"561698 - Merge 'org.eclipse.mdm.nucleus/anehmer/restapi' into 'anehmer/restapi'"
Signed-off-by: Simon Skoczylas <simon.skoczylas@karakun.com>
diff --git a/org.eclipse.mdm.nucleus/.gitignore b/org.eclipse.mdm.nucleus/.gitignore
new file mode 100644
index 0000000..7b943bd
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/.gitignore
@@ -0,0 +1,22 @@
+# eclipse
+.classpath
+.project
+.settings/
+bin/
+
+# gradle
+.gradle
+build/
+gradle.properties
+
+# intellij
+.idea/
+out/
+*.ipr
+*.iml
+*.iws
+/bin/
+
+# node
+**/node_modules
+**/coverage
diff --git a/org.eclipse.mdm.nucleus/LICENSE.txt b/org.eclipse.mdm.nucleus/LICENSE.txt
new file mode 100644
index 0000000..e48e096
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/LICENSE.txt
@@ -0,0 +1,277 @@
+Eclipse Public License - v 2.0
+
+ THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+ PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION
+ OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
+
+1. DEFINITIONS
+
+"Contribution" means:
+
+ a) in the case of the initial Contributor, the initial content
+ Distributed under this Agreement, and
+
+ b) in the case of each subsequent Contributor:
+ i) changes to the Program, and
+ ii) additions to the Program;
+ where such changes and/or additions to the Program originate from
+ and are Distributed by that particular Contributor. A Contribution
+ "originates" from a Contributor if it was added to the Program by
+ such Contributor itself or anyone acting on such Contributor's behalf.
+ Contributions do not include changes or additions to the Program that
+ are not Modified Works.
+
+"Contributor" means any person or entity that Distributes the Program.
+
+"Licensed Patents" mean patent claims licensable by a Contributor which
+are necessarily infringed by the use or sale of its Contribution alone
+or when combined with the Program.
+
+"Program" means the Contributions Distributed in accordance with this
+Agreement.
+
+"Recipient" means anyone who receives the Program under this Agreement
+or any Secondary License (as applicable), including Contributors.
+
+"Derivative Works" shall mean any work, whether in Source Code or other
+form, that is based on (or derived from) the Program and for which the
+editorial revisions, annotations, elaborations, or other modifications
+represent, as a whole, an original work of authorship.
+
+"Modified Works" shall mean any work in Source Code or other form that
+results from an addition to, deletion from, or modification of the
+contents of the Program, including, for purposes of clarity any new file
+in Source Code form that contains any contents of the Program. Modified
+Works shall not include works that contain only declarations,
+interfaces, types, classes, structures, or files of the Program solely
+in each case in order to link to, bind by name, or subclass the Program
+or Modified Works thereof.
+
+"Distribute" means the acts of a) distributing or b) making available
+in any manner that enables the transfer of a copy.
+
+"Source Code" means the form of a Program preferred for making
+modifications, including but not limited to software source code,
+documentation source, and configuration files.
+
+"Secondary License" means either the GNU General Public License,
+Version 2.0, or any later versions of that license, including any
+exceptions or additional permissions as identified by the initial
+Contributor.
+
+2. GRANT OF RIGHTS
+
+ a) Subject to the terms of this Agreement, each Contributor hereby
+ grants Recipient a non-exclusive, worldwide, royalty-free copyright
+ license to reproduce, prepare Derivative Works of, publicly display,
+ publicly perform, Distribute and sublicense the Contribution of such
+ Contributor, if any, and such Derivative Works.
+
+ b) Subject to the terms of this Agreement, each Contributor hereby
+ grants Recipient a non-exclusive, worldwide, royalty-free patent
+ license under Licensed Patents to make, use, sell, offer to sell,
+ import and otherwise transfer the Contribution of such Contributor,
+ if any, in Source Code or other form. This patent license shall
+ apply to the combination of the Contribution and the Program if, at
+ the time the Contribution is added by the Contributor, such addition
+ of the Contribution causes such combination to be covered by the
+ Licensed Patents. The patent license shall not apply to any other
+ combinations which include the Contribution. No hardware per se is
+ licensed hereunder.
+
+ c) Recipient understands that although each Contributor grants the
+ licenses to its Contributions set forth herein, no assurances are
+ provided by any Contributor that the Program does not infringe the
+ patent or other intellectual property rights of any other entity.
+ Each Contributor disclaims any liability to Recipient for claims
+ brought by any other entity based on infringement of intellectual
+ property rights or otherwise. As a condition to exercising the
+ rights and licenses granted hereunder, each Recipient hereby
+ assumes sole responsibility to secure any other intellectual
+ property rights needed, if any. For example, if a third party
+ patent license is required to allow Recipient to Distribute the
+ Program, it is Recipient's responsibility to acquire that license
+ before distributing the Program.
+
+ d) Each Contributor represents that to its knowledge it has
+ sufficient copyright rights in its Contribution, if any, to grant
+ the copyright license set forth in this Agreement.
+
+ e) Notwithstanding the terms of any Secondary License, no
+ Contributor makes additional grants to any Recipient (other than
+ those set forth in this Agreement) as a result of such Recipient's
+ receipt of the Program under the terms of a Secondary License
+ (if permitted under the terms of Section 3).
+
+3. REQUIREMENTS
+
+3.1 If a Contributor Distributes the Program in any form, then:
+
+ a) the Program must also be made available as Source Code, in
+ accordance with section 3.2, and the Contributor must accompany
+ the Program with a statement that the Source Code for the Program
+ is available under this Agreement, and informs Recipients how to
+ obtain it in a reasonable manner on or through a medium customarily
+ used for software exchange; and
+
+ b) the Contributor may Distribute the Program under a license
+ different than this Agreement, provided that such license:
+ i) effectively disclaims on behalf of all other Contributors all
+ warranties and conditions, express and implied, including
+ warranties or conditions of title and non-infringement, and
+ implied warranties or conditions of merchantability and fitness
+ for a particular purpose;
+
+ ii) effectively excludes on behalf of all other Contributors all
+ liability for damages, including direct, indirect, special,
+ incidental and consequential damages, such as lost profits;
+
+ iii) does not attempt to limit or alter the recipients' rights
+ in the Source Code under section 3.2; and
+
+ iv) requires any subsequent distribution of the Program by any
+ party to be under a license that satisfies the requirements
+ of this section 3.
+
+3.2 When the Program is Distributed as Source Code:
+
+ a) it must be made available under this Agreement, or if the
+ Program (i) is combined with other material in a separate file or
+ files made available under a Secondary License, and (ii) the initial
+ Contributor attached to the Source Code the notice described in
+ Exhibit A of this Agreement, then the Program may be made available
+ under the terms of such Secondary Licenses, and
+
+ b) a copy of this Agreement must be included with each copy of
+ the Program.
+
+3.3 Contributors may not remove or alter any copyright, patent,
+trademark, attribution notices, disclaimers of warranty, or limitations
+of liability ("notices") contained within the Program from any copy of
+the Program which they Distribute, provided that Contributors may add
+their own appropriate notices.
+
+4. COMMERCIAL DISTRIBUTION
+
+Commercial distributors of software may accept certain responsibilities
+with respect to end users, business partners and the like. While this
+license is intended to facilitate the commercial use of the Program,
+the Contributor who includes the Program in a commercial product
+offering should do so in a manner which does not create potential
+liability for other Contributors. Therefore, if a Contributor includes
+the Program in a commercial product offering, such Contributor
+("Commercial Contributor") hereby agrees to defend and indemnify every
+other Contributor ("Indemnified Contributor") against any losses,
+damages and costs (collectively "Losses") arising from claims, lawsuits
+and other legal actions brought by a third party against the Indemnified
+Contributor to the extent caused by the acts or omissions of such
+Commercial Contributor in connection with its distribution of the Program
+in a commercial product offering. The obligations in this section do not
+apply to any claims or Losses relating to any actual or alleged
+intellectual property infringement. In order to qualify, an Indemnified
+Contributor must: a) promptly notify the Commercial Contributor in
+writing of such claim, and b) allow the Commercial Contributor to control,
+and cooperate with the Commercial Contributor in, the defense and any
+related settlement negotiations. The Indemnified Contributor may
+participate in any such claim at its own expense.
+
+For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those performance
+claims and warranties, and if a court requires any other Contributor to
+pay any damages as a result, the Commercial Contributor must pay
+those damages.
+
+5. NO WARRANTY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT
+PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS"
+BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR
+IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF
+TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR
+PURPOSE. Each Recipient is solely responsible for determining the
+appropriateness of using and distributing the Program and assumes all
+risks associated with its exercise of rights under this Agreement,
+including but not limited to the risks and costs of program errors,
+compliance with applicable laws, damage to or loss of data, programs
+or equipment, and unavailability or interruption of operations.
+
+6. DISCLAIMER OF LIABILITY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT
+PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS
+SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST
+PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE
+EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+7. GENERAL
+
+If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further
+action by the parties hereto, such provision shall be reformed to the
+minimum extent necessary to make such provision valid and enforceable.
+
+If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other software
+or hardware) infringes such Recipient's patent(s), then such Recipient's
+rights granted under Section 2(b) shall terminate as of the date such
+litigation is filed.
+
+All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of
+time after becoming aware of such noncompliance. If all Recipient's
+rights under this Agreement terminate, Recipient agrees to cease use
+and distribution of the Program as soon as reasonably practicable.
+However, Recipient's obligations under this Agreement and any licenses
+granted by Recipient relating to the Program shall continue and survive.
+
+Everyone is permitted to copy and distribute copies of this Agreement,
+but in order to avoid inconsistency the Agreement is copyrighted and
+may only be modified in the following manner. The Agreement Steward
+reserves the right to publish new versions (including revisions) of
+this Agreement from time to time. No one other than the Agreement
+Steward has the right to modify this Agreement. The Eclipse Foundation
+is the initial Agreement Steward. The Eclipse Foundation may assign the
+responsibility to serve as the Agreement Steward to a suitable separate
+entity. Each new version of the Agreement will be given a distinguishing
+version number. The Program (including Contributions) may always be
+Distributed subject to the version of the Agreement under which it was
+received. In addition, after a new version of the Agreement is published,
+Contributor may elect to Distribute the Program (including its
+Contributions) under the new version.
+
+Except as expressly stated in Sections 2(a) and 2(b) above, Recipient
+receives no rights or licenses to the intellectual property of any
+Contributor under this Agreement, whether expressly, by implication,
+estoppel or otherwise. All rights in the Program not expressly granted
+under this Agreement are reserved. Nothing in this Agreement is intended
+to be enforceable by any entity that is not a Contributor or Recipient.
+No third-party beneficiary rights are created under this Agreement.
+
+Exhibit A - Form of Secondary Licenses Notice
+
+"This Source Code may also be made available under the following
+Secondary Licenses when the conditions for such availability set forth
+in the Eclipse Public License, v. 2.0 are satisfied: {name license(s),
+version(s), and exceptions or additional permissions here}."
+
+ Simply including a copy of this Agreement, including this Exhibit A
+ is not sufficient to license the Source Code under Secondary Licenses.
+
+ If it is not possible or desirable to put the notice in a particular
+ file, then You may include the notice in a location (such as a LICENSE
+ file in a relevant directory) where a recipient would be likely to
+ look for such a notice.
+
+ You may add additional accurate notices of copyright ownership.
diff --git a/org.eclipse.mdm.nucleus/NOTICE.txt b/org.eclipse.mdm.nucleus/NOTICE.txt
new file mode 100644
index 0000000..05b1024
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/NOTICE.txt
@@ -0,0 +1,364 @@
+# Notices for Eclipse MDM|BL
+
+This content is produced and maintained by the Eclipse MDM|BL project,
+it is a project of the openMDM(R) Eclipse Working Group.
+
+* Project home: https://projects.eclipse.org/projects/technology.mdmbl
+
+## Trademarks
+
+Eclipse MDM|BL, MDM|BL and Eclipse openMDM(R) logo are registered trademarks
+of the Eclipse Foundation.
+
+## Copyright
+
+All content is the property of the following respective authors or their employers.
+For more information regarding authorship of content, please consult the listed
+source code repository logs.
+
+Copyright (c) 2016-2018 Gigatronik Ingolstadt GmbH
+Copyright (c) 2016-2019 Peak Solution GmbH
+Copyright (c) 2017-2018 science + computing AG Tuebingen (ATOS SE)
+Copyright (c) 2017-2018 Canoo Engineering AG
+Copyright (c) 2017 Florian Schmitt
+Copyright (c) 2017-2019 Angelika Wittek
+Copyright (c) 2018 Elektronische Fahrwerksysteme GMBH
+Copyright (c) 2018-2019 Karakun AG
+
+## Declared Project Licenses
+
+This program and the accompanying materials are made available under the
+terms of the Eclipse Public License v. 2.0 which is available at
+http://www.eclipse.org/legal/epl-2.0.
+
+SPDX-License-Identifier: EPL-2.0
+
+## Source Code
+
+The project maintains the following source code repositories:
+
+org.eclipse.mdm.api.base.git - The openMDM(R) API.
+org.eclipse.mdm.api.default.git - Extension of the openMDM(R) API containing default elements.
+org.eclipse.mdm.api.odsadapter.git - ODS implementation of persistence adapter.
+org.eclipse.mdm.nucleus.git - Core building blocks for the openMDM Business Logic and Web Frontend.
+
+## Third-party Content
+
+The Content includes items that have been sourced from third parties as set out below.
+If you did not receive this Content directly from the Eclipse Foundation, the following
+is provided for informational purposes only, and you should look to
+the Redistributor's license for terms and conditions of use.
+
+antlr4-4.5.3.jar(2.5.3)
+ * License: New BSD license
+
+aopalliance-repackaged-2.5.0-b05.jar (2.5.0-b05)
+ * License: CDDL
+
+commons-codec-1.2.jar (1.2)
+ * License: Apache License, 2.0
+
+commons-httpclient-3.1.jar (3.1)
+ * License: Apache License, 2.0
+
+commons-lang3-3.8.1.jar (3.8.1)
+ * License: Apache License, 2.0
+
+commons-text-1.6.jar (1.6)
+ * License: Apache License, 2.0
+
+commons-math-2.2.jar (2.2)
+ * License: Apache License, 2.0
+
+gson-2.7.jar (2.7)
+ * License: Apache License, 2.0
+
+Google Guava Version: 25.0-jre (25.0)
+ * License: Apache License, 2.0
+
+Gradle Wrapper (4.10.2)
+ * License: Apache License, 2.0
+
+hk2-api-2.5.0-b05.jar (2.5.0-b05)
+ * License: CDDL-1.1
+
+hk2-locator-2.5.0-b05.jar(2.5.0-b05)
+ * License: CDDL
+
+hk2-utils-2.5.0-b05.jar (2.5.0-b05)
+ * License: CDDL
+
+jackson-annotations-2.9.0.jar (2.9.0)
+ * License: Apache License, 2.0
+
+jackson-core-2.9.2.jar(2.9.2)
+ * License: Apache License, 2.0
+
+jackson-databind-2.9.2.jar (2.9.2)
+ * License: Apache License, 2.0
+
+jackson-jaxrs-base-2.9.2.jar(2.9.2)
+ * License: Apache License, 2.0
+
+jackson-jaxrs-json-provider-2.9.2.jar(2.9.2)
+ * License: Apache License, 2.0
+
+jackson-module-jaxb-annotations-2.9.2.jar (2.9.2)
+ * License: Apache License, 2.0
+
+javassist-3.20.0-GA.jar (2.20.0-GA)
+ * License: Apache 2.0
+
+jcl-over-slf4j-1.7.25.jar(1.7.25)
+ * License: MIT License
+ * Licence Path: https://www.slf4j.org/license.html
+ * Project URL: https://www.slf4j.org
+ * Source URL: https://github.com/qos-ch/slf4j
+
+jersey-client-2.23.2.jar (2.23.2)
+ * License: CDDL
+
+jersey-common-2.23.2.jar (2.23.2)
+ * License: CDDL
+
+jersey-container-servlet-2.23.2.jar (2.23.2)
+ * License: CDDL
+
+jersey-container-servlet-core-2.23.3.jar(2.23.2)
+ * License: CDDL
+
+jersey-guava-2.23.2.jar (2.23.2)
+ * License: Apache License, 2.0
+
+jersey-media-jaxb-2.23.2.jar(2.23.2)
+ * License: CDDL
+
+jersey-media-sse-2.23.2.jar (2.23.2)
+ * License: CDDL
+
+jersey-media-multipart-2.23.2.jar (2.23.2)
+ * License: CDDL
+
+jersey-server-2.23.2.jar (2.23.2)
+ * License: Apache-2.0
+
+log4j-over-slf4j-1.7.25.jar (1.7.25)
+ * License: Apache-2.0
+
+logback-classic-1.2.3.jar(1.2.3)
+ * License: Eclipse Public License 1.0
+
+logback-core-1.2.3.jar(1.2.3)
+ * License: Eclipse Public License 1.0
+
+openatfx-0.7.4.jar (0.7.4)
+ * License: Apache-2.0
+
+osgi-resource-locator-1.0.1.jar(1.0.1)
+ * License: CDDL
+
+protobuf-java-3.2.0.jar (3.2.0)
+ * License: New BSD license
+
+protobuf-java-util-3.2.0.jar (3.2.0)
+ * License: New BSD license
+
+swagger-annotations-2.0.8.jar (2.0.8)
+ * License: Apache-2.0
+
+swagger-ui-3.23.0.jar (3.23.0)
+ * License: Apache-2.0
+
+slf4j-api-1.7.25.jar (1.7.25)
+ * License: MIT license
+ * Licence Path: https://www.slf4j.org/license.html
+ * Project URL: https://github.com/qos-ch/slf4j
+ * Source URL: https://github.com/qos-ch/slf4j/releases/tag/v_1.7.25
+
+validation-api-1.1.0.Final.jar (1.1.0.Final)
+ * License: Apache License, 2.0
+
+vavr-0.9.1-sources.jar (0.9.1)
+ * License: Apache License, 2.0
+
+woodstox-core-asl-4.4.1.jar (4.4.1)
+ * License: Apache License, 2.0
+
+
+FFAMFAMFAM Silk Icon, Version 1.3
+ * License: Creative Commons Attribution 3.0 License
+ * Licence Path: https://creativecommons.org/licenses/by/3.0/
+ * Project: http://www.famfamfam.com/lab/icons/silk/
+ * Source: http://www.famfamfam.com/lab/icons/silk/
+
+@angular/animations:7.2.4
+ * License: MIT
+ * Licence Path: https://github.com/angular/angular/blob/master/LICENSE
+ * Project: https://angular.io/api/animations
+ * Source: https://github.com/angular/angular/releases/tag/7.2.4
+
+@angular/cdk:7.1.1
+ * License: MIT
+ * Licence Path: https://github.com/angular/angular/blob/master/LICENSE
+ * Project: https://angular.io/api
+ * Source: https://github.com/angular/angular/releases/tag/7.1.1
+
+
+@angular/common@7.2.4
+ * License: MIT
+ * Licence Path: https://github.com/angular/angular/blob/master/LICENSE
+ * Project: https://angular.io/api/common
+ * Source: https://github.com/angular/angular/releases/tag/7.2.4r
+
+@angular/compiler@7.2.4
+ * License: MIT
+ * Licence Path: https://github.com/angular/angular/blob/master/LICENSE
+ * Project: https://angular.io
+ * Source: https://github.com/angular/angular/releases/tag/7.2.4
+
+@angular/core@7.2.4
+ * License: MIT
+ * Licence Path: https://github.com/angular/angular/blob/master/LICENSE
+ * Project: https://angular.io
+ * Source: https://github.com/angular/angular/releases/tag/7.2.4
+
+@angular/forms@7.2.4
+ * License: MIT
+ * Licence Path: https://github.com/angular/angular/blob/master/LICENSE
+ * Project: https://angular.io
+ * Source: https://github.com/angular/angular/releases/tag/7.2.4
+
+@angular/http@7.2.4
+ * License: MIT
+ * Licence Path: https://github.com/angular/angular/blob/master/LICENSE
+ * Project: https://angular.io
+ * Source: https://github.com/angular/angular/releases/tag/7.2.4
+
+@angular/platform-browser-dynamic@7.2.4
+ * License: MIT
+ * Licence Path: https://github.com/angular/angular/blob/master/LICENSE
+ * Project: https://angular.io
+ * Source: https://github.com/angular/angular/releases/tag/7.2.4
+
+@angular/platform-browser@7.2.4
+ * License: MIT
+ * Licence Path: https://github.com/angular/angular/blob/master/LICENSE
+ * Project: https://angular.io
+ * Source: https://github.com/angular/angular/releases/tag/7.2.4
+
+@angular/router@7.2.4
+ * License: MIT
+ * Licence Path: https://github.com/angular/angular/blob/master/LICENSE
+ * Project: https://angular.io
+ * Source: https://github.com/angular/angular/releases/tag/7.2.4
+
+bootstrap@4.1.3
+ * License: MIT
+ * Licence Path: https://github.com/twbs/bootstrap/raw/master/LICENSE
+ * Project: https://getbootstrap.com/
+ * Source: https://github.com/twbs/bootstrap
+
+class-transformer@0.1.6
+ * License: MIT
+ * Licence Path: https://github.com/typestack/class-transformer/blob/master/LICENSE
+ * Project: https://github.com/pleerock/class-transformer
+ * Source: https://github.com/pleerock/class-transformer
+
+core-js@2.6.0
+ * License: MIT
+ * Licence Path: https://github.com/zloirock/core-js/raw/master/LICENSE
+ * Project: https://github.com/zloirock/core-js
+ * Source: https://github.com/zloirock/core-js/releases/tag/v2.6.0
+
+file-saver@1.3.3
+ * License: MIT
+ * Licence Path: https://github.com/eligrey/FileSaver.js/raw/master/LICENSE.md
+ * Project: https://github.com/eligrey/FileSaver.js
+ * Source: https://github.com/eligrey/FileSaver.js
+
+font-awesome@4.7.0
+ * License: MIT
+ * Licence Path: https://github.com/FortAwesome/Font-Awesome/blob/master/LICENSE.txt
+ * Project: https://fontawesome.com/
+ * Source: https://github.com/FortAwesome/Font-Awesome
+
+ng2-split-pane@1.3.1
+ * License: MIT
+ * Licence Path: https://github.com/wannabegeek/ng2-split-pane/raw/master/LICENSE
+ * Project: https://github.com/wannabegeek/ng2-split-pane
+ * Source: https://github.com/wannabegeek/ng2-split-pane
+
+ngx-bootstrap@3.1.2
+ * License: MIT
+ * Licence Path: https://github.com/valor-software/ngx-bootstrap/blob/v3.1.2/LICENSE
+ * Project: https://valor-software.com/ngx-bootstrap
+ * Source: https://github.com/valor-software/ngx-bootstrap/tree/v3.1.2
+
+primeicons:1.0.0
+ * License: MIT
+ * Licence Path: https://github.com/primefaces/primeicons/blob/1.0.0/LICENSE
+ * Project: https://www.primefaces.org/primeng
+ * Source: https://github.com/primefaces/primeicons/tree/1.0.0
+
+primeng@7.0.1
+ * License: MIT
+ * Licence Path: https://github.com/primefaces/primeng/blob/7.0.1/LICENSE.md
+ * Project: https://www.primefaces.org/primeng
+ * Source: https://github.com/primefaces/primeng/tree/7.0.1
+
+rxjs@5.1.0
+ * License: Apache-2.0
+ * Project: https://rxjs-dev.firebaseapp.com/
+ * Source: https://github.com/ReactiveX/rxjs/tree/6.3.3
+
+rxjs-compat:6.3.3
+ * License: Apache-2.0
+ * Project: https://rxjs-dev.firebaseapp.com/
+ * Source: https://github.com/ReactiveX/rxjs/tree/6.3.3/compat
+
+
+zone.js@0.8.26
+ * License: MIT
+ * Licence Path: https://github.com/angular/zone.js/raw/master/LICENSE
+ * Project: https://github.com/angular
+ * Source: https://github.com/angular/zone.js/releases/tag/v0.8.26
+
+OMG Event Service Specification (1.2)
+
+* License: LicenseRef - Object-Management-Group-License
+* Project: https://www.omg.org/spec/EVNT/1.2/
+* Source: https://www.omg.org/spec/EVNT/1.2/pdf
+
+OMG Notification Service Specification (1.1)
+
+* License: LicenseRef - Object-Management-Group-License
+* Project: https://www.omg.org/spec/NOT/
+* Source: https://www.omg.org/spec/NOT/1.1/PDF
+
+ods530.idl
+Permission of use:
+From Hans-Georg Swolana, Chairman of the Board ASAM e.V.,
+ Prof. Dr. Marcus Rieker, Member of the Board ASAM e.V.
+Date: Hoehenkirchen, 06/01/2016
+"The ASAM Board of Directors releases the IDL files for use under the EPL to the Eclipse IWG openMDM.
+This is valid for all versions of ASAM ODS 5.3.x.
+This permission is valid under the conditions of Eclipse will not modify the file."
+
+AvalonEvent.idl, CorbaFileServer.idl
+Permission of use:
+From Dr. Ralph Noerenberg
+Date: 08/15/2016
+"Herewith, we release the generated Client-Source-Code generated from our CORBA IDLs, namely
+* CORBANotification Service (generated from „AvalonEvent.idl”)
+* CORBAFileServer (generated from „CorbaFileServer.idl“),
+Under the Eclipse Public License (EPL). This agreement does not include the „AvalonEvent.idl“ and
+„CorbaFileServer.idl“ itself, which remain protected property of HighQSoft. "
+
+## Cryptography
+
+Content may contain encryption software. The country in which you are currently
+may have restrictions on the import, possession, and use, and/or re-export to
+another country, of encryption software. BEFORE using any encryption software,
+please check the country's laws, regulations and policies concerning the import,
+possession, or use, and re-export of encryption software, to see if this is
+permitted.
diff --git a/org.eclipse.mdm.nucleus/README.md b/org.eclipse.mdm.nucleus/README.md
new file mode 100644
index 0000000..fbb164a
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/README.md
@@ -0,0 +1,722 @@
+## minimum requirements
+* JDK 1.8.0_45
+* Gradle 2.13
+
+## build dependencies
+Before you can install and build the application, you have to checkout and install: (gradlew install)
+* org.eclipse.mdm.api.base
+* org.eclipse.mdm.api.default
+* org.eclipse.mdm.api.odsadapter
+
+## build, deploy and configure the application
+
+1. **edit** the **org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/src/app/core/property.service.ts** and set the variables host, port and prefix for your deployment
+(This properties are used to create the rest URLs to communicate with the backend)
+Furthermore, specify the **contextPath** in **org.eclipse.mdm.nucleus/org.eclipse.mdm.application/src/main/webapp/webpack.config.js**
+2. **build** the application (gradlew install)
+The command **gradlew install** at **org.eclipse.mdm.nucleus** creates a ZIP archive named **mdm_web-${version}.zip** at
+**/org.eclipse.mdm.nucleus/build/distributions**
+The ZIP archive contains the backend **org.eclipse.mdm.nucleus-${version}.war** and the configurations **/configuration**
+3. **check** that the database for the preference service is running or else start it with **asadmin start-database**.
+4. **deploy** the backend ( **org.eclipse.mdm.nucleuss-${version}.war** file) at your application server. Make sure to deploy the war file with application name **org.eclipse.mdm.nucleus**, otherwise the LoginRealmModule is not able to lookup the ConnectorService EJB. Additionally in the following examples, we assume that the context root is also set to **org.eclipse.mdm.nucleus**.
+When deploying on command line you can use: **asadmin deploy --name org.eclipse.mdm.nucleus "/path/to/org.eclipse.mdm.nucleus-${version}.war"**
+5. **copy the content** of the extracted **/configuration** folder to **GLASSFISH_ROOT/glassfish/domains/domain1/config**.
+ There is also a system property **org.eclipse.mdm.configPath**, that can be used to redefine the location of the folder to another location.
+6. **edit** the **org.eclipse.mdm.connector/service.xml** file to configure the data sources
+7. **configure** a **LoginModule** with name **MDMRealm** (See section **Configure LoginModule** for details)
+8. **restart** the application server
+9. **visit** the main page of the client to make sure everything works fine. The main page of the client should be available under
+http://SERVER:PORT/{APPLICATIONROOT}
+_(eg: http://localhost:8080/org.eclipse.mdm.nucleus_)
+
+## configure LoginModule
+MDM 5 backend implements the delegated approach to roles and permissions, wherein the data sources (ASAM ODS server, PAK cloud)
+themselves can implement their own security scheme (which they already have) and then delegates the appropriate
+user data to the backends.
+
+In the case of ASAM ODS servers this is done using a technical user and the `for_user` attribute on the established
+connection, so it is a form of 'login on behalf'.
+
+In the case of PAK Cloud this is done by passing the user name along with a http header `X-Remote-User` which is then
+used by PAK Cloud to establish the users roles (from an internal database or an external authentication provider).
+
+Before the user is 'logged in on behalf' he is authenticated by a LoginModule within the Glassfish application server.
+There are different implementations available (e.g. LDAP, Certificate, JDBC, ...). To keep this guide simple, we will setup
+a FileRealm, which stores the user information in a flat file:
+
+The following command will create a FileRealm with name `MDMRealm` that stores the users in a file called `mdm-keyfile`:
+
+```
+asadmin create-auth-realm --classname com.sun.enterprise.security.auth.realm.file.FileRealm --property file=${com.sun.aas.instanceRoot}/config/mdm-keyfile:jaas-context=MDMRealm:assign-groups=MDM MDMRealm
+```
+
+To be able to login you need to explicitly add users to the `MDMRealm`:
+
+```
+asadmin create-file-user --authrealmname MDMRealm
+```
+
+Next you need to add the following snippet to your `login.conf` in `${com.sun.aas.instanceRoot}/config/`
+
+```
+MDMRealm {
+ com.sun.enterprise.security.auth.login.FileLoginModule required;
+};
+```
+As a last step you have to provide the credentials of the technical user in adapter configuration in `service.xml`.
+For the ODS adapter you you have to specify the parameters `user` and `password` of the technical user. For example:
+
+```
+<service entityManagerFactoryClass="org.eclipse.mdm.api.odsadapter.ODSContextFactory">
+ ...
+ <param name="user">sa</param>
+ <param name="password">sa</param>
+ ...
+</service>
+```
+
+Make sure to restart Glassfish after this change.
+
+### Remove MDMLoginRealm from previous versions:
+In versions 5.0.0M1, 0.10 and older the configuration of a custom login realm was neccessary. If you configured your glassfish instance
+for one of these version, you can remove the old configuration options and artifact, as they are no longer needed:
+
+* **delete** the jar file **org.eclipse.mdm.realm.login.glassfish-VERSION.jar** from **GLASSFISH_ROOT/glassfish/domains/domain1/lib**
+
+* **open** the Glassfish login **configuration file** at **GLASSFISH_ROOT/glassfish/domains/domain1/config/login.conf**
+
+* **delete** custom MDM realm module entry to this config file
+
+```
+MDMLoginRealm {
+ org.eclipse.mdm.realm.login.glassfish.LoginRealmModule required;
+};
+```
+
+* **remove** the MDMLoginRealm by executing the following command or by deleting it in the Glassfish web console:
+
+```
+asadmin delete-auth-realm MDMLoginRealm
+```
+
+
+## configure logging
+
+MDM 5 uses SLF4J and logback for logging. The default configuration file can be found at **org.eclipse.mdm.nucleus/src/main/resources/logback.xml**. It logs INFO level messages to **mdm5.log** in the **logs** folder of the Glassfish domain. If you want to customize logging, you can either edit the file within the war file or preferably provide your own logging configuration via system parameter in the JVM settings in Glassfish: **-Dlogback.configurationFile=/path/to/config.xml**
+
+## available rest URLs
+
+Please use the generated OpenAPI Specification, which is generated at build time.
+The OpenAPI Specification is available in `org.eclipse.mdm.nucleus/build/openapi/openapi.json` or at runtime at `http://{SERVER}:{PORT}/{APPLICATIONROOT}/openapi.json`.
+Futhermore a Swagger UI is available under `http://{SERVER}:{PORT}/{APPLICATIONROOT}/swagger.html`.
+
+The following list of URLs will be removed in future releases.
+
+**Business Object: Environment**
+
+* http://{SERVER}:{PORT}/{APPLICATIONROOT}/mdm/environments
+* http://{SERVER}:{PORT}/{APPLICATIONROOT}/mdm/environments/{SOURCENAME}
+* http://{SERVER}:{PORT}/{APPLICATIONROOT}/mdm/environments/{SOURCENAME}/localizations
+* _example: http://localhost:8080/org.eclipse.mdm.nucleus/mdm/environments_
+
+Since all other calls operate on a specific source all subsequent calls share the common prefix
+`http://{SERVER}:{PORT}/{APPLICATIONROOT}/mdm/environments/{SOURCENAME}/`, which we will be our root for the description of the next calls.
+Strings enclosed in curly brackets are meant to be replaced by appropriate values. The following parameters are recurring throughout the different URLs:
+
+* APPLICATIONROOT is the context root under which MDM is deployed
+* SOURCENAME is the source name the underlying data source
+* CONTEXTTYPE is one of [unitundertest, testsequence, testequipment]
+* DATATYPE is one of [STRING, STRING_SEQUENCE, DATE, DATE_SEQUENCE, BOOLEAN, BOOLEAN_SEQUENCE, BYTE, BYTE_SEQUENCE, SHORT, SHORT_SEQUENCE, INTEGER, INTEGER_SEQUENCE, LONG, LONG_SEQUENCE, FLOAT, FLOAT_SEQUENCE, DOUBLE, DOUBLE_SEQUENCE, BYTE_STREAM, BYTE_STREAM_SEQUENCE, FLOAT_COMPLEX, FLOAT_COMPLEX_SEQUENCE, DOUBLE_COMPLEX, DOUBLE_COMPLEX_SEQUENCE, FILE_LINK, FILE_LINK_SEQUENCE]
+* FILTERSTRING is a String defining a filter. For example `Test.Name eq "t*"` filters for all tests which names begin with `t`. Strings should be quoted with `"`. `"` characters within strings have to be escaped with a backslash. For backward compatibility `'` is also allowed to quote strings, but may be blocked in URLs in some environments, thus `"` should be preferred.
+* REMOTE_PATH is the remote path of a file link as it is returned in the attributes of type FILE_LINK and FILE_LINK_SEQUENCE. Make sure to properly url escape the value of the remote path. Especially slashes have to be escaped with `%2F`.
+
+
+**Business Object: Test**
+
+* GET: /tests
+* POST: /tests
+* GET: /tests?filter={FILTERSTRING}
+* GET: /tests/searchattributes
+* GET: /tests/localizations
+* GET: /tests/{TESTID}
+* PUT: /tests/{TESTID}
+* DELETE: /tests/{TESTID}
+* GET: /tests/{TESTID}/files/{REMOTE_PATH}
+
+**Business Object: TestStep**
+
+* GET: /teststeps
+* POST: /teststeps
+* GET: /teststeps?filter=FILTERSTRING
+* GET: /teststeps/searchattributes
+* GET: /teststeps/localizations
+* GET: /teststeps/{TESTSTEPID}
+* PUT: /teststeps/{TESTSTEPID}
+* DELETE: /teststeps/{TESTSTEPID}
+* GET: /teststeps/{TESTSTEPID}/files/{REMOTE_PATH}
+* GET: /teststeps/{TESTSTEPID}/contexts
+* PUT: /teststeps/{TESTSTEPID}/contexts
+* GET: /teststeps/{TESTSTEPID}/contexts/{CONTEXTTYPE}
+* PUT: /teststeps/{TESTSTEPID}/contexts/{CONTEXTTYPE}
+* GET: /teststeps/{TESTSTEPID}/contexts/testequipment/sensors
+
+**Business Object: Measurement**
+
+* GET: /measurements
+* POST: /measurements
+* GET: /measurements?filter={FILTERSTRING}
+* GET: /measurements/searchattributes
+* GET: /measurements/localizations
+* GET: /measurements/{MEASUREMENTID}
+* PUT: /measurements/{MEASUREMENTID}
+* DELETE: /measurements/{MEASUREMENTID}
+* GET: /measurements/{MEASUREMENTID}/files/{REMOTE_PATH}
+* GET: /measurements/{MEASUREMENTID}/contexts
+* GET: /measurements/{MEASUREMENTID}/contexts/{CONTEXTTYPE}
+* PUT: /measurements/{MEASUREMENTID}/contexts/{CONTEXTTYPE}
+* GET: /measurements/{MEASUREMENTID}/contexts/testequipment/sensors
+
+**Business Object: ChannelGroup**
+
+* GET: /channelgroups
+* GET: /channelgroups/localizations
+* GET: /channelgroups/{CHANNELGROUPID}
+
+**Business Object: Channel**
+
+* GET: /channels
+* GET: /channels/localizations
+* GET: /channels/{CHANNELID}
+
+**Business Object: Project**
+
+* GET: /projects
+* POST: /projects
+* GET: /projects?filter={FILTERSTRING}
+* GET: /projects/searchattributes
+* GET: /projects/localizations
+* GET: /projects/{PROJECTID}
+* PUT: /projects/{PROJECTID}
+* DELETE: /projects/{PROJECTID}
+
+**Business Object: Pool**
+
+* GET: /pools
+* POST: /pools
+* GET: /pools?filter={FILTERSTRING}
+* GET: /pools/searchattributes
+* GET: /pools/localizations
+* GET: /pools/{POOLID}
+* PUT: /pools/{POOLID}
+* DELETE: /pools/{POOLID}
+
+**Business Object: ValueList**
+
+* GET: /valuelists
+* POST: /valuelists (JSON: { "Name" : "testValueList" })
+* GET: /valuelists/{VALUELISTID}
+* PUT: /valuelists/{VALUELISTID} (JSON: { "MimeType" : "myMimeType" })
+* DELETE: /valuelists/{VALUELISTID}
+* GET: /valuelists/searchattributes
+* GET: /valuelists/localizations
+
+**Business Object: ValueListValue**
+
+* GET: /valuelists/{VALUELISTID}/values
+* POST: /valuelists/{VALUELISTID}/values (JSON: { "Name" : "testValueListValue" })
+* GET: /valuelists/{VALUELISTID}/values/{VALUELISTVALUEID}
+* PUT: /valuelists/{VALUELISTID}/values/{VALUELISTVALUEID} (JSON: { "MimeType" : "myMimeType" })
+* DELETE: /valuelists/{VALUELISTID}/values/{VALUELISTVALUEID}
+* GET: /valuelists/{VALUELISTID}/values/searchattributes
+* GET: /valuelists/{VALUELISTID}/values/localizations
+
+**Business Object: PhysicalDimension**
+
+* GET: /physicaldimensions
+* POST: /physicaldimensions (JSON: { "Name" : "testPhysicalDimension" })
+* GET: /physicaldimensions/{PHYSICALDIMENSIONID}
+* PUT: /physicaldimensions/{PHYSICALDIMENSIONID} (JSON: { "MimeType" : "myMimeType" })
+* DELETE: /physicaldimensions/{PHYSICALDIMENSIONID}
+* GET: /physicaldimensions/searchattributes
+* GET: /physicaldimensions/localizations
+
+**Business Object: Unit**
+
+* GET: /units
+* POST: /units (JSON: { "Name" : "testUnit", "PhysicalDimension" : "PHYSICALDIMENSIONID" })
+* GET: /units/{UNITID}
+* PUT: /units/{UNITID} (JSON: { "MimeType" : "myMimeType" })
+* DELETE: /units/{UNITID}
+* GET: /units/searchattributes
+* GET: /units/localizations
+
+**Business Object: Quantity**
+
+* GET: /quantities
+* POST: /quantities (JSON: { "Name" : "testQuantity", "Unit" : "UNITID" })
+* GET: /quantities/{QUANTITYID}
+* PUT: /quantities/{QUANTITYID} (JSON: { "MimeType" : "myMimeType" })
+* DELETE: /quantities/{QUANTITYID}
+* GET: /quantities/searchattributes
+* GET: /quantities/localizations
+
+**Business Object: CatalogComponent**
+
+* GET: /catcomps/{CONTEXTTYPE}
+* POST: /catcomps/{CONTEXTTYPE} (JSON: { "Name" : "testCatalogComponent" })
+* GET: /catcomps/{CONTEXTTYPE}/{CATALOGCOMPONENTID}
+* PUT: /catcomps/{CONTEXTTYPE}/{CATALOGCOMPONENTID} (JSON: { "MimeType" : "myMimeType" })
+* DELETE: /catcomps/{CONTEXTTYPE}/{CATALOGCOMPONENTID}
+* GET: /catcomps/{CONTEXTTYPE}/searchattributes
+* GET: /catcomps/{CONTEXTTYPE}/localizations
+
+**Business Object: CatalogAttribute**
+
+* GET: /catcomps/{CONTEXTTYPE}/{CATALOGCOMPONENTID}/catattrs
+* POST: /catcomps/{CONTEXTTYPE}/{CATALOGCOMPONENTID}/catattrs (JSON: { "Name" : "testCatalogAttribute", "DataType" : "DATATYPE" })
+* GET: /catcomps/{CONTEXTTYPE}/{CATALOGCOMPONENTID}/catattrs/{CATALOGATTRIBUTEID}
+* PUT: /catcomps/{CONTEXTTYPE}/{CATALOGCOMPONENTID}/catattrs/{CATALOGATTRIBUTEID} (JSON: { "MimeType" : "myMimeType" })
+* DELETE: /catcomps/{CONTEXTTYPE}/{CATALOGCOMPONENTID}/catattrs/{CATALOGATTRIBUTEID}
+* GET: /catcomps/{CONTEXTTYPE}/{CATALOGCOMPONENTID}/catattrs/searchattributes
+* GET: /catcomps/{CONTEXTTYPE}/{CATALOGCOMPONENTID}/catattrs/localizations
+
+**Business Object: CatalogSensor**
+
+* GET: /catcomps/testequipment/{CATALOGCOMPONENTID}/catsensors
+* POST: /catcomps/testequipment/{CATALOGCOMPONENTID}/catsensors (JSON: { "Name" : "testCatalogSensor" })
+* GET: /catcomps/testequipment/{CATALOGCOMPONENTID}/catsensors/{CATALOGSENSORID}
+* PUT: /catcomps/testequipment/{CATALOGCOMPONENTID}/catsensors/{CATALOGSENSORID} (JSON: { "MimeType" : "myMimeType" })
+* DELETE: /catcomps/testequipment/{CATALOGCOMPONENTID}/catsensors/{CATALOGSENSORID}
+* GET: /catcomps/testequipment/{CATALOGCOMPONENTID}/catsensors/searchattributes
+* GET: /catcomps/testequipment/{CATALOGCOMPONENTID}/catsensors/localizations
+
+**Business Object: CatalogSensorAttribute**
+
+* GET: /catcomps/testequipment/{CATALOGCOMPONENTID}/catsensors/{CATALOGSENSORID}/catsensorattrs
+* POST: /catcomps/testequipment/{CATALOGCOMPONENTID}/catsensors/{CATALOGSENSORID}/catsensorattrs (JSON: { "Name" : "testCatalogAttribute", "DataType" : "DATATYPE" })
+* GET: /catcomps/testequipment/{CATALOGCOMPONENTID}/catsensors/{CATALOGSENSORID}/catsensorattrs/{CATALOGATTRIBUTEID}
+* PUT: /catcomps/testequipment/{CATALOGCOMPONENTID}/catsensors/{CATALOGSENSORID}/catsensorattrs/{CATALOGATTRIBUTEID} (JSON: { "MimeType" : "myMimeType" })
+* DELETE: /catcomps/testequipment/{CATALOGCOMPONENTID}/catsensors/{CATALOGSENSORID}/catsensorattrs/{CATALOGATTRIBUTEID}
+* GET: /catcomps/testequipment/{CATALOGCOMPONENTID}/catsensors/{CATALOGSENSORID}/catsensorattrs/searchattributes
+* GET: /catcomps/testequipment/{CATALOGCOMPONENTID}/catsensors/{CATALOGSENSORID}/catsensorattrs/localizations
+
+**Business Object: TemplateRoot**
+
+* GET: /tplroots/{CONTEXTTYPE}
+* POST: /tplroots/{CONTEXTTYPE} (JSON: { "Name" : "testTemplateRoot" })
+* GET: /tplroots/{CONTEXTTYPE}/{TEMPLATEROOTID}
+* PUT: /tplroots/{CONTEXTTYPE}/{TEMPLATEROOTID} (JSON: { "MimeType" : "myMimeType" })
+* DELETE: /tplroots/{CONTEXTTYPE}/{TEMPLATEROOTID}
+* GET: /tplroots/{CONTEXTTYPE}/searchattributes
+* GET: /tplroots/{CONTEXTTYPE}/localizations
+
+**Business Object: TemplateComponent**
+
+* GET: /tplroots/{CONTEXTTYPE}/{TEMPLATEROOTID}/tplcomps
+* POST: /tplroots/{CONTEXTTYPE}/{TEMPLATEROOTID}/tplcomps (JSON: { "Name" : "testTemplateComponent", "CatalogComponent" : "CATALOGCOMPONENTID" })
+* GET: /tplroots/{CONTEXTTYPE}/{TEMPLATEROOTID}/tplcomps/{TEMPLATECOMPONENTID}
+* PUT: /tplroots/{CONTEXTTYPE}/{TEMPLATEROOTID}/tplcomps/{TEMPLATECOMPONENTID} (JSON: { "MimeType" : "myMimeType" })
+* DELETE: /tplroots/{CONTEXTTYPE}/{TEMPLATEROOTID}/tplcomps/{TEMPLATECOMPONENTID}
+* GET: /tplroots/{CONTEXTTYPE}/{TEMPLATEROOTID}/tplcomps/searchattributes
+* GET: /tplroots/{CONTEXTTYPE}/{TEMPLATEROOTID}/tplcomps/localizations
+
+**Business Object: TemplateAttribute**
+
+* GET: /tplroots/{CONTEXTTYPE}/{TEMPLATEROOTID}/tplcomps/{TEMPLATECOMPONENTID}/tplattrs
+* POST: /tplroots/{CONTEXTTYPE}/{TEMPLATEROOTID}/tplcomps/{TEMPLATECOMPONENTID}/tplattrs (JSON: { "Name" : "testCatalogAttribute" } (name must be identical with corresponding CatalogAttribute))
+* GET: /tplroots/{CONTEXTTYPE}/{TEMPLATEROOTID}/tplcomps/{TEMPLATECOMPONENTID}/tplattrs/{TEMPLATEATTRIBUTEID}
+* PUT: /tplroots/{CONTEXTTYPE}/{TEMPLATEROOTID}/tplcomps/{TEMPLATECOMPONENTID}/tplattrs/{TEMPLATEATTRIBUTEID} (JSON: { "MimeType" : "myMimeType" })
+* DELETE: /tplroots/{CONTEXTTYPE}/{TEMPLATEROOTID}/tplcomps/{TEMPLATECOMPONENTID}/tplattrs/{TEMPLATEATTRIBUTEID}
+* GET: /tplroots/{CONTEXTTYPE}/{TEMPLATEROOTID}/tplcomps/{TEMPLATECOMPONENTID}/tplattrs/searchattributes
+* GET: /tplroots/{CONTEXTTYPE}/{TEMPLATEROOTID}/tplcomps/{TEMPLATECOMPONENTID}/tplattrs/localizations
+
+**Business Object: TemplateSensor**
+
+* GET: /tplroots/testequipment/{TEMPLATEROOTID}/tplcomps/{TEMPLATECOMPONENTID}/tplsensors
+* POST: /tplroots/testequipment/{TEMPLATEROOTID}/tplcomps/{TEMPLATECOMPONENTID}/tplsensors (JSON: { "Name" : "testTemplateSensor", "CatalogSensor" : "CATALOGSENSORID", "quantity" : "QUANTITYID" })
+* GET: /tplroots/testequipment/{TEMPLATEROOTID}/tplcomps/{TEMPLATECOMPONENTID}/tplsensors/{TEMPLATESENSORID}
+* PUT: /tplroots/testequipment/{TEMPLATEROOTID}/tplcomps/{TEMPLATECOMPONENTID}/tplsensors/{TEMPLATESENSORID} (JSON: { "MimeType" : "myMimeType" })
+* DELETE: /tplroots/testequipment/{TEMPLATEROOTID}/tplcomps/{TEMPLATECOMPONENTID}/tplsensors/{TEMPLATESENSORID}
+* GET: /tplroots/testequipment/{TEMPLATEROOTID}/tplcomps/{TEMPLATECOMPONENTID}/tplsensors/searchattributes
+* GET: /tplroots/testequipment/{TEMPLATEROOTID}/tplcomps/{TEMPLATECOMPONENTID}/tplsensors/localizations
+
+**Business Object: TemplateSensorAttribute**
+
+* GET: /tplroots/testequipment/{TEMPLATEROOTID}/tplcomps/{TEMPLATECOMPONENTID}/tplsensors/{TEMPLATESENSORID}/tplsensorattrs
+* GET: /tplroots/testequipment/{TEMPLATEROOTID}/tplcomps/{TEMPLATECOMPONENTID}/tplsensors/{TEMPLATESENSORID}/tplsensorattrs/{TEMPLATEATTRIBUTEID}
+* PUT: /tplroots/testequipment/{TEMPLATEROOTID}/tplcomps/{TEMPLATECOMPONENTID}/tplsensors/{TEMPLATESENSORID}/tplsensorattrs/{TEMPLATEATTRIBUTEID} (JSON: { "MimeType" : "myMimeType" })
+* GET: /tplroots/testequipment/{TEMPLATEROOTID}/tplcomps/{TEMPLATECOMPONENTID}/tplsensors/{TEMPLATESENSORID}/tplsensorattrs/searchattributes
+* GET: /tplroots/testequipment/{TEMPLATEROOTID}/tplcomps/{TEMPLATECOMPONENTID}/tplsensors/{TEMPLATESENSORID}/tplsensorattrs/localizations
+
+**Business Object: NestedTemplateComponent**
+
+* GET: /tplroots/{CONTEXTTYPE}/{TEMPLATEROOTID}/tplcomps/{TEMPLATECOMPONENTID}/tplcomps
+* POST: /tplroots/{CONTEXTTYPE}/{TEMPLATEROOTID}/tplcomps/{TEMPLATECOMPONENTID}/tplcomps (JSON: { "Name" : "testNestedTemplateComponent", "CatalogComponent" : "CATALOGCOMPONENTID" })
+* GET: /tplroots/{CONTEXTTYPE}/{TEMPLATEROOTID}/tplcomps/{TEMPLATECOMPONENTID}/tplcomps/{NESTEDTEMPLATECOMPONENTID}
+* PUT: /tplroots/{CONTEXTTYPE}/{TEMPLATEROOTID}/tplcomps/{TEMPLATECOMPONENTID}/tplcomps/{NESTEDTEMPLATECOMPONENTID} (JSON: { "MimeType" : "myMimeType" })
+* DELETE: /tplroots/{CONTEXTTYPE}/{TEMPLATEROOTID}/tplcomps/{TEMPLATECOMPONENTID}/tplcomps/{NESTEDTEMPLATECOMPONENTID}
+* GET: /tplroots/{CONTEXTTYPE}/{TEMPLATEROOTID}/tplcomps/{TEMPLATECOMPONENTID}/tplcomps/searchattributes
+* GET: /tplroots/{CONTEXTTYPE}/{TEMPLATEROOTID}/tplcomps/{TEMPLATECOMPONENTID}/tplcomps/localizations
+
+**Business Object: NestedTemplateAttribute**
+
+* CONTEXTTYPE is one of [unitundertest, testsequence, testequipment]
+
+* GET: /tplroots/{CONTEXTTYPE}/{TEMPLATEROOTID}/tplcomps/{TEMPLATECOMPONENTID}/tplcomps/{NESTEDTEMPLATECOMPONENTID}/tplattrs
+* POST: /tplroots/{CONTEXTTYPE}/{TEMPLATEROOTID}/tplcomps/{TEMPLATECOMPONENTID}/tplcomps/{NESTEDTEMPLATECOMPONENTID}/tplattrs (JSON: { "Name" : "testCatalogAttribute" } (name must be identical with corresponding CatalogAttribute))
+* GET: /tplroots/{CONTEXTTYPE}/{TEMPLATEROOTID}/tplcomps/{TEMPLATECOMPONENTID}/tplcomps/{NESTEDTEMPLATECOMPONENTID}/tplattrs/{NESTEDTEMPLATEATTRIBUTEID}
+* PUT: /tplroots/{CONTEXTTYPE}/{TEMPLATEROOTID}/tplcomps/{TEMPLATECOMPONENTID}/tplcomps/{NESTEDTEMPLATECOMPONENTID}/tplattrs/{NESTEDTEMPLATEATTRIBUTEID} (JSON: { "MimeType" : "myMimeType" })
+* DELETE: /tplroots/{CONTEXTTYPE}/{TEMPLATEROOTID}/tplcomps/{TEMPLATECOMPONENTID}/tplcomps/{NESTEDTEMPLATECOMPONENTID}/tplattrs/{NESTEDTEMPLATEATTRIBUTEID}
+* GET: /tplroots/{CONTEXTTYPE}/{TEMPLATEROOTID}/tplcomps/{TEMPLATECOMPONENTID}/tplcomps/{NESTEDTEMPLATECOMPONENTID}/tplattrs/searchattributes
+* GET: /tplroots/{CONTEXTTYPE}/{TEMPLATEROOTID}/tplcomps/{TEMPLATECOMPONENTID}/tplcomps/{NESTEDTEMPLATECOMPONENTID}/tplattrs/localizations
+
+**Business Object: TemplateTest**
+
+* GET: /tpltests
+* POST: /tpltests (JSON: { "Name" : "testTemplateTest" })
+* GET: /tpltests/{TEMPLATETESTID}
+* PUT: /tpltests/{TEMPLATETESTID} (JSON: { "MimeType" : "myMimeType" })
+* DELETE: /tpltests/{TEMPLATETESTID}
+* GET: /tpltests/searchattributes
+* GET: /tpltests/localizations
+
+**Business Object: TemplateTestStep**
+
+* GET: /tplteststeps
+* POST: /tplteststeps (JSON: { "Name" : "testTemplateTestStep" })
+* GET: /tplteststeps/{TEMPLATETESTSTEPID}
+* PUT: /tplteststeps/{TEMPLATETESTSTEPID} (JSON: { "MimeType" : "myMimeType" })
+* DELETE: /tplteststeps/{TEMPLATETESTSTEPID}
+* GET: /tplteststeps/searchattributes
+* GET: /tplteststeps/localizations
+
+**Business Object: TemplateTestStepUsage**
+
+* GET: /tpltests/{TEMPLATETESTID}/tplteststepusages
+* POST: /tpltests/{TEMPLATETESTID}/tplteststepusages (JSON: { "Name" : "testTemplateTestStepUsage", "TemplateTestStep" : "TEMPLATETESTSTEPID" })
+* GET: /tpltests/{TEMPLATETESTID}/tplteststepusages/{TEMPLATETESTSTEPUSAGEID}
+* DELETE: /tpltests/{TEMPLATETESTID}/tplteststepusages/{TEMPLATETESTSTEPUSAGEID}
+* GET: /tpltests/{TEMPLATETESTID}/tplteststepusages/searchattributes
+* GET: /tpltests/{TEMPLATETESTID}/tplteststepusages/localizations
+
+**Values endpoint**
+
+Values endpoint accepts `application/protobuf` and `application/json`. For larger amounts of data Protobuf should be preferred. The IDL-file for Protobuf is available in `org.eclipse.mdm.businessobjects/src/main/proto/mdm.proto`
+
+* POST: /values/read (Protobuf: in - ReadRequest, out - MeasuredValuesList)
+* POST: /values/write (Protobuf: in - WriteRequestList)
+* POST: /values/preview (Protobuf: in - PreviewRequest, out - PreviewValuesList)
+
+
+**Query endpoint**
+
+* http://{SERVER}:{PORT}/{APPLICATIONROOT}/mdm/query
+
+ _example:
+`curl -POST -H "Content-Type: application/json" -d '{"resultType": "test", "columns": ["Test.Name", "TestStep.Name"], "filters": { "sourceName": "SOURCENAME", "filter": "Test.Id gt 1", "searchString": ""}}'http://sa:sa@localhost:8080/org.eclipse.mdm.nucleus/mdm/query`
+* http://{SERVER}:{PORT}/{APPLICATIONROOT}/mdm/suggestions
+
+ _example: `curl -POST -H "Content-Type: application/json" -d '{"sourceNames": ["SOURCENAME"], "type": "Test", "attrName": "Name"}' http://sa:sa@localhost:8080/org.eclipse.mdm.nucleus/mdm/suggestions`
+
+**ATFX Import**
+
+POST: http://{SERVER}:{PORT}/{APPLICATIONROOT}/mdm/environments/{SOURCENAME}/import
+
+Imports an ATFX file into the specified environment. The ATFX file must conform to the openMDM5 datamodel.
+
+TODO Templates
+
+Three content-types are accepted:
+- application/xml: The ATFX file is sent in the body of the POST request.
+- multipart/form-data: The ATFX file and its binary files are provided as multipart form data. The field name represents the original file name and the field value the contents of the file. The ATFX file is detected by its file extension 'atfx' or the media type 'application/xml'. Only one ATFX file can be sent at a time.
+- application/zip: The ATFX file and its component files are provided as a zip file. The ATFX file is detected by its file extension 'atfx'. Only one ATFX file can be included in the zip file.
+
+The POST request returns a JSON-Object with the following properties:
+- state: Status of the import. Either `OK` or `FAILED`.
+- message: Error message in case the import fails.
+- stacktrace: Stacktrace in case the import fails.
+
+The returned HTTP status is either `200`, if the imported succeeded or `400`, if the import failed.
+
+
+**ATFX Export**
+
+POST: http://{SERVER}:{PORT}/{APPLICATIONROOT}/mdm/export
+
+Accepts a shopping basket XML file and exports the contained elements into an ATFX file.
+Currently it is only supported to export objects from one environment.
+
+Returned content types in response:
+- application/xml: The response body contains the exported ATFX file
+- application/zip: The response contains a zip file with the exported ATFX file and accompanying component files.
+
+###Example: file download
+
+* Login:
+
+`curl -XPOST --cookie-jar cookie -H "Content-Type: application/x-www-form-urlencoded" -d j_username=sa -d j_password=sa http://localhost:8080/org.eclipse.mdm.nucleus/j_security_check`
+
+* Request a test and extract the remotePath from the first file reference:
+
+`FILE_PATH="$(curl --cookie cookie -s http://localhost:8080/org.eclipse.mdm.nucleus/mdm/environments/MDMNVH/teststeps/10 | jq -r '.data[0].attributes[] | select (.name | contains("MDMLinks")) | .value[0].remotePath')"`
+
+* Urlescape remotePath if necessary:
+
+`FILE_PATH="$(echo $FILE_PATH | python -c 'import sys,urllib;print urllib.quote(sys.stdin.read().strip(), "")')"`
+
+* Request the file content:
+
+`curl --cookie cookie http://localhost:8080/org.eclipse.mdm.nucleus/mdm/environments/MDMNVH/teststeps/10/files/$FILE_PATH`
+
+
+## Preference Service
+Preference service stores its data to a relational database. The database connection is looked up by JNDI and the JNDI name and other database relevant parameters are specified in src/main/resources/META-INF/persistence.xml. The default JNDI name for the JDBC resource is set to jdbc/openMDM. This JDBC resource and its dependent JDBC Connection Pool has to be created and configured within the glassfish web administration console or through asadmin command line tool.
+
+Furthermore the schema has to be created in the configured database. Therefore database DDL scripts are available for PostgreSQL and Apache Derby databases in the folder `schema/org.eclipse.mdm.preferences` of the distribution. Other databases supported by EclipseLink may also work, but is up to the user to adapt the DDL scripts.
+
+### available rest URLs
+* http://{SERVER}:POART/{APPLICATIONROOT}/mdm/preferences
+* example: `curl -GET -H "Content-Type: application/json" http://localhost:8080/org.eclipse.mdm.nucleus/mdm/preferences?scope=SYSTEM&key=ignoredAttributes`
+* example: `curl -PUT -H "Content-Type: application/json" -d '{"scope": "SYSTEM", "key": "ignoredAttributes", "value": "[\"*.MimeType\"]"}' http://localhost:8080/org.eclipse.mdm.nucleus/mdm/preferences`
+* example: `curl -DELETE http://localhost:8080/org.eclipse.mdm.nucleus/mdm/preferences/ID`
+
+
+## FreeTextSearch
+### Configuration
+1. **start** ElasticSearch. ElasticSearch can be downloaded at https://www.elastic.co/products/elasticsearch. For testing purpose, it can be simply started by executing bin/run.bat
+2. **edit** the configuration (global.properties) to fit your environment. You need an ODS Server which supports Notifications. All fields have to be there, but can be empty. However certain ODS Servers ignore some parameters (e.g. PeakODS ignores pollingIntervall since it pushes notifications).
+3. **start up** the application. At the first run it will index the database. This might take a while. After that MDM registers itself as NotificationListener and adapts all changes one-by-one.
+
+### Run on dedicated server
+The Indexing is completely independent from the searching. So the Indexer can be freely deployed at any other machine. In the simplest case, the same steps as in Configuration have to be done. The application can then be deployed on any other machine. All components besides the FreeTextIndexer and its dependencies are not user. Those can be left out, if desired.
+
+## Connector and service.xml
+
+The service.xml contains all information necessary for the Connector-Service to connect to the available datasources/adapter instances. Since this information includes secret information like passwords, it is possible
+to provide lookups, which gives you the possibility to specify tokens as references to properties defined elsewhere.
+
+There are different lookups available:
+* sys: Looks up variables defined as system properties
+* env: Looks up variables defined as environment variables
+
+Example:
+`<param name="password">${env:odsPassword}</param>`
+
+
+##Known issues:
+If you run into "java.lang.ClassNotFoundException: javax.xml.parsers.ParserConfigurationException not found by org.eclipse.persistence.moxy" this is a bug described in https://bugs.eclipse.org/bugs/show_bug.cgi?id=463169 and https://java.net/jira/browse/GLASSFISH-21440.
+This solution is to replace GLASSFISH_HOME/glassfish/modules/org.eclipse.persistence.moxy.jar with this: http://central.maven.org/maven2/org/eclipse/persistence/org.eclipse.persistence.moxy/2.6.1/org.eclipse.persistence.moxy-2.6.1.jar
+
+
+If you run into "java.lang.ClassNotFoundException: com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector not found by com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider" you have to download http://central.maven.org/maven2/com/fasterxml/jackson/module/jackson-module-jaxb-annotations/2.5.1/jackson-module-jaxb-annotations-2.5.1.jar and put it under GLASSFISH_HOME/glassfish/domains/domain1/autodeploy/bundles
+
+## Client preferences
+
+The applications preferences are managed in the administration section. This section can be accessed via the `Administration` button in the main navigation bar or via
+* `http://../administration`.
+A preference is a pair of a unique key and a value. The key is composed of a prefix defining the purpose of the preference followed by an arbitrary but unique identifier string. It is recommended to choose the identifier the same as the preferences 'name' field, in case there is one. The value holds the preference's data in a Json string. The following preferences, sorted by their scope, can be set:
+
+User:
+ - Basket
+ - View
+ - Filter
+
+System:
+ - Node provider
+ - Shopping basket file extensions
+
+Source:
+ - Ignored attributes
+
+However, it might be necessary to reload the application before a newly defined preference is available or any changes on an existing preferences are applied.
+WARNING: Corrupted preferences can result in malfunctions of the application.
+
+### User scope
+A user scoped preference's area of effect is limited to the logged in user. All user scoped preferences can also be set in dialogs in the main application.
+
+1.) Basket
+ Basket preferences keys must start with the prefix `basket.nodes.`. This preference has the fields 'items' and 'name' and holds all the information for saved baskets. The field 'items' holds an array of MDMItems, providing the relevant information of a related node, i.e. 'source', 'type' and 'id'. The field 'name' defines the name, which is provided in the main application to load this basket.
+
+ ** Example:
+ { "items": [{"source":"MDMNVH","type":"Test","id":38}],
+ "name": "basketExample" }
+
+2.) View
+ View preferences keys must start with the prefix `tableview.view.` This preference has the fields 'columns' and 'name' and holds the layout information for the tables displaying the search results and the basket nodes.
+ The field 'columns' holds an array of ViewColumn objects. A ViewColumn is an Object with the fields 'type', 'name', 'sortOrder' and an optional field 'style'. The ViewColumn's 'type' can be set to all available MDM data types, i.e. `Project`, `Pool`, `Test`, `TestStep`, `Measurement`, `ChannelGroup`, `Channel`. The ViewColumn's 'name' field specifies an attribute, which must be an searchable attribute for the given 'type'. The ViewColumn's sortOrder can be set by the number `1` (ascending), `-1` (descending), or null (unsorted). Only one column of the array can have a non-null value sortOrder at a time. The ViewColumn's style element can hold any CSS-style object. However, it is supposed to contain only the columns width. The column order in the array is identically with the appearance in the table.
+ The view's field 'name' defines the name, which is provided in the main application to load this view.
+
+ **Example:
+ { "columns": [{"type":"Test","name":"Id","style":{"width":"75px"},"sortOrder":null}],
+ "name": "viewExample" }
+
+3.) Filter
+ Filter preferences keys must start with the prefix `filter.nodes.`. This preference has the fields 'conditions', 'name', 'environments', 'resultType' and 'fulltextQuery'. It provides the information for the attribute based / advanced search.
+ The field 'conditions' holds an array of Condition objects. A Condition specifies a search condition for attribute based search. It consists of the fields 'type', 'name', 'operator', 'value' and 'valueType'. The Condition's 'type' can be set to all available MDM data types, i.e. `Project`, `Pool`, `Test`, `TestStep`, `Measurement`, `ChannelGroup`, `Channel`. The Condition's 'name' field specifies an attribute, which must be an searchable attribute for the given 'type'. The Condition's 'operator' field, holds on of the following numbers: `0`(=), `1`(<), `2`(>), `3`(like). The Condition's 'value' field holds a string array containing input for the attribute based search. The Condition's 'resultType' field should match the type corresponding to the attribute specified in the 'name' filed, e.g. `string`, `date` or `long`.
+ The Filter's field 'name' defines the name, which is provided in the main application to load this filter.
+ The Filter's field 'environments' holds an string array with the names of the sources that should be included in the search.
+ The Filter's field 'resultType' can be set to all available MDM data types (see above). Only nodes of this type will be included in the search.
+ The Filter's field 'fulltextQuery' holds a string containing full text search input.
+
+ **Example:
+ { "conditions":[{"type":"Test","attribute":"Name","operator":0,"value":[],"valueType":"string"}],
+ "name":"filterExample",
+ "environments":["sourceName"],
+ "resultType":"Test",
+ "fulltextQuery":"" }
+
+
+### System scope
+System scoped preference are applied globally.
+
+1.) Node provider
+
+ The navigation tree structure can be defined via a node provider. The default node provider is set in
+ * ..\src\main\webapp\src\app\navigator\defaultnodeprovider.json.
+ It is recommended not to change the default node provider. Instead new node providers can be added as preferences. Their keys must start with the prefix ´nodeprovider.´. Once a custom node provider is supplied it can be selected in the dropdown menu in the navigation tree header.
+
+ I.) Structure
+
+ a) First layer/root nodes
+ In the node provider each layer of nodes of the navigation tree is defined in a nested object. The first layer of nodes, is always the environment level. This is necessary due to the provided endpoints. The first layer consists of the fields 'name', 'type', and 'children'. The field 'name' sets the name, which is displayed in the application to select the corresponding node provider. The field 'type' defines the data type of the nodes, which is always `Environments` on the first layer. The next layer of nodes are defined via the field 'children'.
+
+ b) Children
+ A child object consists of the fields 'type', 'query', and 'children'. The field 'type' sets the data type of this layer of nodes. It can be set to all available MDM data types, i.e. `Project`, `Pool`, `Test`, `TestStep`, `Measurement`, `ChannelGroup`, `Channel`. The filed 'query' holds the URL to load this layer of nodes. The first part of the query for each child object should be `/` plus the type of the layer in small letters followed by an `s`. For a nested child objected a filter is attached to the query in the form: `?filter=<parentType>.Id eq {<parentType>.Id}`. The placeholder <parentType> has to be replaced by the actual parent type (set in the field 'type' in the parent child or root layer, see example below). At runtime the curly braces will be replaced by the Id of the parent node. Further child objects, and thereby more sublayers, can be nested via the field 'children'. The children field does not need to be set for the last layer of nodes.
+
+ II.) Examples
+
+ a) Minimal node provider
+ { "name": "My name to display", "type": "Environment"}
+
+ b) node provider with two child layers
+ {
+ "name": "My name to display",
+ "type": "Environment",
+ "children": {
+ "type": "Project",
+ "query": "/projects",
+ "children": {
+ "type": "Pool",
+ "query": "/pools?filter=Project.Id eq {Project.Id}"
+ }
+ }
+ }
+
+2.) Shopping basket file extensions
+
+When downloading the contents of a shopping basket, a file with extension `mdm` is generated. Additional file extensions can be adding by poviding a preference with key `shoppingbasket.fileextensions`. Here you can define a list of objects with attributes 'label' and 'extension'. For example: `[ { "label": "MyTool", "extension": "mdm-mytool" }, { "label": "OtherTool", "extension": "mdm-other" } ]`. If `MyTool` has a file handler registered for the extension `mdm-mytool`, the application will be launched if the browser automatically opens the file after download.
+
+### Source scope
+Source scoped preferences are applied at any user but limited to the specified source. The source can be specified in the `Add Preference` or `Edit Preference` dialog.
+
+1.) Ignored Attributes
+The ignore attributes preference must have the exact key `ignoredAttributes`. An identifier must not be added. The preference specifies all attributes, which are supposed to be ignored in the detail view. The preference is a simple Json string holding a list of attributes in the form {"<type>.<AttributeName>"}. The placeholders <type> and <AttributeName> have to be replaced by the actual type and name of the attribute which should be ignored, respectively.
+
+**Example:
+["*.MimeType", "TestStep.Sortindex"]
+
+##Create a module
+Any MDM module needs to be a valid angular2 module. An angular2 module consists of one angular2 component and one ng-module at least. In the angular2 component any content can be defined. The component must be declared in a ng-module to grant accessibility in the rest of the application. In a module additional components and services can be defined. All related files should be stored in a new subfolder in the app folder
+* ..\org.eclipse.mdm.nucleus\org.eclipse.mdm.application\src\main\webapp\src\app.
+
+###Angular2 components (see example 1)
+A component is defined in a typescript file starting with the @Component() identifier. Any html content can be provided here in an inline template or via a link to an external html resource. Thereafter the component itself, which is supposed to hold any logic needed, is defined and exported.
+
+###Ng-module (see example 2)
+ On one hand the ng-module provides other MDM modules of the application, and thereby all the services and components declared within them, in this MDM module. The 'imports' array holds all modules from the application needed in this MDM module. It should always hold the MDMCoreModule, which provides basic functionalities. On the other hand a ng-module grants accessibility of components of this module in other directives (including the html template) within the module (in a 'declaration' array) or even in other parts of the application (in an 'export' array). For more details see *https://angular.io/docs/ts/latest/guide/ngmodule.html.
+
+ ** Minimal example
+ First create a new folder
+ * ..\org.eclipse.mdm.nucleus\org.eclipse.mdm.application\src\main\webapp\src\app\new-module
+
+ 1) Minimal angular2 component
+ Add a new typescript file named 'mdm-new.component.ts' with the following content:
+
+ import {Component} from '@angular/core';
+ @Component({template: '<h1>Example Module</h1>'})
+ export class MDMNewComponent {}
+
+ 2) Minimal ng-module
+ Add a new typescript file named 'mdm-new.module.ts' with the following content:
+
+ import { NgModule } from '@angular/core';
+ import { MDMCoreModule } from '../core/mdm-core.module';
+ import { MDMNewComponent } from './mdm-new.component';
+ @NgModule({imports: [MDMCoreModule], declarations: [MDMNewComponent]})
+ export class MDMNewModule {}
+
+###Embedding a module (no lazy loading)
+To embed this new module in MDM you have to register this module in the MDMModules Module.
+This is done by registering the component to **moduleRoutes** in **modules-routing.module.ts**:
+***
+ { path: 'new', component: MDMNewComponent}
+***
+
+Furthermore you have to define a display name for the registered route in the array returned by **getLinks** in **modules.component.ts**:
+***
+{ path: 'new', name: 'New Module' }
+***
+
+For further information refer to the Angular 2 documentation for modules & router:
+* https://angular.io/docs/ts/latest/guide/ngmodule.html
+* https://angular.io/docs/ts/latest/guide/router.html
+
+
+ ###Lazy loading and routing module
+ For lazy-loading (recommended in case there is a high number of modules) embedding of the module is slightly different.
+ ***
+ { path: 'example', loadChildren: '../example-module/mdm-example.module#MDMExampleModule'}
+ ***
+
+ Additionally, a ng-module, the so called routing module, is needed to provide the routes to this modules components.
+ ***
+ const moduleRoutes: Routes = [{ path: '', component: MDMExampleComponent }];
+ @NgModule({imports: [RouterModule.forChild(moduleRoutes)], exports: [RouterModule]})
+ export class MDMExampleRoutingModule {}
+ ***
+
+ The routing module needs to be declared in the ng-module of this module as well. A full example is provided in
+ * ..\org.eclipse.mdm.nucleus\org.eclipse.mdm.application\src\main\webapp\src\app\example-module
+
+
+ ###Filerelease module
+ The filerelease module is stored in the following folder:
+*..\org.eclipse.mdm.nucleus\org.eclipse.mdm.application\src\main\webapp\src\app\filerelease
+
+It can be embedded as any other module described above. Register to **moduleRoutes** in **modules-routing.module.ts**:
+***
+ { path: 'filerelease', component: MDMFilereleaseComponent }
+***
+
+Add entry to **links** array in **MDMModulesComponent**:
+***
+ { name: 'MDM Suche', path: 'search'}
+***
+
+To make the filerelease module available in the detail view it needs to be imported in the corresponding ng-module **mdm-detail.module.ts**.
+Thereafter, the MDMFilereleaseCreateComponent can be imported to the **mdm-detail-view.component.ts**. Then the following has to be added to the **mdm-detail-view.component.html** file:
+***
+ <mdm-filerelease-create [node]=selectedNode [disabled]="isReleasable()"></mdm-filerelease-create>
+***
+
+
+
+It should be located right after the add to basket button:
+***
+<div class="btn-group pull-right" role="group">
+ <button type="button" class="btn btn-default" (click)="add2Basket()" [disabled]="isShopable()">In den Warenkorb</button>
+ <mdm-filerelease-create [node]=selectedNode [disabled]="isReleasable()"></mdm-filerelease-create>
+</div>
+***
+
+## Copyright and License ##
+Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+
+ See the NOTICE file(s) distributed with this work for additional
+ information regarding copyright ownership.
+
+ This program and the accompanying materials are made available under the
+ terms of the Eclipse Public License v. 2.0 which is available at
+ http://www.eclipse.org/legal/epl-2.0.
+
+ SPDX-License-Identifier: EPL-2.0
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/WebContent/META-INF/MANIFEST.MF b/org.eclipse.mdm.nucleus/WebContent/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..5e94951
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/WebContent/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Class-Path:
+
diff --git a/org.eclipse.mdm.nucleus/build.gradle b/org.eclipse.mdm.nucleus/build.gradle
new file mode 100644
index 0000000..6ca6fb4
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/build.gradle
@@ -0,0 +1,197 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+plugins {
+ id "org.sonarqube" version "2.5"
+ id "io.swagger.core.v3.swagger-gradle-plugin" version "2.0.8"
+}
+
+group = 'org.eclipse.mdm'
+version = '5.1.0M7'
+
+description = 'mdm nucleus'
+apply plugin: 'war'
+apply plugin: 'maven'
+apply plugin: 'eclipse'
+apply plugin: 'jacoco'
+apply plugin: 'org.sonarqube'
+
+sourceCompatibility = 1.8
+
+repositories {
+ mavenLocal()
+ mavenCentral()
+}
+
+subprojects {
+ configurations.all {
+ resolutionStrategy.dependencySubstitution {
+ substitute module("de.rechner:openatfx") with project(":org.eclipse.mdm.openatfx")
+ }
+ }
+
+ group = rootProject.group
+ version = rootProject.version
+
+ apply plugin: 'eclipse'
+ apply plugin: 'java'
+ apply plugin: 'maven'
+ apply plugin: 'jacoco'
+
+ sourceCompatibility = 1.8
+
+ repositories {
+ mavenLocal()
+ mavenCentral()
+ }
+
+ dependencies {
+ compileOnly 'org.slf4j:slf4j-api:1.7.25'
+ compileOnly 'javax:javaee-api:7.0'
+ compile 'io.swagger.core.v3:swagger-annotations:2.0.8'
+ runtime 'ch.qos.logback:logback-classic:1.2.3'
+
+ testCompile 'junit:junit:4.12'
+ testCompile 'org.assertj:assertj-core:3.6.2'
+ testCompile 'org.mockito:mockito-core:2.13.0'
+ testCompile 'javax:javaee-api:7.0'
+ }
+
+ task sourcesJar(type: Jar, dependsOn: classes) {
+ classifier = 'sources'
+ from sourceSets.main.allSource
+ }
+
+ artifacts {
+ archives sourcesJar
+ }
+}
+
+clean {
+ dependsOn gradle.includedBuilds*.task(':clean')
+}
+
+configurations.runtime {
+ resolutionStrategy.dependencySubstitution {
+ substitute module("de.rechner:openatfx") with project(":org.eclipse.mdm.openatfx")
+ }
+ exclude group: 'com.sun.mail', module: 'javax.mail'
+ exclude group: 'javax.ws.rs', module: 'javax.ws.rs-api'
+ exclude group: 'javax.activation', module: 'activation'
+ exclude group: 'javax.annotation', module: 'javax.annotation-api'
+ exclude group: 'javax.inject', module: 'javax.inject'
+ exclude group: 'org.glassfish.hk2.external', module: 'javax.inject'
+ exclude group: 'commons-logging', module: 'commons-logging'
+ // exclude guava dependencies
+ exclude group: 'com.google.code.findbugs', module: 'jsr305'
+ exclude group: 'com.google.errorprone', module: 'error_prone_annotations'
+ exclude group: 'com.google.j2objc', module: 'j2objc-annotations'
+ exclude group: 'org.codehaus.mojo', module: 'animal-sniffer-annotations'
+ exclude group: 'org.checkerframework', module: 'checker-compat-qual'
+}
+
+dependencies {
+ runtime project(':org.eclipse.mdm.application')
+ runtime project(':org.eclipse.mdm.apicopy')
+
+ compile 'org.webjars:swagger-ui:3.23.0'
+ // adapters
+ runtime project(':org.eclipse.mdm.api.atfxadapter')
+ runtime "org.eclipse.mdm:org.eclipse.mdm.api.odsadapter:${version}"
+}
+
+
+resolve {
+ outputPath = file('build/openapi')
+ outputFileName = 'openapi'
+ outputFormat = 'JSONANDYAML'
+ prettyPrint = 'TRUE'
+ classpath = sourceSets.main.runtimeClasspath
+ resourcePackages = ['org.eclipse.mdm']
+ openApiFile = file('src/main/openapi/openApiFile.json')
+}
+
+tasks.war.dependsOn("resolve")
+
+task collectConfiguration() {
+ doLast {
+ subprojects.each { subproject ->
+ copy {
+ from "${project.projectDir}/${subproject.name}/src/main/configuration/"
+ into "${project.projectDir}/build/tmp/openmdm_application/configuration/${subproject.name}"
+ }
+ }
+ }
+}
+
+task copySchema(dependsOn: ':org.eclipse.mdm.preferences:generateSchema') {
+ doLast {
+ copy {
+ from "${project.projectDir}/org.eclipse.mdm.preferences/build/generated-schema/"
+ into "${project.projectDir}/build/tmp/openmdm_application/schema/org.eclipse.mdm.preferences"
+ }
+ }
+}
+
+task distribute(type: Zip) {
+ archiveName = "openMDM_application-${version}.zip"
+
+ from "${project.projectDir}/LICENSE.txt"
+ from "${project.projectDir}/NOTICE.txt"
+ from "${project.projectDir}/readme.md"
+ from "${project.projectDir}/release_notes.md"
+
+ from "${project.projectDir}/doc/GettingStarted_mdmbl.pdf"
+ from "${project.projectDir}/doc/Installation Guide for the openMDM5 Application.pdf"
+
+ from "${project.projectDir}/build/tmp/openmdm_application"
+ from "${project.projectDir}/build/libs/"
+}
+distribute.dependsOn(collectConfiguration)
+distribute.dependsOn(copySchema)
+
+war {
+ from ('org.eclipse.mdm.application/build/node/dist') {
+ include('**/*')
+ }
+ from ("${project.projectDir}/build/openapi/") {
+ include('**/*')
+ filter(org.apache.tools.ant.filters.ReplaceTokens, tokens: [VERSION: version])
+ }
+ from ("${project.projectDir}/src/main/webapp/") {
+ include('**/*')
+ }
+
+
+ webXml = file('org.eclipse.mdm.application/src/main/webconfig/web.xml')
+ webInf {from 'org.eclipse.mdm.application/src/main/webconfig/glassfish-web.xml'}
+
+ metaInf { from 'NOTICE.txt' }
+ metaInf { from 'LICENSE.txt' }
+}
+
+war.finalizedBy(distribute)
+
+jacoco {
+ toolVersion = "0.7.6.201602180812"
+ reportsDir = file("${project.buildDir}/jacoco/test.exec")
+}
+
+sonarqube {
+ properties {
+ property "sonar.java.coveragePlugin", "jacoco"
+ property "sonar.jacoco.reportPaths", "${project.buildDir}/jacoco/test.exec"
+ }
+}
+tasks["sonarqube"].dependsOn "org.eclipse.mdm.application:map_tslint"
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/doc/GettingStarted_mdmbl.pdf b/org.eclipse.mdm.nucleus/doc/GettingStarted_mdmbl.pdf
new file mode 100644
index 0000000..4a231a6
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/doc/GettingStarted_mdmbl.pdf
Binary files differ
diff --git a/org.eclipse.mdm.nucleus/doc/Installation Guide for the openMDM5 Application.pdf b/org.eclipse.mdm.nucleus/doc/Installation Guide for the openMDM5 Application.pdf
new file mode 100644
index 0000000..8b4b060
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/doc/Installation Guide for the openMDM5 Application.pdf
Binary files differ
diff --git a/org.eclipse.mdm.nucleus/eclipse_formatter.xml b/org.eclipse.mdm.nucleus/eclipse_formatter.xml
new file mode 100644
index 0000000..eb0b582
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/eclipse_formatter.xml
@@ -0,0 +1,347 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<profiles version="16">
+<profile kind="CodeFormatterProfile" name="openMDM 5 Formatter (Eclipse built-in 2019-3)" version="16">
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment" value="common_lines"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_logical_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation" value="common_lines"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement" value="common_lines"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.indentation.size" value="4"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration" value="common_lines"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.align_with_spaces" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.disabling_tag" value="@formatter:off"/>
+<setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="2"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement" value="common_lines"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.enabling_tag" value="@formatter:on"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_logical_operator" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line" value="one_line_never"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="80"/>
+<setting id="org.eclipse.jdt.core.formatter.use_on_off_tags" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_method_body_on_one_line" value="one_line_never"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line" value="one_line_never"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line" value="one_line_never"/>
+<setting id="org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line" value="one_line_never"/>
+<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause" value="common_lines"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_additive_operator" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_relational_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line" value="one_line_never"/>
+<setting id="org.eclipse.jdt.core.formatter.wrap_before_shift_operator" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_lambda_body" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_type_parameters" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_loops" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_relational_operator" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation" value="common_lines"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_additive_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_module_statements" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line" value="one_line_never"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="80"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_additive_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_method_declaration" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.wrap_before_conditional_operator" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_shift_operator" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines" value="2147483647"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_resources_in_try" value="80"/>
+<setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause" value="common_lines"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_code_block_on_one_line" value="one_line_never"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="4"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="2"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.wrap_before_assignment_operator" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration" value="common_lines"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line" value="one_line_never"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_type_arguments" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_label" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_logical_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.wrap_before_relational_operator" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_block_comments" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.indent_tag_description" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_string_concatenation" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.wrap_before_logical_operator" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_shift_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration" value="common_lines"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_shift_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line" value="one_line_never"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.wrap_before_additive_operator" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.join_lines_in_comments" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="tab"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_relational_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.wrap_before_string_concatenation" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="120"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>
+</profile>
+</profiles>
diff --git a/org.eclipse.mdm.nucleus/gradle/wrapper/gradle-wrapper.jar b/org.eclipse.mdm.nucleus/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..7a3265e
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/org.eclipse.mdm.nucleus/gradle/wrapper/gradle-wrapper.properties b/org.eclipse.mdm.nucleus/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..b82e006
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-bin.zip
diff --git a/org.eclipse.mdm.nucleus/gradlew b/org.eclipse.mdm.nucleus/gradlew
new file mode 100755
index 0000000..cccdd3d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/gradlew
@@ -0,0 +1,172 @@
+#!/usr/bin/env sh
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+ cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"
diff --git a/org.eclipse.mdm.nucleus/gradlew.bat b/org.eclipse.mdm.nucleus/gradlew.bat
new file mode 100644
index 0000000..e95643d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/gradlew.bat
@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/.gitignore b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/.gitignore
new file mode 100644
index 0000000..49678ad
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/.gitignore
@@ -0,0 +1,17 @@
+# eclipse
+.classpath
+.project
+.settings/
+bin/
+
+# gradle
+.gradle
+build/
+
+# intellij
+.idea/
+out/
+*.ipr
+*.iml
+*.iws
+/bin/
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/build.gradle b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/build.gradle
new file mode 100644
index 0000000..95dbed0
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/build.gradle
@@ -0,0 +1,41 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+description = 'MDM API - ATFXAdapter'
+
+configurations.all {
+ /* openatfx has a dependency on ODS corba interface classses, but we
+ * use the classes generated by org.eclipse.mdm.api.odsadapter and
+ * thus exclude the dependency from openatfx
+ */
+ exclude group: 'org.asam', module: 'ods'
+}
+
+dependencies {
+ compile 'org.slf4j:slf4j-api:1.7.25'
+ compile project(':org.eclipse.mdm.openatfx')
+
+ // MDM5 API
+ compile "org.eclipse.mdm:org.eclipse.mdm.api.odsadapter:${version}"
+
+ testRuntime 'ch.qos.logback:logback-classic:1.2.3'
+ testCompile 'junit:junit:4.12'
+ testCompile 'org.assertj:assertj-core:3.6.2'
+ testCompile 'org.mockito:mockito-core:2.13.0'
+}
+
+jar {
+ metaInf { from 'NOTICE.txt' }
+ metaInf { from 'LICENSE.txt' }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/ATFXContext.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/ATFXContext.java
new file mode 100644
index 0000000..6948a8d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/ATFXContext.java
@@ -0,0 +1,189 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.api.atfxadapter;
+
+import java.util.Map;
+import java.util.Optional;
+
+import org.asam.ods.AoException;
+import org.asam.ods.AoSession;
+import org.asam.ods.ErrorCode;
+import org.asam.ods.SeverityFlag;
+import org.eclipse.mdm.api.base.adapter.ModelManager;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.base.query.QueryService;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.api.dflt.model.EntityFactory;
+import org.eclipse.mdm.api.odsadapter.lookup.config.EntityConfigRepositoryLoader;
+import org.eclipse.mdm.api.odsadapter.query.ODSEntityFactory;
+import org.eclipse.mdm.api.odsadapter.query.ODSModelManager;
+import org.eclipse.mdm.api.odsadapter.query.ODSQueryService;
+import org.omg.CORBA.ORB;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * ATFXContext encapsulates a session to the ASAM ODS CORBA API of openATFX
+ *
+ */
+public class ATFXContext implements ApplicationContext {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ATFXContext.class);
+
+ private Map<String, String> parameters;
+
+ private ODSModelManager modelManager;
+ private ATFXEntityManager entityManager;
+
+ /**
+ * Creates a new ATFX application context.
+ *
+ * @param orb the CORBA ORB used to connect to the ODS API
+ * @param aoSession
+ * @param parameters
+ * @throws AoException
+ */
+ public ATFXContext(ORB orb, AoSession aoSession, Map<String, String> parameters) throws AoException {
+
+ final String ENTITYCONFIGREPOSITORYLOADERCLASS_ATTRIBUTE_NAME = "entityConfigRepositoryLoaderClass";
+
+ // check parameters for configured custom EntityConfigRepositoryLoader
+ String entityConfigRepositoryLoaderClassName = parameters.get(ENTITYCONFIGREPOSITORYLOADERCLASS_ATTRIBUTE_NAME);
+
+ // if custom loader is configured
+ if (entityConfigRepositoryLoaderClassName != null) {
+ EntityConfigRepositoryLoader entityConfigRepositoryLoader;
+ try {
+ entityConfigRepositoryLoader = Thread.currentThread().getContextClassLoader()
+ .loadClass(entityConfigRepositoryLoaderClassName).asSubclass(EntityConfigRepositoryLoader.class)
+ .newInstance();
+ this.modelManager = new ODSModelManager(orb, aoSession, entityConfigRepositoryLoader);
+ } catch (Exception e) {
+ // just log an error, but recover using the default loader
+ LOGGER.error("Failed to initialize EntityConfigRepositoryLoaderClass. Using default.", e);
+ this.modelManager = new ODSModelManager(orb, aoSession, new ATFXEntityConfigRepositoryLoader());
+ }
+ }
+
+ // if not, use default
+ else {
+ this.modelManager = new ODSModelManager(orb, aoSession, new ATFXEntityConfigRepositoryLoader());
+ }
+
+ this.parameters = parameters;
+ this.entityManager = new ATFXEntityManager(this);
+
+ LOGGER.debug("ATFXContext initialized.");
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Optional<EntityManager> getEntityManager() {
+ return Optional.of(entityManager);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Optional<ModelManager> getModelManager() {
+ return Optional.of(modelManager);
+ }
+
+ @Override
+ public Optional<EntityFactory> getEntityFactory() {
+ try {
+ return Optional.of(new ODSEntityFactory(modelManager, entityManager.loadLoggedOnUser()));
+ } catch (DataAccessException e) {
+ throw new IllegalStateException("Unable to load instance of the logged in user.");
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Optional<QueryService> getQueryService() {
+ return Optional.of(new ODSQueryService(modelManager));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Map<String, String> getParameters() {
+ return parameters;
+ }
+
+ /**
+ * @returns the string "atfx"
+ */
+ @Override
+ public String getAdapterType() {
+ return "atfx";
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void close() {
+ try {
+ modelManager.close();
+ } catch (AoException e) {
+ LOGGER.warn("Unable to close sesssion due to: " + e.reason, e);
+ }
+ }
+
+ /**
+ * Returns the {@link ATFXModelManager} used for this context.
+ *
+ * @return the {@link ATFXModelManager}
+ */
+ public ODSModelManager getODSModelManager() {
+ return modelManager;
+ }
+
+ /**
+ * Returns the {@link AoSession} used for this context.
+ *
+ * @return {@link AoSession} used for this context.
+ */
+ public AoSession getAoSession() {
+ return modelManager.getAoSession();
+ }
+
+ /**
+ * Returns the ORB used for this context
+ *
+ * @return ORB used for this context
+ */
+ public ORB getORB() {
+ return modelManager.getORB();
+ }
+
+ /**
+ * Returns a new {@link ATFXContext} with a new ODS co-session.
+ *
+ * @return The created {@code ODSContext} is returned.
+ * @throws AoException Thrown on errors.
+ */
+ public ATFXContext newContext() throws AoException {
+ throw new AoException(ErrorCode.AO_NOT_IMPLEMENTED, SeverityFlag.ERROR, 0,
+ "Method 'createCoSession' not implemented in openATFX");
+ }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/ATFXContextFactory.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/ATFXContextFactory.java
new file mode 100644
index 0000000..45462f4
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/ATFXContextFactory.java
@@ -0,0 +1,53 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.api.atfxadapter;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.Map;
+
+import org.asam.ods.AoException;
+import org.asam.ods.AoSession;
+import org.eclipse.mdm.api.base.ConnectionException;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.ApplicationContextFactory;
+import org.omg.CORBA.ORB;
+
+import de.rechner.openatfx.AoServiceFactory;
+
+public class ATFXContextFactory implements ApplicationContextFactory {
+
+ private final ORB orb = ORB.init(new String[] {}, System.getProperties());
+
+ @Override
+ public ApplicationContext connect(Map<String, String> parameters) throws ConnectionException {
+ File atfxFile = new File(parameters.get("atfxfile"));
+
+ try {
+ AoSession aoSession;
+ if (atfxFile.exists() && Files.size(atfxFile.toPath()) > 0L) {
+ aoSession = AoServiceFactory.getInstance().newAoSession(orb, atfxFile);
+ } else {
+ throw new ConnectionException(
+ "Cannot open session on a not existing or empty ATFX file: " + atfxFile.getAbsolutePath());
+ }
+ return new ATFXContext(orb, aoSession, parameters);
+ } catch (AoException e) {
+ throw new ConnectionException("Error " + e.reason, e);
+ } catch (IOException e) {
+ throw new ConnectionException("Error reading ATFX file " + atfxFile.getAbsolutePath(), e);
+ }
+ }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/ATFXEntityConfigRepositoryLoader.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/ATFXEntityConfigRepositoryLoader.java
new file mode 100644
index 0000000..11f3ffc
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/ATFXEntityConfigRepositoryLoader.java
@@ -0,0 +1,187 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.api.atfxadapter;
+
+import java.util.Locale;
+
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.adapter.Relation;
+import org.eclipse.mdm.api.base.model.Channel;
+import org.eclipse.mdm.api.base.model.ChannelGroup;
+import org.eclipse.mdm.api.base.model.ContextComponent;
+import org.eclipse.mdm.api.base.model.ContextRoot;
+import org.eclipse.mdm.api.base.model.ContextSensor;
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.base.model.Measurement;
+import org.eclipse.mdm.api.base.model.Parameter;
+import org.eclipse.mdm.api.base.model.ParameterSet;
+import org.eclipse.mdm.api.base.model.PhysicalDimension;
+import org.eclipse.mdm.api.base.model.Quantity;
+import org.eclipse.mdm.api.base.model.Sortable;
+import org.eclipse.mdm.api.base.model.Test;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.base.model.Unit;
+import org.eclipse.mdm.api.dflt.model.Pool;
+import org.eclipse.mdm.api.dflt.model.Project;
+import org.eclipse.mdm.api.odsadapter.lookup.config.DefaultEntityConfigRepositoryLoader;
+import org.eclipse.mdm.api.odsadapter.lookup.config.EntityConfig;
+import org.eclipse.mdm.api.odsadapter.lookup.config.EntityConfig.Key;
+import org.eclipse.mdm.api.odsadapter.lookup.config.EntityConfigRepository;
+import org.eclipse.mdm.api.odsadapter.lookup.config.EntityConfigRepositoryLoader;
+import org.eclipse.mdm.api.odsadapter.query.ODSEntityType;
+import org.eclipse.mdm.api.odsadapter.query.ODSModelManager;
+import org.eclipse.mdm.api.odsadapter.utils.ODSUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ATFXEntityConfigRepositoryLoader implements EntityConfigRepositoryLoader {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(DefaultEntityConfigRepositoryLoader.class);
+
+ EntityConfigRepository entityConfigRepository;
+
+ public ATFXEntityConfigRepositoryLoader() {
+ }
+
+ /**
+ * Loads the {@link EntityConfig}s.
+ *
+ * @return
+ */
+ @Override
+ public EntityConfigRepository loadEntityConfigurations(ODSModelManager modelManager) {
+ LOGGER.debug("Loading entity configurations...");
+ long start = System.currentTimeMillis();
+
+ entityConfigRepository = new EntityConfigRepository();
+
+ // Environment | Project | Pool | PhysicalDimension | User | Measurement
+ // | ChannelGroup
+ entityConfigRepository.register(create(modelManager, new Key<>(Environment.class), "Environment", false));
+ entityConfigRepository.register(create(modelManager, new Key<>(Project.class), "Project", false));
+ entityConfigRepository.register(create(modelManager, new Key<>(Pool.class), "StructureLevel", true));
+ entityConfigRepository
+ .register(create(modelManager, new Key<>(PhysicalDimension.class), "PhysDimension", false));
+ entityConfigRepository.register(create(modelManager, new Key<>(Measurement.class), "MeaResult", false));
+ entityConfigRepository.register(create(modelManager, new Key<>(ChannelGroup.class), "SubMatrix", false));
+
+ // Unit
+ EntityConfig<Unit> unitConfig = create(modelManager, new Key<>(Unit.class), "Unit", false);
+ unitConfig.addMandatory(entityConfigRepository.findRoot(new Key<>(PhysicalDimension.class)));
+ entityConfigRepository.register(unitConfig);
+
+ // Quantity
+ EntityConfig<Quantity> quantityConfig = create(modelManager, new Key<>(Quantity.class), "Quantity", false);
+ quantityConfig.addMandatory(entityConfigRepository.findRoot(new Key<>(Unit.class)));
+ entityConfigRepository.register(quantityConfig);
+
+ // Channel
+ EntityConfig<Channel> channelConfig = create(modelManager, new Key<>(Channel.class), "MeaQuantity", false);
+ channelConfig.addMandatory(entityConfigRepository.findRoot(new Key<>(Unit.class)));
+ channelConfig.addMandatory(entityConfigRepository.findRoot(new Key<>(Quantity.class)));
+ entityConfigRepository.register(channelConfig);
+
+ // ParameterSet
+ EntityConfig<Parameter> parameterConfig = create(modelManager, new Key<>(Parameter.class), "ResultParameter",
+ true);
+ parameterConfig.addOptional(entityConfigRepository.findRoot(new Key<>(Unit.class)));
+ EntityConfig<ParameterSet> parameterSetConfig = create(modelManager, new Key<>(ParameterSet.class),
+ "ResultParameterSet", true);
+ parameterSetConfig.addChild(parameterConfig);
+ entityConfigRepository.register(parameterSetConfig);
+
+ // TestStep
+ EntityConfig<TestStep> testStepConfig = create(modelManager, new Key<>(TestStep.class), "TestStep", true);
+ testStepConfig.setComparator(Sortable.COMPARATOR);
+ entityConfigRepository.register(testStepConfig);
+
+ // Test
+ EntityConfig<Test> testConfig = create(modelManager, new Key<>(Test.class), "Test", true);
+ entityConfigRepository.register(testConfig);
+
+ // ContextRoots
+ registerContextRoot(modelManager, ContextType.UNITUNDERTEST);
+ registerContextRoot(modelManager, ContextType.TESTSEQUENCE);
+ registerContextRoot(modelManager, ContextType.TESTEQUIPMENT);
+
+ LOGGER.debug("Entity configurations loaded in {} ms.", System.currentTimeMillis() - start);
+
+ return entityConfigRepository;
+ }
+
+ /**
+ * Loads the {@link EntityConfig}s required for {@link ContextRoot} with given
+ * {@link ContextType}.
+ *
+ * @param contextType The {@code ContextType}.
+ */
+ private void registerContextRoot(ODSModelManager modelManager, ContextType contextType) {
+ EntityConfig<ContextRoot> contextRootConfig = create(modelManager, new Key<>(ContextRoot.class, contextType),
+ ODSUtils.CONTEXTTYPES.get(contextType), true);
+ for (Relation contextComponentRelation : contextRootConfig.getEntityType().getChildRelations()) {
+ EntityType contextComponentEntityType = contextComponentRelation.getTarget();
+ EntityConfig<ContextComponent> contextComponentConfig = create(modelManager,
+ new Key<>(ContextComponent.class, contextType), contextComponentEntityType.getName(), true);
+ contextRootConfig.addChild(contextComponentConfig);
+ if (contextType.isTestEquipment()) {
+ for (Relation contextSensorRelation : contextComponentEntityType.getChildRelations()) {
+ EntityType contextSensorEntityType = contextSensorRelation.getTarget();
+ EntityConfig<ContextSensor> contextSensorConfig = create(modelManager,
+ new Key<>(ContextSensor.class), contextSensorEntityType.getName(), true);
+ contextComponentConfig.addChild(contextSensorConfig);
+ }
+ }
+ }
+ entityConfigRepository.register(contextRootConfig);
+ }
+
+ /**
+ * Creates a new {@link EntityConfig}.
+ *
+ * @param <T> The entity type.
+ * @param key Used as identifier.
+ * @param typeName Name of the associated {@link EntityType}.
+ * @param appendName Flag indicates whether to append the entity types base name
+ * to the MIME type.
+ * @return The created {@code EntityConfig} is returned.
+ */
+ private <T extends Entity> EntityConfig<T> create(ODSModelManager modelManager, Key<T> key, String typeName,
+ boolean appendName) {
+ EntityConfig<T> entityConfig = new EntityConfig<>(key);
+ ODSEntityType entityType = (ODSEntityType) modelManager.getEntityType(typeName);
+ entityConfig.setEntityType(entityType);
+ entityConfig.setMimeType(buildDefaultMimeType(entityType, appendName));
+ return entityConfig;
+ }
+
+ /**
+ * Creates a default MIME type for given {@link EntityType}.
+ *
+ * @param entityType The {@code EntityType}.
+ * @param appendName Flag indicates whether to append the entity types base name
+ * to the MIME type.
+ * @return The created MIME type {@code String} is returned.
+ */
+ private String buildDefaultMimeType(ODSEntityType entityType, boolean appendName) {
+ StringBuilder sb = new StringBuilder();
+ sb.append("application/x-asam.");
+ sb.append(entityType.getBaseName().toLowerCase(Locale.ROOT));
+ if (appendName) {
+ sb.append('.').append(entityType.getName().toLowerCase(Locale.ROOT));
+ }
+ return sb.toString();
+ }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/ATFXEntityManager.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/ATFXEntityManager.java
new file mode 100644
index 0000000..c42c71f
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/ATFXEntityManager.java
@@ -0,0 +1,417 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.api.atfxadapter;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.EnumMap;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Optional;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.asam.ods.AoException;
+import org.asam.ods.ApplicationStructure;
+import org.asam.ods.ElemId;
+import org.asam.ods.InstanceElement;
+import org.asam.ods.T_LONGLONG;
+import org.eclipse.mdm.api.atfxadapter.transaction.ATFXTransaction;
+import org.eclipse.mdm.api.base.ServiceNotProvidedException;
+import org.eclipse.mdm.api.base.Transaction;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.adapter.Relation;
+import org.eclipse.mdm.api.base.massdata.ReadRequest;
+import org.eclipse.mdm.api.base.model.Channel;
+import org.eclipse.mdm.api.base.model.ChannelGroup;
+import org.eclipse.mdm.api.base.model.ContextDescribable;
+import org.eclipse.mdm.api.base.model.ContextRoot;
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.base.model.MeasuredValues;
+import org.eclipse.mdm.api.base.model.StatusAttachable;
+import org.eclipse.mdm.api.base.model.User;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.base.query.Filter;
+import org.eclipse.mdm.api.base.query.JoinType;
+import org.eclipse.mdm.api.base.query.Query;
+import org.eclipse.mdm.api.base.query.QueryService;
+import org.eclipse.mdm.api.base.query.Record;
+import org.eclipse.mdm.api.base.query.Result;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.api.dflt.model.Classification;
+import org.eclipse.mdm.api.dflt.model.Status;
+import org.eclipse.mdm.api.odsadapter.ODSContext;
+import org.eclipse.mdm.api.odsadapter.ODSContextFactory;
+import org.eclipse.mdm.api.odsadapter.ODSEntityManager;
+import org.eclipse.mdm.api.odsadapter.ReadRequestHandler;
+import org.eclipse.mdm.api.odsadapter.lookup.EntityLoader;
+import org.eclipse.mdm.api.odsadapter.lookup.config.EntityConfig.Key;
+import org.eclipse.mdm.api.odsadapter.query.ODSEntityType;
+import org.eclipse.mdm.api.odsadapter.query.ODSModelManager;
+import org.eclipse.mdm.api.odsadapter.utils.ODSConverter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Strings;
+
+/**
+ * ASAM ODS implementation of the {@link EntityManager} interface.
+ *
+ * @see ODSEntityManager
+ */
+public class ATFXEntityManager implements EntityManager {
+ private static final Logger LOGGER = LoggerFactory.getLogger(ATFXEntityManager.class);
+
+ private final ATFXContext context;
+ private final ODSModelManager odsModelManager;
+ private final QueryService queryService;
+ private final EntityLoader entityLoader;
+
+ /**
+ * Constructor.
+ *
+ * @param context The {@link ODSContext}.
+ */
+ public ATFXEntityManager(ATFXContext context) {
+ this.context = context;
+ this.odsModelManager = context.getODSModelManager();
+ this.queryService = context.getQueryService()
+ .orElseThrow(() -> new ServiceNotProvidedException(QueryService.class));
+ entityLoader = new EntityLoader(odsModelManager, queryService);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Environment loadEnvironment() throws DataAccessException {
+ List<Environment> environments = loadAll(Environment.class);
+ if (environments.size() != 1) {
+ throw new DataAccessException("Unable to laod the environment entity.");
+ }
+
+ return environments.get(0);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Optional<User> loadLoggedOnUser() throws DataAccessException {
+ return Optional.empty();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public <T extends Entity> List<T> load(Class<T> entityClass, Collection<String> instanceIDs)
+ throws DataAccessException {
+ return entityLoader.loadAll(new Key<>(entityClass), instanceIDs);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public <T extends Entity> List<T> load(Class<T> entityClass, ContextType contextType,
+ Collection<String> instanceIDs) throws DataAccessException {
+ return entityLoader.loadAll(new Key<>(entityClass, contextType), instanceIDs);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public <T extends Entity> Optional<T> loadParent(Entity child, Class<T> entityClass) throws DataAccessException {
+ EntityType parentEntityType = odsModelManager.getEntityType(entityClass);
+ EntityType childEntityType = odsModelManager.getEntityType(child);
+
+ Optional<String> instanceID = Optional.empty();
+
+ if (child instanceof Channel && ChannelGroup.class.equals(entityClass)) {
+ // this covers the gap between channel and channel group via local column
+ EntityType localColumnEntityType = odsModelManager.getEntityType("LocalColumn");
+
+ Relation relLocalColumnToChannel = localColumnEntityType.getRelation(childEntityType);
+ Relation relLocalColumnToChannelGroup = localColumnEntityType.getRelation(parentEntityType);
+
+ Optional<String> localColumnID = queryService.createQuery().select(localColumnEntityType.getIDAttribute())
+ .fetchSingleton(Filter.idOnly(relLocalColumnToChannel, child.getID()))
+ .map(r -> r.getRecord(localColumnEntityType)).map(r -> r.getID());
+
+ if (localColumnID.isPresent()) {
+ instanceID = queryService.createQuery().select(relLocalColumnToChannelGroup.getAttribute())
+ .fetchSingleton(Filter.idOnly(localColumnEntityType, localColumnID.get()))
+ .map(r -> r.getRecord(localColumnEntityType))
+ .map(r -> r.getID(relLocalColumnToChannelGroup).get());
+ }
+ } else {
+ Relation relationToParent = childEntityType.getRelation(parentEntityType);
+
+ Query query = queryService.createQuery().select(relationToParent.getAttribute());
+ instanceID = query.fetchSingleton(Filter.idOnly(childEntityType, child.getID()))
+ .map(r -> r.getRecord(childEntityType)).map(r -> r.getID(relationToParent).get());
+ }
+
+ if (instanceID.isPresent()) {
+ return Optional.of(entityLoader.load(new Key<>(entityClass), instanceID.get()));
+ }
+
+ return Optional.empty();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public <T extends Entity> List<T> loadAll(Class<T> entityClass, String pattern) throws DataAccessException {
+ return entityLoader.loadAll(new Key<>(entityClass), pattern);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public <T extends StatusAttachable> List<T> loadAll(Class<T> entityClass, Status status, String pattern)
+ throws DataAccessException {
+ EntityType entityType = odsModelManager.getEntityType(entityClass);
+ EntityType classificationType = odsModelManager.getEntityType(Classification.class);
+ EntityType statusEntityType = odsModelManager.getEntityType(status.getTypeName());
+
+ List<String> instanceIDs = queryService.createQuery().join(entityType, classificationType)
+ .join(classificationType, statusEntityType).selectID(entityType)
+ .fetch(Filter.and().id(statusEntityType, status.getID()).name(entityType, pattern)).stream()
+ .map(r -> r.getRecord(entityType)).map(Record::getID).collect(Collectors.toList());
+
+ return entityLoader.loadAll(new Key<>(entityClass), instanceIDs);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public <T extends Entity> List<T> loadAll(Class<T> entityClass, ContextType contextType, String pattern)
+ throws DataAccessException {
+ return entityLoader.loadAll(new Key<>(entityClass, contextType), pattern);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public <T extends Entity> List<T> loadChildren(Entity parent, Class<T> entityClass, String pattern)
+ throws DataAccessException {
+ if (!Strings.isNullOrEmpty(pattern) && !"*".equals(pattern)) {
+ throw new DataAccessException("Pattern not supported by ATFXAdapter");
+ }
+ EntityType parentEntityType = odsModelManager.getEntityType(parent);
+ EntityType childEntityType = odsModelManager.getEntityType(entityClass);
+
+ List<String> instanceIDs;
+
+ if (parent instanceof ChannelGroup && Channel.class.equals(entityClass)) {
+ // this covers the gap between channel and channel group via local column
+ EntityType localColumnEntityType = odsModelManager.getEntityType("LocalColumn");
+
+ Relation relLocalColumnToChannel = localColumnEntityType.getRelation(childEntityType);
+ Relation relLocalColumnToChannelGroup = localColumnEntityType.getRelation(parentEntityType);
+
+ instanceIDs = queryService.createQuery().select(relLocalColumnToChannel.getAttribute())
+ .fetch(Filter.and().id(relLocalColumnToChannelGroup, parent.getID()).name(localColumnEntityType,
+ pattern))
+ .stream().map(r -> r.getRecord(localColumnEntityType))
+ .map(r -> r.getID(relLocalColumnToChannel).get()).collect(Collectors.toList());
+
+ return entityLoader.loadAll(new Key<>(entityClass), instanceIDs);
+ } else {
+ Relation relationToParent = childEntityType.getRelation(parentEntityType);
+
+ instanceIDs = queryService.createQuery().selectID(childEntityType).select(relationToParent.getAttribute())
+ .fetch(Filter.and().id(relationToParent, parent.getID()).name(childEntityType, pattern)).stream()
+ .map(r -> r.getRecord(childEntityType)).map(Record::getID).collect(Collectors.toList());
+ }
+
+ return entityLoader.loadAll(new Key<>(entityClass), instanceIDs);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public List<ContextType> loadContextTypes(ContextDescribable contextDescribable) throws DataAccessException {
+ EntityType contextDescribableEntityType = odsModelManager.getEntityType(contextDescribable);
+ Query query = queryService.createQuery();
+
+ Map<ContextType, EntityType> contextRootEntityTypes = new EnumMap<>(ContextType.class);
+ for (ContextType contextType : ContextType.values()) {
+ EntityType entityType = odsModelManager.getEntityType(ContextRoot.class, contextType);
+ contextRootEntityTypes.put(contextType, entityType);
+ query.join(contextDescribableEntityType.getRelation(entityType), JoinType.OUTER).selectID(entityType);
+ }
+
+ Optional<Result> result = query
+ .fetchSingleton(Filter.idOnly(contextDescribableEntityType, contextDescribable.getID()));
+ if (result.isPresent()) {
+ List<ContextType> contextTypes = new ArrayList<>();
+ for (Entry<ContextType, EntityType> entry : contextRootEntityTypes.entrySet()) {
+ Optional<String> instanceID = result.map(r -> r.getRecord(entry.getValue())).map(Record::getID);
+ if (instanceID.isPresent()) {
+ contextTypes.add(entry.getKey());
+ }
+ }
+
+ return contextTypes;
+ }
+
+ return Collections.emptyList();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Map<ContextType, ContextRoot> loadContexts(ContextDescribable contextDescribable,
+ ContextType... contextTypes) throws DataAccessException {
+ EntityType contextDescribableEntityType = odsModelManager.getEntityType(contextDescribable);
+
+ Map<ContextType, EntityType> contextRootEntityTypes = new EnumMap<>(ContextType.class);
+ Map<ContextType, ContextRoot> contextRoots = new EnumMap<>(ContextType.class);
+ for (ContextType contextType : contextTypes.length == 0 ? ContextType.values() : contextTypes) {
+
+ EntityType entityType = odsModelManager.getEntityType(ContextRoot.class, contextType);
+ contextRootEntityTypes.put(contextType, entityType);
+
+ // openATFX does not support joins in queries, thus we have to retrive the
+ // ContextRoots one by one by ID
+ ElemId elemId = new ElemId(((ODSEntityType) contextDescribableEntityType).getODSID(),
+ ODSConverter.toODSID(contextDescribable.getID()));
+ try {
+ T_LONGLONG[] contextRootIds = odsModelManager.getApplElemAccess().getRelInst(elemId,
+ contextDescribableEntityType.getRelation(entityType).getName());
+
+ if (contextRootIds != null && contextRootIds.length > 0) {
+ // There can only be one result per ContextType, thus we take the first one and
+ // ignore the rest
+ String instanceID = Long.toString(ODSConverter.fromODSLong(contextRootIds[0]));
+
+ contextRoots.put(contextType,
+ entityLoader.load(new Key<>(ContextRoot.class, contextType), instanceID));
+ }
+ } catch (AoException e) {
+ throw new DataAccessException("Cannot load contextRoot '" + entityType.getName() + "' for ID '"
+ + contextDescribable.getID() + "': " + e.reason, e);
+ }
+ }
+ return contextRoots;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public List<MeasuredValues> readMeasuredValues(ReadRequest readRequest) throws DataAccessException {
+ return new ReadRequestHandler(odsModelManager, queryService).execute(readRequest);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Transaction startTransaction() throws DataAccessException {
+ try {
+ return new ATFXTransaction(context);
+ } catch (AoException e) {
+ throw new DataAccessException("Unable to start transaction due to: " + e.reason, e);
+ }
+ }
+
+ /**
+ * Retrives the ASAM paths for the given entities. The ASAM paths are prefixed
+ * with a servicename, in the form
+ * <code>corbaloc:[iop|ssliop]:1.2@HOSTNAME:PORT/NameService/MDM.ASAM-ODS/</code>
+ *
+ * @returns returns a map with the ASAM paths to the given entities. If a entity
+ * is not found in the ODS server the entity is not included in the
+ * result map.
+ * @throws DataAccessException if links could not be loaded for the given
+ * entities
+ * @throws IllegalArgumentException if a the source or typeName of an entity is
+ * invalid
+ * @see org.eclipse.mdm.api.base.BaseEntityManager#getLinks(Collection)
+ */
+ @Override
+ public Map<Entity, String> getLinks(Collection<Entity> entities) throws DataAccessException {
+
+ Map<Entity, String> linkMap = new HashMap<>();
+
+ ApplicationStructure appStructure;
+ try {
+ appStructure = odsModelManager.getAoSession().getApplicationStructure();
+ } catch (AoException e) {
+ throw new DataAccessException("Could not load application structure! Reason: " + e.reason, e);
+ }
+
+ String serverRoot = context.getParameters().get(ODSContextFactory.PARAM_NAMESERVICE) + "/"
+ + context.getParameters().get(ODSContextFactory.PARAM_SERVICENAME);
+
+ Map<String, List<Entity>> entitiesByTypeName = entities.stream().filter(e -> e.getTypeName() != null)
+ .collect(Collectors.groupingBy(Entity::getTypeName));
+
+ for (Map.Entry<String, List<Entity>> entry : entitiesByTypeName.entrySet()) {
+ ODSEntityType et = (ODSEntityType) odsModelManager.getEntityType(entry.getKey());
+
+ List<ElemId> elemIds = entry.getValue().stream()
+ .map(e -> new ElemId(et.getODSID(), ODSConverter.toODSLong(Long.parseLong(e.getID()))))
+ .collect(Collectors.toList());
+
+ try {
+ InstanceElement[] instances = appStructure.getInstancesById(elemIds.toArray(new ElemId[0]));
+
+ for (InstanceElement ie : instances) {
+ String id = Long.toString(ODSConverter.fromODSLong(ie.getId()));
+ String asamPath = serverRoot + ie.getAsamPath();
+ entry.getValue().stream().filter(e -> e.getID().equals(id)).findFirst()
+ .ifPresent(e -> linkMap.put(e, asamPath));
+ }
+ } catch (AoException e) {
+ LOGGER.debug("Could not load links for entities: " + entities + ". Reason: " + e.reason, e);
+ }
+ }
+
+ return linkMap;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public <T extends Entity> List<T> loadRelatedEntities(Entity entity, String relationName, Class<T> relatedClass) {
+ ODSEntityType entityType = ((ODSEntityType) context.getODSModelManager().getEntityType(entity));
+ ElemId elemId = new ElemId(entityType.getODSID(), ODSConverter.toODSID(entity.getID()));
+
+ try {
+ T_LONGLONG[] instanceIds = context.getAoSession().getApplElemAccess().getRelInst(elemId, relationName);
+ List<String> instanceIDs = Stream.of(instanceIds).map(ODSConverter::fromODSLong).map(Object::toString)
+ .collect(Collectors.toList());
+ return entityLoader.loadAll(new Key<>(relatedClass), instanceIDs);
+ } catch (AoException e) {
+ throw new DataAccessException("Cannot load related instances: " + e.reason, e);
+ }
+ }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/ATFXTransaction.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/ATFXTransaction.java
new file mode 100644
index 0000000..5b878c9
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/ATFXTransaction.java
@@ -0,0 +1,401 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.api.atfxadapter.transaction;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.UUID;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import org.asam.ods.AoException;
+import org.eclipse.mdm.api.atfxadapter.ATFXContext;
+import org.eclipse.mdm.api.base.Transaction;
+import org.eclipse.mdm.api.base.adapter.Core;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.massdata.WriteRequest;
+import org.eclipse.mdm.api.base.model.Channel;
+import org.eclipse.mdm.api.base.model.ContextRoot;
+import org.eclipse.mdm.api.base.model.Deletable;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.Measurement;
+import org.eclipse.mdm.api.base.model.ScalarType;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.base.model.Value;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.dflt.model.CatalogAttribute;
+import org.eclipse.mdm.api.dflt.model.CatalogComponent;
+import org.eclipse.mdm.api.dflt.model.CatalogSensor;
+import org.eclipse.mdm.api.odsadapter.ODSContext;
+import org.eclipse.mdm.api.odsadapter.query.ODSModelManager;
+import org.eclipse.mdm.api.odsadapter.utils.ODSUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * ODS implementation of the {@link Transaction} interface.
+ *
+ * @see org.eclipse.mdm.api.odsadapter.transaction.ODSTransaction
+ */
+public final class ATFXTransaction implements Transaction {
+
+ // TODO: it should be possible to a attach a progress listener
+ // -> progress notification updates while uploading files
+ // -> any other useful informations?!
+ // -> splitting of tasks into subtasks may be required...
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ATFXTransaction.class);
+
+ // this one is used to access the application model and execute queries
+ // instance is decoupled from its parent
+ private final ATFXContext context;
+
+ // only for logging
+ private final String id = UUID.randomUUID().toString();
+
+ // need to write version == instanceID -> update after create
+ private final List<ContextRoot> contextRoots = new ArrayList<>();
+
+ // reset instance IDs on abort
+ private final List<Core> created = new ArrayList<>();
+
+ // apply changes
+ private final List<Core> modified = new ArrayList<>();
+
+ private CatalogManager catalogManager;
+
+ /**
+ * Constructor.
+ *
+ * @param parentModelManager Used to access the persistence.
+ * @param entity Used for security checks
+ * @param transfer The file transfer type.
+ * @throws AoException Thrown if unable to start a co-session.
+ */
+ public ATFXTransaction(ATFXContext context) throws AoException {
+ this.context = context;
+ this.context.getAoSession().startTransaction();
+ LOGGER.debug("Transaction '{}' started.", id);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ @SuppressWarnings("unchecked")
+ public <T extends Entity> void create(Collection<T> entities) throws DataAccessException {
+ if (entities.isEmpty()) {
+ return;
+ } else if (entities.stream().filter(e -> ODSUtils.isValidID(e.getID())).findAny().isPresent()) {
+ throw new IllegalArgumentException("At least one given entity is already persisted.");
+ }
+
+ try {
+ Map<Class<?>, List<T>> entitiesByClassType = entities.stream()
+ .collect(Collectors.groupingBy(e -> e.getClass()));
+
+ List<CatalogComponent> catalogComponents = (List<CatalogComponent>) entitiesByClassType
+ .get(CatalogComponent.class);
+ if (catalogComponents != null) {
+ getCatalogManager().createCatalogComponents(catalogComponents);
+ }
+
+ List<CatalogSensor> catalogSensors = (List<CatalogSensor>) entitiesByClassType.get(CatalogSensor.class);
+ if (catalogSensors != null) {
+ // TODO anehmer on 2017-11-16: avalon 4.3b throws an exception in
+ // AoSession.commitTransaction() if multiple
+ // catalog sensors have been deleted and leaves the application
+ // model in a broken state. This is also stated in the documentation. This
+ // comment should be removed later.
+ getCatalogManager().createCatalogSensors(catalogSensors);
+ }
+
+ List<CatalogAttribute> catalogAttributes = (List<CatalogAttribute>) entitiesByClassType
+ .get(CatalogAttribute.class);
+ if (catalogAttributes != null) {
+ getCatalogManager().createCatalogAttributes(catalogAttributes);
+ }
+
+ List<TestStep> testSteps = (List<TestStep>) entitiesByClassType.get(TestStep.class);
+ if (testSteps != null) {
+ create(testSteps.stream().map(ContextRoot::of).collect(ArrayList::new, List::addAll, List::addAll));
+ }
+
+ List<Measurement> measurements = (List<Measurement>) entitiesByClassType.get(Measurement.class);
+ if (measurements != null) {
+ // Use set here, since measurement siblings point to the same
+ // context roots. Only create those ContextRoots that haven't been created yet:
+ create(measurements.stream().map(ContextRoot::of)
+ .collect(HashSet<ContextRoot>::new, Set<ContextRoot>::addAll, Set<ContextRoot>::addAll).stream()
+ .filter(cr -> !ODSUtils.isValidID(cr.getID())).collect(Collectors.toSet()));
+ }
+
+ executeStatements(et -> new InsertStatement(this, et), entities);
+
+ List<ContextRoot> roots = (List<ContextRoot>) entitiesByClassType.get(ContextRoot.class);
+ if (roots != null) {
+ roots.forEach(contextRoot -> {
+ contextRoot.setVersion(contextRoot.getID().toString());
+ });
+
+ // this will restore the ASAM path of each context root
+ executeStatements(et -> new UpdateStatement(this, et, true), roots);
+ contextRoots.addAll(roots);
+ }
+ } catch (AoException e) {
+ throw new DataAccessException("Unable to write new entities due to: " + e.reason, e);
+ } catch (IOException e) {
+ throw new DataAccessException("Unable to write new entities due to: " + e.getMessage(), e);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ @SuppressWarnings("unchecked")
+ public <T extends Entity> void update(Collection<T> entities) throws DataAccessException {
+ if (entities.isEmpty()) {
+ return;
+ } else if (entities.stream().filter(e -> !ODSUtils.isValidID(e.getID())).findAny().isPresent()) {
+ throw new IllegalArgumentException("At least one given entity is not yet persisted.");
+ }
+
+ try {
+ Map<Class<?>, List<T>> entitiesByClassType = entities.stream()
+ .collect(Collectors.groupingBy(e -> e.getClass()));
+ List<CatalogAttribute> catalogAttributes = (List<CatalogAttribute>) entitiesByClassType
+ .get(CatalogAttribute.class);
+ if (catalogAttributes != null) {
+ getCatalogManager().updateCatalogAttributes(catalogAttributes);
+ }
+
+ executeStatements(et -> new UpdateStatement(this, et, false), entities);
+ } catch (AoException e) {
+ throw new DataAccessException("Unable to update entities due to: " + e.reason, e);
+ } catch (IOException e) {
+ throw new DataAccessException("Unable to update entities due to: " + e.getMessage(), e);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ @SuppressWarnings("unchecked")
+ public <T extends Deletable> void delete(Collection<T> entities) throws DataAccessException {
+ if (entities.isEmpty()) {
+ return;
+ }
+
+ List<T> filteredEntities = entities.stream().filter(e -> ODSUtils.isValidID(e.getID()))
+ .collect(Collectors.toList());
+
+ try {
+ Map<Class<?>, List<T>> entitiesByClassType = filteredEntities.stream()
+ .collect(Collectors.groupingBy(e -> e.getClass()));
+
+ List<CatalogComponent> catalogComponents = (List<CatalogComponent>) entitiesByClassType
+ .get(CatalogComponent.class);
+ if (catalogComponents != null) {
+ getCatalogManager().deleteCatalogComponents(catalogComponents);
+ }
+
+ List<CatalogSensor> catalogSensors = (List<CatalogSensor>) entitiesByClassType.get(CatalogSensor.class);
+ if (catalogSensors != null) {
+ // TODO anehmer on 2017-11-16: avalon 4.3b throws an exception in
+ // AoSession.commitTransaction() if multiple
+ // catalog sensors have been deleted and leaves the application
+ // model in a broken state. This is also stated in the documentation. This
+ // comment should be removed later.
+ getCatalogManager().deleteCatalogSensors(catalogSensors);
+ }
+
+ List<CatalogAttribute> catalogAttributes = (List<CatalogAttribute>) entitiesByClassType
+ .get(CatalogAttribute.class);
+ if (catalogAttributes != null) {
+ getCatalogManager().deleteCatalogAttributes(catalogAttributes);
+ }
+
+ /*
+ * TODO: for any template that has to be deleted it is required to ensure there
+ * are no links to it...
+ */
+
+ executeStatements(et -> new DeleteStatement(this, et, true), filteredEntities);
+ } catch (AoException e) {
+ throw new DataAccessException("Unable to delete entities due to: " + e.reason, e);
+ } catch (IOException e) {
+ throw new DataAccessException("Unable to delete entities due to: " + e.getMessage(), e);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void writeMeasuredValues(Collection<WriteRequest> writeRequests) throws DataAccessException {
+ if (writeRequests.isEmpty()) {
+ return;
+ }
+
+ try {
+ Map<ScalarType, List<WriteRequest>> writeRequestsByRawType = writeRequests.stream()
+ .collect(Collectors.groupingBy(WriteRequest::getRawScalarType));
+
+ for (List<WriteRequest> writeRequestGroup : writeRequestsByRawType.values()) {
+ WriteRequestHandler writeRequestHandler = new WriteRequestHandler(this);
+ List<Channel> channels = new ArrayList<>();
+
+ for (WriteRequest writeRequest : writeRequestGroup) {
+ Channel channel = writeRequest.getChannel();
+ channel.setScalarType(writeRequest.getCalculatedScalarType());
+ // TODO it might be required to change relation to another
+ // unit?!??
+ channels.add(channel);
+ writeRequestHandler.addRequest(writeRequest);
+ }
+
+ update(channels);
+ writeRequestHandler.execute();
+ }
+ } catch (AoException e) {
+ throw new DataAccessException("Unable to write measured values due to: " + e.reason, e);
+ } catch (IOException e) {
+ throw new DataAccessException("Unable to write measured values due to: " + e.getMessage(), e);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void commit() throws DataAccessException {
+ try {
+ context.getAoSession().commitTransaction();
+
+ // commit succeed -> apply changes in entity cores
+ modified.forEach(Core::apply);
+
+ if (catalogManager != null) {
+ // application model has been modified -> reload
+ context.getODSModelManager().reloadApplicationModel();
+ }
+
+ LOGGER.debug("Transaction '{}' committed.", id);
+ } catch (AoException e) {
+ throw new DataAccessException("Unable to commit transaction '" + id + "' due to: " + e.reason, e);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void abort() {
+ try {
+ // reset version, since creation failed or was aborted
+ contextRoots.forEach(cr -> cr.setVersion(null));
+
+ // reset instance IDs
+ String virtualID = "0";
+ created.forEach(c -> c.setID(virtualID));
+
+ context.getAoSession().abortTransaction();
+
+ LOGGER.debug("Transaction '{}' aborted.", id);
+ } catch (AoException e) {
+ LOGGER.error("Unable to abort transaction '" + id + "' due to: " + e.reason, e);
+ }
+ }
+
+ /**
+ * Once {@link #abort()} is called instance ID of given {@link Core} will be
+ * reset to {@code 0} which indicates a virtual {@link Entity}, not yet
+ * persisted, entity.
+ *
+ * @param core The {@code Core} of a newly written {@code Entity}.
+ */
+ void addCreated(Core core) {
+ created.add(core);
+ }
+
+ /**
+ * Once {@link #commit()} is {@link Core#apply()} will be called to apply
+ * modified {@link Value} contents and removed related entities.
+ *
+ * @param core The {@code Core} of an updated {@code Entity}.
+ */
+ void addModified(Core core) {
+ modified.add(core);
+ }
+
+ /**
+ * Returns the {@link ODSContext}.
+ *
+ * @return The {@code ODSContext} is returned.
+ */
+ ATFXContext getContext() {
+ return context;
+ }
+
+ /**
+ * Returns the {@link ODSModelManager}.
+ *
+ * @return The {@code ODSModelManager} is returned.
+ */
+ ODSModelManager getModelManager() {
+ return context.getODSModelManager();
+ }
+
+ /**
+ * Returns the {@link CatalogManager}.
+ *
+ * @return The {@code CatalogManager} is returned.
+ */
+ private CatalogManager getCatalogManager() {
+ if (catalogManager == null) {
+ catalogManager = new CatalogManager(this);
+ }
+
+ return catalogManager;
+ }
+
+ /**
+ * Executes statements for given entities by using given statement factory.
+ *
+ * @param <T> The entity type.
+ * @param statementFactory Used to create a new statement for a given
+ * {@link EntityType}.
+ * @param entities The processed {@code Entity}s.
+ * @throws AoException Thrown if the execution fails.
+ * @throws DataAccessException Thrown if the execution fails.
+ * @throws IOException Thrown if a file transfer operation fails.
+ */
+ private <T extends Entity> void executeStatements(Function<EntityType, BaseStatement> statementFactory,
+ Collection<T> entities) throws AoException, DataAccessException, IOException {
+ Map<EntityType, List<Entity>> entitiesByType = entities.stream()
+ .collect(Collectors.groupingBy(context.getODSModelManager()::getEntityType));
+ for (Entry<EntityType, List<Entity>> entry : entitiesByType.entrySet()) {
+ statementFactory.apply(entry.getKey()).execute(entry.getValue());
+ }
+ }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/BaseStatement.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/BaseStatement.java
new file mode 100644
index 0000000..6c2ecbe
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/BaseStatement.java
@@ -0,0 +1,108 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.api.atfxadapter.transaction;
+
+import java.io.IOException;
+import java.util.Collection;
+
+import org.asam.ods.AoException;
+import org.asam.ods.ApplElemAccess;
+import org.eclipse.mdm.api.base.ServiceNotProvidedException;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.base.query.QueryService;
+import org.eclipse.mdm.api.odsadapter.query.ODSEntityType;
+import org.eclipse.mdm.api.odsadapter.query.ODSModelManager;
+
+/**
+ * A base implementation for execution statements (CREATE, UPDATE, DELETE).
+ *
+ * @see org.eclipse.mdm.api.odsadapter.transaction.BaseStatement
+ */
+abstract class BaseStatement {
+
+ private final ATFXTransaction transaction;
+ private final ODSEntityType entityType;
+
+ /**
+ * Constructor.
+ *
+ * @param transaction The owning {@link ATFXTransaction}.
+ * @param entityType The associated {@link EntityType}.
+ */
+ protected BaseStatement(ATFXTransaction transaction, EntityType entityType) {
+ this.transaction = transaction;
+ this.entityType = (ODSEntityType) entityType;
+ }
+
+ /**
+ * Executes this statement for given {@link Entity}s.
+ *
+ * @param entities The processed {@code Entity}s.
+ * @throws AoException Thrown if the execution fails.
+ * @throws DataAccessException Thrown if the execution fails.
+ * @throws IOException Thrown if a file transfer operation fails.
+ */
+ public abstract void execute(Collection<Entity> entities) throws AoException, DataAccessException, IOException;
+
+ /**
+ * Returns the {@link ATFXTransaction}.
+ *
+ * @return The {@code ODSTransaction} is returned.
+ */
+ protected ATFXTransaction getTransaction() {
+ return transaction;
+ }
+
+ /**
+ * Returns the {@link ODSModelManager}.
+ *
+ * @return The {@code ODSModelManager} is returned.
+ */
+ protected ODSModelManager getModelManager() {
+ return transaction.getModelManager();
+ }
+
+ /**
+ * Returns the {@link QueryService}.
+ *
+ * @return The {@code QueryService} is returned.
+ */
+ protected QueryService getQueryService() {
+ return transaction.getContext().getQueryService()
+ .orElseThrow(() -> new ServiceNotProvidedException(QueryService.class));
+ }
+
+ /**
+ * Returns the {@link ApplElemAccess}.
+ *
+ * @return The {@code ApplElemAccess} is returned.
+ * @throws AoException Thrown in case of errors.
+ */
+ protected ApplElemAccess getApplElemAccess() throws AoException {
+ return transaction.getContext().getODSModelManager().getApplElemAccess();
+ }
+
+ /**
+ * Returns the associated {@link EntityType}.
+ *
+ * @return The associated {@code EntityType} is returned.
+ */
+ protected ODSEntityType getEntityType() {
+ return entityType;
+ }
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/CatalogManager.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/CatalogManager.java
new file mode 100644
index 0000000..ff5f6e2
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/CatalogManager.java
@@ -0,0 +1,548 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.api.atfxadapter.transaction;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import org.asam.ods.AoException;
+import org.asam.ods.ApplicationAttribute;
+import org.asam.ods.ApplicationElement;
+import org.asam.ods.ApplicationRelation;
+import org.asam.ods.ApplicationStructure;
+import org.asam.ods.BaseAttribute;
+import org.asam.ods.BaseElement;
+import org.asam.ods.BaseStructure;
+import org.asam.ods.DataType;
+import org.asam.ods.RelationRange;
+import org.eclipse.mdm.api.base.ServiceNotProvidedException;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.Unit;
+import org.eclipse.mdm.api.base.query.ComparisonOperator;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.base.query.Filter;
+import org.eclipse.mdm.api.base.query.Query;
+import org.eclipse.mdm.api.base.query.QueryService;
+import org.eclipse.mdm.api.base.query.Result;
+import org.eclipse.mdm.api.dflt.model.CatalogAttribute;
+import org.eclipse.mdm.api.dflt.model.CatalogComponent;
+import org.eclipse.mdm.api.dflt.model.CatalogSensor;
+import org.eclipse.mdm.api.odsadapter.utils.ODSConverter;
+import org.eclipse.mdm.api.odsadapter.utils.ODSEnumerations;
+import org.eclipse.mdm.api.odsadapter.utils.ODSUtils;
+
+/**
+ * Used to create, update or delete {@link CatalogComponent},
+ * {@link CatalogSensor} and {@link CatalogAttribute} entities. Modifications of
+ * the listed types results in modifications of the application model.
+ *
+ * @see org.eclipse.mdm.api.odsadapter.transaction.CatalogManager
+ */
+final class CatalogManager {
+
+ private final ATFXTransaction transaction;
+
+ private ApplicationStructure applicationStructure;
+ private BaseStructure baseStructure;
+
+ /**
+ * Constructor.
+ *
+ * @param transaction The {@link ATFXTransaction}.
+ */
+ CatalogManager(ATFXTransaction transaction) {
+ this.transaction = transaction;
+ }
+
+ /**
+ * Creates for each given {@link CatalogComponent} a corresponding application
+ * element including all required application relations.
+ *
+ * @param catalogComponents The {@code CatalogComponent}s.
+ * @throws AoException Thrown in case of errors.
+ */
+ public void createCatalogComponents(Collection<CatalogComponent> catalogComponents) throws AoException {
+ Map<ContextType, List<CatalogComponent>> catalogComponentsByContextType = catalogComponents.stream()
+ .collect(Collectors.groupingBy(CatalogComponent::getContextType));
+
+ for (Entry<ContextType, List<CatalogComponent>> entry : catalogComponentsByContextType.entrySet()) {
+ String odsContextTypeName = ODSUtils.CONTEXTTYPES.get(entry.getKey());
+ ApplicationElement contextRootApplicationElement = getApplicationStructure()
+ .getElementByName(odsContextTypeName);
+ BaseElement contextRootBaseElement = contextRootApplicationElement.getBaseElement();
+ ApplicationElement contextTemplateComponentApplicationElement = getApplicationStructure()
+ .getElementByName("Tpl" + odsContextTypeName + "Comp");
+ BaseElement baseElement = getBaseStructure().getElementByType("Ao" + odsContextTypeName + "Part");
+
+ for (CatalogComponent catalogComponent : entry.getValue()) {
+ ApplicationElement applicationElement = createApplicationElement(catalogComponent.getName(),
+ baseElement);
+
+ // relation context root to context component
+ ApplicationRelation applicationRelation = getApplicationStructure().createRelation();
+ applicationRelation.setElem1(contextRootApplicationElement);
+ applicationRelation.setElem2(applicationElement);
+ applicationRelation.setRelationName(catalogComponent.getName());
+ applicationRelation.setInverseRelationName(odsContextTypeName);
+ applicationRelation
+ .setBaseRelation(getBaseStructure().getRelation(contextRootBaseElement, baseElement));
+ applicationRelation._release();
+
+ // relation template component to context component
+ applicationRelation = getApplicationStructure().createRelation();
+ applicationRelation.setElem1(contextTemplateComponentApplicationElement);
+ applicationRelation.setElem2(applicationElement);
+ applicationRelation.setRelationName(catalogComponent.getName());
+ applicationRelation.setInverseRelationName("Tpl" + odsContextTypeName + "Comp");
+ applicationRelation.setRelationRange(new RelationRange((short) 0, (short) -1));
+ applicationRelation.setInverseRelationRange(new RelationRange((short) 1, (short) 1));
+
+ // release resources
+ applicationElement._release();
+ applicationRelation._release();
+ }
+
+ // release resources
+ contextTemplateComponentApplicationElement._release();
+ contextRootApplicationElement._release();
+ contextRootBaseElement._release();
+ baseElement._release();
+ }
+ }
+
+ /**
+ * Creates for each given {@link CatalogSensor} a corresponding application
+ * element including all required application relations.
+ *
+ * @param catalogSensors The {@code CatalogSensor}s.
+ * @throws AoException Thrown in case of errors.
+ */
+ public void createCatalogSensors(Collection<CatalogSensor> catalogSensors) throws AoException {
+ Map<String, List<CatalogSensor>> catalogSensorsByCatalogComponent = catalogSensors.stream()
+ .collect(Collectors.groupingBy(cs -> cs.getCatalogComponent().getName()));
+
+ ApplicationElement channelApplicationElement = getApplicationStructure().getElementByName("MeaQuantity");
+ BaseElement channelBaseElement = channelApplicationElement.getBaseElement();
+
+ for (Entry<String, List<CatalogSensor>> entry : catalogSensorsByCatalogComponent.entrySet()) {
+ ApplicationElement contextComponentApplicationElement = getApplicationStructure()
+ .getElementByName(entry.getKey());
+ BaseElement contextComponentBaseElement = contextComponentApplicationElement.getBaseElement();
+ ApplicationElement contextTemplateSensorApplicationElement = getApplicationStructure()
+ .getElementByName("TplSensor");
+ BaseElement baseElement = getBaseStructure().getElementByType("AoTestEquipmentPart");
+
+ for (CatalogSensor catalogSensor : entry.getValue()) {
+ ApplicationElement applicationElement = createApplicationElement(catalogSensor.getName(), baseElement);
+
+ // relation context component to context sensor
+ ApplicationRelation applicationRelation = getApplicationStructure().createRelation();
+ applicationRelation.setElem1(contextComponentApplicationElement);
+ applicationRelation.setElem2(applicationElement);
+ applicationRelation.setRelationName(catalogSensor.getName());
+ applicationRelation.setInverseRelationName(entry.getKey());
+ applicationRelation
+ .setBaseRelation(getBaseStructure().getRelation(contextComponentBaseElement, baseElement));
+ applicationRelation._release();
+
+ // relation template sensor to context sensor
+ applicationRelation = getApplicationStructure().createRelation();
+ applicationRelation.setElem1(contextTemplateSensorApplicationElement);
+ applicationRelation.setElem2(applicationElement);
+ applicationRelation.setRelationName(catalogSensor.getName());
+ applicationRelation.setInverseRelationName("TplSensor");
+ applicationRelation.setRelationRange(new RelationRange((short) 0, (short) -1));
+ applicationRelation.setInverseRelationRange(new RelationRange((short) 1, (short) 1));
+ applicationRelation._release();
+
+ // relation channel to context sensor
+ applicationRelation = getApplicationStructure().createRelation();
+ applicationRelation.setElem1(channelApplicationElement);
+ applicationRelation.setElem2(applicationElement);
+ applicationRelation.setRelationName(catalogSensor.getName());
+ applicationRelation.setInverseRelationName("MeaQuantity");
+ applicationRelation.setBaseRelation(getBaseStructure().getRelation(channelBaseElement, baseElement));
+
+ // release resources
+ applicationElement._release();
+ applicationRelation._release();
+ }
+
+ // release resources
+ contextComponentApplicationElement._release();
+ contextTemplateSensorApplicationElement._release();
+ contextComponentBaseElement._release();
+ baseElement._release();
+ }
+
+ // release resources
+ channelApplicationElement._release();
+ channelBaseElement._release();
+ }
+
+ /**
+ * Creates for each given {@link CatalogAttribute} a corresponding application
+ * attribute.
+ *
+ * @param catalogAttributes The {@code CatalogAttribute}s.
+ * @throws AoException Thrown in case of errors.
+ */
+ public void createCatalogAttributes(Collection<CatalogAttribute> catalogAttributes) throws AoException {
+ Map<String, List<CatalogAttribute>> catalogAttributesByCatalogComponent = catalogAttributes.stream()
+ .collect(Collectors.groupingBy(CatalogManager::getParentName));
+
+ for (Entry<String, List<CatalogAttribute>> entry : catalogAttributesByCatalogComponent.entrySet()) {
+ ApplicationElement applicationElement = getApplicationStructure().getElementByName(entry.getKey());
+
+ for (CatalogAttribute catalogAttribute : entry.getValue()) {
+
+ ApplicationAttribute applicationAttribute = applicationElement.createAttribute();
+ DataType dataType = ODSUtils.VALUETYPES.get(catalogAttribute.getValueType());
+ applicationAttribute.setDataType(dataType);
+ applicationAttribute.setName(catalogAttribute.getName());
+ if (dataType == DataType.DT_ENUM) {
+ applicationAttribute.setEnumerationDefinition(getApplicationStructure().getEnumerationDefinition(
+ ODSEnumerations.getEnumName(catalogAttribute.getEnumerationObject())));
+ }
+ Optional<Unit> unit = catalogAttribute.getUnit();
+ if (unit.isPresent()) {
+ applicationAttribute.setUnit(ODSConverter.toODSID(unit.get().getID()));
+ }
+
+ // release resources
+ applicationAttribute._release();
+ }
+
+ // release resources
+ applicationElement._release();
+ }
+ }
+
+ /**
+ * Updates the application attribute for each given {@link CatalogAttribute}.
+ *
+ * @param catalogAttributes The {@code CatalogAttribute}s.
+ * @throws AoException Thrown in case of errors.
+ */
+ public void updateCatalogAttributes(List<CatalogAttribute> catalogAttributes) throws AoException {
+ Map<String, List<CatalogAttribute>> catalogAttributesByCatalogComponent = catalogAttributes.stream()
+ .collect(Collectors.groupingBy(CatalogManager::getParentName));
+
+ for (Entry<String, List<CatalogAttribute>> entry : catalogAttributesByCatalogComponent.entrySet()) {
+ ApplicationElement applicationElement = getApplicationStructure().getElementByName(entry.getKey());
+
+ for (CatalogAttribute catalogAttribute : entry.getValue()) {
+
+ ApplicationAttribute applicationAttribute = applicationElement
+ .getAttributeByName(catalogAttribute.getName());
+
+ Optional<Unit> unit = catalogAttribute.getUnit();
+ if (unit.isPresent()) {
+ applicationAttribute.setUnit(ODSConverter.toODSID(unit.get().getID()));
+ }
+
+ // release resources
+ applicationAttribute._release();
+ }
+
+ // release resources
+ applicationElement._release();
+ }
+ }
+
+ /**
+ * Deletes the corresponding application element for each given
+ * {@link CatalogComponent}. Deleting a {@code CatalogComponent} is only allowed
+ * if it is not used in templates and all of its children could be deleted. So
+ * at first it is tried to delete its {@link CatalogAttribute}s and
+ * {@link CatalogSensor}s. On success it is ensured none of the given {@code
+ * CatalogComponent}s is used in templates. Finally the corresponding
+ * application elements are deleted.
+ *
+ * @param catalogComponents The {@code CatalogComponent}s.
+ * @throws AoException Thrown in case of errors.
+ * @throws DataAccessException Thrown in case of errors.
+ */
+ public void deleteCatalogComponents(Collection<CatalogComponent> catalogComponents)
+ throws AoException, DataAccessException {
+ List<CatalogAttribute> attributes = new ArrayList<>();
+ List<CatalogSensor> sensors = new ArrayList<>();
+ for (CatalogComponent catalogComponent : catalogComponents) {
+ attributes.addAll(catalogComponent.getCatalogAttributes());
+ sensors.addAll(catalogComponent.getCatalogSensors());
+ }
+ transaction.delete(sensors);
+ transaction.delete(attributes);
+
+ if (areReferencedInTemplates(catalogComponents)) {
+ throw new DataAccessException(
+ "Unable to delete given catalog components since at least " + "one is used in templates.");
+ }
+
+ for (CatalogComponent catalogComponent : catalogComponents) {
+ ApplicationElement applicationElement = getApplicationStructure()
+ .getElementByName(catalogComponent.getName());
+ for (ApplicationRelation applicationRelation : applicationElement.getAllRelations()) {
+ getApplicationStructure().removeRelation(applicationRelation);
+
+ // release resources
+ applicationRelation._release();
+ }
+ getApplicationStructure().removeElement(applicationElement);
+
+ // release resources
+ applicationElement._release();
+ }
+ }
+
+ /**
+ * Deletes the corresponding application element for each given
+ * {@link CatalogSensor}. Deleting a {@code CatalogSensor} is only allowed if it
+ * is not used in templates and all of its children could be deleted. So at
+ * first it is tried to delete its {@link CatalogAttribute}s. On success it is
+ * ensured none of the given {@code CatalogSensor}s is used in templates.
+ * Finally the corresponding application elements are deleted.
+ *
+ * @param catalogSensors The {@code CatalogSensor}s.
+ * @throws AoException Thrown in case of errors.
+ * @throws DataAccessException Thrown in case of errors.
+ */
+ public void deleteCatalogSensors(Collection<CatalogSensor> catalogSensors) throws AoException, DataAccessException {
+ List<CatalogAttribute> attributes = new ArrayList<>();
+ for (CatalogSensor catalogSensor : catalogSensors) {
+ attributes.addAll(catalogSensor.getCatalogAttributes());
+ }
+ transaction.delete(attributes);
+
+ if (areReferencedInTemplates(catalogSensors)) {
+ throw new DataAccessException(
+ "Unable to delete given catalog sensors since at " + "least one is used in templates.");
+ }
+
+ for (CatalogSensor catalogSensor : catalogSensors) {
+ ApplicationElement applicationElement = getApplicationStructure().getElementByName(catalogSensor.getName());
+ for (ApplicationRelation applicationRelation : applicationElement.getAllRelations()) {
+ getApplicationStructure().removeRelation(applicationRelation);
+
+ // release resources
+ applicationRelation._release();
+ }
+ getApplicationStructure().removeElement(applicationElement);
+
+ // release resources
+ applicationElement._release();
+ }
+
+ }
+
+ /**
+ * Deletes the corresponding application attributes for each given
+ * {@link CatalogAttribute}. Deleting a {@code CatalogAttribute} is only allowed
+ * if it is not used in templates. So at first it is ensured none of the given
+ * {@code CatalogAttribute}s is used in templates and finally the corresponding
+ * application attributes are deleted.
+ *
+ * @param catalogAttributes The {@code CatalogAttribute}s.
+ * @throws AoException Thrown in case of errors.
+ * @throws DataAccessException Thrown in case of errors.
+ */
+ public void deleteCatalogAttributes(Collection<CatalogAttribute> catalogAttributes)
+ throws AoException, DataAccessException {
+ if (areReferencedInTemplates(catalogAttributes)) {
+ throw new DataAccessException(
+ "Unable to delete given catalog attributes since at least " + "one is used in templates.");
+ }
+
+ Map<String, List<CatalogAttribute>> catalogAttributesByParent = catalogAttributes.stream()
+ .collect(Collectors.groupingBy(CatalogManager::getParentName));
+
+ for (Entry<String, List<CatalogAttribute>> entry : catalogAttributesByParent.entrySet()) {
+ ApplicationElement applicationElement = getApplicationStructure().getElementByName(entry.getKey());
+
+ for (CatalogAttribute catalogAttribute : entry.getValue()) {
+ ApplicationAttribute applicationAttribute = applicationElement
+ .getAttributeByName(catalogAttribute.getName());
+ applicationElement.removeAttribute(applicationAttribute);
+
+ // release resources
+ applicationAttribute._release();
+ }
+
+ // release resources
+ applicationElement._release();
+ }
+ }
+
+ /**
+ * Releases cached resources.
+ */
+ public void clear() {
+ if (applicationStructure != null) {
+ applicationStructure._release();
+ }
+
+ if (baseStructure != null) {
+ baseStructure._release();
+ }
+ }
+
+ /**
+ * Creates a new {@link ApplicationElement} with given name and
+ * {@link BaseElement}. The returned {@code ApplicationElement} will be created
+ * with the three mandatory {@link ApplicationAttribute}s for 'Id', 'Name' and
+ * 'MimeType'.
+ *
+ * @param name The name of the application element.
+ * @param baseElement The {@code BaseElement} the created {@code
+ * ApplicationElement} will be derived from.
+ * @return The created {@code ApplicationElement} is returned.
+ * @throws AoException Thrown in case of errors.
+ */
+ private ApplicationElement createApplicationElement(String name, BaseElement baseElement) throws AoException {
+ ApplicationElement applicationElement = getApplicationStructure().createElement(baseElement);
+ applicationElement.setName(name);
+
+ // Id
+ ApplicationAttribute idApplicationAttribute = applicationElement.getAttributeByBaseName("id");
+ idApplicationAttribute.setName("Id");
+ idApplicationAttribute.setDataType(DataType.DT_LONGLONG);
+ idApplicationAttribute.setIsAutogenerated(true);
+
+ // Name
+ ApplicationAttribute nameApplicationAttribute = applicationElement.getAttributeByBaseName("name");
+ nameApplicationAttribute.setName("Name");
+ nameApplicationAttribute.setLength(50);
+
+ // MimeType
+ BaseAttribute mimeTypeBaseAttribute = baseElement.getAttributes("mime_type")[0];
+ ApplicationAttribute mimeTypeApplicationAttribute = applicationElement.createAttribute();
+ mimeTypeApplicationAttribute.setBaseAttribute(mimeTypeBaseAttribute);
+ mimeTypeApplicationAttribute.setName("MimeType");
+ mimeTypeApplicationAttribute.setDataType(DataType.DT_STRING);
+ mimeTypeApplicationAttribute.setLength(256);
+ mimeTypeApplicationAttribute.setIsObligatory(true);
+
+ // release resources
+ idApplicationAttribute._release();
+ nameApplicationAttribute._release();
+ mimeTypeApplicationAttribute._release();
+ mimeTypeBaseAttribute._release();
+
+ return applicationElement;
+ }
+
+ /**
+ * Returns the cached {@link ApplicationStructure}.
+ *
+ * @return The {@code ApplicationStructure} is returned.
+ * @throws AoException Thrown if unable to access the {@code
+ * ApplicationStructure}.
+ */
+ private ApplicationStructure getApplicationStructure() throws AoException {
+ if (applicationStructure == null) {
+ applicationStructure = transaction.getModelManager().getAoSession().getApplicationStructure();
+ }
+
+ return applicationStructure;
+ }
+
+ /**
+ * Returns the cached {@link BaseStructure}.
+ *
+ * @return The {@code BaseStructure} is returned.
+ * @throws AoException Thrown if unable to access the {@code
+ * BaseStructure}.
+ */
+ private BaseStructure getBaseStructure() throws AoException {
+ if (baseStructure == null) {
+ baseStructure = transaction.getModelManager().getAoSession().getBaseStructure();
+ }
+
+ return baseStructure;
+ }
+
+ /**
+ * Checks whether given {@link Entity}s are referenced in templates.
+ *
+ * @param entities The checked entities ({@link CatalogComponent},
+ * {@link CatalogSensor} or {@link CatalogAttribute}).
+ * @return Returns {@code true} if at least one entity is referenced in a
+ * template.
+ * @throws AoException Thrown on errors.
+ * @throws DataAccessException Thrown on errors.
+ */
+ private boolean areReferencedInTemplates(Collection<? extends Entity> entities)
+ throws AoException, DataAccessException {
+ Map<EntityType, List<Entity>> entitiesByEntityType = entities.stream()
+ .collect(Collectors.groupingBy(transaction.getModelManager()::getEntityType));
+
+ for (Entry<EntityType, List<Entity>> entry : entitiesByEntityType.entrySet()) {
+ EntityType source = entry.getKey();
+ EntityType target = transaction.getModelManager().getEntityType(source.getName().replace("Cat", "Tpl"));
+
+ Query query = transaction.getContext().getQueryService()
+ .orElseThrow(() -> new ServiceNotProvidedException(QueryService.class)).createQuery()
+ .selectID(target).join(source, target);
+
+ List<Result> results = query.fetch(Filter.and().add(
+ ComparisonOperator.IN_SET.create(source.getIDAttribute(), collectInstanceIDs(entry.getValue()))));
+ if (results.size() > 0) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Collect the instance IDs of all given {@link Entity}s.
+ *
+ * @param entities The {@link Entity}s.
+ * @return The instance IDs a {@code String[]} are turned.
+ */
+ private static String[] collectInstanceIDs(List<Entity> entities) {
+ String[] ids = new String[entities.size()];
+
+ for (int i = 0; i < ids.length; i++) {
+ ids[i] = entities.get(i).getID();
+ }
+
+ return ids;
+ }
+
+ /**
+ * Returns the parent name for given {@link CatalogAttribute}.
+ *
+ * @param catalogAttribute The {@code CatalogAttribute}.
+ * @return The parent name is returned.
+ */
+ private static String getParentName(CatalogAttribute catalogAttribute) {
+ Optional<CatalogComponent> catalogComponent = catalogAttribute.getCatalogComponent();
+ if (catalogComponent.isPresent()) {
+ return catalogComponent.get().getName();
+ }
+
+ return catalogAttribute.getCatalogSensor()
+ .orElseThrow(() -> new IllegalStateException("Parent entity is unknown.")).getName();
+ }
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/DeleteStatement.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/DeleteStatement.java
new file mode 100644
index 0000000..ba3784d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/DeleteStatement.java
@@ -0,0 +1,227 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.api.atfxadapter.transaction;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.asam.ods.AoException;
+import org.asam.ods.T_LONGLONG;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.adapter.Relation;
+import org.eclipse.mdm.api.base.model.Channel;
+import org.eclipse.mdm.api.base.model.ContextRoot;
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.FilesAttachable;
+import org.eclipse.mdm.api.base.model.Measurement;
+import org.eclipse.mdm.api.base.model.ParameterSet;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.base.query.Filter;
+import org.eclipse.mdm.api.base.query.JoinType;
+import org.eclipse.mdm.api.base.query.Query;
+import org.eclipse.mdm.api.base.query.Result;
+import org.eclipse.mdm.api.odsadapter.lookup.config.EntityConfig;
+import org.eclipse.mdm.api.odsadapter.query.ODSEntityType;
+import org.eclipse.mdm.api.odsadapter.utils.ODSConverter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Delete statement is used to delete entities with their children.
+ *
+ * @see org.eclipse.mdm.api.odsadapter.transaction.DeleteStatement
+ */
+final class DeleteStatement extends BaseStatement {
+
+ private static final List<String> AUTO_DELETABLE = Arrays.asList("MeaQuantity", "SubMatrix", "LocalColumn",
+ "ExternalComponent");
+ private static final Logger LOGGER = LoggerFactory.getLogger(DeleteStatement.class);
+
+ private final boolean useAutoDelete;
+
+ /**
+ * Constructor.
+ *
+ * @param transaction The owning {@link ATFXTransaction}.
+ * @param entityType The associated {@link EntityType}.
+ * @param useAutoDelete If {@code true} child relations of {@link Measurement}
+ * entities are not followed.
+ */
+ DeleteStatement(ATFXTransaction transaction, EntityType entityType, boolean useAutoDelete) {
+ super(transaction, entityType);
+ this.useAutoDelete = useAutoDelete;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void execute(Collection<Entity> entities) throws AoException, DataAccessException {
+ if (entities.stream().filter(e -> !e.getTypeName().equals(getEntityType().getName())).findAny().isPresent()) {
+ throw new IllegalArgumentException("At least one given entity is of incompatible type.");
+ }
+
+ long start = System.currentTimeMillis();
+ int amount = delete(getEntityType(), entities.stream().map(Entity::getID).collect(Collectors.toSet()), false);
+ LOGGER.debug("{} instances deleted in {} ms.", amount, System.currentTimeMillis() - start);
+ }
+
+ /**
+ * Recursively follows child relations of given entities and deletes all child
+ * entities before deleting parent entities.
+ *
+ * @param entityType {@link EntityType} of the deleted entities.
+ * @param instanceIDs Instance IDs of entities which have to be deleted.
+ * @param ignoreSiblings Is it required to check whether {@link Measurement}
+ * siblings share a common {@link ContextRoot}s.
+ * @return Returns the total number of deleted instances.
+ * @throws AoException Thrown if unable to delete entities.
+ * @throws DataAccessException Thrown if unable to query child entities.
+ */
+ private int delete(EntityType entityType, Collection<String> instanceIDs, boolean ignoreSiblings)
+ throws AoException, DataAccessException {
+ if (instanceIDs.isEmpty()) {
+ return 0;
+ }
+
+ Query query = getQueryService().createQuery().selectID(entityType);
+ for (Relation relation : entityType.getChildRelations()) {
+ if (useAutoDelete && AUTO_DELETABLE.contains(relation.getTarget().getName())) {
+ continue;
+ }
+
+ if (!relation.getTarget().equals(relation.getSource())) {
+ query.join(relation, JoinType.OUTER).selectID(relation.getTarget());
+ }
+ }
+
+ // select attributes containing file links only for entity types
+ // implementing FilesAttachable
+ EntityConfig<?> entityConfig = getModelManager().getEntityConfig(entityType);
+ if (FilesAttachable.class.isAssignableFrom(entityConfig.getEntityClass())) {
+ entityType.getAttributes().stream().filter(a -> a.getValueType().isFileLinkType()).forEach(query::select);
+ }
+
+ EntityType testStep = getModelManager().getEntityType(TestStep.class);
+ EntityType measurement = getModelManager().getEntityType(Measurement.class);
+ EntityType channel = getModelManager().getEntityType(Channel.class);
+
+ EntityType unitUnderTest = getModelManager().getEntityType(ContextRoot.class, ContextType.UNITUNDERTEST);
+ EntityType testSequence = getModelManager().getEntityType(ContextRoot.class, ContextType.TESTSEQUENCE);
+ EntityType testEquipment = getModelManager().getEntityType(ContextRoot.class, ContextType.TESTEQUIPMENT);
+
+ // type in this list must be deleted AFTER this this instances have been
+ // deleted
+ // informative relation is considered as a child relation
+ List<EntityType> delayedDelete = new ArrayList<>();
+
+ // join context roots
+ if (measurement.equals(entityType) || testStep.equals(entityType)) {
+ query.join(entityType.getRelation(unitUnderTest), JoinType.OUTER).selectID(unitUnderTest);
+ query.join(entityType.getRelation(testSequence), JoinType.OUTER).selectID(testSequence);
+ query.join(entityType.getRelation(testEquipment), JoinType.OUTER).selectID(testEquipment);
+ delayedDelete.addAll(Arrays.asList(unitUnderTest, testSequence, testEquipment));
+ }
+
+ // join parameter sets
+ if (measurement.equals(entityType) || channel.equals(entityType)) {
+ EntityType parameterSet = getModelManager().getEntityType(ParameterSet.class);
+ query.join(entityType.getRelation(parameterSet), JoinType.OUTER).selectID(parameterSet);
+ }
+
+ Filter filter = Filter.or().ids(entityType, instanceIDs);
+ entityType.getParentRelations().stream().filter(r -> r.getTarget().equals(entityType))
+ .forEach(relation -> filter.ids(relation, instanceIDs));
+
+ // query child IDs
+ Map<EntityType, Set<String>> children = new HashMap<>();
+ for (Result result : query.fetch(filter)) {
+ // load children of other types
+ result.stream().filter(r -> r.getID() != null && r.getID().length() > 0).forEach(r -> {
+ children.computeIfAbsent(r.getEntityType(), k -> new HashSet<>()).add(r.getID());
+ });
+ }
+
+ // omit context roots with references to not removed measurements
+ if (!ignoreSiblings && measurement.equals(entityType)) {
+ for (EntityType contextRoot : Arrays.asList(unitUnderTest, testSequence, testEquipment)) {
+ Set<String> contextRootIDs = children.getOrDefault(contextRoot, Collections.emptySet());
+ if (contextRootIDs.isEmpty()) {
+ continue;
+ }
+
+ Query contextQuery = getQueryService().createQuery();
+ contextQuery.selectID(contextRoot, measurement);
+ contextQuery.join(contextRoot, measurement);
+
+ for (Result result : contextQuery.fetch(Filter.idsOnly(contextRoot, contextRootIDs))) {
+ if (instanceIDs.contains(result.getRecord(measurement).getID())) {
+ continue;
+ }
+
+ // context root references a not removed measurement
+ contextRootIDs.remove(result.getRecord(contextRoot).getID());
+ }
+ }
+ }
+
+ int amount = 0;
+ // delete real children
+ List<Entry<EntityType, Set<String>>> consideredChildren = new ArrayList<>();
+ for (Entry<EntityType, Set<String>> entry : children.entrySet()) {
+ EntityType childType = entry.getKey();
+ Set<String> childInstanceIDs = entry.getValue();
+ if (entityType.equals(childType)) {
+ childInstanceIDs.removeAll(instanceIDs);
+ } else if (delayedDelete.contains(entry.getKey())) {
+ consideredChildren.add(entry);
+ continue;
+ }
+ amount += delete(entry.getKey(), childInstanceIDs, true);
+ }
+
+ getApplElemAccess().deleteInstances(((ODSEntityType) entityType).getODSID(), toODSIDs(instanceIDs));
+
+ // delete considered children (informative relation)
+ for (Entry<EntityType, Set<String>> entry : consideredChildren) {
+ amount += delete(entry.getKey(), entry.getValue(), true);
+ }
+
+ return amount + instanceIDs.size();
+ }
+
+ /**
+ * Converts given {@code Collection} of instance IDs to ODS a {@link T_LONGLONG}
+ * array.
+ *
+ * @param instanceIDs The instance IDs.
+ * @return The corresponding ODS {@code T_LONGLONG[]} is returned.
+ */
+ private T_LONGLONG[] toODSIDs(Collection<String> instanceIDs) {
+ return instanceIDs.stream().map(ODSConverter::toODSID).toArray(T_LONGLONG[]::new);
+ }
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/InsertStatement.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/InsertStatement.java
new file mode 100644
index 0000000..875e053
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/InsertStatement.java
@@ -0,0 +1,278 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.api.atfxadapter.transaction;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.asam.ods.AIDName;
+import org.asam.ods.AIDNameValueSeqUnitId;
+import org.asam.ods.AoException;
+import org.asam.ods.ElemId;
+import org.asam.ods.T_LONGLONG;
+import org.eclipse.mdm.api.base.adapter.Attribute;
+import org.eclipse.mdm.api.base.adapter.Core;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.adapter.Relation;
+import org.eclipse.mdm.api.base.model.Deletable;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.FileLink;
+import org.eclipse.mdm.api.base.model.Sortable;
+import org.eclipse.mdm.api.base.model.Test;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.base.model.Value;
+import org.eclipse.mdm.api.base.query.Aggregation;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.base.query.Filter;
+import org.eclipse.mdm.api.base.query.Query;
+import org.eclipse.mdm.api.base.query.Record;
+import org.eclipse.mdm.api.base.query.Result;
+import org.eclipse.mdm.api.odsadapter.query.ODSEntityFactory;
+import org.eclipse.mdm.api.odsadapter.utils.ODSConverter;
+import org.eclipse.mdm.api.odsadapter.utils.ODSUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Insert statement is used to write new entities and their children.
+ *
+ * @see org.eclipse.mdm.api.odsadapter.transaction.InsertStatement
+ */
+final class InsertStatement extends BaseStatement {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(InsertStatement.class);
+
+ private final Map<Class<? extends Entity>, List<Entity>> childrenMap = new HashMap<>();
+ private final List<Core> cores = new ArrayList<>();
+ private final Map<String, List<Value>> insertMap = new HashMap<>();
+
+ private final List<FileLink> fileLinkToUpload = new ArrayList<>();
+
+ private final Map<String, SortIndexTestSteps> sortIndexTestSteps = new HashMap<>();
+ private boolean loadSortIndex;
+
+ /**
+ * Constructor.
+ *
+ * @param transaction The owning {@link ATFXTransaction}.
+ * @param entityType The associated {@link EntityType}.
+ */
+ InsertStatement(ATFXTransaction transaction, EntityType entityType) {
+ super(transaction, entityType);
+
+ loadSortIndex = getModelManager().getEntityType(TestStep.class).equals(getEntityType());
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void execute(Collection<Entity> entities) throws AoException, DataAccessException, IOException {
+ entities.stream().map(ODSEntityFactory::extract).forEach(this::readEntityCore);
+ execute();
+ }
+
+ /**
+ * Executes this statement for given {@link Core}s.
+ *
+ * @param cores The processed {@code Core}s.
+ * @throws AoException Thrown if the execution fails.
+ * @throws DataAccessException Thrown if the execution fails.
+ * @throws IOException Thrown if a file transfer operation fails.
+ */
+ public void executeWithCores(Collection<Core> cores) throws AoException, DataAccessException, IOException {
+ cores.forEach(this::readEntityCore);
+ execute();
+ }
+
+ /**
+ * Uploads new {@link FileLink}s, adjusts sort indices for new {@link TestStep}
+ * entities and writes collected insertion data at once. Once new entities are
+ * written their children are created by delegation to the
+ * {@link ATFXTransaction}.
+ *
+ * @throws AoException Thrown if the execution fails.
+ * @throws DataAccessException Thrown if the execution fails.
+ * @throws IOException Thrown if a file transfer operation fails.
+ */
+ private void execute() throws AoException, DataAccessException, IOException {
+ List<AIDNameValueSeqUnitId> anvsuList = new ArrayList<>();
+ T_LONGLONG aID = getEntityType().getODSID();
+
+ // TODO tracing progress in this method...
+
+ if (loadSortIndex && !sortIndexTestSteps.isEmpty()) {
+ adjustMissingSortIndices();
+ }
+
+ for (Entry<String, List<Value>> entry : insertMap.entrySet()) {
+ Attribute attribute = getEntityType().getAttribute(entry.getKey());
+
+ AIDNameValueSeqUnitId anvsu = new AIDNameValueSeqUnitId();
+ anvsu.attr = new AIDName(aID, entry.getKey());
+ anvsu.unitId = ODSConverter.toODSLong(0);
+ anvsu.values = ODSConverter.toODSValueSeq(attribute, entry.getValue());
+ anvsuList.add(anvsu);
+ }
+
+ long start = System.currentTimeMillis();
+ ElemId[] elemIds = getApplElemAccess()
+ .insertInstances(anvsuList.toArray(new AIDNameValueSeqUnitId[anvsuList.size()]));
+ for (int i = 0; i < elemIds.length; i++) {
+ cores.get(i).setID(Long.toString(ODSConverter.fromODSLong(elemIds[i].iid)));
+ }
+ long stop = System.currentTimeMillis();
+
+ LOGGER.debug("{} " + getEntityType() + " instances created in {} ms.", elemIds.length, stop - start);
+
+ for (List<Entity> children : childrenMap.values()) {
+ getTransaction().create(children);
+ }
+ }
+
+ /**
+ * Reads given {@link Core} and prepares its data to be written:
+ *
+ * <ul>
+ * <li>collect new {@link FileLink}s</li>
+ * <li>trace missing sort indices of TestSteps</li>
+ * <li>collect property {@link Value}s</li>
+ * <li>collect foreign key {@code Value}s</li>
+ * <li>collect child entities for recursive creation</li>
+ * </ul>
+ *
+ * @param core The {@code Core}.
+ */
+ private void readEntityCore(Core core) {
+ if (!core.getTypeName().equals(getEntityType().getName())) {
+ throw new IllegalArgumentException("Entity core '" + core.getTypeName()
+ + "' is incompatible with current insert statement for entity type '" + getEntityType() + "'.");
+ }
+
+ cores.add(core);
+
+ if (loadSortIndex) {
+ if ((Integer) core.getValues().get(Sortable.ATTR_SORT_INDEX).extract() < 0) {
+ sortIndexTestSteps.computeIfAbsent(core.getPermanentStore().get(Test.class).getID(),
+ k -> new SortIndexTestSteps()).testStepCores.add(core);
+ }
+ }
+
+ // add all entity values
+ for (Value value : core.getAllValues().values()) {
+ insertMap.computeIfAbsent(value.getName(), k -> new ArrayList<>()).add(value);
+ }
+
+ // collect file links
+ fileLinkToUpload.addAll(core.getAddedFileLinks());
+
+ // define "empty" values for informative relations
+ for (Relation relation : getEntityType().getInfoRelations()) {
+ insertMap.computeIfAbsent(relation.getName(), k -> new ArrayList<>()).add(relation.createValue());
+ }
+
+ // define "empty" values for parent relations
+ for (Relation relation : getEntityType().getParentRelations()) {
+ insertMap.computeIfAbsent(relation.getName(), k -> new ArrayList<>()).add(relation.createValue());
+ }
+
+ // replace "empty" relation values with corresponding instance IDs
+ setRelationIDs(core.getMutableStore().getCurrent());
+ setRelationIDs(core.getPermanentStore().getCurrent());
+
+ for (Entry<Class<? extends Deletable>, List<? extends Deletable>> entry : core.getChildrenStore().getCurrent()
+ .entrySet()) {
+ childrenMap.computeIfAbsent(entry.getKey(), k -> new ArrayList<>()).addAll(entry.getValue());
+ }
+
+ getTransaction().addModified(core);
+ getTransaction().addCreated(core);
+ }
+
+ /**
+ * Overwrites empty foreign key {@link Value} containers.
+ *
+ * @param relatedEntities The related {@link Entity}s.
+ */
+ private void setRelationIDs(Collection<Entity> relatedEntities) {
+ for (Entity relatedEntity : relatedEntities) {
+ if (!ODSUtils.isValidID(relatedEntity.getID())) {
+ throw new IllegalArgumentException("Related entity must be a persited entity.");
+ }
+
+ Relation relation = getEntityType().getRelation(getModelManager().getEntityType(relatedEntity));
+ List<Value> relationValues = insertMap.get(relation.getName());
+ if (relationValues == null) {
+ throw new IllegalStateException("Relation '" + relation + "' is incompatible with insert statement "
+ + "for entity type '" + getEntityType() + "'");
+ }
+ relationValues.get(relationValues.size() - 1).set(relatedEntity.getID());
+ }
+ }
+
+ /**
+ * Adjusts missing sort indices for {@link TestStep}s by querying last used max
+ * sort index.
+ *
+ * @throws DataAccessException Thrown if unable to query used sort indices.
+ */
+ private void adjustMissingSortIndices() throws DataAccessException {
+ EntityType testStep = getEntityType();
+ EntityType test = getModelManager().getEntityType(Test.class);
+ Relation parentRelation = testStep.getRelation(test);
+
+ Attribute attrSortIndex = testStep.getAttribute(Sortable.ATTR_SORT_INDEX);
+ Query query = getQueryService().createQuery().select(parentRelation.getAttribute())
+ .select(attrSortIndex, Aggregation.MAXIMUM).group(parentRelation.getAttribute());
+
+ Filter filter = Filter.idsOnly(parentRelation, sortIndexTestSteps.keySet());
+ for (Result result : query.fetch(filter)) {
+ Record record = result.getRecord(testStep);
+ int sortIndex = (Integer) record.getValues()
+ .get(ODSConverter.getColumnName(attrSortIndex, Aggregation.MAXIMUM)).extract();
+ sortIndexTestSteps.remove(record.getID(parentRelation).get()).setIndices(sortIndex + 1);
+ }
+
+ // start at 1 for all remaining
+ sortIndexTestSteps.values().forEach(tss -> tss.setIndices(0));
+ }
+
+ /**
+ * Utility class to write missing sort index of new {@link TestStep}s.
+ */
+ private static final class SortIndexTestSteps {
+
+ private List<Core> testStepCores = new ArrayList<>();
+
+ /**
+ * Assigns sort indices to {@link Core}s starting at given index.
+ *
+ * @param startIndex The start index.
+ */
+ private void setIndices(int startIndex) {
+ int index = startIndex;
+ for (Core core : testStepCores) {
+ core.getValues().get(Sortable.ATTR_SORT_INDEX).set(index++);
+ }
+ }
+
+ }
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/UpdateStatement.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/UpdateStatement.java
new file mode 100644
index 0000000..9d8a006
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/UpdateStatement.java
@@ -0,0 +1,225 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.api.atfxadapter.transaction;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.stream.Collectors;
+
+import org.asam.ods.AIDName;
+import org.asam.ods.AIDNameValueSeqUnitId;
+import org.asam.ods.AoException;
+import org.asam.ods.T_LONGLONG;
+import org.eclipse.mdm.api.base.adapter.Attribute;
+import org.eclipse.mdm.api.base.adapter.Core;
+import org.eclipse.mdm.api.base.adapter.EntityStore;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.adapter.Relation;
+import org.eclipse.mdm.api.base.model.Deletable;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.FileLink;
+import org.eclipse.mdm.api.base.model.Value;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.odsadapter.query.ODSEntityFactory;
+import org.eclipse.mdm.api.odsadapter.utils.ODSConverter;
+import org.eclipse.mdm.api.odsadapter.utils.ODSUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Insert statement is used to update entities and their children.
+ *
+ * @see org.eclipse.mdm.api.odsadapter.transaction.UpdateStatement
+ */
+final class UpdateStatement extends BaseStatement {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(UpdateStatement.class);
+
+ private final Map<Class<? extends Entity>, List<Entity>> childrenToCreate = new HashMap<>();
+ private final Map<Class<? extends Entity>, List<Entity>> childrenToUpdate = new HashMap<>();
+ private final Map<Class<? extends Deletable>, List<Deletable>> childrenToRemove = new HashMap<>();
+ private Map<String, List<Value>> updateMap = new HashMap<>();
+
+ private final List<String> nonUpdatableRelationNames;
+ private final boolean ignoreChildren;
+
+ /**
+ * Constructor.
+ *
+ * @param transaction The owning {@link ATFXTransaction}.
+ * @param entityType The associated {@link EntityType}.
+ * @param ignoreChildren If {@code true}, then child entities won't be
+ * processed.
+ */
+ UpdateStatement(ATFXTransaction transaction, EntityType entityType, boolean ignoreChildren) {
+ super(transaction, entityType);
+
+ nonUpdatableRelationNames = entityType.getInfoRelations().stream().map(Relation::getName)
+ .collect(Collectors.toList());
+ this.ignoreChildren = ignoreChildren;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void execute(Collection<Entity> entities) throws AoException, DataAccessException, IOException {
+ for (Entity entity : entities) {
+ readEntityCore(ODSEntityFactory.extract(entity));
+ }
+
+ // TODO tracing progress in this method...
+
+ List<AIDNameValueSeqUnitId> anvsuList = new ArrayList<>();
+ T_LONGLONG aID = getEntityType().getODSID();
+
+ for (Entry<String, List<Value>> entry : updateMap.entrySet()) {
+ if (nonUpdatableRelationNames.contains(entry.getKey())) {
+ // skip "empty" informative relation sequence
+ continue;
+ }
+
+ Attribute attribute = getEntityType().getAttribute(entry.getKey());
+
+ AIDNameValueSeqUnitId anvsu = new AIDNameValueSeqUnitId();
+ anvsu.attr = new AIDName(aID, entry.getKey());
+ anvsu.unitId = ODSConverter.toODSLong(0);
+ anvsu.values = ODSConverter.toODSValueSeq(attribute, entry.getValue());
+ anvsuList.add(anvsu);
+ }
+
+ long start = System.currentTimeMillis();
+ getApplElemAccess().updateInstances(anvsuList.toArray(new AIDNameValueSeqUnitId[anvsuList.size()]));
+ long stop = System.currentTimeMillis();
+
+ LOGGER.debug("{} " + getEntityType() + " instances updated in {} ms.", entities.size(), stop - start);
+
+ // delete first to make sure naming collisions do not occur!
+ for (List<Deletable> children : childrenToRemove.values()) {
+ getTransaction().delete(children);
+ }
+ for (List<Entity> children : childrenToCreate.values()) {
+ getTransaction().create(children);
+ }
+ for (List<Entity> children : childrenToUpdate.values()) {
+ getTransaction().update(children);
+ }
+ }
+
+ /**
+ * Reads given {@link Core} and prepares its data to be written:
+ *
+ * <ul>
+ * <li>collect new and removed {@link FileLink}s</li>
+ * <li>collect property {@link Value}s</li>
+ * <li>collect foreign key {@code Value}s</li>
+ * <li>collect child entities for recursive create/update/delete</li>
+ * </ul>
+ *
+ * @param core The {@code Core}.
+ * @throws DataAccessException Thrown in case of errors.
+ */
+ private void readEntityCore(Core core) throws DataAccessException {
+ if (!core.getTypeName().equals(getEntityType().getName())) {
+ throw new IllegalArgumentException("Entity core '" + core.getTypeName()
+ + "' is incompatible with current update statement for entity type '" + getEntityType() + "'.");
+ }
+
+ // add all entity values
+ for (Value value : core.getAllValues().values()) {
+ updateMap.computeIfAbsent(value.getName(), k -> new ArrayList<>()).add(value);
+ }
+
+ updateMap.computeIfAbsent(getEntityType().getIDAttribute().getName(), k -> new ArrayList<>())
+ .add(getEntityType().getIDAttribute().createValue(core.getID()));
+
+ // define "empty" values for ALL informative relations
+ for (Relation relation : getEntityType().getInfoRelations()) {
+ updateMap.computeIfAbsent(relation.getName(), k -> new ArrayList<>()).add(relation.createValue());
+ }
+
+ // preserve "empty" relation values for removed related entities
+ EntityStore mutableStore = core.getMutableStore();
+ mutableStore.getRemoved().stream().map(e -> getModelManager().getEntityType(e))
+ .map(getEntityType()::getRelation).map(Relation::getName).forEach(nonUpdatableRelationNames::remove);
+
+ // replace "empty" relation values with corresponding instance IDs
+ setRelationIDs(mutableStore.getCurrent());
+
+ collectChildEntities(core);
+
+ getTransaction().addModified(core);
+ }
+
+ /**
+ * Collects child entities for recursive processing.
+ *
+ * @param core The {@link Core}.
+ */
+ private void collectChildEntities(Core core) {
+ if (ignoreChildren) {
+ return;
+ }
+
+ for (Entry<Class<? extends Deletable>, List<? extends Deletable>> entry : core.getChildrenStore().getCurrent()
+ .entrySet()) {
+ Map<Boolean, List<Entity>> partition = entry.getValue().stream()
+ .collect(Collectors.partitioningBy(e -> ODSUtils.isValidID(e.getID())));
+ List<Entity> virtualEntities = partition.get(Boolean.FALSE);
+ if (virtualEntities != null && !virtualEntities.isEmpty()) {
+ childrenToCreate.computeIfAbsent(entry.getKey(), k -> new ArrayList<>()).addAll(virtualEntities);
+ }
+ List<Entity> existingEntities = partition.get(Boolean.TRUE);
+ if (existingEntities != null && !existingEntities.isEmpty()) {
+ childrenToUpdate.computeIfAbsent(entry.getKey(), k -> new ArrayList<>()).addAll(existingEntities);
+ }
+ }
+
+ for (Entry<Class<? extends Deletable>, List<? extends Deletable>> entry : core.getChildrenStore().getRemoved()
+ .entrySet()) {
+ List<Deletable> toDelete = entry.getValue().stream().filter(e -> ODSUtils.isValidID(e.getID()))
+ .collect(Collectors.toList());
+ childrenToRemove.computeIfAbsent(entry.getKey(), k -> new ArrayList<>()).addAll(toDelete);
+ }
+ }
+
+ /**
+ * Overwrites empty foreign key {@link Value} containers.
+ *
+ * @param relatedEntities The related {@link Entity}s.
+ */
+ private void setRelationIDs(Collection<Entity> relatedEntities) {
+ for (Entity relatedEntity : relatedEntities) {
+ if (!ODSUtils.isValidID(relatedEntity.getID())) {
+ throw new IllegalArgumentException("Related entity must be a persited entity.");
+ }
+
+ Relation relation = getEntityType().getRelation(getModelManager().getEntityType(relatedEntity));
+ List<Value> relationValues = updateMap.get(relation.getName());
+ if (relationValues == null) {
+ throw new IllegalStateException("Relation '" + relation
+ + "' is incompatible with update statement for entity type '" + getEntityType() + "'");
+ }
+ relationValues.get(relationValues.size() - 1).set(relatedEntity.getID());
+ nonUpdatableRelationNames.remove(relation.getName());
+ }
+ }
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/WriteRequestHandler.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/WriteRequestHandler.java
new file mode 100644
index 0000000..3504534
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/main/java/org/eclipse/mdm/api/atfxadapter/transaction/WriteRequestHandler.java
@@ -0,0 +1,147 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.api.atfxadapter.transaction;
+
+import java.io.IOException;
+import java.lang.reflect.Array;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.IntStream;
+
+import org.asam.ods.AoException;
+import org.eclipse.mdm.api.base.adapter.Core;
+import org.eclipse.mdm.api.base.adapter.DefaultCore;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.massdata.WriteRequest;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.Value;
+import org.eclipse.mdm.api.base.model.ValueType;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.odsadapter.utils.ODSConverter;
+
+/**
+ * Writes mass data specified in {@link WriteRequest}s.
+ *
+ * @see org.eclipse.mdm.api.odsadapter.transaction.WriteRequestHandler
+ */
+public final class WriteRequestHandler {
+
+ private static final String AE_LC_ATTR_INDEPENDENT = "IndependentFlag";
+ private static final String AE_LC_ATTR_REPRESENTATION = "SequenceRepresentation";
+ private static final String AE_LC_ATTR_PARAMETERS = "GenerationParameters";
+ private static final String AE_LC_ATTR_RAWDATATYPE = "RawDatatype";
+ private static final String AE_LC_ATTR_AXISTYPE = "axistype";
+ private static final String AE_LC_ATTR_VALUES = "Values";
+ private static final String AE_LC_ATTR_FLAGS = "Flags";
+ private static final String AE_LC_ATTR_GLOBAL_FLAG = "GlobalFlag";
+
+ private final List<Core> cores = new ArrayList<>();
+ private final EntityType localColumnEntityType;
+ private final InsertStatement insertStatement;
+
+ /**
+ * Constructor.
+ *
+ * @param transaction The owning {@link ATFXTransaction}.
+ */
+ public WriteRequestHandler(ATFXTransaction transaction) {
+ localColumnEntityType = transaction.getModelManager().getEntityType("LocalColumn");
+ insertStatement = new InsertStatement(transaction, localColumnEntityType);
+ }
+
+ /**
+ * Adds given {@link WriteRequest} to be processed.
+ *
+ * @param writeRequest The {@code WriteRequest}.
+ */
+ public void addRequest(WriteRequest writeRequest) {
+ cores.add(createCore(writeRequest));
+ }
+
+ /**
+ * Imports given mass data configurations.
+ *
+ * @throws AoException Thrown if the execution fails.
+ * @throws DataAccessException Thrown if the execution fails.
+ * @throws IOException Thrown if a file transfer operation fails.
+ */
+ public void execute() throws AoException, DataAccessException, IOException {
+ insertStatement.executeWithCores(cores);
+ }
+
+ /**
+ * Reads given {@link WriteRequest} and prepares a corresponding {@link Core}
+ * for import.
+ *
+ * @param writeRequest The mass data configuration.
+ * @return The created {@code Core} is returned.
+ */
+ private Core createCore(WriteRequest writeRequest) {
+ Core core = new DefaultCore(localColumnEntityType);
+
+ core.getPermanentStore().set(writeRequest.getChannelGroup());
+ core.getMutableStore().set(writeRequest.getChannel());
+
+ Map<String, Value> values = core.getValues();
+ values.get(Entity.ATTR_NAME).set(writeRequest.getChannel().getName());
+ values.get(Entity.ATTR_MIMETYPE).set("application/x-asam.aolocalcolumn");
+ values.get(AE_LC_ATTR_INDEPENDENT).set((short) (writeRequest.isIndependent() ? 1 : 0));
+ values.get(AE_LC_ATTR_RAWDATATYPE).set(writeRequest.getRawScalarType());
+ values.get(AE_LC_ATTR_REPRESENTATION).set(writeRequest.getSequenceRepresentation());
+ values.get(AE_LC_ATTR_AXISTYPE).set(writeRequest.getAxisType());
+ values.get(AE_LC_ATTR_PARAMETERS).set(writeRequest.getGenerationParameters());
+
+ if (writeRequest.hasValues()) {
+ ValueType<?> valueType = writeRequest.getRawScalarType().toValueType();
+ String unitName = writeRequest.getChannel().getUnit().getName();
+ values.put(AE_LC_ATTR_VALUES,
+ valueType.create(AE_LC_ATTR_VALUES, unitName, true, writeRequest.getValues()));
+
+ // OpenATFX issue: For "implicit" columns, if no value for the
+ // GenerationParameters attribute is present,
+ // it is attempted to transfer the local column values (through which the
+ // generation parameters are
+ // available in these cases) to the GenerationParameters attribute without
+ // converting them to the
+ // correct DS_DOUBLE data type first (unless it is a DOUBLE or LONG column),
+ // resulting in an exception.
+ // Hence, supply correctly converted generation parameters as a workaround:
+ if (writeRequest.getSequenceRepresentation().isImplicit()) {
+ Object genParamValues = writeRequest.getValues();
+ double[] genParamD = new double[Array.getLength(genParamValues)];
+ IntStream.range(0, genParamD.length)
+ .forEach(i -> genParamD[i] = ((Number) Array.get(genParamValues, i)).doubleValue());
+ values.get(AE_LC_ATTR_PARAMETERS).set(genParamD);
+ }
+
+ // flags
+ if (writeRequest.areAllValid()) {
+ values.get(AE_LC_ATTR_GLOBAL_FLAG).set((short) 15);
+ } else {
+ short[] flags = ODSConverter.toODSValidFlagSeq(writeRequest.getFlags());
+ values.get(AE_LC_ATTR_FLAGS).set(flags);
+ }
+ } else if (writeRequest.hasExternalComponents()) {
+ // TODO
+ throw new UnsupportedOperationException("NOT YET IMPLEMENTED.");
+ } else {
+ throw new IllegalStateException("Given write request neither has measured values nor external components");
+ }
+
+ return core;
+ }
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/java/org/eclipse/mdm/api/atfxadapter/AtfxAdaperTest.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/java/org/eclipse/mdm/api/atfxadapter/AtfxAdaperTest.java
new file mode 100644
index 0000000..3043a16
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/java/org/eclipse/mdm/api/atfxadapter/AtfxAdaperTest.java
@@ -0,0 +1,211 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.api.atfxadapter;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.List;
+import java.util.Map;
+
+import org.assertj.core.api.Assertions;
+import org.eclipse.mdm.api.base.ConnectionException;
+import org.eclipse.mdm.api.base.massdata.ReadRequest;
+import org.eclipse.mdm.api.base.model.Channel;
+import org.eclipse.mdm.api.base.model.ChannelGroup;
+import org.eclipse.mdm.api.base.model.ContextRoot;
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.api.base.model.MeasuredValues;
+import org.eclipse.mdm.api.base.model.Measurement;
+import org.eclipse.mdm.api.base.model.Test;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.base.model.ValueType;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.api.dflt.model.Project;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+import com.google.common.collect.ImmutableMap;
+
+public class AtfxAdaperTest {
+
+ public static final String ATFX_FILE = "src/test/resources/Right_Acc.atfx";
+
+ public static ApplicationContext context;
+
+ @BeforeClass
+ public static void init() throws ConnectionException {
+ Map<String, String> map = ImmutableMap.of("atfxfile", ATFX_FILE, "freetext.active", "false");
+
+ context = new ATFXContextFactory().connect(map);
+ }
+
+ @AfterClass
+ public static void teardown() throws ConnectionException {
+ context.close();
+ }
+
+ @org.junit.Test
+ public void testLoadLoggedOnUser() {
+ EntityManager em = context.getEntityManager().get();
+
+ assertThat(em.loadLoggedOnUser()).isNotNull();
+ ;
+ }
+
+ @org.junit.Test
+ public void testLoadEnvironment() {
+ EntityManager em = context.getEntityManager().get();
+
+ assertThat(em.loadEnvironment().getName()).isEqualTo("MDM");
+ }
+
+ @org.junit.Test
+ public void testLoadAllProjects() {
+
+ EntityManager em = context.getEntityManager().get();
+
+ assertThat(em.loadAll(Project.class)).extracting(Project::getName).contains("PMV Model P");
+ }
+
+ @org.junit.Test
+ public void testLoadAllTests() {
+
+ EntityManager em = context.getEntityManager().get();
+
+ assertThat(em.loadAll(Test.class)).extracting(Test::getName).contains("PBN_UNECE_R51_20140314170907");
+ }
+
+ @org.junit.Test
+ public void testLoadAllTestSteps() {
+
+ EntityManager em = context.getEntityManager().get();
+
+ assertThat(em.loadAll(TestStep.class)).extracting(TestStep::getName).contains("PBN_UNECE_R51_Right_Acc_70");
+ }
+
+ @org.junit.Test
+ public void testLoadAllMeasurements() {
+
+ EntityManager em = context.getEntityManager().get();
+ assertThat(em.loadAll(Measurement.class)).extracting(Measurement::getName).contains("Channel");
+ }
+
+ @org.junit.Test
+ public void testLoadParent() {
+
+ EntityManager em = context.getEntityManager().get();
+ Measurement meaResult = em.loadAll(Measurement.class).get(0);
+
+ assertThat(em.loadParent(meaResult, TestStep.class).get()).extracting(TestStep::getName)
+ .contains("PBN_UNECE_R51_Right_Acc_70");
+ }
+
+ @org.junit.Test
+ public void testLoadChildren() {
+
+ EntityManager em = context.getEntityManager().get();
+ Test test = em.loadAll(Test.class).get(0);
+
+ assertThat(em.loadChildren(test, TestStep.class).get(0)).extracting(TestStep::getName)
+ .contains("PBN_UNECE_R51_Right_Acc_70");
+ }
+
+ @org.junit.Test
+ public void testLoadChildrenForChannelGroup() {
+
+ EntityManager em = context.getEntityManager().get();
+ ChannelGroup channelGroup = em.loadAll(ChannelGroup.class).get(0);
+
+ assertThat(em.loadChildren(channelGroup, Channel.class)).extracting(Channel::getName).contains("X-Axis",
+ "CHANNEL01", "CHANNEL02", "CHANNEL03", "CHANNEL04", "CHANNEL05", "CHANNEL06", "CHANNEL07", "CHANNEL08",
+ "CHANNEL09", "CHANNEL10");
+ }
+
+ @org.junit.Test
+ public void testLoadChildrenForChannelGroupWithPattern() {
+
+ EntityManager em = context.getEntityManager().get();
+ ChannelGroup channelGroup = em.loadAll(ChannelGroup.class).get(0);
+
+ Assertions.assertThatThrownBy(() -> em.loadChildren(channelGroup, Channel.class, "*Axis"))
+ .isInstanceOf(DataAccessException.class).hasMessageContaining("not supported");
+
+ // assertThat(em.loadChildren(channelGroup, Channel.class,
+ // "*Axis")).extracting(Channel::getName)
+ // .contains("X-Axis", "CHANNEL01", "CHANNEL02", "CHANNEL03", "CHANNEL04",
+ // "CHANNEL05", "CHANNEL06", "CHANNEL07", "CHANNEL08", "CHANNEL09",
+ // "CHANNEL10");
+ }
+
+ @org.junit.Test
+ public void testLoadParentForChannel() {
+
+ EntityManager em = context.getEntityManager().get();
+ Channel channel = em.loadAll(Channel.class).get(0);
+
+ assertThat(em.loadParent(channel, ChannelGroup.class).get()).extracting(ChannelGroup::getName)
+ .contains("Channel");
+ }
+
+ @org.junit.Test
+ public void testLoadAllChannelGroups() {
+
+ EntityManager em = context.getEntityManager().get();
+
+ assertThat(em.loadAll(ChannelGroup.class)).extracting(ChannelGroup::getName).contains("Channel");
+ }
+
+ @org.junit.Test
+ public void testLoadAllChannels() {
+
+ EntityManager em = context.getEntityManager().get();
+
+ assertThat(em.loadAll(Channel.class)).extracting(Channel::getName).contains("X-Axis", "CHANNEL01", "CHANNEL02",
+ "CHANNEL03", "CHANNEL04", "CHANNEL05", "CHANNEL06", "CHANNEL07", "CHANNEL08", "CHANNEL09", "CHANNEL10");
+ }
+
+ @org.junit.Test
+ public void testLoadAllContext() {
+
+ EntityManager em = context.getEntityManager().get();
+
+ List<Measurement> measurements = em.loadAll(Measurement.class);
+ assertThat(measurements).hasSize(1);
+
+ Map<ContextType, ContextRoot> context = em.loadContexts(measurements.get(0));
+ assertThat(context.get(ContextType.UNITUNDERTEST).getContextComponents()).extracting(cc -> cc.getName())
+ .contains("FL_tyre");
+
+ assertThat(context.get(ContextType.UNITUNDERTEST).getContextComponents().get(0).getValues()).hasSize(7)
+ .containsEntry("Name", ValueType.STRING.create("Name", "FL_tyre"))
+ .containsEntry("axle", ValueType.SHORT.create("axle", (short) 1))
+ .containsEntry("side", ValueType.STRING.create("side", "Left"))
+ .containsEntry("manufacturer", ValueType.STRING.create("manufacturer", "Tunnelsand"));
+
+ }
+
+ @org.junit.Test
+ public void testReadMeasuredValues() {
+ EntityManager em = context.getEntityManager().get();
+
+ List<ChannelGroup> listCg = em.loadAll(ChannelGroup.class);
+ assertThat(listCg).hasSize(1);
+
+ List<MeasuredValues> values = em
+ .readMeasuredValues(ReadRequest.create(listCg.get(0)).allChannels().allValues());
+ assertThat(values).extracting(mv -> mv.getLength()).containsOnly(3001);
+ }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/resources/Right_Acc.atfx b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/resources/Right_Acc.atfx
new file mode 100644
index 0000000..a044f4f
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/resources/Right_Acc.atfx
@@ -0,0 +1,3497 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<atfx_file version="atfx_file: V1.2.0" xmlns="http://www.asam.net/ODS/5.2.0/Schema">
+ <documentation>
+ <exported_by>openATFX</exported_by>
+ <exporter>openATFX</exporter>
+ <export_date_time>20140317155010</export_date_time>
+ <exporter_version>0.4.3</exporter_version>
+ </documentation>
+ <base_model_version>asam30</base_model_version>
+ <application_model>
+ <application_enumeration>
+ <name>valid_enum</name>
+ <item>
+ <name>editing</name>
+ <value>0</value>
+ </item>
+ <item>
+ <name>valid</name>
+ <value>1</value>
+ </item>
+ <item>
+ <name>archive</name>
+ <value>2</value>
+ </item>
+ </application_enumeration>
+ <application_enumeration>
+ <name>axistype</name>
+ <item>
+ <name>Xaxis</name>
+ <value>0</value>
+ </item>
+ <item>
+ <name>Yaxis</name>
+ <value>1</value>
+ </item>
+ <item>
+ <name>Both</name>
+ <value>2</value>
+ </item>
+ </application_enumeration>
+ <application_element>
+ <name>Environment</name>
+ <basetype>AoEnvironment</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Description</name>
+ <base_attribute>description</base_attribute>
+ <length>500</length>
+ </application_attribute>
+ <application_attribute>
+ <name>DateCreated</name>
+ <base_attribute>version_date</base_attribute>
+ <obligatory>true</obligatory>
+ <length>30</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Max_test_level</name>
+ <base_attribute>max_test_level</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Base_model_version</name>
+ <base_attribute>base_model_version</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>AppModelType</name>
+ <base_attribute>application_model_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>100</length>
+ </application_attribute>
+ <application_attribute>
+ <name>AppModelVersion</name>
+ <base_attribute>application_model_version</base_attribute>
+ <obligatory>true</obligatory>
+ <length>20</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Timezone</name>
+ <base_attribute>timezone</base_attribute>
+ <obligatory>true</obligatory>
+ <length>20</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MeaningOfAliases</name>
+ <base_attribute>meaning_of_aliases</base_attribute>
+ <obligatory>true</obligatory>
+ <length>20</length>
+ </application_attribute>
+ </application_element>
+ <application_element>
+ <name>Project</name>
+ <basetype>AoTest</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>StructureLevel</name>
+ <ref_to>StructureLevel</ref_to>
+ <base_relation>children</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>Project</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>StructureLevel</name>
+ <basetype>AoSubTest</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>Tests</name>
+ <ref_to>Test</ref_to>
+ <base_relation>children</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>StructureLevel</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>Project</name>
+ <ref_to>Project</ref_to>
+ <base_relation>parent_test</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>StructureLevel</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>Test</name>
+ <basetype>AoSubTest</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>100</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Description</name>
+ <base_attribute>description</base_attribute>
+ <length>500</length>
+ </application_attribute>
+ <application_attribute>
+ <name>DateCreated</name>
+ <base_attribute>version_date</base_attribute>
+ <length>30</length>
+ </application_attribute>
+ <application_attribute>
+ <name>DateClosed</name>
+ <datatype>DT_DATE</datatype>
+ <length>30</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MDMLinks</name>
+ <base_attribute>external_references</base_attribute>
+ <length>254</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>ResponsiblePerson</name>
+ <ref_to>User</ref_to>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>Tests</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>StructureLevel</name>
+ <ref_to>StructureLevel</ref_to>
+ <base_relation>parent_test</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>Tests</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>TestSteps</name>
+ <ref_to>TestStep</ref_to>
+ <base_relation>children</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>Test</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>TestStep</name>
+ <basetype>AoSubTest</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>100</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Description</name>
+ <base_attribute>description</base_attribute>
+ <length>500</length>
+ </application_attribute>
+ <application_attribute>
+ <name>DateCreated</name>
+ <base_attribute>version_date</base_attribute>
+ <length>30</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Optional</name>
+ <datatype>DT_BOOLEAN</datatype>
+ </application_attribute>
+ <application_attribute>
+ <name>Sortindex</name>
+ <datatype>DT_LONG</datatype>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>MDMLinks</name>
+ <base_attribute>external_references</base_attribute>
+ <length>254</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>Test</name>
+ <ref_to>Test</ref_to>
+ <base_relation>parent_test</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>TestSteps</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>MeaResults</name>
+ <ref_to>MeaResult</ref_to>
+ <base_relation>children</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>TestStep</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>MeaResult</name>
+ <basetype>AoMeasurement</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>100</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Description</name>
+ <base_attribute>description</base_attribute>
+ <length>500</length>
+ </application_attribute>
+ <application_attribute>
+ <name>DateCreated</name>
+ <base_attribute>version_date</base_attribute>
+ <length>30</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MeasurementBegin</name>
+ <base_attribute>measurement_begin</base_attribute>
+ <length>30</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MeasurementEnd</name>
+ <base_attribute>measurement_end</base_attribute>
+ <length>30</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MDMLinks</name>
+ <base_attribute>external_references</base_attribute>
+ <length>254</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>TestEquipment</name>
+ <ref_to>TestEquipment</ref_to>
+ <base_relation>equipments</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>MeaResults</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>UnitUnderTest</name>
+ <ref_to>UnitUnderTest</ref_to>
+ <base_relation>units_under_test</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>MeaResults</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>MeaQuantities</name>
+ <ref_to>MeaQuantity</ref_to>
+ <base_relation>measurement_quantities</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>MeaResult</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>TestStep</name>
+ <ref_to>TestStep</ref_to>
+ <base_relation>test</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>MeaResults</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>SubMatrices</name>
+ <ref_to>SubMatrix</ref_to>
+ <base_relation>submatrices</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>MeaResult</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>ResultParameterSet</name>
+ <ref_to>ResultParameterSet</ref_to>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>MeaResult</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>TestSequence</name>
+ <ref_to>TestSequence</ref_to>
+ <base_relation>sequences</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>MeaResults</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>UnitUnderTest</name>
+ <basetype>AoUnitUnderTest</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>100</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Version</name>
+ <base_attribute>version</base_attribute>
+ <obligatory>true</obligatory>
+ <length>20</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>engine</name>
+ <ref_to>engine</ref_to>
+ <base_relation>children</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>UnitUnderTest</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>gearbox</name>
+ <ref_to>gearbox</ref_to>
+ <base_relation>children</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>UnitUnderTest</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>tyre</name>
+ <ref_to>tyre</ref_to>
+ <base_relation>children</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>UnitUnderTest</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>noise_reduction_system</name>
+ <ref_to>noise_reduction_system</ref_to>
+ <base_relation>children</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>UnitUnderTest</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>vehicle</name>
+ <ref_to>vehicle</ref_to>
+ <base_relation>children</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>UnitUnderTest</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>exhaust_piping</name>
+ <ref_to>exhaust_piping</ref_to>
+ <base_relation>children</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>UnitUnderTest</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>expansion_chamber</name>
+ <ref_to>expansion_chamber</ref_to>
+ <base_relation>children</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>UnitUnderTest</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>air_filter</name>
+ <ref_to>air_filter</ref_to>
+ <base_relation>children</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>UnitUnderTest</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>MeaResults</name>
+ <ref_to>MeaResult</ref_to>
+ <base_relation>measurement</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>UnitUnderTest</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>silencer</name>
+ <ref_to>silencer</ref_to>
+ <base_relation>children</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>UnitUnderTest</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>engine</name>
+ <basetype>AoUnitUnderTestPart</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>power</name>
+ <datatype>DT_SHORT</datatype>
+ </application_attribute>
+ <application_attribute>
+ <name>manufacturer</name>
+ <datatype>DT_STRING</datatype>
+ <length>254</length>
+ </application_attribute>
+ <application_attribute>
+ <name>type</name>
+ <datatype>DT_STRING</datatype>
+ <length>254</length>
+ </application_attribute>
+ <application_attribute>
+ <name>model</name>
+ <datatype>DT_STRING</datatype>
+ <length>254</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>UnitUnderTest</name>
+ <ref_to>UnitUnderTest</ref_to>
+ <base_relation>parent_unit_under_test</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>engine</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>gearbox</name>
+ <basetype>AoUnitUnderTestPart</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>no_forward_gears</name>
+ <datatype>DT_SHORT</datatype>
+ </application_attribute>
+ <application_attribute>
+ <name>transmission</name>
+ <datatype>DT_STRING</datatype>
+ <length>254</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>UnitUnderTest</name>
+ <ref_to>UnitUnderTest</ref_to>
+ <base_relation>parent_unit_under_test</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>gearbox</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>noise_reduction_system</name>
+ <basetype>AoUnitUnderTestPart</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>design_family</name>
+ <datatype>DT_STRING</datatype>
+ <length>254</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>UnitUnderTest</name>
+ <ref_to>UnitUnderTest</ref_to>
+ <base_relation>parent_unit_under_test</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>noise_reduction_system</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>tyre</name>
+ <basetype>AoUnitUnderTestPart</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>axle</name>
+ <datatype>DT_SHORT</datatype>
+ </application_attribute>
+ <application_attribute>
+ <name>side</name>
+ <datatype>DT_STRING</datatype>
+ <length>254</length>
+ </application_attribute>
+ <application_attribute>
+ <name>size</name>
+ <datatype>DT_STRING</datatype>
+ <length>254</length>
+ </application_attribute>
+ <application_attribute>
+ <name>manufacturer</name>
+ <datatype>DT_STRING</datatype>
+ <length>254</length>
+ </application_attribute>
+ <application_attribute>
+ <name>tread_depth</name>
+ <datatype>DT_FLOAT</datatype>
+ </application_attribute>
+ <relation_attribute>
+ <name>UnitUnderTest</name>
+ <ref_to>UnitUnderTest</ref_to>
+ <base_relation>parent_unit_under_test</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>tyre</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>air_filter</name>
+ <basetype>AoUnitUnderTestPart</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>min_bulk_material_density</name>
+ <datatype>DT_FLOAT</datatype>
+ </application_attribute>
+ <relation_attribute>
+ <name>UnitUnderTest</name>
+ <ref_to>UnitUnderTest</ref_to>
+ <base_relation>parent_unit_under_test</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>air_filter</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>expansion_chamber</name>
+ <basetype>AoUnitUnderTestPart</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>volume</name>
+ <datatype>DT_FLOAT</datatype>
+ </application_attribute>
+ <relation_attribute>
+ <name>UnitUnderTest</name>
+ <ref_to>UnitUnderTest</ref_to>
+ <base_relation>parent_unit_under_test</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>expansion_chamber</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>exhaust_piping</name>
+ <basetype>AoUnitUnderTestPart</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>material</name>
+ <datatype>DT_STRING</datatype>
+ <length>254</length>
+ </application_attribute>
+ <application_attribute>
+ <name>length</name>
+ <datatype>DT_FLOAT</datatype>
+ </application_attribute>
+ <relation_attribute>
+ <name>UnitUnderTest</name>
+ <ref_to>UnitUnderTest</ref_to>
+ <base_relation>parent_unit_under_test</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>exhaust_piping</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>vehicle</name>
+ <basetype>AoUnitUnderTestPart</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>maximum_authorized_mass</name>
+ <datatype>DT_FLOAT</datatype>
+ </application_attribute>
+ <application_attribute>
+ <name>vehicle_type</name>
+ <datatype>DT_STRING</datatype>
+ <length>254</length>
+ </application_attribute>
+ <application_attribute>
+ <name>vehicle_category</name>
+ <datatype>DT_STRING</datatype>
+ <length>254</length>
+ </application_attribute>
+ <application_attribute>
+ <name>manufacturer</name>
+ <datatype>DT_STRING</datatype>
+ <length>254</length>
+ </application_attribute>
+ <application_attribute>
+ <name>model</name>
+ <datatype>DT_STRING</datatype>
+ <obligatory>true</obligatory>
+ <length>254</length>
+ </application_attribute>
+ <application_attribute>
+ <name>length</name>
+ <datatype>DT_FLOAT</datatype>
+ </application_attribute>
+ <application_attribute>
+ <name>reference_point</name>
+ <datatype>DT_STRING</datatype>
+ <length>254</length>
+ </application_attribute>
+ <application_attribute>
+ <name>mass_in_running_order</name>
+ <datatype>DT_FLOAT</datatype>
+ </application_attribute>
+ <relation_attribute>
+ <name>UnitUnderTest</name>
+ <ref_to>UnitUnderTest</ref_to>
+ <base_relation>parent_unit_under_test</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>vehicle</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>silencer</name>
+ <basetype>AoUnitUnderTestPart</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>location</name>
+ <datatype>DT_STRING</datatype>
+ <length>254</length>
+ </application_attribute>
+ <application_attribute>
+ <name>manufacturer</name>
+ <datatype>DT_STRING</datatype>
+ <length>254</length>
+ </application_attribute>
+ <application_attribute>
+ <name>model</name>
+ <datatype>DT_STRING</datatype>
+ <length>254</length>
+ </application_attribute>
+ <application_attribute>
+ <name>type</name>
+ <datatype>DT_STRING</datatype>
+ <length>254</length>
+ </application_attribute>
+ <application_attribute>
+ <name>fibre_type</name>
+ <datatype>DT_STRING</datatype>
+ <length>254</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>UnitUnderTest</name>
+ <ref_to>UnitUnderTest</ref_to>
+ <base_relation>parent_unit_under_test</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>silencer</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>TestEquipment</name>
+ <basetype>AoTestEquipment</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>100</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Version</name>
+ <base_attribute>version</base_attribute>
+ <obligatory>true</obligatory>
+ <length>20</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>vehicle_measurement</name>
+ <ref_to>vehicle_measurement</ref_to>
+ <base_relation>children</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>TestEquipment</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>meteorological_measurement</name>
+ <ref_to>meteorological_measurement</ref_to>
+ <base_relation>children</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>TestEquipment</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>sound_measurement</name>
+ <ref_to>sound_measurement</ref_to>
+ <base_relation>children</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>TestEquipment</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>MeaResults</name>
+ <ref_to>MeaResult</ref_to>
+ <base_relation>measurement</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>TestEquipment</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>vehicle_measurement</name>
+ <basetype>AoTestEquipmentPart</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>speed</name>
+ <ref_to>speed</ref_to>
+ <base_relation>children</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>vehicle_measurement</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>TestEquipment</name>
+ <ref_to>TestEquipment</ref_to>
+ <base_relation>parent_equipment</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>vehicle_measurement</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>rotational_speed</name>
+ <ref_to>rotational_speed</ref_to>
+ <base_relation>children</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>vehicle_measurement</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>acceleration</name>
+ <ref_to>acceleration</ref_to>
+ <base_relation>children</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>vehicle_measurement</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>speed</name>
+ <basetype>AoTestEquipmentPart</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>direction</name>
+ <datatype>DT_STRING</datatype>
+ <length>254</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>vehicle_measurement</name>
+ <ref_to>vehicle_measurement</ref_to>
+ <base_relation>parent_equipment_part</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>speed</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>MeaQuantity</name>
+ <ref_to>MeaQuantity</ref_to>
+ <base_relation>measurement_quantities</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>speed</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>rotational_speed</name>
+ <basetype>AoTestEquipmentPart</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>vehicle_measurement</name>
+ <ref_to>vehicle_measurement</ref_to>
+ <base_relation>parent_equipment_part</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>rotational_speed</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>MeaQuantity</name>
+ <ref_to>MeaQuantity</ref_to>
+ <base_relation>measurement_quantities</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>rotational_speed</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>acceleration</name>
+ <basetype>AoTestEquipmentPart</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>manufacturer</name>
+ <datatype>DT_STRING</datatype>
+ <length>254</length>
+ </application_attribute>
+ <application_attribute>
+ <name>type_code</name>
+ <datatype>DT_STRING</datatype>
+ <length>254</length>
+ </application_attribute>
+ <application_attribute>
+ <name>last_calibration</name>
+ <datatype>DT_DATE</datatype>
+ <length>30</length>
+ </application_attribute>
+ <application_attribute>
+ <name>location</name>
+ <datatype>DT_STRING</datatype>
+ <length>254</length>
+ </application_attribute>
+ <application_attribute>
+ <name>direction</name>
+ <datatype>DT_STRING</datatype>
+ <length>254</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>vehicle_measurement</name>
+ <ref_to>vehicle_measurement</ref_to>
+ <base_relation>parent_equipment_part</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>acceleration</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>MeaQuantity</name>
+ <ref_to>MeaQuantity</ref_to>
+ <base_relation>measurement_quantities</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>acceleration</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>meteorological_measurement</name>
+ <basetype>AoTestEquipmentPart</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>temperature</name>
+ <ref_to>temperature</ref_to>
+ <base_relation>children</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>meteorological_measurement</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>barometric_pressure</name>
+ <ref_to>barometric_pressure</ref_to>
+ <base_relation>children</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>meteorological_measurement</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>TestEquipment</name>
+ <ref_to>TestEquipment</ref_to>
+ <base_relation>parent_equipment</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>meteorological_measurement</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>relative_humidity</name>
+ <ref_to>relative_humidity</ref_to>
+ <base_relation>children</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>meteorological_measurement</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>wind_speed</name>
+ <ref_to>wind_speed</ref_to>
+ <base_relation>children</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>meteorological_measurement</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>barometric_pressure</name>
+ <basetype>AoTestEquipmentPart</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>manufacturer</name>
+ <datatype>DT_STRING</datatype>
+ <length>254</length>
+ </application_attribute>
+ <application_attribute>
+ <name>type_code</name>
+ <datatype>DT_STRING</datatype>
+ <length>254</length>
+ </application_attribute>
+ <application_attribute>
+ <name>last_calibration</name>
+ <datatype>DT_DATE</datatype>
+ <length>30</length>
+ </application_attribute>
+ <application_attribute>
+ <name>height_above_ground</name>
+ <datatype>DT_FLOAT</datatype>
+ </application_attribute>
+ <relation_attribute>
+ <name>meteorological_measurement</name>
+ <ref_to>meteorological_measurement</ref_to>
+ <base_relation>parent_equipment_part</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>barometric_pressure</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>MeaQuantity</name>
+ <ref_to>MeaQuantity</ref_to>
+ <base_relation>measurement_quantities</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>barometric_pressure</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>temperature</name>
+ <basetype>AoTestEquipmentPart</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>meteorological_measurement</name>
+ <ref_to>meteorological_measurement</ref_to>
+ <base_relation>parent_equipment_part</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>temperature</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>MeaQuantity</name>
+ <ref_to>MeaQuantity</ref_to>
+ <base_relation>measurement_quantities</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>temperature</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>relative_humidity</name>
+ <basetype>AoTestEquipmentPart</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>meteorological_measurement</name>
+ <ref_to>meteorological_measurement</ref_to>
+ <base_relation>parent_equipment_part</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>relative_humidity</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>MeaQuantity</name>
+ <ref_to>MeaQuantity</ref_to>
+ <base_relation>measurement_quantities</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>relative_humidity</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>wind_speed</name>
+ <basetype>AoTestEquipmentPart</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>wind_direction</name>
+ <datatype>DT_STRING</datatype>
+ <length>254</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>meteorological_measurement</name>
+ <ref_to>meteorological_measurement</ref_to>
+ <base_relation>parent_equipment_part</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>wind_speed</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>MeaQuantity</name>
+ <ref_to>MeaQuantity</ref_to>
+ <base_relation>measurement_quantities</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>wind_speed</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>sound_measurement</name>
+ <basetype>AoTestEquipmentPart</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>microphone</name>
+ <ref_to>microphone</ref_to>
+ <base_relation>children</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>sound_measurement</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>TestEquipment</name>
+ <ref_to>TestEquipment</ref_to>
+ <base_relation>parent_equipment</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>sound_measurement</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>microphone</name>
+ <basetype>AoTestEquipmentPart</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>manufacturer</name>
+ <datatype>DT_STRING</datatype>
+ <length>254</length>
+ </application_attribute>
+ <application_attribute>
+ <name>type_code</name>
+ <datatype>DT_STRING</datatype>
+ <length>254</length>
+ </application_attribute>
+ <application_attribute>
+ <name>height_above_ground</name>
+ <datatype>DT_FLOAT</datatype>
+ </application_attribute>
+ <application_attribute>
+ <name>last_calibration</name>
+ <datatype>DT_DATE</datatype>
+ <length>30</length>
+ </application_attribute>
+ <application_attribute>
+ <name>distance_from_target</name>
+ <datatype>DT_FLOAT</datatype>
+ </application_attribute>
+ <application_attribute>
+ <name>windscreen_applied</name>
+ <datatype>DT_BOOLEAN</datatype>
+ </application_attribute>
+ <relation_attribute>
+ <name>sound_measurement</name>
+ <ref_to>sound_measurement</ref_to>
+ <base_relation>parent_equipment_part</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>microphone</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>MeaQuantity</name>
+ <ref_to>MeaQuantity</ref_to>
+ <base_relation>measurement_quantities</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>microphone</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>MeaQuantity</name>
+ <basetype>AoMeasurementQuantity</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>150</length>
+ </application_attribute>
+ <application_attribute>
+ <name>DataType</name>
+ <base_attribute>datatype</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Description</name>
+ <base_attribute>description</base_attribute>
+ <length>500</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Interpolation</name>
+ <base_attribute>interpolation</base_attribute>
+ </application_attribute>
+ <application_attribute>
+ <name>Rank</name>
+ <base_attribute>rank</base_attribute>
+ </application_attribute>
+ <application_attribute>
+ <name>Dimension</name>
+ <base_attribute>dimension</base_attribute>
+ </application_attribute>
+ <application_attribute>
+ <name>TypeSize</name>
+ <base_attribute>type_size</base_attribute>
+ </application_attribute>
+ <application_attribute>
+ <name>Minimum</name>
+ <base_attribute>minimum</base_attribute>
+ </application_attribute>
+ <application_attribute>
+ <name>Maximum</name>
+ <base_attribute>maximum</base_attribute>
+ </application_attribute>
+ <application_attribute>
+ <name>Average</name>
+ <base_attribute>average</base_attribute>
+ </application_attribute>
+ <application_attribute>
+ <name>Deviation</name>
+ <base_attribute>standard_deviation</base_attribute>
+ </application_attribute>
+ <application_attribute>
+ <name>non_reference_channel_name</name>
+ <datatype>DT_STRING</datatype>
+ <length>128</length>
+ </application_attribute>
+ <application_attribute>
+ <name>reference_channel_name</name>
+ <datatype>DT_STRING</datatype>
+ <length>128</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>meq-for-ref-user-window-fct</name>
+ <ref_to>MeaQuantity</ref_to>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>reference-user-window-function</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>speed</name>
+ <ref_to>speed</ref_to>
+ <base_relation>channel</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>MeaQuantity</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>meq-forequalization-
+filter</name>
+ <ref_to>MeaQuantity</ref_to>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>equalization-filter</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>barometric_pressure</name>
+ <ref_to>barometric_pressure</ref_to>
+ <base_relation>channel</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>MeaQuantity</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>Unit</name>
+ <ref_to>Unit</ref_to>
+ <base_relation>unit</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>MeaQuantities</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>relative_humidity</name>
+ <ref_to>relative_humidity</ref_to>
+ <base_relation>channel</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>MeaQuantity</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>non_reference_channel_quantity</name>
+ <ref_to>Quantity</ref_to>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>meq-for-non_ref_chan_quantity</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>equalization-filter</name>
+ <ref_to>MeaQuantity</ref_to>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>meq-forequalization-
+filter</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>wind_speed</name>
+ <ref_to>wind_speed</ref_to>
+ <base_relation>channel</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>MeaQuantity</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>ResultParameterSet</name>
+ <ref_to>ResultParameterSet</ref_to>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>MeaQuantity</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>MeaResult</name>
+ <ref_to>MeaResult</ref_to>
+ <base_relation>measurement</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>MeaQuantities</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>user-window-function</name>
+ <ref_to>MeaQuantity</ref_to>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>meq-for-user-window-fct</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>temperature</name>
+ <ref_to>temperature</ref_to>
+ <base_relation>channel</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>MeaQuantity</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>microphone</name>
+ <ref_to>microphone</ref_to>
+ <base_relation>channel</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>MeaQuantity</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>LocalColumns</name>
+ <ref_to>LocalColumn</ref_to>
+ <base_relation>local_columns</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>MeaQuantity</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>rotational_speed</name>
+ <ref_to>rotational_speed</ref_to>
+ <base_relation>channel</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>MeaQuantity</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>reference-user-window-function</name>
+ <ref_to>MeaQuantity</ref_to>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>meq-for-ref-user-window-fct</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>meq-for-user-window-fct</name>
+ <ref_to>MeaQuantity</ref_to>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>user-window-function</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>reference_channel_quantity</name>
+ <ref_to>Quantity</ref_to>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>meq-for-ref_chan_quantity</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>Quantity</name>
+ <ref_to>Quantity</ref_to>
+ <base_relation>quantity</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>MeaQuantities</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>acceleration</name>
+ <ref_to>acceleration</ref_to>
+ <base_relation>channel</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>MeaQuantity</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>Unit</name>
+ <basetype>AoUnit</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Factor</name>
+ <base_attribute>factor</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Offset</name>
+ <base_attribute>offset</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Description</name>
+ <base_attribute>description</base_attribute>
+ <length>500</length>
+ </application_attribute>
+ <application_attribute>
+ <name>DateCreated</name>
+ <base_attribute>version_date</base_attribute>
+ <length>30</length>
+ </application_attribute>
+ <application_attribute>
+ <name>dB</name>
+ <datatype>DT_BOOLEAN</datatype>
+ </application_attribute>
+ <application_attribute>
+ <name>dB_reference_factor</name>
+ <datatype>DT_FLOAT</datatype>
+ </application_attribute>
+ <relation_attribute>
+ <name>Quantities</name>
+ <ref_to>Quantity</ref_to>
+ <base_relation>quantities</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>Unit</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>PhysDimension</name>
+ <ref_to>PhysDimension</ref_to>
+ <base_relation>phys_dimension</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>Units</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>ResultParameter</name>
+ <ref_to>ResultParameter</ref_to>
+ <base_relation>parameters</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>Unit</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>MeaQuantities</name>
+ <ref_to>MeaQuantity</ref_to>
+ <base_relation>measurement_quantities</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>Unit</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>PhysDimension</name>
+ <basetype>AoPhysicalDimension</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Length</name>
+ <base_attribute>length_exp</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Mass</name>
+ <base_attribute>mass_exp</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Time</name>
+ <base_attribute>time_exp</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Current</name>
+ <base_attribute>current_exp</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Temperature</name>
+ <base_attribute>temperature_exp</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>MolarAmount</name>
+ <base_attribute>molar_amount_exp</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>LuminousIntensity</name>
+ <base_attribute>luminous_intensity_exp</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Description</name>
+ <base_attribute>description</base_attribute>
+ <length>500</length>
+ </application_attribute>
+ <application_attribute>
+ <name>angle</name>
+ <datatype>DT_LONG</datatype>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <relation_attribute>
+ <name>Units</name>
+ <ref_to>Unit</ref_to>
+ <base_relation>units</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>PhysDimension</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>Quantity</name>
+ <basetype>AoQuantity</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>150</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Version</name>
+ <base_attribute>version</base_attribute>
+ <obligatory>true</obligatory>
+ <length>20</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Description</name>
+ <base_attribute>description</base_attribute>
+ <length>500</length>
+ </application_attribute>
+ <application_attribute>
+ <name>DateCreated</name>
+ <base_attribute>version_date</base_attribute>
+ <length>30</length>
+ </application_attribute>
+ <application_attribute>
+ <name>DefaultRank</name>
+ <base_attribute>default_rank</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>DefDimension</name>
+ <base_attribute>default_dimension</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>DefTypeSize</name>
+ <base_attribute>default_type_size</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>DefMQName</name>
+ <base_attribute>default_mq_name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>DefDataType</name>
+ <base_attribute>default_datatype</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>ValidFlag</name>
+ <datatype>DT_ENUM</datatype>
+ <enumeration_type>valid_enum</enumeration_type>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <relation_attribute>
+ <name>Unit</name>
+ <ref_to>Unit</ref_to>
+ <base_relation>default_unit</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>Quantities</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>meq-for-non_ref_chan_quantity</name>
+ <ref_to>MeaQuantity</ref_to>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>non_reference_channel_quantity</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>meq-for-ref_chan_quantity</name>
+ <ref_to>MeaQuantity</ref_to>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>reference_channel_quantity</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>MeaQuantities</name>
+ <ref_to>MeaQuantity</ref_to>
+ <base_relation>measurement_quantities</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>Quantity</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>ResultParameterSet</name>
+ <basetype>AoParameterSet</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Version</name>
+ <base_attribute>version</base_attribute>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>ResultParameter</name>
+ <ref_to>ResultParameter</ref_to>
+ <base_relation>parameters</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>ResultParameterSet</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>MeaQuantity</name>
+ <ref_to>MeaQuantity</ref_to>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>ResultParameterSet</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>MeaResult</name>
+ <ref_to>MeaResult</ref_to>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>ResultParameterSet</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>ResultParameter</name>
+ <basetype>AoParameter</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>DataType</name>
+ <base_attribute>parameter_datatype</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Value</name>
+ <base_attribute>pvalue</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>Unit</name>
+ <ref_to>Unit</ref_to>
+ <base_relation>unit</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>ResultParameter</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>ResultParameterSet</name>
+ <ref_to>ResultParameterSet</ref_to>
+ <base_relation>parameter_set</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>ResultParameter</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>LocalColumn</name>
+ <basetype>AoLocalColumn</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>150</length>
+ </application_attribute>
+ <application_attribute>
+ <name>IndependentFlag</name>
+ <base_attribute>independent</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>SequenceRepresentation</name>
+ <base_attribute>sequence_representation</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>GlobalFlag</name>
+ <base_attribute>global_flag</base_attribute>
+ </application_attribute>
+ <application_attribute>
+ <name>Values</name>
+ <base_attribute>values</base_attribute>
+ </application_attribute>
+ <application_attribute>
+ <name>Flags</name>
+ <base_attribute>flags</base_attribute>
+ </application_attribute>
+ <application_attribute>
+ <name>GenerationParameters</name>
+ <base_attribute>generation_parameters</base_attribute>
+ </application_attribute>
+ <application_attribute>
+ <name>RawDatatype</name>
+ <base_attribute>raw_datatype</base_attribute>
+ </application_attribute>
+ <application_attribute>
+ <name>axistype</name>
+ <datatype>DT_ENUM</datatype>
+ <enumeration_type>axistype</enumeration_type>
+ </application_attribute>
+ <relation_attribute>
+ <name>MeaQuantity</name>
+ <ref_to>MeaQuantity</ref_to>
+ <base_relation>measurement_quantity</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>LocalColumns</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>SubMatrix</name>
+ <ref_to>SubMatrix</ref_to>
+ <base_relation>submatrix</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>LocalColumns</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>ExternalComponent</name>
+ <ref_to>ExternalComponent</ref_to>
+ <base_relation>external_component</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>LocalColumn</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>SubMatrix</name>
+ <basetype>AoSubmatrix</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>150</length>
+ </application_attribute>
+ <application_attribute>
+ <name>SubMatrixNoRows</name>
+ <base_attribute>number_of_rows</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>y-axis-for-z-axis</name>
+ <ref_to>SubMatrix</ref_to>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>z-axis-for-y-axis</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>y-axis-for-x-axis</name>
+ <ref_to>SubMatrix</ref_to>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>x-axis-for-y-axis</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>LocalColumns</name>
+ <ref_to>LocalColumn</ref_to>
+ <base_relation>local_columns</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>SubMatrix</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>z-axis-for-y-axis</name>
+ <ref_to>SubMatrix</ref_to>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>y-axis-for-z-axis</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>MeaResult</name>
+ <ref_to>MeaResult</ref_to>
+ <base_relation>measurement</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>SubMatrices</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>x-axis-for-y-axis</name>
+ <ref_to>SubMatrix</ref_to>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>y-axis-for-x-axis</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>ExternalComponent</name>
+ <basetype>AoExternalComponent</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>150</length>
+ </application_attribute>
+ <application_attribute>
+ <name>FilenameURL</name>
+ <base_attribute>filename_url</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>TypeSpecification</name>
+ <base_attribute>value_type</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Length</name>
+ <base_attribute>component_length</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>StartOffset</name>
+ <base_attribute>start_offset</base_attribute>
+ <datatype>DT_LONG</datatype>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Blocksize</name>
+ <base_attribute>block_size</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>ValuesPerBlock</name>
+ <base_attribute>valuesperblock</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>ValueOffset</name>
+ <base_attribute>value_offset</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>OrdinalNumber</name>
+ <base_attribute>ordinal_number</base_attribute>
+ </application_attribute>
+ <application_attribute>
+ <name>FlagsFilenameURL</name>
+ <base_attribute>flags_filename_url</base_attribute>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>FlagsStartOffset</name>
+ <base_attribute>flags_start_offset</base_attribute>
+ <datatype>DT_LONG</datatype>
+ </application_attribute>
+ <relation_attribute>
+ <name>LocalColumn</name>
+ <ref_to>LocalColumn</ref_to>
+ <base_relation>local_column</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>ExternalComponent</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>TestSequence</name>
+ <basetype>AoTestSequence</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>100</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Version</name>
+ <base_attribute>version</base_attribute>
+ <obligatory>true</obligatory>
+ <length>20</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>PBN_test_conduction</name>
+ <ref_to>PBN_test_conduction</ref_to>
+ <base_relation>children</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>TestSequence</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>track</name>
+ <ref_to>track</ref_to>
+ <base_relation>children</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>TestSequence</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>SVN_test_conduction</name>
+ <ref_to>SVN_test_conduction</ref_to>
+ <base_relation>children</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>TestSequence</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>testsite</name>
+ <ref_to>testsite</ref_to>
+ <base_relation>children</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>TestSequence</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>MeaResults</name>
+ <ref_to>MeaResult</ref_to>
+ <base_relation>measurement</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>TestSequence</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>PBN_test_conduction</name>
+ <basetype>AoTestSequencePart</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>v_test</name>
+ <datatype>DT_FLOAT</datatype>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>PMR</name>
+ <datatype>DT_FLOAT</datatype>
+ </application_attribute>
+ <application_attribute>
+ <name>accelerated</name>
+ <datatype>DT_BOOLEAN</datatype>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>tested_vehicle_side</name>
+ <datatype>DT_STRING</datatype>
+ <obligatory>true</obligatory>
+ <length>254</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>TestSequence</name>
+ <ref_to>TestSequence</ref_to>
+ <base_relation>parent_sequence</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>PBN_test_conduction</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>track</name>
+ <basetype>AoTestSequencePart</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>residual_voids_content</name>
+ <datatype>DT_FLOAT</datatype>
+ </application_attribute>
+ <application_attribute>
+ <name>sound_absorption_coefficient</name>
+ <datatype>DT_FLOAT</datatype>
+ </application_attribute>
+ <application_attribute>
+ <name>texture_depth</name>
+ <datatype>DT_FLOAT</datatype>
+ </application_attribute>
+ <application_attribute>
+ <name>surface_homogeneity</name>
+ <datatype>DT_STRING</datatype>
+ <length>254</length>
+ </application_attribute>
+ <application_attribute>
+ <name>last_check_texture_depth</name>
+ <datatype>DT_DATE</datatype>
+ <length>30</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>TestSequence</name>
+ <ref_to>TestSequence</ref_to>
+ <base_relation>parent_sequence</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>track</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>SVN_test_conduction</name>
+ <basetype>AoTestSequencePart</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>TestSequence</name>
+ <ref_to>TestSequence</ref_to>
+ <base_relation>parent_sequence</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>SVN_test_conduction</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>testsite</name>
+ <basetype>AoTestSequencePart</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>track_id</name>
+ <datatype>DT_STRING</datatype>
+ <length>254</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>TestSequence</name>
+ <ref_to>TestSequence</ref_to>
+ <base_relation>parent_sequence</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>testsite</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>User</name>
+ <basetype>AoUser</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Description</name>
+ <base_attribute>description</base_attribute>
+ <length>500</length>
+ </application_attribute>
+ <application_attribute>
+ <name>GivenName</name>
+ <datatype>DT_STRING</datatype>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Surname</name>
+ <datatype>DT_STRING</datatype>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Department</name>
+ <datatype>DT_STRING</datatype>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Telephone</name>
+ <datatype>DT_STRING</datatype>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>E-Mail</name>
+ <datatype>DT_STRING</datatype>
+ <length>50</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>users2groups</name>
+ <ref_to>Role</ref_to>
+ <base_relation>groups</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>groups2users</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>Tests</name>
+ <ref_to>Test</ref_to>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>ResponsiblePerson</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>Role</name>
+ <basetype>AoUserGroup</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>SuperuserFlag</name>
+ <base_attribute>superuser_flag</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Description</name>
+ <base_attribute>description</base_attribute>
+ <length>500</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>groups2users</name>
+ <ref_to>User</ref_to>
+ <base_relation>users</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>users2groups</inverse_name>
+ </relation_attribute>
+ </application_element>
+ </application_model>
+ <instance_data>
+ <Environment>
+ <Id>1</Id>
+ <Name>MDM</Name>
+ <MimeType>application/x-asam.aoenvironment</MimeType>
+ <Description>MDM Environment</Description>
+ <DateCreated>20120214120000</DateCreated>
+ <Max_test_level>4</Max_test_level>
+ <Base_model_version>asam30</Base_model_version>
+ <AppModelType>ASAM_SECURITY,ASAM_NVH,ASAM_WORKFLOW,MDM</AppModelType>
+ <AppModelVersion>4.4.1</AppModelVersion>
+ <Timezone>GMT</Timezone>
+ <MeaningOfAliases>
+ <s>,language=en</s>
+ <s>,language=de</s>
+ </MeaningOfAliases>
+ </Environment>
+ <Project>
+ <Id>1</Id>
+ <Name>PMV Model P</Name>
+ <MimeType>application/x-asam.aotest</MimeType>
+ <StructureLevel>1</StructureLevel>
+ </Project>
+ <StructureLevel>
+ <Id>1</Id>
+ <Name>PBN Measurements</Name>
+ <MimeType>application/x-asam.aosubtest.structurelevel</MimeType>
+ <Tests>1</Tests>
+ <Project>1</Project>
+ </StructureLevel>
+ <Test>
+ <Id>1</Id>
+ <Name>PBN_UNECE_R51_20140314170907</Name>
+ <MimeType>application/x-asam.aosubtest.test</MimeType>
+ <DateCreated>20140314170907</DateCreated>
+ <DateClosed>20140314170908</DateClosed>
+ <StructureLevel>1</StructureLevel>
+ <ResponsiblePerson>1</ResponsiblePerson>
+ <TestSteps>1</TestSteps>
+ </Test>
+ <TestStep>
+ <Id>1</Id>
+ <Name>PBN_UNECE_R51_Right_Acc_70</Name>
+ <MimeType>application/x-asam.aosubtest.teststep</MimeType>
+ <DateCreated>20140314170908</DateCreated>
+ <Optional>true</Optional>
+ <Sortindex>40</Sortindex>
+ <Test>1</Test>
+ <MeaResults>1</MeaResults>
+ </TestStep>
+ <MeaResult>
+ <Id>1</Id>
+ <Name>Channel</Name>
+ <MimeType>application/x-asam.aomeasurement</MimeType>
+ <DateCreated>20140317154822</DateCreated>
+ <TestEquipment>1</TestEquipment>
+ <UnitUnderTest>1</UnitUnderTest>
+ <MeaQuantities>1 2 3 4 5 6 7 8 9 10 11</MeaQuantities>
+ <TestStep>1</TestStep>
+ <SubMatrices>1</SubMatrices>
+ <TestSequence>1</TestSequence>
+ </MeaResult>
+ <UnitUnderTest>
+ <Id>1</Id>
+ <Name>PBN_vehicle</Name>
+ <Version>57</Version>
+ <MimeType>application/x-asam.aounitundertest.unitundertest</MimeType>
+ <engine>1</engine>
+ <gearbox>1</gearbox>
+ <tyre>1 2 3 4</tyre>
+ <noise_reduction_system>1</noise_reduction_system>
+ <vehicle>1</vehicle>
+ <exhaust_piping>1</exhaust_piping>
+ <expansion_chamber>1</expansion_chamber>
+ <air_filter>1</air_filter>
+ <MeaResults>1</MeaResults>
+ <silencer>1 2</silencer>
+ </UnitUnderTest>
+ <engine>
+ <Id>1</Id>
+ <Name>engine</Name>
+ <MimeType>application/x-asam.aounitundertestpart.engine.engine</MimeType>
+ <power>167</power>
+ <manufacturer>Peak Motors Ltd.</manufacturer>
+ <type>Compression-ignition</type>
+ <model>Peak Turbo V16</model>
+ <UnitUnderTest>1</UnitUnderTest>
+ </engine>
+ <gearbox>
+ <Id>1</Id>
+ <Name>gearbox</Name>
+ <MimeType>application/x-asam.aounitundertestpart.gearbox.gearbox</MimeType>
+ <no_forward_gears>6</no_forward_gears>
+ <transmission>Automatic</transmission>
+ <UnitUnderTest>1</UnitUnderTest>
+ </gearbox>
+ <noise_reduction_system>
+ <Id>1</Id>
+ <Name>noise_reduction_system</Name>
+ <MimeType>application/x-asam.aounitundertestpart.noise_reduction_system.noise_reduction_system</MimeType>
+ <design_family>Whisper</design_family>
+ <UnitUnderTest>1</UnitUnderTest>
+ </noise_reduction_system>
+ <tyre>
+ <Id>1</Id>
+ <Name>FL_tyre</Name>
+ <MimeType>application/x-asam.aounitundertestpart.tyre.fl_tyre</MimeType>
+ <axle>1</axle>
+ <side>Left</side>
+ <size>75R15</size>
+ <manufacturer>Tunnelsand</manufacturer>
+ <tread_depth>2.2</tread_depth>
+ <UnitUnderTest>1</UnitUnderTest>
+ </tyre>
+ <tyre>
+ <Id>2</Id>
+ <Name>FR_tyre</Name>
+ <MimeType>application/x-asam.aounitundertestpart.tyre.fr_tyre</MimeType>
+ <axle>1</axle>
+ <side>Right</side>
+ <size>75R15</size>
+ <manufacturer>Tunnelsand</manufacturer>
+ <tread_depth>2.3</tread_depth>
+ <UnitUnderTest>1</UnitUnderTest>
+ </tyre>
+ <tyre>
+ <Id>3</Id>
+ <Name>RL_tyre</Name>
+ <MimeType>application/x-asam.aounitundertestpart.tyre.rl_tyre</MimeType>
+ <axle>2</axle>
+ <side>Left</side>
+ <size>75R15</size>
+ <manufacturer>Tunnelsand</manufacturer>
+ <tread_depth>2.1</tread_depth>
+ <UnitUnderTest>1</UnitUnderTest>
+ </tyre>
+ <tyre>
+ <Id>4</Id>
+ <Name>RR_tyre</Name>
+ <MimeType>application/x-asam.aounitundertestpart.tyre.rr_tyre</MimeType>
+ <axle>2</axle>
+ <side>Right</side>
+ <size>75R15</size>
+ <manufacturer>Tunnelsand</manufacturer>
+ <tread_depth>2.2</tread_depth>
+ <UnitUnderTest>1</UnitUnderTest>
+ </tyre>
+ <air_filter>
+ <Id>1</Id>
+ <Name>air_filter</Name>
+ <MimeType>application/x-asam.aounitundertestpart.air_filter.air_filter</MimeType>
+ <min_bulk_material_density>0.83</min_bulk_material_density>
+ <UnitUnderTest>1</UnitUnderTest>
+ </air_filter>
+ <expansion_chamber>
+ <Id>1</Id>
+ <Name>expansion_chamber</Name>
+ <MimeType>application/x-asam.aounitundertestpart.expansion_chamber.expansion_chamber</MimeType>
+ <volume>0.53</volume>
+ <UnitUnderTest>1</UnitUnderTest>
+ </expansion_chamber>
+ <exhaust_piping>
+ <Id>1</Id>
+ <Name>exhaust_piping</Name>
+ <MimeType>application/x-asam.aounitundertestpart.exhaust_piping.exhaust_piping</MimeType>
+ <material>Stainless steel</material>
+ <length>3.79</length>
+ <UnitUnderTest>1</UnitUnderTest>
+ </exhaust_piping>
+ <vehicle>
+ <Id>1</Id>
+ <Name>vehicle</Name>
+ <MimeType>application/x-asam.aounitundertestpart.vehicle.vehicle</MimeType>
+ <maximum_authorized_mass>1950.0</maximum_authorized_mass>
+ <vehicle_type>Cabrio</vehicle_type>
+ <vehicle_category>Passenger transport</vehicle_category>
+ <manufacturer>Peak Motor Vehicles</manufacturer>
+ <model>Model P</model>
+ <length>3.96</length>
+ <reference_point>Rear end</reference_point>
+ <mass_in_running_order>1463.0</mass_in_running_order>
+ <UnitUnderTest>1</UnitUnderTest>
+ </vehicle>
+ <silencer>
+ <Id>1</Id>
+ <Name>exhaust_silencer</Name>
+ <MimeType>application/x-asam.aounitundertestpart.silencer.exhaust_silencer</MimeType>
+ <location>exhaust</location>
+ <manufacturer>Peak Silencers Ltd.</manufacturer>
+ <model>Lion's Roar 2013</model>
+ <type>Quadruple pipe</type>
+ <fibre_type>Biosil wool</fibre_type>
+ <UnitUnderTest>1</UnitUnderTest>
+ </silencer>
+ <silencer>
+ <Id>2</Id>
+ <Name>intake_silencer</Name>
+ <MimeType>application/x-asam.aounitundertestpart.silencer.intake_silencer</MimeType>
+ <location>intake</location>
+ <manufacturer>Peak Silencers Ltd.</manufacturer>
+ <model>Snake's Hiss 2013</model>
+ <fibre_type>Etype wool</fibre_type>
+ <UnitUnderTest>1</UnitUnderTest>
+ </silencer>
+ <TestEquipment>
+ <Id>1</Id>
+ <Name>PBN_setup</Name>
+ <Version>56</Version>
+ <MimeType>application/x-asam.aotestequipment.testequipment</MimeType>
+ <vehicle_measurement>1</vehicle_measurement>
+ <meteorological_measurement>1</meteorological_measurement>
+ <sound_measurement>1</sound_measurement>
+ <MeaResults>1</MeaResults>
+ </TestEquipment>
+ <vehicle_measurement>
+ <Id>1</Id>
+ <Name>vehicle_measurement</Name>
+ <MimeType>application/x-asam.aotestequipmentpart.vehicle_measurement.vehicle_measurement</MimeType>
+ <speed>1</speed>
+ <TestEquipment>1</TestEquipment>
+ <rotational_speed>1</rotational_speed>
+ <acceleration>1</acceleration>
+ </vehicle_measurement>
+ <speed>
+ <Id>1</Id>
+ <Name>vehicle_speed</Name>
+ <MimeType>application/x-asam.aotestequipmentpart.speed</MimeType>
+ <vehicle_measurement>1</vehicle_measurement>
+ </speed>
+ <rotational_speed>
+ <Id>1</Id>
+ <Name>rotational_speed</Name>
+ <MimeType>application/x-asam.aotestequipmentpart.rotational_speed</MimeType>
+ <vehicle_measurement>1</vehicle_measurement>
+ </rotational_speed>
+ <acceleration>
+ <Id>1</Id>
+ <Name>vehicle_acceleration</Name>
+ <MimeType>application/x-asam.aotestequipmentpart.acceleration</MimeType>
+ <vehicle_measurement>1</vehicle_measurement>
+ </acceleration>
+ <meteorological_measurement>
+ <Id>1</Id>
+ <Name>meteorological_measurement</Name>
+ <MimeType>application/x-asam.aotestequipmentpart.meteorological_measurement.meteorological_measurement</MimeType>
+ <temperature>1 2</temperature>
+ <barometric_pressure>1</barometric_pressure>
+ <TestEquipment>1</TestEquipment>
+ <relative_humidity>1</relative_humidity>
+ <wind_speed>1</wind_speed>
+ </meteorological_measurement>
+ <barometric_pressure>
+ <Id>1</Id>
+ <Name>atmospheric_pressure</Name>
+ <MimeType>application/x-asam.aotestequipmentpart.barometric_pressure</MimeType>
+ <meteorological_measurement>1</meteorological_measurement>
+ </barometric_pressure>
+ <temperature>
+ <Id>1</Id>
+ <Name>ambient_air_temperature</Name>
+ <MimeType>application/x-asam.aotestequipmentpart.temperature</MimeType>
+ <meteorological_measurement>1</meteorological_measurement>
+ </temperature>
+ <temperature>
+ <Id>2</Id>
+ <Name>track_surface_temperature</Name>
+ <MimeType>application/x-asam.aotestequipmentpart.temperature</MimeType>
+ <meteorological_measurement>1</meteorological_measurement>
+ </temperature>
+ <relative_humidity>
+ <Id>1</Id>
+ <Name>humidity</Name>
+ <MimeType>application/x-asam.aotestequipmentpart.relative_humidity</MimeType>
+ <meteorological_measurement>1</meteorological_measurement>
+ </relative_humidity>
+ <wind_speed>
+ <Id>1</Id>
+ <Name>wind_speed</Name>
+ <MimeType>application/x-asam.aotestequipmentpart.wind_speed</MimeType>
+ <meteorological_measurement>1</meteorological_measurement>
+ </wind_speed>
+ <sound_measurement>
+ <Id>1</Id>
+ <Name>sound_measurement</Name>
+ <MimeType>application/x-asam.aotestequipmentpart.sound_measurement.sound_measurement</MimeType>
+ <microphone>1 2</microphone>
+ <TestEquipment>1</TestEquipment>
+ </sound_measurement>
+ <microphone>
+ <Id>1</Id>
+ <Name>background_noise</Name>
+ <MimeType>application/x-asam.aotestequipmentpart.microphone</MimeType>
+ <sound_measurement>1</sound_measurement>
+ </microphone>
+ <microphone>
+ <Id>2</Id>
+ <Name>vehicle_noise</Name>
+ <MimeType>application/x-asam.aotestequipmentpart.microphone</MimeType>
+ <sound_measurement>1</sound_measurement>
+ </microphone>
+ <MeaQuantity>
+ <Id>1</Id>
+ <Name>CHANNEL05</Name>
+ <DataType>DT_DOUBLE</DataType>
+ <MimeType>application/x-asam.aomeasurementquantity</MimeType>
+ <Interpolation>no_interpolation</Interpolation>
+ <Rank>1</Rank>
+ <TypeSize>1</TypeSize>
+ <Unit>1</Unit>
+ <MeaResult>1</MeaResult>
+ <LocalColumns>8136</LocalColumns>
+ <Quantity>1</Quantity>
+ </MeaQuantity>
+ <MeaQuantity>
+ <Id>2</Id>
+ <Name>CHANNEL08</Name>
+ <DataType>DT_DOUBLE</DataType>
+ <MimeType>application/x-asam.aomeasurementquantity</MimeType>
+ <Interpolation>no_interpolation</Interpolation>
+ <Rank>1</Rank>
+ <TypeSize>1</TypeSize>
+ <Unit>1</Unit>
+ <MeaResult>1</MeaResult>
+ <LocalColumns>8137</LocalColumns>
+ <Quantity>1</Quantity>
+ </MeaQuantity>
+ <MeaQuantity>
+ <Id>3</Id>
+ <Name>CHANNEL03</Name>
+ <DataType>DT_DOUBLE</DataType>
+ <MimeType>application/x-asam.aomeasurementquantity</MimeType>
+ <Interpolation>no_interpolation</Interpolation>
+ <Rank>1</Rank>
+ <TypeSize>1</TypeSize>
+ <Unit>1</Unit>
+ <MeaResult>1</MeaResult>
+ <LocalColumns>8138</LocalColumns>
+ <Quantity>1</Quantity>
+ </MeaQuantity>
+ <MeaQuantity>
+ <Id>4</Id>
+ <Name>CHANNEL01</Name>
+ <DataType>DT_DOUBLE</DataType>
+ <MimeType>application/x-asam.aomeasurementquantity</MimeType>
+ <Interpolation>no_interpolation</Interpolation>
+ <Rank>1</Rank>
+ <TypeSize>1</TypeSize>
+ <Unit>1</Unit>
+ <MeaResult>1</MeaResult>
+ <LocalColumns>8139</LocalColumns>
+ <Quantity>1</Quantity>
+ </MeaQuantity>
+ <MeaQuantity>
+ <Id>5</Id>
+ <Name>CHANNEL06</Name>
+ <DataType>DT_DOUBLE</DataType>
+ <MimeType>application/x-asam.aomeasurementquantity</MimeType>
+ <Interpolation>no_interpolation</Interpolation>
+ <Rank>1</Rank>
+ <TypeSize>1</TypeSize>
+ <Unit>1</Unit>
+ <MeaResult>1</MeaResult>
+ <LocalColumns>8140</LocalColumns>
+ <Quantity>1</Quantity>
+ </MeaQuantity>
+ <MeaQuantity>
+ <Id>6</Id>
+ <Name>CHANNEL04</Name>
+ <DataType>DT_DOUBLE</DataType>
+ <MimeType>application/x-asam.aomeasurementquantity</MimeType>
+ <Interpolation>no_interpolation</Interpolation>
+ <Rank>1</Rank>
+ <TypeSize>1</TypeSize>
+ <Unit>1</Unit>
+ <MeaResult>1</MeaResult>
+ <LocalColumns>8141</LocalColumns>
+ <Quantity>1</Quantity>
+ </MeaQuantity>
+ <MeaQuantity>
+ <Id>7</Id>
+ <Name>CHANNEL07</Name>
+ <DataType>DT_DOUBLE</DataType>
+ <MimeType>application/x-asam.aomeasurementquantity</MimeType>
+ <Interpolation>no_interpolation</Interpolation>
+ <Rank>1</Rank>
+ <TypeSize>1</TypeSize>
+ <Unit>1</Unit>
+ <MeaResult>1</MeaResult>
+ <LocalColumns>8142</LocalColumns>
+ <Quantity>1</Quantity>
+ </MeaQuantity>
+ <MeaQuantity>
+ <Id>8</Id>
+ <Name>CHANNEL02</Name>
+ <DataType>DT_DOUBLE</DataType>
+ <MimeType>application/x-asam.aomeasurementquantity</MimeType>
+ <Interpolation>no_interpolation</Interpolation>
+ <Rank>1</Rank>
+ <TypeSize>1</TypeSize>
+ <Unit>1</Unit>
+ <MeaResult>1</MeaResult>
+ <LocalColumns>8143</LocalColumns>
+ <Quantity>1</Quantity>
+ </MeaQuantity>
+ <MeaQuantity>
+ <Id>9</Id>
+ <Name>CHANNEL09</Name>
+ <DataType>DT_DOUBLE</DataType>
+ <MimeType>application/x-asam.aomeasurementquantity</MimeType>
+ <Interpolation>no_interpolation</Interpolation>
+ <Rank>1</Rank>
+ <TypeSize>1</TypeSize>
+ <Unit>1</Unit>
+ <MeaResult>1</MeaResult>
+ <LocalColumns>8144</LocalColumns>
+ <Quantity>1</Quantity>
+ </MeaQuantity>
+ <MeaQuantity>
+ <Id>10</Id>
+ <Name>CHANNEL10</Name>
+ <DataType>DT_DOUBLE</DataType>
+ <MimeType>application/x-asam.aomeasurementquantity</MimeType>
+ <Interpolation>no_interpolation</Interpolation>
+ <Rank>1</Rank>
+ <TypeSize>1</TypeSize>
+ <Unit>1</Unit>
+ <MeaResult>1</MeaResult>
+ <LocalColumns>8145</LocalColumns>
+ <Quantity>1</Quantity>
+ </MeaQuantity>
+ <MeaQuantity>
+ <Id>11</Id>
+ <Name>X-Axis</Name>
+ <DataType>DT_LONG</DataType>
+ <MimeType>application/x-asam.aomeasurementquantity</MimeType>
+ <Interpolation>no_interpolation</Interpolation>
+ <Rank>1</Rank>
+ <TypeSize>1</TypeSize>
+ <Unit>2</Unit>
+ <MeaResult>1</MeaResult>
+ <LocalColumns>8146</LocalColumns>
+ <Quantity>2</Quantity>
+ </MeaQuantity>
+ <Unit>
+ <Id>1</Id>
+ <Name>Pa</Name>
+ <Factor>1.0</Factor>
+ <Offset>0.0</Offset>
+ <MimeType>application/x-asam.aounit</MimeType>
+ <dB>false</dB>
+ <Quantities>1</Quantities>
+ <PhysDimension>1</PhysDimension>
+ <MeaQuantities>1 2 3 4 5 6 7 8 9 10</MeaQuantities>
+ </Unit>
+ <Unit>
+ <Id>2</Id>
+ <Name>s</Name>
+ <Factor>1.0</Factor>
+ <Offset>0.0</Offset>
+ <MimeType>application/x-asam.aounit</MimeType>
+ <dB>false</dB>
+ <Quantities>2</Quantities>
+ <PhysDimension>2</PhysDimension>
+ <MeaQuantities>11</MeaQuantities>
+ </Unit>
+ <PhysDimension>
+ <Id>1</Id>
+ <Name>pressure</Name>
+ <Length>-1</Length>
+ <Mass>1</Mass>
+ <Time>-2</Time>
+ <Current>0</Current>
+ <Temperature>0</Temperature>
+ <MolarAmount>0</MolarAmount>
+ <LuminousIntensity>0</LuminousIntensity>
+ <MimeType>application/x-asam.aophysicaldimension</MimeType>
+ <Description>unit: pascal</Description>
+ <angle>0</angle>
+ <Units>1</Units>
+ </PhysDimension>
+ <PhysDimension>
+ <Id>2</Id>
+ <Name>time</Name>
+ <Length>0</Length>
+ <Mass>0</Mass>
+ <Time>1</Time>
+ <Current>0</Current>
+ <Temperature>0</Temperature>
+ <MolarAmount>0</MolarAmount>
+ <LuminousIntensity>0</LuminousIntensity>
+ <MimeType>application/x-asam.aophysicaldimension</MimeType>
+ <angle>0</angle>
+ <Units>2</Units>
+ </PhysDimension>
+ <Quantity>
+ <Id>1</Id>
+ <Name>Noise</Name>
+ <Version>1</Version>
+ <MimeType>application/x-asam.aoquantity</MimeType>
+ <DateCreated>20140211133954</DateCreated>
+ <DefaultRank>1</DefaultRank>
+ <DefDimension>0</DefDimension>
+ <DefTypeSize>1</DefTypeSize>
+ <DefMQName>Noise</DefMQName>
+ <DefDataType>DT_FLOAT</DefDataType>
+ <ValidFlag>valid</ValidFlag>
+ <Unit>1</Unit>
+ <MeaQuantities>1 2 3 4 5 6 7 8 9 10</MeaQuantities>
+ </Quantity>
+ <Quantity>
+ <Id>2</Id>
+ <Name>Time</Name>
+ <Version>1</Version>
+ <MimeType>application/x-asam.aoquantity</MimeType>
+ <DateCreated>20140303190409</DateCreated>
+ <DefaultRank>1</DefaultRank>
+ <DefDimension>0</DefDimension>
+ <DefTypeSize>1</DefTypeSize>
+ <DefMQName>Time</DefMQName>
+ <DefDataType>DT_FLOAT</DefDataType>
+ <ValidFlag>valid</ValidFlag>
+ <Unit>2</Unit>
+ <MeaQuantities>11</MeaQuantities>
+ </Quantity>
+ <LocalColumn>
+ <SequenceRepresentation>external_component</SequenceRepresentation>
+ <Id>8136</Id>
+ <Name>CHANNEL05</Name>
+ <IndependentFlag>0</IndependentFlag>
+ <MimeType>application/x-asam.aolocalcolumn</MimeType>
+ <GlobalFlag>15</GlobalFlag>
+ <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>
+ <axistype>Yaxis</axistype>
+ <MeaQuantity>1</MeaQuantity>
+ <SubMatrix>1</SubMatrix>
+ <ExternalComponent>1</ExternalComponent>
+ </LocalColumn>
+ <LocalColumn>
+ <SequenceRepresentation>external_component</SequenceRepresentation>
+ <Id>8137</Id>
+ <Name>CHANNEL08</Name>
+ <IndependentFlag>0</IndependentFlag>
+ <MimeType>application/x-asam.aolocalcolumn</MimeType>
+ <GlobalFlag>15</GlobalFlag>
+ <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>
+ <axistype>Yaxis</axistype>
+ <MeaQuantity>2</MeaQuantity>
+ <SubMatrix>1</SubMatrix>
+ <ExternalComponent>2</ExternalComponent>
+ </LocalColumn>
+ <LocalColumn>
+ <SequenceRepresentation>external_component</SequenceRepresentation>
+ <Id>8138</Id>
+ <Name>CHANNEL03</Name>
+ <IndependentFlag>0</IndependentFlag>
+ <MimeType>application/x-asam.aolocalcolumn</MimeType>
+ <GlobalFlag>15</GlobalFlag>
+ <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>
+ <axistype>Yaxis</axistype>
+ <MeaQuantity>3</MeaQuantity>
+ <SubMatrix>1</SubMatrix>
+ <ExternalComponent>3</ExternalComponent>
+ </LocalColumn>
+ <LocalColumn>
+ <SequenceRepresentation>external_component</SequenceRepresentation>
+ <Id>8139</Id>
+ <Name>CHANNEL01</Name>
+ <IndependentFlag>0</IndependentFlag>
+ <MimeType>application/x-asam.aolocalcolumn</MimeType>
+ <GlobalFlag>15</GlobalFlag>
+ <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>
+ <axistype>Yaxis</axistype>
+ <MeaQuantity>4</MeaQuantity>
+ <SubMatrix>1</SubMatrix>
+ <ExternalComponent>4</ExternalComponent>
+ </LocalColumn>
+ <LocalColumn>
+ <SequenceRepresentation>external_component</SequenceRepresentation>
+ <Id>8140</Id>
+ <Name>CHANNEL06</Name>
+ <IndependentFlag>0</IndependentFlag>
+ <MimeType>application/x-asam.aolocalcolumn</MimeType>
+ <GlobalFlag>15</GlobalFlag>
+ <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>
+ <axistype>Yaxis</axistype>
+ <MeaQuantity>5</MeaQuantity>
+ <SubMatrix>1</SubMatrix>
+ <ExternalComponent>5</ExternalComponent>
+ </LocalColumn>
+ <LocalColumn>
+ <SequenceRepresentation>external_component</SequenceRepresentation>
+ <Id>8141</Id>
+ <Name>CHANNEL04</Name>
+ <IndependentFlag>0</IndependentFlag>
+ <MimeType>application/x-asam.aolocalcolumn</MimeType>
+ <GlobalFlag>15</GlobalFlag>
+ <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>
+ <axistype>Yaxis</axistype>
+ <MeaQuantity>6</MeaQuantity>
+ <SubMatrix>1</SubMatrix>
+ <ExternalComponent>6</ExternalComponent>
+ </LocalColumn>
+ <LocalColumn>
+ <SequenceRepresentation>external_component</SequenceRepresentation>
+ <Id>8142</Id>
+ <Name>CHANNEL07</Name>
+ <IndependentFlag>0</IndependentFlag>
+ <MimeType>application/x-asam.aolocalcolumn</MimeType>
+ <GlobalFlag>15</GlobalFlag>
+ <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>
+ <axistype>Yaxis</axistype>
+ <MeaQuantity>7</MeaQuantity>
+ <SubMatrix>1</SubMatrix>
+ <ExternalComponent>7</ExternalComponent>
+ </LocalColumn>
+ <LocalColumn>
+ <SequenceRepresentation>external_component</SequenceRepresentation>
+ <Id>8143</Id>
+ <Name>CHANNEL02</Name>
+ <IndependentFlag>0</IndependentFlag>
+ <MimeType>application/x-asam.aolocalcolumn</MimeType>
+ <GlobalFlag>15</GlobalFlag>
+ <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>
+ <axistype>Yaxis</axistype>
+ <MeaQuantity>8</MeaQuantity>
+ <SubMatrix>1</SubMatrix>
+ <ExternalComponent>8</ExternalComponent>
+ </LocalColumn>
+ <LocalColumn>
+ <SequenceRepresentation>external_component</SequenceRepresentation>
+ <Id>8144</Id>
+ <Name>CHANNEL09</Name>
+ <IndependentFlag>0</IndependentFlag>
+ <MimeType>application/x-asam.aolocalcolumn</MimeType>
+ <GlobalFlag>15</GlobalFlag>
+ <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>
+ <axistype>Yaxis</axistype>
+ <MeaQuantity>9</MeaQuantity>
+ <SubMatrix>1</SubMatrix>
+ <ExternalComponent>9</ExternalComponent>
+ </LocalColumn>
+ <LocalColumn>
+ <SequenceRepresentation>external_component</SequenceRepresentation>
+ <Id>8145</Id>
+ <Name>CHANNEL10</Name>
+ <IndependentFlag>0</IndependentFlag>
+ <MimeType>application/x-asam.aolocalcolumn</MimeType>
+ <GlobalFlag>15</GlobalFlag>
+ <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>
+ <axistype>Yaxis</axistype>
+ <MeaQuantity>10</MeaQuantity>
+ <SubMatrix>1</SubMatrix>
+ <ExternalComponent>10</ExternalComponent>
+ </LocalColumn>
+ <LocalColumn>
+ <SequenceRepresentation>external_component</SequenceRepresentation>
+ <Id>8146</Id>
+ <Name>X-Axis</Name>
+ <IndependentFlag>1</IndependentFlag>
+ <MimeType>application/x-asam.aolocalcolumn</MimeType>
+ <GlobalFlag>15</GlobalFlag>
+ <Flags>15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15</Flags>
+ <axistype>Xaxis</axistype>
+ <MeaQuantity>11</MeaQuantity>
+ <SubMatrix>1</SubMatrix>
+ <ExternalComponent>11</ExternalComponent>
+ </LocalColumn>
+ <SubMatrix>
+ <Id>1</Id>
+ <Name>Channel</Name>
+ <SubMatrixNoRows>3001</SubMatrixNoRows>
+ <MimeType>application/x-asam.aosubmatrix</MimeType>
+ <LocalColumns>8136 8137 8138 8139 8140 8141 8142 8143 8144 8145 8146</LocalColumns>
+ <MeaResult>1</MeaResult>
+ </SubMatrix>
+ <ExternalComponent>
+ <Id>1</Id>
+ <Name>ExtComp</Name>
+ <FilenameURL>data_1.bin</FilenameURL>
+ <TypeSpecification>ieeefloat8</TypeSpecification>
+ <Length>3001</Length>
+ <StartOffset>0</StartOffset>
+ <Blocksize>8</Blocksize>
+ <ValuesPerBlock>1</ValuesPerBlock>
+ <ValueOffset>0</ValueOffset>
+ <LocalColumn>8136</LocalColumn>
+ </ExternalComponent>
+ <ExternalComponent>
+ <Id>2</Id>
+ <Name>ExtComp</Name>
+ <FilenameURL>data_1.bin</FilenameURL>
+ <TypeSpecification>ieeefloat8</TypeSpecification>
+ <Length>3001</Length>
+ <StartOffset>24008</StartOffset>
+ <Blocksize>8</Blocksize>
+ <ValuesPerBlock>1</ValuesPerBlock>
+ <ValueOffset>0</ValueOffset>
+ <LocalColumn>8137</LocalColumn>
+ </ExternalComponent>
+ <ExternalComponent>
+ <Id>3</Id>
+ <Name>ExtComp</Name>
+ <FilenameURL>data_1.bin</FilenameURL>
+ <TypeSpecification>ieeefloat8</TypeSpecification>
+ <Length>3001</Length>
+ <StartOffset>48016</StartOffset>
+ <Blocksize>8</Blocksize>
+ <ValuesPerBlock>1</ValuesPerBlock>
+ <ValueOffset>0</ValueOffset>
+ <LocalColumn>8138</LocalColumn>
+ </ExternalComponent>
+ <ExternalComponent>
+ <Id>4</Id>
+ <Name>ExtComp</Name>
+ <FilenameURL>data_1.bin</FilenameURL>
+ <TypeSpecification>ieeefloat8</TypeSpecification>
+ <Length>3001</Length>
+ <StartOffset>72024</StartOffset>
+ <Blocksize>8</Blocksize>
+ <ValuesPerBlock>1</ValuesPerBlock>
+ <ValueOffset>0</ValueOffset>
+ <LocalColumn>8139</LocalColumn>
+ </ExternalComponent>
+ <ExternalComponent>
+ <Id>5</Id>
+ <Name>ExtComp</Name>
+ <FilenameURL>data_1.bin</FilenameURL>
+ <TypeSpecification>ieeefloat8</TypeSpecification>
+ <Length>3001</Length>
+ <StartOffset>96032</StartOffset>
+ <Blocksize>8</Blocksize>
+ <ValuesPerBlock>1</ValuesPerBlock>
+ <ValueOffset>0</ValueOffset>
+ <LocalColumn>8140</LocalColumn>
+ </ExternalComponent>
+ <ExternalComponent>
+ <Id>6</Id>
+ <Name>ExtComp</Name>
+ <FilenameURL>data_1.bin</FilenameURL>
+ <TypeSpecification>ieeefloat8</TypeSpecification>
+ <Length>3001</Length>
+ <StartOffset>120040</StartOffset>
+ <Blocksize>8</Blocksize>
+ <ValuesPerBlock>1</ValuesPerBlock>
+ <ValueOffset>0</ValueOffset>
+ <LocalColumn>8141</LocalColumn>
+ </ExternalComponent>
+ <ExternalComponent>
+ <Id>7</Id>
+ <Name>ExtComp</Name>
+ <FilenameURL>data_1.bin</FilenameURL>
+ <TypeSpecification>ieeefloat8</TypeSpecification>
+ <Length>3001</Length>
+ <StartOffset>144048</StartOffset>
+ <Blocksize>8</Blocksize>
+ <ValuesPerBlock>1</ValuesPerBlock>
+ <ValueOffset>0</ValueOffset>
+ <LocalColumn>8142</LocalColumn>
+ </ExternalComponent>
+ <ExternalComponent>
+ <Id>8</Id>
+ <Name>ExtComp</Name>
+ <FilenameURL>data_1.bin</FilenameURL>
+ <TypeSpecification>ieeefloat8</TypeSpecification>
+ <Length>3001</Length>
+ <StartOffset>168056</StartOffset>
+ <Blocksize>8</Blocksize>
+ <ValuesPerBlock>1</ValuesPerBlock>
+ <ValueOffset>0</ValueOffset>
+ <LocalColumn>8143</LocalColumn>
+ </ExternalComponent>
+ <ExternalComponent>
+ <Id>9</Id>
+ <Name>ExtComp</Name>
+ <FilenameURL>data_1.bin</FilenameURL>
+ <TypeSpecification>ieeefloat8</TypeSpecification>
+ <Length>3001</Length>
+ <StartOffset>192064</StartOffset>
+ <Blocksize>8</Blocksize>
+ <ValuesPerBlock>1</ValuesPerBlock>
+ <ValueOffset>0</ValueOffset>
+ <LocalColumn>8144</LocalColumn>
+ </ExternalComponent>
+ <ExternalComponent>
+ <Id>10</Id>
+ <Name>ExtComp</Name>
+ <FilenameURL>data_1.bin</FilenameURL>
+ <TypeSpecification>ieeefloat8</TypeSpecification>
+ <Length>3001</Length>
+ <StartOffset>216072</StartOffset>
+ <Blocksize>8</Blocksize>
+ <ValuesPerBlock>1</ValuesPerBlock>
+ <ValueOffset>0</ValueOffset>
+ <LocalColumn>8145</LocalColumn>
+ </ExternalComponent>
+ <ExternalComponent>
+ <Id>11</Id>
+ <Name>ExtComp</Name>
+ <FilenameURL>data_1.bin</FilenameURL>
+ <TypeSpecification>dt_long</TypeSpecification>
+ <Length>3001</Length>
+ <StartOffset>240080</StartOffset>
+ <Blocksize>4</Blocksize>
+ <ValuesPerBlock>1</ValuesPerBlock>
+ <ValueOffset>0</ValueOffset>
+ <LocalColumn>8146</LocalColumn>
+ </ExternalComponent>
+ <TestSequence>
+ <Id>1</Id>
+ <Name>PBN_emission_testing</Name>
+ <Version>41</Version>
+ <MimeType>application/x-asam.aotestsequence.testsequence</MimeType>
+ <PBN_test_conduction>1</PBN_test_conduction>
+ <track>1</track>
+ <testsite>1</testsite>
+ <MeaResults>1</MeaResults>
+ </TestSequence>
+ <PBN_test_conduction>
+ <Id>1</Id>
+ <Name>test_conduction</Name>
+ <MimeType>application/x-asam.aotestsequencepart.pbn_test_conduction.test_conduction</MimeType>
+ <v_test>70.0</v_test>
+ <PMR>114</PMR>
+ <accelerated>true</accelerated>
+ <tested_vehicle_side>Right</tested_vehicle_side>
+ <TestSequence>1</TestSequence>
+ </PBN_test_conduction>
+ <track>
+ <Id>1</Id>
+ <Name>track</Name>
+ <MimeType>application/x-asam.aotestsequencepart.track.track</MimeType>
+ <residual_voids_content>7.8</residual_voids_content>
+ <sound_absorption_coefficient>0.093</sound_absorption_coefficient>
+ <texture_depth>0.3</texture_depth>
+ <surface_homogeneity>homogenous</surface_homogeneity>
+ <last_check_texture_depth>20140220000000</last_check_texture_depth>
+ <TestSequence>1</TestSequence>
+ </track>
+ <testsite>
+ <Id>1</Id>
+ <Name>testsite</Name>
+ <MimeType>application/x-asam.aotestsequencepart.testsite.testsite</MimeType>
+ <track_id>PBN Area 51</track_id>
+ <TestSequence>1</TestSequence>
+ </testsite>
+ <User>
+ <Id>1</Id>
+ <Name>dummy</Name>
+ <MimeType>application/x-asam.aouser</MimeType>
+ <GivenName>dummy</GivenName>
+ <Surname>dummy</Surname>
+ <users2groups>1</users2groups>
+ <Tests>1</Tests>
+ </User>
+ <Role>
+ <Id>1</Id>
+ <Name>DummyRole</Name>
+ <SuperuserFlag>0</SuperuserFlag>
+ <MimeType>application/x-asam.aorole</MimeType>
+ <groups2users>1</groups2users>
+ </Role>
+ </instance_data>
+</atfx_file>
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/resources/data_1.bin b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/resources/data_1.bin
new file mode 100644
index 0000000..1cece2d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/resources/data_1.bin
Binary files differ
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/resources/mdm_minimum_ods_application_model_500.xml b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/resources/mdm_minimum_ods_application_model_500.xml
new file mode 100644
index 0000000..936145e
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.api.atfxadapter/src/test/resources/mdm_minimum_ods_application_model_500.xml
@@ -0,0 +1,1313 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<atfx_file version="atfx_file: V1.2.0" xmlns="http://www.asam.net/ODS/5.2.0/Schema">
+ <documentation>
+ <exported_by>openATFX</exported_by>
+ <exporter>openATFX</exporter>
+ <export_date_time>20181022101553</export_date_time>
+ <exporter_version>0.7.3</exporter_version>
+ </documentation>
+ <base_model_version>asam30</base_model_version>
+ <application_model>
+ <application_enumeration>
+ <name>axistype</name>
+ <item>
+ <name>Xaxis</name>
+ <value>0</value>
+ </item>
+ <item>
+ <name>Yaxis</name>
+ <value>1</value>
+ </item>
+ <item>
+ <name>Both</name>
+ <value>2</value>
+ </item>
+ </application_enumeration>
+ <application_enumeration>
+ <name>valid_enum</name>
+ <item>
+ <name>editing</name>
+ <value>0</value>
+ </item>
+ <item>
+ <name>valid</name>
+ <value>1</value>
+ </item>
+ <item>
+ <name>archive</name>
+ <value>2</value>
+ </item>
+ </application_enumeration>
+ <application_element>
+ <name>MeaQuantity</name>
+ <basetype>AoMeasurementQuantity</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>150</length>
+ </application_attribute>
+ <application_attribute>
+ <name>DataType</name>
+ <base_attribute>datatype</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Description</name>
+ <base_attribute>description</base_attribute>
+ <length>500</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Interpolation</name>
+ <base_attribute>interpolation</base_attribute>
+ </application_attribute>
+ <application_attribute>
+ <name>Rank</name>
+ <base_attribute>rank</base_attribute>
+ </application_attribute>
+ <application_attribute>
+ <name>Dimension</name>
+ <base_attribute>dimension</base_attribute>
+ </application_attribute>
+ <application_attribute>
+ <name>TypeSize</name>
+ <base_attribute>type_size</base_attribute>
+ </application_attribute>
+ <application_attribute>
+ <name>Minimum</name>
+ <base_attribute>minimum</base_attribute>
+ </application_attribute>
+ <application_attribute>
+ <name>Maximum</name>
+ <base_attribute>maximum</base_attribute>
+ </application_attribute>
+ <application_attribute>
+ <name>Average</name>
+ <base_attribute>average</base_attribute>
+ </application_attribute>
+ <application_attribute>
+ <name>Deviation</name>
+ <base_attribute>standard_deviation</base_attribute>
+ </application_attribute>
+ <relation_attribute>
+ <name>ResultParameterSet</name>
+ <ref_to>ResultParameterSet</ref_to>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>MeaQuantity</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>Quantity</name>
+ <ref_to>Quantity</ref_to>
+ <base_relation>quantity</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>MeaQuantities</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>LocalColumns</name>
+ <ref_to>LocalColumn</ref_to>
+ <base_relation>local_columns</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>MeaQuantity</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>Unit</name>
+ <ref_to>Unit</ref_to>
+ <base_relation>unit</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>MeaQuantities</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>MeaResult</name>
+ <ref_to>MeaResult</ref_to>
+ <base_relation>measurement</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>MeaQuantities</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>StructureLevel</name>
+ <basetype>AoSubTest</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <length>256</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>Project</name>
+ <ref_to>Project</ref_to>
+ <base_relation>parent_test</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>StructureLevel</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>Tests</name>
+ <ref_to>Test</ref_to>
+ <base_relation>children</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>StructureLevel</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>PhysDimension</name>
+ <basetype>AoPhysicalDimension</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Length</name>
+ <base_attribute>length_exp</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Mass</name>
+ <base_attribute>mass_exp</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Time</name>
+ <base_attribute>time_exp</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Current</name>
+ <base_attribute>current_exp</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Temperature</name>
+ <base_attribute>temperature_exp</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>MolarAmount</name>
+ <base_attribute>molar_amount_exp</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>LuminousIntensity</name>
+ <base_attribute>luminous_intensity_exp</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Description</name>
+ <base_attribute>description</base_attribute>
+ <length>500</length>
+ </application_attribute>
+ <application_attribute>
+ <name>angle</name>
+ <datatype>DT_LONG</datatype>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <relation_attribute>
+ <name>Units</name>
+ <ref_to>Unit</ref_to>
+ <base_relation>units</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>PhysDimension</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>Project</name>
+ <basetype>AoTest</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <length>256</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>StructureLevel</name>
+ <ref_to>StructureLevel</ref_to>
+ <base_relation>children</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>Project</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>Environment</name>
+ <basetype>AoEnvironment</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Description</name>
+ <base_attribute>description</base_attribute>
+ <length>500</length>
+ </application_attribute>
+ <application_attribute>
+ <name>DateCreated</name>
+ <base_attribute>version_date</base_attribute>
+ <length>30</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Max_test_level</name>
+ <base_attribute>max_test_level</base_attribute>
+ </application_attribute>
+ <application_attribute>
+ <name>Base_model_version</name>
+ <base_attribute>base_model_version</base_attribute>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>AppModelType</name>
+ <base_attribute>application_model_type</base_attribute>
+ <length>100</length>
+ </application_attribute>
+ <application_attribute>
+ <name>AppModelVersion</name>
+ <base_attribute>application_model_version</base_attribute>
+ <length>20</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Timezone</name>
+ <base_attribute>timezone</base_attribute>
+ <length>20</length>
+ </application_attribute>
+ </application_element>
+ <application_element>
+ <name>User</name>
+ <basetype>AoUser</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Password</name>
+ <base_attribute>password</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Description</name>
+ <base_attribute>description</base_attribute>
+ <length>500</length>
+ </application_attribute>
+ <application_attribute>
+ <name>GivenName</name>
+ <datatype>DT_STRING</datatype>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Surname</name>
+ <datatype>DT_STRING</datatype>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Department</name>
+ <datatype>DT_STRING</datatype>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Telephone</name>
+ <datatype>DT_STRING</datatype>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>E-Mail</name>
+ <datatype>DT_STRING</datatype>
+ <length>50</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>users2groups</name>
+ <ref_to>Role</ref_to>
+ <base_relation>groups</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>groups2users</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>Tests</name>
+ <ref_to>Test</ref_to>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>ResponsiblePerson</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>SubMatrix</name>
+ <basetype>AoSubmatrix</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>150</length>
+ </application_attribute>
+ <application_attribute>
+ <name>SubMatrixNoRows</name>
+ <base_attribute>number_of_rows</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <length>256</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>y-axis-for-x-axis</name>
+ <ref_to>SubMatrix</ref_to>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>x-axis-for-y-axis</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>ResultParameter</name>
+ <ref_to>ResultParameter</ref_to>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>SubMatrix</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>y-axis-for-z-axis</name>
+ <ref_to>SubMatrix</ref_to>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>z-axis-for-y-axis</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>x-axis-for-y-axis</name>
+ <ref_to>SubMatrix</ref_to>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>y-axis-for-x-axis</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>LocalColumns</name>
+ <ref_to>LocalColumn</ref_to>
+ <base_relation>local_columns</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>SubMatrix</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>z-axis-for-y-axis</name>
+ <ref_to>SubMatrix</ref_to>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>y-axis-for-z-axis</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>MeaResult</name>
+ <ref_to>MeaResult</ref_to>
+ <base_relation>measurement</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>SubMatrices</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>Unit</name>
+ <basetype>AoUnit</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Factor</name>
+ <base_attribute>factor</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Offset</name>
+ <base_attribute>offset</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Description</name>
+ <base_attribute>description</base_attribute>
+ <length>500</length>
+ </application_attribute>
+ <application_attribute>
+ <name>DateCreated</name>
+ <base_attribute>version_date</base_attribute>
+ <length>30</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>ResultParameter</name>
+ <ref_to>ResultParameter</ref_to>
+ <base_relation>parameters</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>Unit</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>PhysDimension</name>
+ <ref_to>PhysDimension</ref_to>
+ <base_relation>phys_dimension</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>Units</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>MeaQuantities</name>
+ <ref_to>MeaQuantity</ref_to>
+ <base_relation>measurement_quantities</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>Unit</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>Quantities</name>
+ <ref_to>Quantity</ref_to>
+ <base_relation>quantities</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>Unit</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>TestEquipment</name>
+ <basetype>AoTestEquipment</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>100</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Version</name>
+ <base_attribute>version</base_attribute>
+ <length>20</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <length>256</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>MeaResults</name>
+ <ref_to>MeaResult</ref_to>
+ <base_relation>measurement</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>TestEquipment</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>TestSteps</name>
+ <ref_to>TestStep</ref_to>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>TestEquipment</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>TestStep</name>
+ <basetype>AoSubTest</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>100</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Description</name>
+ <base_attribute>description</base_attribute>
+ <length>500</length>
+ </application_attribute>
+ <application_attribute>
+ <name>DateCreated</name>
+ <base_attribute>version_date</base_attribute>
+ <length>30</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Optional</name>
+ <datatype>DT_BOOLEAN</datatype>
+ </application_attribute>
+ <application_attribute>
+ <name>Sortindex</name>
+ <datatype>DT_LONG</datatype>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>MDMLinks</name>
+ <base_attribute>external_references</base_attribute>
+ <length>254</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>MeaResults</name>
+ <ref_to>MeaResult</ref_to>
+ <base_relation>children</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>TestStep</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>Test</name>
+ <ref_to>Test</ref_to>
+ <base_relation>parent_test</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>TestSteps</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>TestSequence</name>
+ <ref_to>TestSequence</ref_to>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>TestSteps</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>TestEquipment</name>
+ <ref_to>TestEquipment</ref_to>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>TestSteps</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>UnitUnderTest</name>
+ <ref_to>UnitUnderTest</ref_to>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>TestSteps</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>TestSequence</name>
+ <basetype>AoTestSequence</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>100</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Version</name>
+ <base_attribute>version</base_attribute>
+ <length>20</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <length>256</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>MeaResults</name>
+ <ref_to>MeaResult</ref_to>
+ <base_relation>measurement</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>TestSequence</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>TestSteps</name>
+ <ref_to>TestStep</ref_to>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>TestSequence</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>ExternalComponent</name>
+ <basetype>AoExternalComponent</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>150</length>
+ </application_attribute>
+ <application_attribute>
+ <name>FilenameURL</name>
+ <base_attribute>filename_url</base_attribute>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>TypeSpecification</name>
+ <base_attribute>value_type</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Length</name>
+ <base_attribute>component_length</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>StartOffset</name>
+ <base_attribute>start_offset</base_attribute>
+ <datatype>DT_LONGLONG</datatype>
+ </application_attribute>
+ <application_attribute>
+ <name>Blocksize</name>
+ <base_attribute>block_size</base_attribute>
+ </application_attribute>
+ <application_attribute>
+ <name>ValuesPerBlock</name>
+ <base_attribute>valuesperblock</base_attribute>
+ </application_attribute>
+ <application_attribute>
+ <name>ValueOffset</name>
+ <base_attribute>value_offset</base_attribute>
+ </application_attribute>
+ <application_attribute>
+ <name>OrdinalNumber</name>
+ <base_attribute>ordinal_number</base_attribute>
+ </application_attribute>
+ <application_attribute>
+ <name>FlagsFilenameURL</name>
+ <base_attribute>flags_filename_url</base_attribute>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>FlagsStartOffset</name>
+ <base_attribute>flags_start_offset</base_attribute>
+ <datatype>DT_LONGLONG</datatype>
+ </application_attribute>
+ <relation_attribute>
+ <name>LocalColumn</name>
+ <ref_to>LocalColumn</ref_to>
+ <base_relation>local_column</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>ExternalComponent</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>MeaResult</name>
+ <basetype>AoMeasurement</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>100</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Description</name>
+ <base_attribute>description</base_attribute>
+ <length>500</length>
+ </application_attribute>
+ <application_attribute>
+ <name>DateCreated</name>
+ <base_attribute>version_date</base_attribute>
+ <length>30</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MeasurementBegin</name>
+ <base_attribute>measurement_begin</base_attribute>
+ <length>30</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MeasurementEnd</name>
+ <base_attribute>measurement_end</base_attribute>
+ <length>30</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MDMLinks</name>
+ <base_attribute>external_references</base_attribute>
+ <length>254</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>TestStep</name>
+ <ref_to>TestStep</ref_to>
+ <base_relation>test</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>MeaResults</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>ResultParameterSet</name>
+ <ref_to>ResultParameterSet</ref_to>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>MeaResult</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>SubMatrices</name>
+ <ref_to>SubMatrix</ref_to>
+ <base_relation>submatrices</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>MeaResult</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>MeaQuantities</name>
+ <ref_to>MeaQuantity</ref_to>
+ <base_relation>measurement_quantities</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>MeaResult</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>TestSequence</name>
+ <ref_to>TestSequence</ref_to>
+ <base_relation>sequences</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>MeaResults</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>UnitUnderTest</name>
+ <ref_to>UnitUnderTest</ref_to>
+ <base_relation>units_under_test</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>MeaResults</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>TestEquipment</name>
+ <ref_to>TestEquipment</ref_to>
+ <base_relation>equipments</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>MeaResults</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>Test</name>
+ <basetype>AoSubTest</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>100</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Description</name>
+ <base_attribute>description</base_attribute>
+ <length>500</length>
+ </application_attribute>
+ <application_attribute>
+ <name>DateCreated</name>
+ <base_attribute>version_date</base_attribute>
+ <length>30</length>
+ </application_attribute>
+ <application_attribute>
+ <name>DateClosed</name>
+ <datatype>DT_DATE</datatype>
+ <length>30</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MDMLinks</name>
+ <base_attribute>external_references</base_attribute>
+ <length>254</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>TestSteps</name>
+ <ref_to>TestStep</ref_to>
+ <base_relation>children</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>Test</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>ResponsiblePerson</name>
+ <ref_to>User</ref_to>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>Tests</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>StructureLevel</name>
+ <ref_to>StructureLevel</ref_to>
+ <base_relation>parent_test</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>Tests</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>UnitUnderTest</name>
+ <basetype>AoUnitUnderTest</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>100</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Version</name>
+ <base_attribute>version</base_attribute>
+ <length>20</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <length>256</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>MeaResults</name>
+ <ref_to>MeaResult</ref_to>
+ <base_relation>measurement</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>UnitUnderTest</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>TestSteps</name>
+ <ref_to>TestStep</ref_to>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>UnitUnderTest</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>Role</name>
+ <basetype>AoUserGroup</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>SuperuserFlag</name>
+ <base_attribute>superuser_flag</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Description</name>
+ <base_attribute>description</base_attribute>
+ <length>500</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>groups2users</name>
+ <ref_to>User</ref_to>
+ <base_relation>users</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>users2groups</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>Quantity</name>
+ <basetype>AoQuantity</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>150</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Version</name>
+ <base_attribute>version</base_attribute>
+ <length>20</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Description</name>
+ <base_attribute>description</base_attribute>
+ <length>500</length>
+ </application_attribute>
+ <application_attribute>
+ <name>DateCreated</name>
+ <base_attribute>version_date</base_attribute>
+ <length>30</length>
+ </application_attribute>
+ <application_attribute>
+ <name>DefaultRank</name>
+ <base_attribute>default_rank</base_attribute>
+ </application_attribute>
+ <application_attribute>
+ <name>DefDimension</name>
+ <base_attribute>default_dimension</base_attribute>
+ </application_attribute>
+ <application_attribute>
+ <name>DefTypeSize</name>
+ <base_attribute>default_type_size</base_attribute>
+ </application_attribute>
+ <application_attribute>
+ <name>DefMQName</name>
+ <base_attribute>default_mq_name</base_attribute>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>DefDataType</name>
+ <base_attribute>default_datatype</base_attribute>
+ </application_attribute>
+ <application_attribute>
+ <name>ValidFlag</name>
+ <datatype>DT_ENUM</datatype>
+ <enumeration_type>valid_enum</enumeration_type>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <relation_attribute>
+ <name>MeaQuantities</name>
+ <ref_to>MeaQuantity</ref_to>
+ <base_relation>measurement_quantities</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>Quantity</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>Unit</name>
+ <ref_to>Unit</ref_to>
+ <base_relation>default_unit</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>Quantities</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>LocalColumn</name>
+ <basetype>AoLocalColumn</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>150</length>
+ </application_attribute>
+ <application_attribute>
+ <name>IndependentFlag</name>
+ <base_attribute>independent</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>SequenceRepresentation</name>
+ <base_attribute>sequence_representation</base_attribute>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>GlobalFlag</name>
+ <base_attribute>global_flag</base_attribute>
+ </application_attribute>
+ <application_attribute>
+ <name>Values</name>
+ <base_attribute>values</base_attribute>
+ </application_attribute>
+ <application_attribute>
+ <name>Flags</name>
+ <base_attribute>flags</base_attribute>
+ </application_attribute>
+ <application_attribute>
+ <name>GenerationParameters</name>
+ <base_attribute>generation_parameters</base_attribute>
+ </application_attribute>
+ <application_attribute>
+ <name>RawDatatype</name>
+ <base_attribute>raw_datatype</base_attribute>
+ </application_attribute>
+ <application_attribute>
+ <name>axistype</name>
+ <datatype>DT_ENUM</datatype>
+ <enumeration_type>axistype</enumeration_type>
+ </application_attribute>
+ <relation_attribute>
+ <name>MeaQuantity</name>
+ <ref_to>MeaQuantity</ref_to>
+ <base_relation>measurement_quantity</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>LocalColumns</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>ExternalComponent</name>
+ <ref_to>ExternalComponent</ref_to>
+ <base_relation>external_component</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>LocalColumn</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>SubMatrix</name>
+ <ref_to>SubMatrix</ref_to>
+ <base_relation>submatrix</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>LocalColumns</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>ResultParameterSet</name>
+ <basetype>AoParameterSet</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>Version</name>
+ <base_attribute>version</base_attribute>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <length>256</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>MeaQuantity</name>
+ <ref_to>MeaQuantity</ref_to>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>ResultParameterSet</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>ResultParameter</name>
+ <ref_to>ResultParameter</ref_to>
+ <base_relation>parameters</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>Many</max_occurs>
+ <inverse_name>ResultParameterSet</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>MeaResult</name>
+ <ref_to>MeaResult</ref_to>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>ResultParameterSet</inverse_name>
+ </relation_attribute>
+ </application_element>
+ <application_element>
+ <name>ResultParameter</name>
+ <basetype>AoParameter</basetype>
+ <application_attribute>
+ <name>Id</name>
+ <base_attribute>id</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Name</name>
+ <base_attribute>name</base_attribute>
+ <obligatory>true</obligatory>
+ <length>50</length>
+ </application_attribute>
+ <application_attribute>
+ <name>DataType</name>
+ <base_attribute>parameter_datatype</base_attribute>
+ <obligatory>true</obligatory>
+ </application_attribute>
+ <application_attribute>
+ <name>Value</name>
+ <base_attribute>pvalue</base_attribute>
+ <obligatory>true</obligatory>
+ <length>256</length>
+ </application_attribute>
+ <application_attribute>
+ <name>MimeType</name>
+ <base_attribute>mime_type</base_attribute>
+ <length>256</length>
+ </application_attribute>
+ <relation_attribute>
+ <name>ResultParameterSet</name>
+ <ref_to>ResultParameterSet</ref_to>
+ <base_relation>parameter_set</base_relation>
+ <min_occurs>1</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>ResultParameter</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>Unit</name>
+ <ref_to>Unit</ref_to>
+ <base_relation>unit</base_relation>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>ResultParameter</inverse_name>
+ </relation_attribute>
+ <relation_attribute>
+ <name>SubMatrix</name>
+ <ref_to>SubMatrix</ref_to>
+ <min_occurs>0</min_occurs>
+ <max_occurs>1</max_occurs>
+ <inverse_name>ResultParameter</inverse_name>
+ </relation_attribute>
+ </application_element>
+ </application_model>
+ <instance_data>
+ <Environment>
+ <Id>1</Id>
+ <Name>MDM</Name>
+ <MimeType>application/x-asam.aoenvironment</MimeType>
+ <Description>MDM Environment</Description>
+ <DateCreated>20120703120000</DateCreated>
+ <Max_test_level>4</Max_test_level>
+ <Base_model_version>asam30</Base_model_version>
+ <AppModelType>MDM</AppModelType>
+ <AppModelVersion>4.4.1_mod_prototype</AppModelVersion>
+ <Timezone>GMT</Timezone>
+ </Environment>
+ <User>
+ <Id>1</Id>
+ <Name>dummy</Name>
+ <Password>dummy</Password>
+ <MimeType>application/x-asam.aouser</MimeType>
+ <GivenName>dummy</GivenName>
+ <Surname>dummy</Surname>
+ <users2groups>1</users2groups>
+ </User>
+ <Role>
+ <Id>1</Id>
+ <Name>DummyRole</Name>
+ <SuperuserFlag>0</SuperuserFlag>
+ <MimeType>application/x-asam.aorole</MimeType>
+ <groups2users>1</groups2users>
+ </Role>
+ </instance_data>
+</atfx_file>
\ No newline at end of file
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/.gitignore b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/.gitignore
new file mode 100644
index 0000000..03be9c1
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/.gitignore
@@ -0,0 +1,3 @@
+/.gradle/
+/build/
+/bin/
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/build.gradle b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/build.gradle
new file mode 100644
index 0000000..686fa8b
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/build.gradle
@@ -0,0 +1,42 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+description = 'atfx file importer'
+
+dependencies {
+ compile 'org.glassfish.jersey.media:jersey-media-multipart:2.23.2'
+ compileOnly 'org.slf4j:slf4j-api:1.7.25'
+ compileOnly 'javax:javaee-api:7.0'
+ runtime 'ch.qos.logback:logback-classic:1.2.3'
+
+ // MDM5 API
+ compile project(':org.eclipse.mdm.application')
+ compile project(':org.eclipse.mdm.businessobjects')
+
+ /* ODSAdapter is only needed for workaround in org.eclipse.mdm.apicopy.ClassificationUtil.
+ * Can be removed when classifications are written with org.eclipse.mdm.api.default
+ */
+ compile "org.eclipse.mdm:org.eclipse.mdm.api.odsadapter:${version}"
+
+ testCompile 'junit:junit:4.12'
+ testCompile 'org.mockito:mockito-core:2.13.0'
+ testCompile 'org.assertj:assertj-core:3.6.2'
+ testCompile 'org.glassfish.jersey.test-framework.providers:jersey-test-framework-provider-grizzly2:2.23.2'
+ testCompile 'org.glassfish.jersey.media:jersey-media-json-jackson:2.23.2'
+}
+
+jar {
+ metaInf { from 'NOTICE.txt' }
+ metaInf { from 'LICENSE.txt' }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/ApiCopyException.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/ApiCopyException.java
new file mode 100644
index 0000000..9fd8e89
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/ApiCopyException.java
@@ -0,0 +1,27 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.apicopy;
+
+public class ApiCopyException extends RuntimeException {
+
+ private static final long serialVersionUID = 6120223578891046326L;
+
+ public ApiCopyException(String message) {
+ super(message);
+ }
+
+ public ApiCopyException(String message, Throwable t) {
+ super(message, t);
+ }
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/ApiCopyService.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/ApiCopyService.java
new file mode 100644
index 0000000..929db7e
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/ApiCopyService.java
@@ -0,0 +1,20 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.apicopy;
+
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+
+public interface ApiCopyService {
+ ApiCopyTask newApiCopyTask(ApplicationContext src, ApplicationContext dst);
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/ApiCopyServiceImpl.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/ApiCopyServiceImpl.java
new file mode 100644
index 0000000..0828c40
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/ApiCopyServiceImpl.java
@@ -0,0 +1,28 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.apicopy;
+
+import javax.ejb.Stateless;
+
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+
+@Stateless
+public class ApiCopyServiceImpl implements ApiCopyService {
+
+ @Override
+ public ApiCopyTask newApiCopyTask(ApplicationContext src, ApplicationContext dst) {
+ return new AtfxImportTask(src, dst);
+ }
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/ApiCopyTask.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/ApiCopyTask.java
new file mode 100644
index 0000000..940a07d
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/ApiCopyTask.java
@@ -0,0 +1,22 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.apicopy;
+
+import java.util.List;
+
+import org.eclipse.mdm.api.base.model.Entity;
+
+public interface ApiCopyTask {
+ void copy(List<? extends Entity> entities);
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/AtfxExportTask.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/AtfxExportTask.java
new file mode 100644
index 0000000..7a987aa
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/AtfxExportTask.java
@@ -0,0 +1,332 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.apicopy;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.mdm.api.base.Transaction;
+import org.eclipse.mdm.api.base.massdata.ReadRequest;
+import org.eclipse.mdm.api.base.massdata.ReadRequest.ValuesMode;
+import org.eclipse.mdm.api.base.massdata.WriteRequest;
+import org.eclipse.mdm.api.base.model.Channel;
+import org.eclipse.mdm.api.base.model.ChannelGroup;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.MeasuredValues;
+import org.eclipse.mdm.api.base.model.Measurement;
+import org.eclipse.mdm.api.base.model.PhysicalDimension;
+import org.eclipse.mdm.api.base.model.Quantity;
+import org.eclipse.mdm.api.base.model.Test;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.base.model.Unit;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.model.Pool;
+import org.eclipse.mdm.api.dflt.model.Project;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.collect.ListMultimap;
+
+public class AtfxExportTask extends AtfxTransferBase implements ApiCopyTask {
+ private static final Logger LOG = LoggerFactory.getLogger(AtfxExportTask.class);
+
+ public AtfxExportTask(ApplicationContext src, ApplicationContext dst) {
+ super(src, dst);
+ }
+
+ @Override
+ public void copy(List<? extends Entity> entities) {
+ Transaction transaction = entityManagerDst.startTransaction();
+ try {
+ mapSrcDstEntities.clear();
+
+ ListMultimap<Class<? extends Entity>, Entity> parents = loadParents(entities);
+ LOG.trace("Resolved parents: {}", parents);
+ supportedRootEntities.forEach(ec -> parents.get(ec).forEach(e -> copyEntity(e, false, transaction)));
+
+ LOG.trace("Export entities: {}", entities);
+ entities.forEach(e -> copyEntity(e, true, transaction));
+
+ transaction.commit();
+ } catch (Exception exc) {
+ try {
+ transaction.abort();
+ } catch (Exception exc2) {
+ LOG.error("Could not abort transaction!");
+ }
+
+ throw new ApiCopyException("Could not copy data.", exc);
+ }
+ }
+
+ private Entity copyEntity(Entity entity, boolean recursive, Transaction transaction) {
+ if (entity instanceof Project) {
+ return copyProject((Project) entity, recursive, transaction);
+ } else if (entity instanceof Pool) {
+ return copyPool((Pool) entity, recursive, transaction);
+ } else if (entity instanceof Test) {
+ return copyTest((Test) entity, recursive, transaction);
+ } else if (entity instanceof TestStep) {
+ return copyTestStep((TestStep) entity, recursive, transaction);
+ } else if (entity instanceof Measurement) {
+ return copyMeasurement((Measurement) entity, recursive, transaction);
+ } else {
+ throw new ApiCopyException("Unsupported entity: '" + entity.getClass().getName() + "'");
+ }
+ }
+
+ private Project copyProject(Project projectSrc, boolean recursive, Transaction transaction) {
+ EntityHolder ehSrc = new EntityHolder(projectSrc, entityManagerSrc);
+
+ EntityHolder ehDst = mapSrcDstEntities.get(ehSrc);
+
+ if (null == ehDst) {
+ Project projectDst = entityFactoryDst.createProject(projectSrc.getName());
+
+ copyValues(projectSrc, projectDst, Arrays.asList("Id", "Name"));
+
+ persist(transaction, projectDst);
+
+ ehDst = new EntityHolder(projectDst, entityManagerDst);
+ mapSrcDstEntities.put(ehSrc, ehDst);
+
+ if (recursive) {
+ entityManagerSrc.loadChildren(projectSrc, Pool.class)
+ .forEach(pool -> copyPool(pool, recursive, transaction));
+ }
+ }
+
+ return (Project) ehDst.getEntity();
+ }
+
+ private Pool copyPool(Pool poolSrc, boolean recursive, Transaction transaction) {
+ EntityHolder ehSrc = new EntityHolder(poolSrc, entityManagerSrc);
+
+ EntityHolder ehDst = mapSrcDstEntities.get(ehSrc);
+
+ if (null == ehDst) {
+ Project projectParentDst = (Project) mapSrcDstEntities
+ .get(new EntityHolder(entityManagerSrc.loadParent(poolSrc, Project.class).get(), entityManagerSrc))
+ .getEntity();
+
+ Pool poolDst = entityFactoryDst.createPool(poolSrc.getName(), projectParentDst);
+
+ copyValues(poolSrc, poolDst, Arrays.asList("Id", "Name"));
+
+ persist(transaction, poolDst);
+
+ ehDst = new EntityHolder(poolDst, entityManagerDst);
+ mapSrcDstEntities.put(ehSrc, ehDst);
+
+ if (recursive) {
+ entityManagerSrc.loadChildren(poolSrc, Test.class)
+ .forEach(test -> copyTest(test, recursive, transaction));
+ }
+ }
+
+ return (Pool) ehDst.getEntity();
+ }
+
+ private Test copyTest(Test testSrc, boolean recursive, Transaction transaction) {
+ EntityHolder ehSrc = new EntityHolder(testSrc, entityManagerSrc);
+
+ EntityHolder ehDst = mapSrcDstEntities.get(ehSrc);
+
+ if (null == ehDst) {
+ Pool poolParentDst = (Pool) mapSrcDstEntities
+ .get(new EntityHolder(entityManagerSrc.loadParent(testSrc, Pool.class).get(), entityManagerSrc))
+ .getEntity();
+
+ Test testDst = entityFactoryDst.createTest(testSrc.getName(), poolParentDst);
+
+ copyValues(testSrc, testDst, Arrays.asList("Id", "Name"));
+
+ persist(transaction, testDst);
+
+ ehDst = new EntityHolder(testDst, entityManagerDst);
+ mapSrcDstEntities.put(ehSrc, ehDst);
+
+ if (recursive) {
+ entityManagerSrc.loadChildren(testSrc, TestStep.class)
+ .forEach(testStep -> copyTestStep(testStep, recursive, transaction));
+ }
+ }
+
+ return (Test) ehDst.getEntity();
+ }
+
+ private TestStep copyTestStep(TestStep testStepSrc, boolean recursive, Transaction transaction) {
+ EntityHolder ehSrc = new EntityHolder(testStepSrc, entityManagerSrc);
+
+ EntityHolder ehDst = mapSrcDstEntities.get(ehSrc);
+
+ if (null == ehDst) {
+ Test testParentDst = (Test) mapSrcDstEntities
+ .get(new EntityHolder(entityManagerSrc.loadParent(testStepSrc, Test.class).get(), entityManagerSrc))
+ .getEntity();
+
+ TestStep testStepDst = entityFactoryDst.createTestStep(testStepSrc.getName(), testParentDst);
+
+ copyValues(testStepSrc, testStepDst, Arrays.asList("Id", "Name"));
+
+ persist(transaction, testStepDst);
+
+ ehDst = new EntityHolder(testStepDst, entityManagerDst);
+ mapSrcDstEntities.put(ehSrc, ehDst);
+
+ if (recursive) {
+ entityManagerSrc.loadChildren(testStepSrc, Measurement.class)
+ .forEach(measurement -> copyMeasurement(measurement, recursive, transaction));
+ }
+ }
+
+ return (TestStep) ehDst.getEntity();
+ }
+
+ private Measurement copyMeasurement(Measurement measurementSrc, boolean recursive, Transaction transaction) {
+ EntityHolder ehSrc = new EntityHolder(measurementSrc, entityManagerSrc);
+
+ EntityHolder ehDst = mapSrcDstEntities.get(ehSrc);
+
+ if (null == ehDst) {
+ TestStep testStepParentDst = (TestStep) mapSrcDstEntities
+ .get(new EntityHolder(entityManagerSrc.loadParent(measurementSrc, TestStep.class).get(),
+ entityManagerSrc))
+ .getEntity();
+
+ Measurement measurementDst = entityFactoryDst.createMeasurement(measurementSrc.getName(),
+ testStepParentDst);
+
+ copyValues(measurementSrc, measurementDst, Arrays.asList("Id", "Name"));
+
+ persist(transaction, measurementDst);
+
+ ehDst = new EntityHolder(measurementDst, entityManagerDst);
+ mapSrcDstEntities.put(ehSrc, ehDst);
+
+ if (recursive) {
+ List<WriteRequest> listWriteRequests = new ArrayList<>();
+
+ Map<String, Channel> mapChannels = new HashMap<>();
+
+ for (Channel channel : entityManagerSrc.loadChildren(measurementSrc, Channel.class)) {
+ Channel channelDst = copyChannel(channel, transaction);
+ mapChannels.put(channel.getName(), channelDst);
+ }
+
+ for (ChannelGroup channelGroup : entityManagerSrc.loadChildren(measurementSrc, ChannelGroup.class)) {
+ ChannelGroup channelGroupDst = copyChannelGroup(channelGroup, transaction);
+
+ for (MeasuredValues measuredValues : entityManagerSrc.readMeasuredValues(ReadRequest
+ .create(channelGroup).valuesMode(ValuesMode.STORAGE).allChannels().allValues())) {
+ if (!mapChannels.containsKey(measuredValues.getName())) {
+ throw new ApiCopyException(
+ String.format("Cannot find Channel %s in destination!", measuredValues.getName()));
+ }
+
+ Channel channelDst = mapChannels.get(measuredValues.getName());
+
+ listWriteRequests.add(createWriteRequest(channelGroupDst, channelDst, measuredValues));
+ }
+ }
+
+ transaction.writeMeasuredValues(listWriteRequests);
+ }
+ }
+
+ return (Measurement) ehDst.getEntity();
+ }
+
+ private Channel copyChannel(Channel channelSrc, Transaction transaction) {
+ EntityHolder ehSrc = new EntityHolder(channelSrc, entityManagerSrc);
+
+ EntityHolder ehDst = mapSrcDstEntities.get(ehSrc);
+
+ if (null == ehDst) {
+ Measurement measurementParentDst = (Measurement) mapSrcDstEntities
+ .get(new EntityHolder(entityManagerSrc.loadParent(channelSrc, Measurement.class).get(),
+ entityManagerSrc))
+ .getEntity();
+
+ Quantity quantitySrc = channelSrc.getQuantity();
+ Unit unitSrc = quantitySrc.getDefaultUnit();
+ PhysicalDimension physicalDimensionSrc = unitSrc.getPhysicalDimension();
+
+ PhysicalDimension physicalDimensionDst = fetchOne(entityManagerDst, PhysicalDimension.class,
+ physicalDimensionSrc.getName())
+ .orElseGet(() -> entityFactoryDst.createPhysicalDimension(physicalDimensionSrc.getName()));
+
+ if (isNewEntity(physicalDimensionDst)) {
+ copyValues(physicalDimensionSrc, physicalDimensionDst, Arrays.asList("Id", "Name"));
+ persist(transaction, physicalDimensionDst);
+ }
+
+ Unit unitDst = fetchOne(entityManagerDst, Unit.class, unitSrc.getName())
+ .orElseGet(() -> entityFactoryDst.createUnit(unitSrc.getName(), physicalDimensionDst));
+
+ if (isNewEntity(unitDst)) {
+ copyValues(unitSrc, unitDst, Arrays.asList("Id", "Name"));
+ persist(transaction, unitDst);
+ }
+
+ Quantity quantityDst = fetchOne(entityManagerDst, Quantity.class, quantitySrc.getName())
+ .orElseGet(() -> entityFactoryDst.createQuantity(quantitySrc.getName(), unitDst));
+
+ if (isNewEntity(quantityDst)) {
+ copyValues(quantitySrc, quantityDst, Arrays.asList("Id", "Name"));
+ persist(transaction, quantityDst);
+ }
+
+ Channel channelDst = entityFactoryDst.createChannel(measurementParentDst, quantityDst);
+
+ copyValues(channelSrc, channelDst, Arrays.asList("Id", "Name"));
+
+ persist(transaction, channelDst);
+
+ ehDst = new EntityHolder(channelDst, entityManagerDst);
+ mapSrcDstEntities.put(ehSrc, ehDst);
+ }
+
+ return (Channel) ehDst.getEntity();
+ }
+
+ private ChannelGroup copyChannelGroup(ChannelGroup channelGroupSrc, Transaction transaction) {
+ EntityHolder ehSrc = new EntityHolder(channelGroupSrc, entityManagerSrc);
+
+ EntityHolder ehDst = mapSrcDstEntities.get(ehSrc);
+
+ if (null == ehDst) {
+ Measurement measurementParentDst = (Measurement) mapSrcDstEntities
+ .get(new EntityHolder(entityManagerSrc.loadParent(channelGroupSrc, Measurement.class).get(),
+ entityManagerSrc))
+ .getEntity();
+
+ ChannelGroup channelGroupDst = entityFactoryDst.createChannelGroup(channelGroupSrc.getName(),
+ channelGroupSrc.getNumberOfValues(), measurementParentDst);
+
+ copyValues(channelGroupSrc, channelGroupDst, Arrays.asList("Id", "Name"));
+
+ persist(transaction, channelGroupDst);
+
+ ehDst = new EntityHolder(channelGroupDst, entityManagerDst);
+ mapSrcDstEntities.put(ehSrc, ehDst);
+ }
+
+ return (ChannelGroup) ehDst.getEntity();
+ }
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/AtfxImportTask.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/AtfxImportTask.java
new file mode 100644
index 0000000..bcc916c
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/AtfxImportTask.java
@@ -0,0 +1,614 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.apicopy;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import org.eclipse.mdm.api.base.ServiceNotProvidedException;
+import org.eclipse.mdm.api.base.Transaction;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.adapter.Relation;
+import org.eclipse.mdm.api.base.massdata.ReadRequest;
+import org.eclipse.mdm.api.base.massdata.ReadRequest.ValuesMode;
+import org.eclipse.mdm.api.base.massdata.WriteRequest;
+import org.eclipse.mdm.api.base.model.Channel;
+import org.eclipse.mdm.api.base.model.ChannelGroup;
+import org.eclipse.mdm.api.base.model.ContextComponent;
+import org.eclipse.mdm.api.base.model.ContextDescribable;
+import org.eclipse.mdm.api.base.model.ContextRoot;
+import org.eclipse.mdm.api.base.model.ContextType;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.MeasuredValues;
+import org.eclipse.mdm.api.base.model.Measurement;
+import org.eclipse.mdm.api.base.model.Quantity;
+import org.eclipse.mdm.api.base.model.Test;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.base.model.User;
+import org.eclipse.mdm.api.base.query.Filter;
+import org.eclipse.mdm.api.base.search.SearchService;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.model.Pool;
+import org.eclipse.mdm.api.dflt.model.Project;
+import org.eclipse.mdm.api.dflt.model.TemplateComponent;
+import org.eclipse.mdm.api.dflt.model.TemplateRoot;
+import org.eclipse.mdm.api.dflt.model.TemplateTest;
+import org.eclipse.mdm.api.dflt.model.TemplateTestStep;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.collect.ListMultimap;
+
+public class AtfxImportTask extends AtfxTransferBase implements ApiCopyTask {
+ private static final Logger LOG = LoggerFactory.getLogger(AtfxImportTask.class);
+
+ private SearchService searchServiceDst;
+ private TemplateResolver templateResolver;
+
+ public AtfxImportTask(ApplicationContext src, ApplicationContext dst) {
+ super(src, dst);
+
+ searchServiceDst = contextDst.getSearchService()
+ .orElseThrow(() -> new ServiceNotProvidedException(SearchService.class));
+ templateResolver = new TemplateResolver(entityManagerDst);
+ }
+
+ @Override
+ public void copy(List<? extends Entity> entities) {
+ Transaction transaction = entityManagerDst.startTransaction();
+ try {
+ mapSrcDstEntities.clear();
+
+ ListMultimap<Class<? extends Entity>, Entity> parents = loadParents(entities);
+ LOG.trace("Resolved parents: {}", parents);
+ supportedRootEntities.forEach(ec -> parents.get(ec).forEach(e -> copyEntity(e, false, transaction)));
+
+ LOG.trace("Export entities: {}", entities);
+ entities.forEach(e -> copyEntity(e, true, transaction));
+
+ transaction.commit();
+ } catch (Exception exc) {
+ try {
+ transaction.abort();
+ } catch (Exception exc2) {
+ LOG.error("Could not abort transaction!");
+ }
+
+ throw new ApiCopyException("Could not copy data.", exc);
+ }
+
+ // QnD, can't be done above due to lack of security support in MDM5,
+ // has to use ODS interface and transaction of its own:
+ new ClassificationUtil(contextDst).attachClassification(
+ mapSrcDstEntities.values().stream().map(eh -> eh.getEntity()).collect(Collectors.toList()));
+ }
+
+ private Entity copyEntity(Entity entity, boolean recursive, Transaction transaction) {
+ if (entity instanceof Project) {
+ return copyProject((Project) entity, recursive, transaction);
+ } else if (entity instanceof Pool) {
+ return copyPool((Pool) entity, recursive, transaction);
+ } else if (entity instanceof Test) {
+ return copyTest((Test) entity, recursive, transaction);
+ } else if (entity instanceof TestStep) {
+ return copyTestStep((TestStep) entity, recursive, transaction);
+ } else if (entity instanceof Measurement) {
+ return copyMeasurement((Measurement) entity, new ArrayList<ContextRoot>(), recursive, transaction);
+ } else {
+ throw new ApiCopyException("Unsupported entity: '" + entity.getClass().getName() + "'");
+ }
+ }
+
+ private Project copyProject(Project projectSrc, boolean recursive, Transaction transaction) {
+ EntityHolder ehSrc = new EntityHolder(projectSrc, entityManagerSrc);
+
+ EntityHolder ehDst = mapSrcDstEntities.get(ehSrc);
+
+ if (null == ehDst) {
+ EntityType etProject = modelManagerDst.getEntityType(Project.class);
+
+ Filter filter = Filter.nameOnly(etProject, projectSrc.getName());
+
+ Project projectDst = fetchOne(searchServiceDst, Project.class, filter)
+ .orElseGet(() -> entityFactoryDst.createProject(projectSrc.getName()));
+
+ copyValues(projectSrc, projectDst, Arrays.asList("Id", "Name"));
+
+ persist(transaction, projectDst);
+
+ ehDst = new EntityHolder(projectDst, entityManagerDst);
+ mapSrcDstEntities.put(ehSrc, ehDst);
+
+ if (recursive) {
+ entityManagerSrc.loadChildren(projectSrc, Pool.class)
+ .forEach(pool -> copyPool(pool, recursive, transaction));
+ }
+ }
+
+ return (Project) ehDst.getEntity();
+ }
+
+ private Pool copyPool(Pool poolSrc, boolean recursive, Transaction transaction) {
+ EntityHolder ehSrc = new EntityHolder(poolSrc, entityManagerSrc);
+
+ EntityHolder ehDst = mapSrcDstEntities.get(ehSrc);
+
+ if (null == ehDst) {
+ Project projectParentDst = (Project) mapSrcDstEntities
+ .get(new EntityHolder(entityManagerSrc.loadParent(poolSrc, Project.class).get(), entityManagerSrc))
+ .getEntity();
+
+ EntityType etPool = modelManagerDst.getEntityType(Pool.class);
+ EntityType etProject = modelManagerDst.getEntityType(Project.class);
+
+ Relation relProject = etPool.getRelation(etProject);
+
+ if (null == relProject) {
+ throw new ApiCopyException("No relation to Project found at Pool!");
+ }
+
+ Filter filter = Filter.nameOnly(etPool, poolSrc.getName()).id(relProject, projectParentDst.getID());
+ Pool poolDst = fetchOne(searchServiceDst, Pool.class, filter)
+ .orElseGet(() -> entityFactoryDst.createPool(poolSrc.getName(), projectParentDst));
+
+ copyValues(poolSrc, poolDst, Arrays.asList("Id", "Name"));
+
+ persist(transaction, poolDst);
+
+ ehDst = new EntityHolder(poolDst, entityManagerDst);
+ mapSrcDstEntities.put(ehSrc, ehDst);
+
+ if (recursive) {
+ entityManagerSrc.loadChildren(poolSrc, Test.class)
+ .forEach(test -> copyTest(test, recursive, transaction));
+ }
+ }
+
+ return (Pool) ehDst.getEntity();
+ }
+
+ private Test copyTest(Test testSrc, boolean recursive, Transaction transaction) {
+ EntityHolder ehSrc = new EntityHolder(testSrc, entityManagerSrc);
+
+ EntityHolder ehDst = mapSrcDstEntities.get(ehSrc);
+
+ if (null == ehDst) {
+ Pool poolParentDst = (Pool) mapSrcDstEntities
+ .get(new EntityHolder(entityManagerSrc.loadParent(testSrc, Pool.class).get(), entityManagerSrc))
+ .getEntity();
+
+ EntityType etTest = modelManagerDst.getEntityType(Test.class);
+ EntityType etPool = modelManagerDst.getEntityType(Pool.class);
+
+ Relation relPool = etTest.getRelation(etPool);
+
+ if (null == relPool) {
+ throw new ApiCopyException("No relation to StructureLevel found at Test!");
+ }
+
+ Optional<TemplateTest> templateTestDst = templateResolver.resolveTemplateTest();
+
+ Filter filter = Filter.nameOnly(etTest, testSrc.getName()).id(relPool, poolParentDst.getID());
+
+ Test testDst;
+ if (templateTestDst.isPresent()) {
+ testDst = fetchOne(searchServiceDst, Test.class, filter).orElseGet(
+ () -> entityFactoryDst.createTest(testSrc.getName(), poolParentDst, templateTestDst.get()));
+ } else {
+ testDst = fetchOne(searchServiceDst, Test.class, filter)
+ .orElseGet(() -> entityFactoryDst.createTest(testSrc.getName(), poolParentDst));
+ }
+
+ copyValues(testSrc, testDst, Arrays.asList("Id", "Name"));
+
+ // copy responsible person:
+ Optional<User> userSrc = testSrc.getResponsiblePerson();
+ if (userSrc.isPresent()) {
+ User userDst = entityManagerDst.loadAll(User.class, userSrc.get().getName()).stream().findFirst()
+ .orElseThrow(() -> new ApiCopyException(String.format(
+ "No User instance with name %s found in destination!", userSrc.get().getName())));
+
+ testDst.setResponsiblePerson(userDst);
+ }
+
+ persist(transaction, testDst);
+
+ ehDst = new EntityHolder(testDst, entityManagerDst);
+ mapSrcDstEntities.put(ehSrc, ehDst);
+
+ if (recursive) {
+ EntityType etTestStep = modelManagerDst.getEntityType(TestStep.class);
+ Relation relTest = etTestStep.getRelation(etTest);
+
+ if (null == relTest) {
+ throw new ApiCopyException("No relation to Test found at TestStep!");
+ }
+
+ copyTestSteps(testSrc, recursive, templateTestDst, testDst, transaction);
+ entityManagerSrc.loadChildren(testSrc, TestStep.class)
+ .forEach(testStep -> copyTestStep(testStep, recursive, transaction));
+ }
+ }
+
+ return (Test) ehDst.getEntity();
+ }
+
+ private TestStep copyTestStep(TestStep testStepSrc, boolean recursive, Transaction transaction) {
+ EntityHolder ehSrc = new EntityHolder(testStepSrc, entityManagerSrc);
+
+ EntityHolder ehDst = mapSrcDstEntities.get(ehSrc);
+
+ if (null == ehDst) {
+ EntityType etTestStep = modelManagerDst.getEntityType(TestStep.class);
+ EntityType etTest = modelManagerDst.getEntityType(Test.class);
+
+ Relation relTest = etTestStep.getRelation(etTest);
+
+ if (null == relTest) {
+ throw new ApiCopyException("No relation to Test found at TestStep!");
+ }
+
+ Test testDst = (Test) mapSrcDstEntities
+ .get(new EntityHolder(entityManagerSrc.loadParent(testStepSrc, Test.class).get(), entityManagerSrc))
+ .getEntity();
+
+ Optional<TemplateTestStep> templateTestStep = templateResolver
+ .resolveTemplateTestStep(templateResolver.resolveTemplateTest());
+
+ Filter filter = Filter.nameOnly(etTestStep, testStepSrc.getName()).id(relTest, testDst.getID());
+ TestStep testStepDst = fetchOne(searchServiceDst, TestStep.class, filter).orElseGet(() -> {
+ if (templateTestStep.isPresent()) {
+ return entityFactoryDst.createTestStep(testDst, templateTestStep.get());
+ } else {
+ return entityFactoryDst.createTestStep(testStepSrc.getName(), testDst);
+ }
+ });
+
+ copyValues(testStepSrc, testStepDst, Arrays.asList("Id"));
+
+ persist(transaction, testStepDst);
+
+ ehDst = new EntityHolder(testStepDst, entityManagerDst);
+ mapSrcDstEntities.put(ehSrc, ehDst);
+
+ copyContext(testStepSrc, testStepDst, templateTestStep, transaction);
+
+ if (recursive) {
+ List<ContextRoot> listContextRoots = new ArrayList<>();
+ entityManagerSrc.loadChildren(testStepSrc, Measurement.class)
+ .forEach(measurement -> copyMeasurement(measurement, listContextRoots, recursive, transaction));
+ }
+ }
+ return (TestStep) ehDst.getEntity();
+ }
+
+ private List<TestStep> copyTestSteps(Test testSrc, boolean recursive, Optional<TemplateTest> templateTestDst,
+ Test testDst, Transaction transaction) {
+ EntityType etTestStep = modelManagerDst.getEntityType(TestStep.class);
+ EntityType etTest = modelManagerDst.getEntityType(Test.class);
+
+ Relation relTest = etTestStep.getRelation(etTest);
+
+ if (null == relTest) {
+ throw new ApiCopyException("No relation to Test found at TestStep!");
+ }
+
+ List<TestStep> listTestStepsSrc = entityManagerSrc.loadChildren(testSrc, TestStep.class);
+
+ List<TestStep> listTestStepsDst = new ArrayList<>();
+ for (int i = 0, len = listTestStepsSrc.size(); i < len; ++i) {
+ TestStep testStepSrc = listTestStepsSrc.get(i);
+ Optional<TemplateTestStep> templateTestStep = templateResolver
+ .resolveTemplateTestStep(templateTestDst.get());
+
+ TestStep testStepDst;
+ if (templateTestStep.isPresent()) {
+ testStepDst = entityFactoryDst.createTestStep(testDst, templateTestStep.get());
+ } else {
+ testStepDst = entityFactoryDst.createTestStep(testSrc.getName(), testDst);
+ }
+
+ copyValues(testStepSrc, testStepDst, Arrays.asList("Id"));
+
+ listTestStepsDst.add(testStepDst);
+
+ mapSrcDstEntities.put(new EntityHolder(testStepSrc, entityManagerSrc),
+ new EntityHolder(testStepDst, entityManagerDst));
+ }
+
+ transaction.create(listTestStepsDst);
+
+ for (TestStep testStepSrc : listTestStepsSrc) {
+ Optional<TestStep> testStepDst = listTestStepsDst.stream()
+ .filter(n -> n.getName().equals(testStepSrc.getName())).findFirst();
+
+ if (testStepDst.isPresent()) {
+ copyContext(testStepSrc, testStepDst.get(), templateResolver.resolveTemplateTestStep(templateTestDst),
+ transaction);
+ }
+ }
+
+ if (recursive) {
+ for (TestStep testStep : listTestStepsSrc) {
+ List<ContextRoot> listContextRoots = new ArrayList<>();
+ entityManagerSrc.loadChildren(testStep, Measurement.class)
+ .forEach(measurement -> copyMeasurement(measurement, listContextRoots, recursive, transaction));
+ }
+ }
+
+ return listTestStepsDst;
+ }
+
+ private void copyContext(ContextDescribable contextDescribableSrc, ContextDescribable contextDescribableDst,
+ Optional<TemplateTestStep> optTemplateTestStep, Transaction transaction) {
+ List<Entity> listUpdatedEntities = new ArrayList<>();
+ List<Entity> listCreatedEntities = new ArrayList<>();
+
+ Map<ContextType, ContextRoot> mapContextRootsDst = contextDescribableDst.loadContexts(entityManagerDst,
+ ContextType.values());
+
+ for (Map.Entry<ContextType, ContextRoot> me : contextDescribableSrc
+ .loadContexts(entityManagerSrc, ContextType.values()).entrySet()) {
+ ContextRoot contextRootDst = mapContextRootsDst.get(me.getKey());
+ if (null != contextRootDst && contextRootDst.getName().equals(me.getValue().getName())) {
+ ContextRoot contextRootSrc = me.getValue();
+ copyValues(contextRootSrc, contextRootDst, Arrays.asList("Id", "Name"));
+
+ TemplateRoot templateRootDst = null;
+
+ if (optTemplateTestStep.isPresent()) {
+ Optional<TemplateRoot> optTemplateRoot = optTemplateTestStep.get()
+ .getTemplateRoot(contextRootDst.getContextType());
+
+ templateRootDst = optTemplateRoot.orElse(null);
+ }
+
+ for (ContextComponent contextComponentSrc : me.getValue().getContextComponents()) {
+ Optional<ContextComponent> o = contextRootDst.getContextComponent(contextComponentSrc.getName());
+
+ if (o.isPresent()) {
+ ContextComponent contextComponentDst = o.get();
+
+ copyValues(contextComponentSrc, contextComponentDst, Arrays.asList("Id", "Name"));
+
+ listUpdatedEntities.add(contextComponentDst);
+ } else if (null != templateRootDst) {
+ Optional<TemplateComponent> optTemplateComponent = templateRootDst
+ .getTemplateComponent(contextComponentSrc.getName());
+
+ if (optTemplateComponent.isPresent()) {
+ TemplateComponent templateComponent = optTemplateComponent.get();
+ if (templateComponent.isOptional() && !templateComponent.isDefaultActive()) {
+ ContextComponent contextComponentDst = entityFactoryDst
+ .createContextComponent(contextComponentSrc.getName(), contextRootDst);
+
+ copyValues(contextComponentSrc, contextComponentDst, Arrays.asList("Id", "Name"));
+
+ listCreatedEntities.add(contextComponentDst);
+ }
+ }
+ }
+ }
+ }
+
+ if (null != contextRootDst) {
+ listUpdatedEntities.add(contextRootDst);
+ }
+ }
+
+ transaction.create(listCreatedEntities);
+ transaction.update(listUpdatedEntities);
+ }
+
+ private Measurement copyMeasurement(Measurement measurementSrc, List<ContextRoot> listContextRootsDst,
+ boolean recursive, Transaction transaction) {
+ EntityHolder ehSrc = new EntityHolder(measurementSrc, entityManagerSrc);
+
+ EntityHolder ehDst = mapSrcDstEntities.get(ehSrc);
+
+ if (null == ehDst) {
+ TestStep testStepParentDst = (TestStep) mapSrcDstEntities
+ .get(new EntityHolder(entityManagerSrc.loadParent(measurementSrc, TestStep.class).get(),
+ entityManagerSrc))
+ .getEntity();
+
+ EntityType etMeasurement = modelManagerDst.getEntityType(Measurement.class);
+ EntityType etTestStep = modelManagerDst.getEntityType(TestStep.class);
+
+ Relation relTestStep = etMeasurement.getRelation(etTestStep);
+
+ if (null == relTestStep) {
+ throw new ApiCopyException("No relation to TestStep found at MeaResult!");
+ }
+
+ Filter filter = Filter.nameOnly(etMeasurement, measurementSrc.getName()).id(relTestStep,
+ testStepParentDst.getID());
+
+ Optional<TemplateTestStep> optTemplateTestStep = templateResolver
+ .resolveTemplateTestStep(templateResolver.resolveTemplateTest());
+
+ // If no ContextRoots to use with the newly created Measurement are passed into
+ // this method, use ContextRoots
+ // of any already existing Measurement under the parent test step.
+ // First look in destination...
+ if (listContextRootsDst.size() == 0) {
+ for (Measurement existingMeasurementDst : entityManagerDst.loadChildren(testStepParentDst,
+ Measurement.class)) {
+ listContextRootsDst.addAll(
+ existingMeasurementDst.loadContexts(entityManagerDst, ContextType.values()).values());
+
+ if (listContextRootsDst.size() > 0) {
+ break;
+ }
+ }
+ }
+
+ // ...then, if nothing has been found, in source and try to find destination
+ // counterpart in cache map:
+ if (listContextRootsDst.size() == 0) {
+ for (Measurement existingMeasurementSrc : entityManagerSrc.loadChildren(
+ entityManagerSrc.loadParent(measurementSrc, TestStep.class).get(), Measurement.class)) {
+ EntityHolder eh = mapSrcDstEntities.get(new EntityHolder(existingMeasurementSrc, entityManagerSrc));
+ if (null != eh) {
+ listContextRootsDst.addAll(((Measurement) eh.getEntity())
+ .loadContexts(entityManagerDst, ContextType.values()).values());
+ }
+
+ if (listContextRootsDst.size() > 0) {
+ break;
+ }
+ }
+ }
+
+ // Still no ContextRoots found? Create them from the test step template:
+ if (listContextRootsDst.size() == 0 && optTemplateTestStep.isPresent()) {
+ optTemplateTestStep.get().getTemplateRoots()
+ .forEach(tr -> listContextRootsDst.add(entityFactoryDst.createContextRoot(tr)));
+ }
+
+ Measurement measurementDst = fetchOne(searchServiceDst, Measurement.class, filter)
+ .orElseGet(() -> entityFactoryDst.createMeasurement(measurementSrc.getName(), testStepParentDst,
+ listContextRootsDst.toArray(new ContextRoot[listContextRootsDst.size()])));
+
+ copyValues(measurementSrc, measurementDst, Arrays.asList("Id", "Name"));
+
+ persist(transaction, measurementDst);
+
+ ehDst = new EntityHolder(measurementDst, entityManagerDst);
+ mapSrcDstEntities.put(ehSrc, ehDst);
+
+ copyContext(measurementSrc, measurementDst, optTemplateTestStep, transaction);
+
+ if (recursive) {
+ List<WriteRequest> listWriteRequests = new ArrayList<>();
+
+ Map<String, Channel> mapChannels = new HashMap<>();
+
+ for (Channel channel : entityManagerSrc.loadChildren(measurementSrc, Channel.class)) {
+ Channel channelDst = copyChannel(channel, transaction);
+ mapChannels.put(channel.getName(), channelDst);
+ }
+
+ for (ChannelGroup channelGroup : entityManagerSrc.loadChildren(measurementSrc, ChannelGroup.class)) {
+ ChannelGroup channelGroupDst = copyChannelGroup(channelGroup, transaction);
+
+ for (MeasuredValues measuredValues : entityManagerSrc.readMeasuredValues(ReadRequest
+ .create(channelGroup).valuesMode(ValuesMode.STORAGE).allChannels().allValues())) {
+ if (!mapChannels.containsKey(measuredValues.getName())) {
+ throw new ApiCopyException(
+ String.format("Cannot find Channel %s in destination!", measuredValues.getName()));
+ }
+
+ Channel channelDst = mapChannels.get(measuredValues.getName());
+
+ listWriteRequests.add(createWriteRequest(channelGroupDst, channelDst, measuredValues));
+ }
+ }
+
+ transaction.writeMeasuredValues(listWriteRequests);
+ }
+ }
+
+ return (Measurement) ehDst.getEntity();
+ }
+
+ private Channel copyChannel(Channel channelSrc, Transaction transaction) {
+ EntityHolder ehSrc = new EntityHolder(channelSrc, entityManagerSrc);
+
+ EntityHolder ehDst = mapSrcDstEntities.get(ehSrc);
+
+ if (null == ehDst) {
+ Measurement measurementParentDst = (Measurement) mapSrcDstEntities
+ .get(new EntityHolder(entityManagerSrc.loadParent(channelSrc, Measurement.class).get(),
+ entityManagerSrc))
+ .getEntity();
+
+ EntityType etChannel = modelManagerDst.getEntityType(Channel.class);
+ EntityType etMeasurement = modelManagerDst.getEntityType(Measurement.class);
+
+ Relation relMeasurement = etChannel.getRelation(etMeasurement);
+
+ if (null == relMeasurement) {
+ throw new ApiCopyException("No relation to MeaResult found at MeaQuantity!");
+ }
+
+ List<Quantity> listQuantities = entityManagerDst.loadAll(Quantity.class,
+ channelSrc.getQuantity().getName());
+
+ if (listQuantities.size() != 1) {
+ throw new ApiCopyException(
+ String.format("Cannot find Quantity %s in destination!", channelSrc.getQuantity().getName()));
+ }
+
+ Filter filter = Filter.nameOnly(etChannel, channelSrc.getName()).id(relMeasurement,
+ measurementParentDst.getID());
+
+ Channel channelDst = fetchOne(searchServiceDst, Channel.class, filter)
+ .orElseGet(() -> entityFactoryDst.createChannel(measurementParentDst, listQuantities.get(0)));
+
+ copyValues(channelSrc, channelDst, Arrays.asList("Id"));
+
+ persist(transaction, channelDst);
+
+ ehDst = new EntityHolder(channelDst, entityManagerDst);
+ mapSrcDstEntities.put(ehSrc, ehDst);
+ }
+
+ return (Channel) ehDst.getEntity();
+ }
+
+ private ChannelGroup copyChannelGroup(ChannelGroup channelGroupSrc, Transaction transaction) {
+ EntityHolder ehSrc = new EntityHolder(channelGroupSrc, entityManagerSrc);
+
+ EntityHolder ehDst = mapSrcDstEntities.get(ehSrc);
+
+ if (null == ehDst) {
+ Measurement measurementParentDst = (Measurement) mapSrcDstEntities
+ .get(new EntityHolder(entityManagerSrc.loadParent(channelGroupSrc, Measurement.class).get(),
+ entityManagerSrc))
+ .getEntity();
+
+ EntityType etChannelGroup = modelManagerDst.getEntityType(ChannelGroup.class);
+ EntityType etMeasurement = modelManagerDst.getEntityType(Measurement.class);
+
+ Relation relMeasurement = etChannelGroup.getRelation(etMeasurement);
+
+ if (null == relMeasurement) {
+ throw new ApiCopyException("No relation to MeaResult found at SubMatrix!");
+ }
+
+ Filter filter = Filter.nameOnly(etChannelGroup, channelGroupSrc.getName()).id(relMeasurement,
+ measurementParentDst.getID());
+
+ ChannelGroup channelGroupDst = fetchOne(searchServiceDst, ChannelGroup.class, filter)
+ .orElseGet(() -> entityFactoryDst.createChannelGroup(channelGroupSrc.getName(),
+ channelGroupSrc.getNumberOfValues(), measurementParentDst));
+
+ copyValues(channelGroupSrc, channelGroupDst, Arrays.asList("Id"));
+
+ persist(transaction, channelGroupDst);
+
+ ehDst = new EntityHolder(channelGroupDst, entityManagerDst);
+ mapSrcDstEntities.put(ehSrc, ehDst);
+ }
+
+ return (ChannelGroup) ehDst.getEntity();
+ }
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/AtfxTransferBase.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/AtfxTransferBase.java
new file mode 100644
index 0000000..9a99d08
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/AtfxTransferBase.java
@@ -0,0 +1,377 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+package org.eclipse.mdm.apicopy;
+
+import java.time.LocalDateTime;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.eclipse.mdm.api.base.ServiceNotProvidedException;
+import org.eclipse.mdm.api.base.Transaction;
+import org.eclipse.mdm.api.base.adapter.ModelManager;
+import org.eclipse.mdm.api.base.massdata.AnyTypeValuesBuilder;
+import org.eclipse.mdm.api.base.massdata.ComplexNumericalValuesBuilder;
+import org.eclipse.mdm.api.base.massdata.NumericalValuesBuilder;
+import org.eclipse.mdm.api.base.massdata.WriteRequest;
+import org.eclipse.mdm.api.base.massdata.WriteRequestBuilder;
+import org.eclipse.mdm.api.base.model.Channel;
+import org.eclipse.mdm.api.base.model.ChannelGroup;
+import org.eclipse.mdm.api.base.model.DoubleComplex;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.FileLink;
+import org.eclipse.mdm.api.base.model.FloatComplex;
+import org.eclipse.mdm.api.base.model.MeasuredValues;
+import org.eclipse.mdm.api.base.model.MeasuredValues.ValueIterator;
+import org.eclipse.mdm.api.base.model.Measurement;
+import org.eclipse.mdm.api.base.model.ScalarType;
+import org.eclipse.mdm.api.base.model.SequenceRepresentation;
+import org.eclipse.mdm.api.base.model.Test;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.base.model.Value;
+import org.eclipse.mdm.api.base.query.Filter;
+import org.eclipse.mdm.api.base.search.SearchService;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.api.dflt.model.EntityFactory;
+import org.eclipse.mdm.api.dflt.model.Pool;
+import org.eclipse.mdm.api.dflt.model.Project;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.LinkedListMultimap;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.Lists;
+
+public abstract class AtfxTransferBase {
+ List<Class<? extends Entity>> supportedRootEntities = Arrays.asList(Project.class, Pool.class, Test.class,
+ TestStep.class, Measurement.class);
+
+ ApplicationContext contextSrc;
+ EntityManager entityManagerSrc;
+
+ ApplicationContext contextDst;
+ EntityManager entityManagerDst;
+ EntityFactory entityFactoryDst;
+ ModelManager modelManagerDst;
+
+ Map<EntityHolder, EntityHolder> mapSrcDstEntities = new HashMap<>();
+
+ public AtfxTransferBase(ApplicationContext src, ApplicationContext dst) {
+ contextSrc = src;
+ entityManagerSrc = contextSrc.getEntityManager()
+ .orElseThrow(() -> new ServiceNotProvidedException(EntityManager.class));
+
+ contextDst = dst;
+ entityManagerDst = contextDst.getEntityManager()
+ .orElseThrow(() -> new ServiceNotProvidedException(EntityManager.class));
+ entityFactoryDst = contextDst.getEntityFactory()
+ .orElseThrow(() -> new ServiceNotProvidedException(EntityFactory.class));
+ modelManagerDst = contextDst.getModelManager()
+ .orElseThrow(() -> new ServiceNotProvidedException(ModelManager.class));
+ }
+
+ ListMultimap<Class<? extends Entity>, Entity> loadParents(List<? extends Entity> entities) {
+ List<Entity> list = entities.stream().filter(e -> !isSupported(e)).collect(Collectors.toList());
+ if (!list.isEmpty()) {
+ throw new ApiCopyException("Entity " + list + " not supported!");
+ }
+ LinkedListMultimap<Class<? extends Entity>, Entity> byType = LinkedListMultimap.create();
+ entities.forEach(e -> byType.put(e.getClass(), e));
+
+ byType.get(Measurement.class)
+ .forEach(e -> byType.put(TestStep.class, entityManagerSrc.loadParent(e, TestStep.class).get()));
+ byType.get(TestStep.class)
+ .forEach(e -> byType.put(Test.class, entityManagerSrc.loadParent(e, Test.class).get()));
+ byType.get(Test.class).forEach(e -> byType.put(Pool.class, entityManagerSrc.loadParent(e, Pool.class).get()));
+ byType.get(Pool.class)
+ .forEach(e -> byType.put(Project.class, entityManagerSrc.loadParent(e, Project.class).get()));
+
+ entities.forEach(e -> byType.remove(e.getClass(), e));
+ return byType;
+ }
+
+ boolean isSupported(Entity e) {
+ return supportedRootEntities.contains(e.getClass());
+ }
+
+ <T extends Entity> Optional<T> fetchOne(SearchService searchService, Class<T> entityClass, Filter filter) {
+ List<T> results = searchService.fetch(entityClass, filter);
+
+ if (results.isEmpty()) {
+ return Optional.empty();
+ } else if (results.size() == 1) {
+ return Optional.of(results.get(0));
+ } else {
+ throw new IllegalStateException(String.format("Expected at most one instance of %s, but found %s!",
+ entityClass.getName(), results.size()));
+ }
+ }
+
+ <T extends Entity> Optional<T> fetchOne(EntityManager entityManager, Class<T> entityClass, String name) {
+ List<T> results = entityManager.loadAll(entityClass).stream().filter(entity -> entity.getName().equals(name))
+ .collect(Collectors.toList());
+
+ if (results.isEmpty()) {
+ return Optional.empty();
+ } else if (results.size() == 1) {
+ return Optional.of(results.get(0));
+ } else {
+ throw new IllegalStateException(String.format("Expected at most one instance of %s, but found %s!",
+ entityClass.getName(), results.size()));
+ }
+ }
+
+ boolean isNewEntity(Entity entity) {
+ return (Strings.isNullOrEmpty(entity.getID()) || Long.valueOf(entity.getID()) <= 0);
+ }
+
+ void persist(Transaction transaction, Entity entity) {
+ if (isNewEntity(entity)) {
+ transaction.create(Lists.newArrayList(entity));
+ } else {
+ transaction.update(Lists.newArrayList(entity));
+ }
+ }
+
+ void copyValues(Entity srcEntity, Entity dstEntity, List<String> ignoredAttributes) {
+ Set<String> valueNamesDst = dstEntity.getValues().keySet();
+ for (Map.Entry<String, Value> me : srcEntity.getValues().entrySet()) {
+ String key = me.getKey();
+ if (!ignoredAttributes.contains(key) && valueNamesDst.contains(key)) {
+ dstEntity.getValue(me.getKey()).set(me.getValue().extract());
+ }
+ }
+ }
+
+ WriteRequest createWriteRequest(ChannelGroup channelGroupDst, Channel channelDst, MeasuredValues measuredValues) {
+ WriteRequestBuilder wrb = WriteRequest.create(channelGroupDst, channelDst, measuredValues.getAxisType());
+ NumericalValuesBuilder builder = null;
+ SequenceRepresentation seqRep = measuredValues.getSequenceRepresentation();
+ ScalarType scalarType = measuredValues.getScalarType();
+ boolean independent = measuredValues.isIndependent();
+ double[] generationParameters = measuredValues.getGenerationParameters();
+
+ if (SequenceRepresentation.EXPLICIT.equals(seqRep) || SequenceRepresentation.EXPLICIT_EXTERNAL.equals(seqRep)) {
+ builder = wrb.explicit();
+ } else if (SequenceRepresentation.IMPLICIT_CONSTANT.equals(seqRep)) {
+ checkGenerationParameters(generationParameters, 1);
+
+ return wrb.implicitConstant(scalarType, generationParameters[0]).build();
+ } else if (SequenceRepresentation.IMPLICIT_LINEAR.equals(seqRep)) {
+ checkGenerationParameters(generationParameters, 2);
+
+ return wrb.implicitLinear(scalarType, generationParameters[0], generationParameters[1])
+ .independent(independent).build();
+ } else if (SequenceRepresentation.IMPLICIT_SAW.equals(seqRep)) {
+ checkGenerationParameters(generationParameters, 3);
+
+ return wrb
+ .implicitSaw(scalarType, generationParameters[0], generationParameters[1], generationParameters[2])
+ .build();
+ } else if (SequenceRepresentation.RAW_LINEAR.equals(seqRep)
+ || SequenceRepresentation.RAW_LINEAR_EXTERNAL.equals(seqRep)) {
+ checkGenerationParameters(generationParameters, 2);
+
+ builder = wrb.rawLinear(generationParameters[0], generationParameters[1]);
+ } else if (SequenceRepresentation.RAW_LINEAR_CALIBRATED.equals(seqRep)
+ || SequenceRepresentation.RAW_LINEAR_CALIBRATED_EXTERNAL.equals(seqRep)) {
+ checkGenerationParameters(generationParameters, 3);
+
+ builder = wrb.rawLinearCalibrated(generationParameters[0], generationParameters[1],
+ generationParameters[2]);
+ } else if (SequenceRepresentation.RAW_POLYNOMIAL.equals(seqRep)
+ || SequenceRepresentation.RAW_POLYNOMIAL_EXTERNAL.equals(seqRep)) {
+ builder = wrb.rawPolynomial(generationParameters);
+ }
+
+ if (scalarType.isString()) {
+ String[] values = new String[measuredValues.getLength()];
+ boolean[] flags = new boolean[values.length];
+ ValueIterator<String> iter = measuredValues.iterator();
+ int count = 0;
+ while (iter.hasNext()) {
+ flags[count] = iter.isValid();
+ values[count++] = iter.next();
+ }
+
+ return castBuilder(builder, AnyTypeValuesBuilder.class).stringValues(values, flags).build();
+ } else if (scalarType.isDate()) {
+ LocalDateTime[] values = new LocalDateTime[measuredValues.getLength()];
+ boolean[] flags = new boolean[values.length];
+ ValueIterator<LocalDateTime> iter = measuredValues.iterator();
+ int count = 0;
+ while (iter.hasNext()) {
+ flags[count] = iter.isValid();
+ values[count++] = iter.next();
+ }
+
+ return castBuilder(builder, AnyTypeValuesBuilder.class).dateValues(values, flags).independent(independent)
+ .build();
+ } else if (scalarType.isBoolean()) {
+ boolean[] values = new boolean[measuredValues.getLength()];
+ boolean[] flags = new boolean[values.length];
+ ValueIterator<Boolean> iter = measuredValues.iterator();
+ int count = 0;
+ while (iter.hasNext()) {
+ flags[count] = iter.isValid();
+ values[count++] = iter.next();
+ }
+
+ return castBuilder(builder, AnyTypeValuesBuilder.class).booleanValues(values, flags).build();
+ } else if (scalarType.isByte()) {
+ byte[] values = new byte[measuredValues.getLength()];
+ boolean[] flags = new boolean[values.length];
+ ValueIterator<Byte> iter = measuredValues.iterator();
+ int count = 0;
+ while (iter.hasNext()) {
+ flags[count] = iter.isValid();
+ values[count++] = iter.next();
+ }
+
+ return builder.byteValues(values, flags).independent(independent).build();
+ } else if (scalarType.isShort()) {
+ short[] values = new short[measuredValues.getLength()];
+ boolean[] flags = new boolean[values.length];
+ ValueIterator<Short> iter = measuredValues.iterator();
+ int count = 0;
+ while (iter.hasNext()) {
+ flags[count] = iter.isValid();
+ values[count++] = iter.next();
+ }
+
+ return builder.shortValues(values, flags).independent(independent).build();
+ } else if (scalarType.isInteger()) {
+ int[] values = new int[measuredValues.getLength()];
+ boolean[] flags = new boolean[values.length];
+ ValueIterator<Integer> iter = measuredValues.iterator();
+ int count = 0;
+ while (iter.hasNext()) {
+ flags[count] = iter.isValid();
+ values[count++] = iter.next();
+ }
+
+ return builder.integerValues(values, flags).independent(independent).build();
+ } else if (scalarType.isLong()) {
+ long[] values = new long[measuredValues.getLength()];
+ boolean[] flags = new boolean[values.length];
+ ValueIterator<Long> iter = measuredValues.iterator();
+ int count = 0;
+ while (iter.hasNext()) {
+ flags[count] = iter.isValid();
+ values[count++] = iter.next();
+ }
+
+ return builder.longValues(values, flags).independent(independent).build();
+ } else if (scalarType.isFloat()) {
+ float[] values = new float[measuredValues.getLength()];
+ boolean[] flags = new boolean[values.length];
+ ValueIterator<Float> iter = measuredValues.iterator();
+ int count = 0;
+ while (iter.hasNext()) {
+ flags[count] = iter.isValid();
+ values[count++] = iter.next();
+ }
+
+ return builder.floatValues(values, flags).independent(independent).build();
+ } else if (scalarType.isDouble()) {
+ double[] values = new double[measuredValues.getLength()];
+ boolean[] flags = new boolean[values.length];
+ ValueIterator<Double> iter = measuredValues.iterator();
+ int count = 0;
+ while (iter.hasNext()) {
+ flags[count] = iter.isValid();
+ values[count++] = iter.next();
+ }
+
+ return builder.doubleValues(values, flags).independent(independent).build();
+ } else if (scalarType.isByteStream()) {
+ byte[][] values = new byte[measuredValues.getLength()][];
+ boolean[] flags = new boolean[values.length];
+ ValueIterator<byte[]> iter = measuredValues.iterator();
+ int count = 0;
+ while (iter.hasNext()) {
+ flags[count] = iter.isValid();
+ values[count++] = iter.next();
+ }
+
+ return castBuilder(builder, AnyTypeValuesBuilder.class).byteStreamValues(values, flags).build();
+ } else if (scalarType.isFloatComplex()) {
+ FloatComplex[] values = new FloatComplex[measuredValues.getLength()];
+ boolean[] flags = new boolean[values.length];
+ ValueIterator<FloatComplex> iter = measuredValues.iterator();
+ int count = 0;
+ while (iter.hasNext()) {
+ flags[count] = iter.isValid();
+ values[count++] = iter.next();
+ }
+
+ return castBuilder(builder, ComplexNumericalValuesBuilder.class).floatComplexValues(values, flags).build();
+ } else if (scalarType.isDoubleComplex()) {
+ DoubleComplex[] values = new DoubleComplex[measuredValues.getLength()];
+ boolean[] flags = new boolean[values.length];
+ ValueIterator<DoubleComplex> iter = measuredValues.iterator();
+ int count = 0;
+ while (iter.hasNext()) {
+ flags[count] = iter.isValid();
+ values[count++] = iter.next();
+ }
+
+ return castBuilder(builder, ComplexNumericalValuesBuilder.class).doubleComplexValues(values, flags).build();
+ } else if (scalarType.isFileLink()) {
+ FileLink[] values = new FileLink[measuredValues.getLength()];
+ boolean[] flags = new boolean[values.length];
+ ValueIterator<FileLink> iter = measuredValues.iterator();
+ int count = 0;
+ while (iter.hasNext()) {
+ flags[count] = iter.isValid();
+ values[count++] = iter.next();
+ }
+
+ return castBuilder(builder, AnyTypeValuesBuilder.class).fileLinkValues(values, flags).build();
+ } else if (scalarType.isBlob()) {
+ Object value = null;
+ ValueIterator<Object> iter = measuredValues.iterator();
+ while (iter.hasNext()) {
+ value = iter.next();
+ }
+
+ return castBuilder(builder, AnyTypeValuesBuilder.class).blobValue(value).build();
+ } else {
+ throw new IllegalStateException(
+ String.format("Unsupported ScalarType %s in MeasuredValues!", scalarType.name()));
+ }
+ }
+
+ void checkGenerationParameters(double[] generationParameters, int expectedLength) {
+ if (null == generationParameters || generationParameters.length < expectedLength) {
+ throw new IllegalStateException(String.format("Number of generation parameters is %d, expected %d!",
+ (null == generationParameters ? 0 : generationParameters.length), expectedLength));
+ }
+ }
+
+ <T extends NumericalValuesBuilder> T castBuilder(NumericalValuesBuilder builder, Class<T> cls) {
+ if (!cls.isInstance(builder)) {
+ throw new IllegalStateException(String.format(
+ "Error creating the write values builder, expected class is %s, actual class is %s (likely column data type and sequence representation mismatch)!",
+ cls.getName(), (null == builder ? "???" : builder.getClass().getName())));
+ }
+
+ return cls.cast(builder);
+ }
+
+}
diff --git a/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/ClassificationUtil.java b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/ClassificationUtil.java
new file mode 100644
index 0000000..b163546
--- /dev/null
+++ b/org.eclipse.mdm.nucleus/org.eclipse.mdm.apicopy/src/main/java/org/eclipse/mdm/apicopy/ClassificationUtil.java
@@ -0,0 +1,290 @@
+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.