Skip to content
Snippets Groups Projects
Commit aecc2b3c authored by Torben Miny's avatar Torben Miny
Browse files

Merge branch 'feature/aasx' into 'master'

Add AASX reading and writing functionality

Closes #38

See merge request acplt/pyaas!16
parents 81545c7e 65981a4b
No related branches found
No related tags found
1 merge request!16Add AASX reading and writing functionality
Pipeline #259822 passed
# Copyright 2019 PyI40AAS Contributors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
# specific language governing permissions and limitations under the License.
"""
Functionality for reading and writing AASX files according to "Details of the Asset Administration Shell Part 1 V2.0",
section 7.
The AASX file format is built upon the Open Packaging Conventions (OPC; ECMA 376-2). We use the `pyecma376_2` library
for low level OPC reading and writing. It currently supports all required features except for embedded digital
signatures.
Writing and reading of AASX packages is performed through the AASXReader and AASXWriter classes. Each instance of these
classes wraps an existing AASX file resp. a file to be created and allows to read/write the included AAS objects
into/form object stores. For handling of embedded supplementary files, this module provides the
`AbstractSupplementaryFileContainer` class interface and the `DictSupplementaryFileContainer` implementation.
"""
import abc
import hashlib
import io
import logging
import os
import re
from typing import Dict, Tuple, IO, Union, List, Set, Optional
from .. import model
from .json.json_deserialization import read_json_aas_file
from .json.json_serialization import write_aas_json_file
import pyecma376_2
from ..util import traversal
logger = logging.getLogger(__name__)
RELATIONSHIP_TYPE_AASX_ORIGIN = "http://www.admin-shell.io/aasx/relationships/aasx-origin"
RELATIONSHIP_TYPE_AAS_SPEC = "http://www.admin-shell.io/aasx/relationships/aas-spec"
RELATIONSHIP_TYPE_AAS_SPEC_SPLIT = "http://www.admin-shell.io/aasx/relationships/aas-spec-split"
RELATIONSHIP_TYPE_AAS_SUPL = "http://www.admin-shell.io/aasx/relationships/aas-suppl"
class AASXReader:
"""
An AASXReader wraps an existing AASX package file to allow reading its contents and metadata.
Basic usage:
objects = DictObjectStore()
files = DictSupplementaryFileContainer()
with AASXReader("filename.aasx") as reader:
meta_data = reader.get_core_properties()
reader.read_into(objects, files)
"""
def __init__(self, file: Union[os.PathLike, str, IO]):
"""
Open an AASX reader for the given filename or file handle
The given file is opened as OPC ZIP package. Make sure to call `AASXReader.close()` after reading the file
contents to close the underlying ZIP file reader. You may also use the AASXReader as a context manager to ensure
closing under any circumstances.
:param file: A filename, file path or an open file-like object in binary mode
:raises ValueError: If the file is not a valid OPC zip package
"""
try:
logger.debug("Opening {} as AASX pacakge for reading ...".format(file))
self.reader = pyecma376_2.ZipPackageReader(file)
except Exception as e:
raise ValueError("{} is not a valid ECMA376-2 (OPC) file".format(file)) from e
def get_core_properties(self) -> pyecma376_2.OPCCoreProperties:
"""
Retrieve the OPC Core Properties (meta data) of the AASX package file.
If no meta data is provided in the package file, an emtpy OPCCoreProperties object is returned.
:return: The AASX package's meta data
"""
return self.reader.get_core_properties()
def get_thumbnail(self) -> Optional[bytes]:
"""
Retrieve the packages thumbnail image
The thumbnail image file is read into memory and returned as bytes object. You may use some python image library
for further processing or conversion, e.g. `pillow`:
import io
from PIL import Image
thumbnail = Image.open(io.BytesIO(reader.get_thumbnail()))
:return: The AASX package thumbnail's file contents or None if no thumbnail is provided
"""
try:
thumbnail_part = self.reader.get_related_parts_by_type()[pyecma376_2.RELATIONSHIP_TYPE_THUMBNAIL][0]
except IndexError:
return None
with self.reader.open_part(thumbnail_part) as p:
return p.read()
def read_into(self, object_store: model.AbstractObjectStore,
file_store: "AbstractSupplementaryFileContainer",
override_existing: bool = False) -> Set[model.Identifier]:
"""
Read the contents of the AASX package and add them into a given ObjectStore
This function does the main job of reading the AASX file's contents. It traverses the relationships within the
package to find AAS JSON or XML parts, parses them and adds the contained AAS objects into the provided
`object_store`. While doing so, it searches all parsed Submodels for File objects to extract the supplementary
files. The referenced supplementary files are added to the given `file_store` and the File objects' values are
updated with the absolute name of the supplementary file to allow for robust resolution the file within the
`file_store` later.
:param object_store: An ObjectStore to add the AAS objects from the AASX file to
:param file_store: A SupplementaryFileContainer to add the embedded supplementary files to
:param override_existing: If True, existing objects in the object store are overridden with objects from the
AASX that have the same Identifer. Default behavior is to skip those objects from the AASX.
:return: A set of the Identifiers of all Identifiable objects parsed from the AASX file
"""
# Find AASX-Origin part
core_rels = self.reader.get_related_parts_by_type()
try:
aasx_origin_part = core_rels[RELATIONSHIP_TYPE_AASX_ORIGIN][0]
except IndexError as e:
raise ValueError("Not a valid AASX file: aasx-origin Relationship is missing.") from e
read_identifiables: Set[model.Identifier] = set()
# Iterate AAS files
for aas_part in self.reader.get_related_parts_by_type(aasx_origin_part)[
RELATIONSHIP_TYPE_AAS_SPEC]:
self._read_aas_part_into(aas_part, object_store, file_store, read_identifiables, override_existing)
# Iterate split parts of AAS file
for split_part in self.reader.get_related_parts_by_type(aas_part)[
RELATIONSHIP_TYPE_AAS_SPEC_SPLIT]:
self._read_aas_part_into(split_part, object_store, file_store, read_identifiables, override_existing)
return read_identifiables
def close(self) -> None:
"""
Close the AASXReader and the underlying OPC / ZIP file readers. Must be called after reading the file.
"""
self.reader.close()
def __enter__(self) -> "AASXReader":
return self
def __exit__(self, exc_type, exc_val, exc_tb) -> None:
self.close()
def _read_aas_part_into(self, part_name: str,
object_store: model.AbstractObjectStore,
file_store: "AbstractSupplementaryFileContainer",
read_identifiables: Set[model.Identifier],
override_existing: bool) -> None:
"""
Helper function for `read_into()` to read and process the contents of an AAS-spec part of the AASX file.
This method primarily checks for duplicate objects. It uses `_parse_aas_parse()` to do the actual parsing and
`_collect_supplementary_files()` for supplementary file processing of non-duplicate objects.
:param part_name: The OPC part name to read
:param object_store: An ObjectStore to add the AAS objects from the AASX file to
:param file_store: A SupplementaryFileContainer to add the embedded supplementary files to, which are reference
from a File object of this part
:param read_identifiables: A set of Identifiers of objects which have already been read. New objects'
Identifiers are added to this set. Objects with already known Identifiers are skipped silently.
:param override_existing: If True, existing objects in the object store are overridden with objects from the
AASX that have the same Identifer. Default behavior is to skip those objects from the AASX.
"""
for obj in self._parse_aas_part(part_name):
if obj.identification in read_identifiables:
continue
if obj.identification in object_store:
if override_existing:
logger.info("Overriding existing object in ObjectStore with {} ...".format(obj))
object_store.discard(obj)
else:
logger.warning("Skipping {}, since an object with the same id is already contained in the "
"ObjectStore".format(obj))
continue
object_store.add(obj)
read_identifiables.add(obj.identification)
if isinstance(obj, model.Submodel):
self._collect_supplementary_files(part_name, obj, file_store)
def _parse_aas_part(self, part_name: str) -> model.DictObjectStore:
"""
Helper function to parse the AAS objects from a single JSON or XML part of the AASX package.
This method chooses and calls the correct parser.
:param part_name: The OPC part name of the part to be parsed
:return: A DictObjectStore containing the parsed AAS objects
"""
content_type = self.reader.get_content_type(part_name)
extension = part_name.split("/")[-1].split(".")[-1]
if content_type.split(";")[0] in ("text/xml", "application/xml") or content_type == "" and extension == "xml":
logger.debug("Parsing AAS objects from XML stream in OPC part {} ...".format(part_name))
# TODO XML Deserialization
raise NotImplementedError("XML deserialization is not implemented yet. Thus, AASX files with XML parts are "
"not supported.")
elif content_type.split(";")[0] in ("text/json", "application/json") \
or content_type == "" and extension == "json":
logger.debug("Parsing AAS objects from JSON stream in OPC part {} ...".format(part_name))
with self.reader.open_part(part_name) as p:
return read_json_aas_file(io.TextIOWrapper(p, encoding='utf-8-sig'))
else:
logger.error("Could not determine part format of AASX part {} (Content Type: {}, extension: {}"
.format(part_name, content_type, extension))
return model.DictObjectStore()
def _collect_supplementary_files(self, part_name: str, submodel: model.Submodel,
file_store: "AbstractSupplementaryFileContainer") -> None:
"""
Helper function to search File objects within a single parsed Submodel, extract the referenced supplementary
files and update the File object's values with the absolute path.
:param part_name: The OPC part name of the part the submodel has been parsed from. This is used to resolve
relative file paths.
:param submodel: The Submodel to process
:param file_store: The SupplementaryFileContainer to add the extracted supplementary files to
"""
for element in traversal.walk_submodel(submodel):
if isinstance(element, model.File):
if element.value is None:
continue
absolute_name = pyecma376_2.package_model.part_realpath(element.value, part_name)
logger.debug("Reading supplementary file {} from AASX package ...".format(absolute_name))
with self.reader.open_part(absolute_name) as p:
final_name = file_store.add_file(absolute_name, p, self.reader.get_content_type(absolute_name))
element.value = final_name
class AASXWriter:
"""
An AASXWriter wraps a new AASX package file to write its contents to it piece by piece.
Basic usage:
# object_store and file_store are expected to be given (e.g. some storage backend or previously created data)
cp = OPCCoreProperties()
cp.creator = "ACPLT"
cp.created = datetime.datetime.now()
with AASXWriter("filename.aasx") as writer:
writer.write_aas(Identifier("https://acplt.org/AssetAdministrationShell", IdentifierType.IRI),
object_store,
file_store)
writer.write_aas(Identifier("https://acplt.org/AssetAdministrationShell2", IdentifierType.IRI),
object_store,
file_store)
writer.write_core_properties(cp)
Attention: The AASXWriter must always be closed using the close() method or its context manager functionality (as
shown above). Otherwise the resulting AASX file will lack important data structures and will not be readable.
"""
AASX_ORIGIN_PART_NAME = "/aasx/aasx-origin"
def __init__(self, file: Union[os.PathLike, str, IO]):
"""
Create a new AASX package in the given file and open the AASXWriter to add contents to the package.
Make sure to call `AASXWriter.close()` after writing all contents to write the aas-spec relationships for all
AAS parts to the file and close the underlying ZIP file writer. You may also use the AASXWriter as a context
manager to ensure closing under any circumstances.
:param file: filename, path, or binary file handle opened for writing
"""
# names of aas-spec parts, used by `_write_aasx_origin_relationships()`
self._aas_part_names: List[str] = []
# name of the thumbnail part (if any)
self._thumbnail_part: Optional[str] = None
# name of the core properties part (if any)
self._properties_part: Optional[str] = None
# names and hashes of all supplementary file parts that have already been written
self._supplementary_part_names: Dict[str, Optional[bytes]] = {}
self._aas_name_friendlyfier = NameFriendlyfier()
# Open OPC package writer
self.writer = pyecma376_2.ZipPackageWriter(file)
# Create AASX origin part
logger.debug("Creating AASX origin part in AASX package ...")
p = self.writer.open_part(self.AASX_ORIGIN_PART_NAME, "text/plain")
p.close()
# TODO allow to specify, which supplementary parts (submodels, conceptDescriptions) should be added to the package
# TODO allow to select JSON/XML serialization
def write_aas(self,
aas_id: model.Identifier,
object_store: model.AbstractObjectStore,
file_store: "AbstractSupplementaryFileContainer") -> None:
"""
Add an Asset Administration Shell with all included and referenced objects to the AASX package.
This method takes the AAS's Identifier (as `aas_id`) to retrieve it from the given object_store. References to
the Asset, ConceptDescriptions and Submodels are also resolved using the object_store. All of these objects are
written to aas-spec parts in the AASX package, follwing the conventions presented in "Details of the Asset
Administration Shell". For each Submodel, a aas-spec-split part is used. Supplementary files which are
referenced by a File object in any of the Submodels, are also added to the AASX package.
:param aas_id: Identifier of the AAS to be added to the AASX file
:param object_store: ObjectStore to retrieve the Identifiable AAS objects (AAS, Asset, ConceptDescriptions and
Submodels) from
:param file_store: SupplementaryFileContainer to retrieve supplementary files from, which are referenced by File
objects
"""
aas_friendly_name = self._aas_name_friendlyfier.get_friendly_name(aas_id)
aas_part_name = "/aasx/{0}/{0}.aas.json".format(aas_friendly_name)
self._aas_part_names.append(aas_part_name)
aas_friendlyfier = NameFriendlyfier()
aas: model.AssetAdministrationShell = object_store.get_identifiable(aas_id) # type: ignore
objects_to_be_written: model.DictObjectStore[model.Identifiable] = model.DictObjectStore()
objects_to_be_written.add(aas)
# Add the Asset object to the objects in the AAS part
try:
objects_to_be_written.add(aas.asset.resolve(object_store))
except KeyError as e:
logger.warning("Skipping Asset object, since {} could not be resolved: {}".format(aas.asset, e))
pass
# Add referenced ConceptDescriptions to the AAS part
for dictionary in aas.concept_dictionary:
for concept_rescription_ref in dictionary.concept_description:
try:
obj = concept_rescription_ref.resolve(object_store)
except KeyError as e:
logger.warning("Skipping ConceptDescription, since {} could not be resolved: {}"
.format(concept_rescription_ref, e))
continue
try:
objects_to_be_written.add(obj)
except KeyError:
# Ignore duplicate ConceptDescriptions (i.e. same Description referenced from multiple
# Dictionaries)
pass
# Write AAS part
logger.debug("Writing AAS {} to part {} in AASX package ...".format(aas.identification, aas_part_name))
with self.writer.open_part(aas_part_name, "application/json") as p:
write_aas_json_file(io.TextIOWrapper(p, encoding='utf-8'), objects_to_be_written)
# Create a AAS split part for each (available) submodel of the AAS
aas_split_part_names: List[str] = []
for submodel_ref in aas.submodel:
try:
submodel = submodel_ref.resolve(object_store)
except KeyError as e:
logger.warning("Skipping Submodel, since {} could not be resolved: {}".format(submodel_ref, e))
continue
submodel_friendly_name = aas_friendlyfier.get_friendly_name(submodel.identification)
submodel_part_name = "/aasx/{0}/{1}/{1}.submodel.json".format(aas_friendly_name, submodel_friendly_name)
self._write_submodel_part(file_store, submodel, submodel_part_name)
aas_split_part_names.append(submodel_part_name)
# Add relationships from AAS part to (submodel) split parts
logger.debug("Writing aas-spec-split relationships for AAS {} to AASX package ..."
.format(aas.identification))
self.writer.write_relationships(
(pyecma376_2.OPCRelationship("r{}".format(i),
RELATIONSHIP_TYPE_AAS_SPEC_SPLIT,
submodel_part_name,
pyecma376_2.OPCTargetMode.INTERNAL)
for i, submodel_part_name in enumerate(aas_split_part_names)),
aas_part_name)
def _write_submodel_part(self, file_store: "AbstractSupplementaryFileContainer",
submodel: model.Submodel, submodel_part_name: str) -> None:
"""
Helper function for `write_aas()` to write an aas-spec-split part for a Submodel object and add the relevant
supplementary files.
:param file_store: The SupplementaryFileContainer to retrieve supplementary files from
:param submodel: The submodel to be written into the AASX package
:param submodel_part_name: OPC part name of the aas-spec-split part for this Submodel
"""
logger.debug("Writing Submodel {} to part {} in AASX package ..."
.format(submodel.identification, submodel_part_name))
submodel_file_objects: model.DictObjectStore[model.Identifiable] = model.DictObjectStore()
submodel_file_objects.add(submodel)
with self.writer.open_part(submodel_part_name, "application/json") as p:
write_aas_json_file(io.TextIOWrapper(p, encoding='utf-8'), submodel_file_objects)
# Write submodel's supplementary files to AASX file
submodel_file_names = []
for element in traversal.walk_submodel(submodel):
if isinstance(element, model.File):
file_name = element.value
if file_name is None:
continue
try:
content_type = file_store.get_content_type(file_name)
hash = file_store.get_sha256(file_name)
except KeyError:
logger.warning("Could not find file {} in file store, referenced from {}."
.format(file_name, element))
continue
# Check if this supplementary file has already been written to the AASX package or has a name conflict
if self._supplementary_part_names.get(file_name) == hash:
continue
elif file_name in self._supplementary_part_names:
logger.error("Trying to write supplementary file {} to AASX twice with different contents"
.format(file_name))
logger.debug("Writing supplementary file {} to AASX package ...".format(file_name))
with self.writer.open_part(file_name, content_type) as p:
file_store.write_file(file_name, p)
submodel_file_names.append(pyecma376_2.package_model.normalize_part_name(file_name))
self._supplementary_part_names[file_name] = hash
# Add relationships from submodel to supplementary parts
# TODO should the relationships be added from the AAS instead?
logger.debug("Writing aas-suppl relationships for Submodel {} to AASX package ..."
.format(submodel.identification))
self.writer.write_relationships(
(pyecma376_2.OPCRelationship("r{}".format(i),
RELATIONSHIP_TYPE_AAS_SUPL,
submodel_file_name,
pyecma376_2.OPCTargetMode.INTERNAL)
for i, submodel_file_name in enumerate(submodel_file_names)),
submodel_part_name)
def write_core_properties(self, core_properties: pyecma376_2.OPCCoreProperties):
"""
Write OPC Core Properties (meta data) to the AASX package file.
Attention: This method may only be called once for each AASXWriter!
:param core_properties: The OPCCoreProperties object with the meta data to be written to the package file
"""
if self._properties_part is not None:
raise RuntimeError("Core Properties have already been written.")
logger.debug("Writing core properties to AASX package ...")
with self.writer.open_part(pyecma376_2.DEFAULT_CORE_PROPERTIES_NAME, "application/xml") as p:
core_properties.write_xml(p)
self._properties_part = pyecma376_2.DEFAULT_CORE_PROPERTIES_NAME
def write_thumbnail(self, name: str, data: bytearray, content_type: str):
"""
Write an image file as thumbnail image to the AASX package.
Attention: This method may only be called once for each AASXWriter!
:param name: The OPC part name of the thumbnail part. Should not contain '/' or URI-encoded '/' or '\'.
:param data: The image file's binary contents to be written
:param content_type: OPC content type (MIME type) of the image file
"""
if self._thumbnail_part is not None:
raise RuntimeError("package thumbnail has already been written to {}.".format(self._thumbnail_part))
with self.writer.open_part(name, content_type) as p:
p.write(data)
self._thumbnail_part = name
def close(self):
"""
Write relationships for all data files to package and close underlying OPC package and ZIP file.
"""
self._write_aasx_origin_relationships()
self._write_package_relationships()
self.writer.close()
def __enter__(self) -> "AASXWriter":
return self
def __exit__(self, exc_type, exc_val, exc_tb) -> None:
self.close()
def _write_aasx_origin_relationships(self):
"""
Helper function to write aas-spec relationships of the aasx-origin part.
This method uses the list of aas-spec parts in `_aas_part_names`. It should be called just before closing the
file to make sure all aas-spec parts of the package have already been written.
"""
# Add relationships from AASX-origin part to AAS parts
logger.debug("Writing aas-spec relationships to AASX package ...")
self.writer.write_relationships(
(pyecma376_2.OPCRelationship("r{}".format(i), RELATIONSHIP_TYPE_AAS_SPEC,
aas_part_name,
pyecma376_2.OPCTargetMode.INTERNAL)
for i, aas_part_name in enumerate(self._aas_part_names)),
self.AASX_ORIGIN_PART_NAME)
def _write_package_relationships(self):
"""
Helper function to write package (root) relationships to the OPC package.
This method must be called just before closing the package file to make sure we write exactly the correct
relationships:
* aasx-origin (always)
* core-properties (if core properties have been added)
* thumbnail (if thumbnail part has been added)
"""
logger.debug("Writing package relationships to AASX package ...")
package_relationships: List[pyecma376_2.OPCRelationship] = [
pyecma376_2.OPCRelationship("r1", RELATIONSHIP_TYPE_AASX_ORIGIN,
self.AASX_ORIGIN_PART_NAME,
pyecma376_2.OPCTargetMode.INTERNAL),
]
if self._properties_part is not None:
package_relationships.append(pyecma376_2.OPCRelationship(
"r2", pyecma376_2.RELATIONSHIP_TYPE_CORE_PROPERTIES, self._properties_part,
pyecma376_2.OPCTargetMode.INTERNAL))
if self._thumbnail_part is not None:
package_relationships.append(pyecma376_2.OPCRelationship(
"r3", pyecma376_2.RELATIONSHIP_TYPE_THUMBNAIL, self._thumbnail_part,
pyecma376_2.OPCTargetMode.INTERNAL))
self.writer.write_relationships(package_relationships)
class NameFriendlyfier:
"""
A simple helper class to create unique "AAS friendly names" according to DotAAS, section 7.6.
Objects of this class store the already created friendly names to avoid name collisions within one set of names.
"""
RE_NON_ALPHANUMERICAL = re.compile(r"[^a-zA-Z0-9]")
def __init__(self) -> None:
self.issued_names: Set[str] = set()
def get_friendly_name(self, identifier: model.Identifier):
"""
Generate a friendly name from an AAS identifier.
According to section 7.6 of "Details of the Asset Administration Shell", all non-alphanumerical characters are
replaced with underscores. We also replace all non-ASCII characters to generate valid URIs as the result.
If this replacement results in a collision with a previously generated friendly name of this NameFriendlifier,
a number is appended with underscore to the friendly name. Example
>>> friendlyfier = NameFriendlyfier()
>>> friendlyfier.get_friendly_name(model.Identifier("http://example.com/AAS-a", model.IdentifierType.IRI))
"http___example_com_AAS_a"
>>> friendlyfier.get_friendly_name(model.Identifier("http://example.com/AAS+a", model.IdentifierType.IRI))
"http___example_com_AAS_a_1"
"""
# friendlify name
raw_name = self.RE_NON_ALPHANUMERICAL.sub('_', identifier.id)
# Unify name (avoid collisions)
amended_name = raw_name
i = 1
while amended_name in self.issued_names:
amended_name = "{}_{}".format(raw_name, i)
i += 1
self.issued_names.add(amended_name)
return amended_name
class AbstractSupplementaryFileContainer(metaclass=abc.ABCMeta):
"""
Abstract interface for containers of supplementary files for AASs.
Supplementary files may be PDF files or other binary or textual files, referenced in a File object of an AAS by
their name. They are used to provide associated documents without embedding their contents (as Blob object) in the
AAS.
A SupplementaryFileContainer keeps track of the name and content_type (MIME type) for each file. Additionally it
allows to resolve name conflicts by comparing the files' contents and providing an alternative name for a dissimilar
new file. It also provides each files sha256 hash sum to allow name conflict checking in other classes (e.g. when
writing AASX files).
"""
@abc.abstractmethod
def add_file(self, name: str, file: IO[bytes], content_type: str) -> str:
"""
Add a new file to the SupplementaryFileContainer and resolve name conflicts.
The file contents must be provided as a binary file-like object to be read by the SupplementaryFileContainer.
If the container already contains an equally named file, the content_type and file contents are compared (using
a hash sum). In case of dissimilar files, a new unique name for the new file is computed and returned. It should
be used to update in the File object of the AAS.
:param name: The file's proposed name. Should start with a '/'. Should not contain URI-encoded '/' or '\'
:param file: A binary file-like opened for reading the file contents
:param content_type: The file's content_type
:return: The file name as stored in the SupplementaryFileContainer. Typically `name` or a modified version of
`name` to resolve conflicts.
"""
pass # pragma: no cover
@abc.abstractmethod
def get_content_type(self, name: str) -> str:
"""
Get a stored file's content_type.
:param name: file name of questioned file
:return: The file's content_type
:raises KeyError: If no file with this name is stored
"""
pass # pragma: no cover
@abc.abstractmethod
def get_sha256(self, name: str) -> bytes:
"""
Get a stored file content's sha256 hash sum.
This may be used by other classes (e.g. the AASXWriter) to check for name conflicts.
:param name: file name of questioned file
:return: The file content's sha256 hash sum
:raises KeyError: If no file with this name is stored
"""
pass # pragma: no cover
@abc.abstractmethod
def write_file(self, name: str, file: IO[bytes]) -> None:
"""
Retrieve a stored file's contents by writing them into a binary writable file-like object.
:param name: file name of questioned file
:param file: A binary file-like object with write() method to write the file contents into
:raises KeyError: If no file with this name is stored
"""
pass # pragma: no cover
@abc.abstractmethod
def __contains__(self, item: str) -> bool:
"""
Check if a file with the given name is stored in this SupplementaryFileContainer.
"""
pass # pragma: no cover
class DictSupplementaryFileContainer(AbstractSupplementaryFileContainer):
"""
SupplementaryFileContainer implementation using a dict to store the file contents in-memory.
"""
def __init__(self):
# Stores the files' contents, identified by their sha256 hash
self._store: Dict[bytes, bytes] = {}
# Maps file names to (sha256, content_type)
self._name_map: Dict[str, Tuple[bytes, str]] = {}
def add_file(self, name: str, file: IO[bytes], content_type: str) -> str:
data = file.read()
hash = hashlib.sha256(data).digest()
if hash not in self._store:
self._store[hash] = data
name_map_data = (hash, content_type)
new_name = name
i = 1
while True:
if new_name not in self._name_map:
self._name_map[new_name] = name_map_data
return new_name
elif self._name_map[new_name] == name_map_data:
return new_name
new_name = self._append_counter(name, i)
i += 1
@staticmethod
def _append_counter(name: str, i: int) -> str:
split1 = name.split('/')
split2 = split1[-1].split('.')
index = -2 if len(split2) > 1 else -1
new_basename = "{}_{:04d}".format(split2[index], i)
split2[index] = new_basename
split1[-1] = ".".join(split2)
return "/".join(split1)
def get_content_type(self, name: str) -> str:
return self._name_map[name][1]
def get_sha256(self, name: str) -> bytes:
return self._name_map[name][0]
def write_file(self, name: str, file: IO[bytes]) -> None:
file.write(self._store[self._name_map[name][0]])
def __contains__(self, item: object) -> bool:
return item in self._name_map
......@@ -637,7 +637,18 @@ def create_example_asset_administration_shell(concept_dictionary: model.ConceptD
local=False,
value='https://acplt.org/Test_Submodel',
id_type=model.KeyType.IRI),),
model.Submodel)},
model.Submodel),
model.AASReference((model.Key(type_=model.KeyElements.SUBMODEL,
local=False,
value='http://acplt.org/Submodels/Assets/TestAsset/Identification',
id_type=model.KeyType.IRI),),
model.Submodel),
model.AASReference((model.Key(type_=model.KeyElements.SUBMODEL,
local=False,
value='http://acplt.org/Submodels/Assets/TestAsset/BillOfMaterial',
id_type=model.KeyType.IRI),),
model.Submodel),
},
concept_dictionary=[concept_dictionary],
view=[],
derived_from=model.AASReference((model.Key(type_=model.KeyElements.ASSET_ADMINISTRATION_SHELL,
......
......@@ -76,8 +76,10 @@ class DictObjectStore(AbstractObjectStore[_IT], Generic[_IT]):
"""
A local in-memory object store for Identifiable Objects, backed by a dict, mapping Identifier → Identifiable
"""
def __init__(self):
def __init__(self, objects: Iterable[_IT] = ()) -> None:
self._backend: Dict[Identifier, _IT] = {}
for x in objects:
self.add(x)
def get_identifiable(self, identifier: Identifier) -> _IT:
return self._backend[identifier]
......
# Copyright 2019 PyI40AAS Contributors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
# specific language governing permissions and limitations under the License.
"""
A module with helper functions for traversing AAS object strcutures.
"""
from typing import Union, Iterator
from .. import model
def walk_submodel(collection: Union[model.Submodel, model.SubmodelElementCollection]) \
-> Iterator[model.SubmodelElement]:
"""
Traverse the SubmodelElements in a Submodel or a SubmodelElementCollection recursively in post-order tree-traversal.
This is a generator function, yielding all the SubmodelElements. No SubmodelElements should be added, removed or
moved while iterating, as this could result in undefined behaviour.
"""
elements = collection.submodel_element if isinstance(collection, model.Submodel) else collection.value
for element in elements:
if isinstance(element, model.SubmodelElementCollection):
yield from walk_submodel(element)
yield element
jsonschema>=3.2,<4.0
lxml>=4.2,<5
python-dateutil>=2.8,<3.0
pyecma376-2>=0.2
......@@ -42,5 +42,6 @@ setuptools.setup(
install_requires=[
'python-dateutil>=2.8,<3',
'lxml>=4.2,<5',
'pyecma376-2>=0.2',
]
)
File added
# Copyright 2019 PyI40AAS Contributors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
# specific language governing permissions and limitations under the License.
import datetime
import hashlib
import io
import os
import tempfile
import unittest
import pyecma376_2
from aas import model
from aas.adapter import aasx
from aas.examples.data import example_aas, _helper
class TestAASXUtils(unittest.TestCase):
def test_name_friendlyfier(self) -> None:
friendlyfier = aasx.NameFriendlyfier()
name1 = friendlyfier.get_friendly_name(model.Identifier("http://example.com/AAS-a", model.IdentifierType.IRI))
self.assertEqual("http___example_com_AAS_a", name1)
name2 = friendlyfier.get_friendly_name(model.Identifier("http://example.com/AAS+a", model.IdentifierType.IRI))
self.assertEqual("http___example_com_AAS_a_1", name2)
def test_supplementary_file_container(self) -> None:
container = aasx.DictSupplementaryFileContainer()
with open(os.path.join(os.path.dirname(__file__), 'TestFile.pdf'), 'rb') as f:
new_name = container.add_file("/TestFile.pdf", f, "application/pdf")
# Name should not be modified, since there is no conflict
self.assertEqual("/TestFile.pdf", new_name)
f.seek(0)
container.add_file("/TestFile.pdf", f, "application/pdf")
# Name should not be modified, since there is still no conflict
self.assertEqual("/TestFile.pdf", new_name)
with open(__file__, 'rb') as f:
new_name = container.add_file("/TestFile.pdf", f, "application/pdf")
# Now, we have a conflict
self.assertNotEqual("/TestFile.pdf", new_name)
self.assertIn(new_name, container)
# Check metadata
self.assertEqual("application/pdf", container.get_content_type("/TestFile.pdf"))
self.assertEqual("b18229b24a4ee92c6c2b6bc6a8018563b17472f1150d35d5a5945afeb447ed44",
container.get_sha256("/TestFile.pdf").hex())
self.assertIn("/TestFile.pdf", container)
# Check contents
file_content = io.BytesIO()
container.write_file("/TestFile.pdf", file_content)
self.assertEqual(hashlib.sha1(file_content.getvalue()).hexdigest(), "78450a66f59d74c073bf6858db340090ea72a8b1")
class AASXWriterTest(unittest.TestCase):
def test_writing_reading_example_aas(self) -> None:
# Create example data and file_store
data = example_aas.create_full_example()
files = aasx.DictSupplementaryFileContainer()
with open(os.path.join(os.path.dirname(__file__), 'TestFile.pdf'), 'rb') as f:
files.add_file("/TestFile.pdf", f, "application/pdf")
f.seek(0)
# Create OPC/AASX core properties
cp = pyecma376_2.OPCCoreProperties()
cp.created = datetime.datetime.now()
cp.creator = "PyI40AAS Testing Framework"
# Write AASX file
fd, filename = tempfile.mkstemp(suffix=".aasx")
os.close(fd)
with aasx.AASXWriter(filename) as writer:
writer.write_aas(model.Identifier(id_='https://acplt.org/Test_AssetAdministrationShell',
id_type=model.IdentifierType.IRI),
data, files)
writer.write_core_properties(cp)
# Read AASX file
new_data: model.DictObjectStore[model.Identifiable] = model.DictObjectStore()
new_files = aasx.DictSupplementaryFileContainer()
with aasx.AASXReader(filename) as reader:
reader.read_into(new_data, new_files)
new_cp = reader.get_core_properties()
# Check AAS objects
checker = _helper.AASDataChecker(raise_immediately=True)
example_aas.check_full_example(checker, new_data)
# Check core properties
self.assertEqual(new_cp.created, cp.created)
self.assertEqual(new_cp.creator, "PyI40AAS Testing Framework")
self.assertIsNone(new_cp.lastModifiedBy)
# Check files
self.assertEqual(new_files.get_content_type("/TestFile.pdf"), "application/pdf")
file_content = io.BytesIO()
new_files.write_file("/TestFile.pdf", file_content)
self.assertEqual(hashlib.sha1(file_content.getvalue()).hexdigest(), "78450a66f59d74c073bf6858db340090ea72a8b1")
os.unlink(filename)
{"assetAdministrationShells": [{"idShort": "TestAssetAdministrationShell", "description": [{"language": "en-us", "text": "An Example Asset Administration Shell for the test application"}, {"language": "de", "text": "Ein Beispiel-Verwaltungsschale f\u00fcr eine Test-Anwendung"}], "modelType": {"name": "AssetAdministrationShell"}, "identification": {"id": "https://acplt.org/Test_AssetAdministrationShell", "idType": "IRI"}, "administration": {"version": "0.9", "revision": "0"}, "derivedFrom": {"keys": [{"type": "AssetAdministrationShell", "idType": "IRI", "value": "https://acplt.org/TestAssetAdministrationShell2", "local": false}]}, "asset": {"keys": [{"type": "Asset", "idType": "IRI", "value": "https://acplt.org/Test_Asset", "local": false}]}, "submodels": [{"keys": [{"type": "Submodel", "idType": "IRI", "value": "https://acplt.org/Test_Submodel", "local": false}]}], "conceptDictionaries": [{"idShort": "TestConceptDictionary", "description": [{"language": "en-us", "text": "An example concept dictionary for the test application"}, {"language": "de", "text": "Ein Beispiel-ConceptDictionary f\u00fcr eine Test-Anwendung"}], "modelType": {"name": "ConceptDictionary"}, "conceptDescriptions": [{"keys": [{"type": "ConceptDescription", "idType": "IRI", "value": "https://acplt.org/Test_ConceptDescription", "local": false}]}]}]}, {"idShort": "", "modelType": {"name": "AssetAdministrationShell"}, "identification": {"id": "https://acplt.org/Test_AssetAdministrationShell_Mandatory", "idType": "IRI"}, "asset": {"keys": [{"type": "Asset", "idType": "IRI", "value": "https://acplt.org/Test_Asset_Mandatory", "local": false}]}, "submodels": [{"keys": [{"type": "Submodel", "idType": "IRI", "value": "https://acplt.org/Test_Submodel_Mandatory", "local": false}]}, {"keys": [{"type": "Submodel", "idType": "IRI", "value": "https://acplt.org/Test_Submodel2_Mandatory", "local": false}]}], "conceptDictionaries": [{"idShort": "TestConceptDictionary", "modelType": {"name": "ConceptDictionary"}}]}, {"idShort": "", "modelType": {"name": "AssetAdministrationShell"}, "identification": {"id": "https://acplt.org/Test_AssetAdministrationShell2_Mandatory", "idType": "IRI"}, "asset": {"keys": [{"type": "Asset", "idType": "IRI", "value": "https://acplt.org/Test_Asset_Mandatory", "local": false}]}}, {"idShort": "TestAssetAdministrationShell", "description": [{"language": "en-us", "text": "An Example Asset Administration Shell for the test application"}, {"language": "de", "text": "Ein Beispiel-Verwaltungsschale f\u00fcr eine Test-Anwendung"}], "modelType": {"name": "AssetAdministrationShell"}, "identification": {"id": "https://acplt.org/Test_AssetAdministrationShell_Missing", "idType": "IRI"}, "administration": {"version": "0.9", "revision": "0"}, "asset": {"keys": [{"type": "Asset", "idType": "IRI", "value": "https://acplt.org/Test_Asset_Missing", "local": false}]}, "submodels": [{"keys": [{"type": "Submodel", "idType": "IRI", "value": "https://acplt.org/Test_Submodel_Missing", "local": false}]}], "views": [{"idShort": "ExampleView", "modelType": {"name": "View"}, "containedElements": [{"keys": [{"type": "Submodel", "idType": "IRI", "value": "https://acplt.org/Test_Submodel_Missing", "local": false}]}]}, {"idShort": "ExampleView2", "modelType": {"name": "View"}}], "conceptDictionaries": [{"idShort": "TestConceptDictionary", "description": [{"language": "en-us", "text": "An example concept dictionary for the test application"}, {"language": "de", "text": "Ein Beispiel-ConceptDictionary f\u00fcr eine Test-Anwendung"}], "modelType": {"name": "ConceptDictionary"}, "conceptDescriptions": [{"keys": [{"type": "ConceptDescription", "idType": "IRI", "value": "https://acplt.org/Test_ConceptDescription_Missing", "local": false}]}]}]}], "submodels": [{"idShort": "Identification", "description": [{"language": "en-us", "text": "An example asset identification submodel for the test application"}, {"language": "de", "text": "Ein Beispiel-Identifikations-Submodel f\u00fcr eine Test-Anwendung"}], "modelType": {"name": "Submodel"}, "identification": {"id": "http://acplt.org/Submodels/Assets/TestAsset/Identification", "idType": "IRI"}, "administration": {"version": "0.9", "revision": "0"}, "semanticId": {"keys": [{"type": "Submodel", "idType": "IRI", "value": "http://acplt.org/SubmodelTemplates/AssetIdentification", "local": false}]}, "submodelElements": [{"idShort": "ManufacturerName", "description": [{"language": "en-us", "text": "Legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation."}, {"language": "de", "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist"}], "modelType": {"name": "Property"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "0173-1#02-AAO677#002", "local": false}]}, "qualifiers": [{"modelType": {"name": "Qualifier"}, "value": "100", "valueId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/ValueId/ExampleValueId", "local": false}]}, "valueType": "int", "type": "http://acplt.org/Qualifier/ExampleQualifier"}, {"modelType": {"name": "Qualifier"}, "value": "50", "valueId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/ValueId/ExampleValueId", "local": false}]}, "valueType": "int", "type": "http://acplt.org/Qualifier/ExampleQualifier2"}], "value": "ACPLT", "valueId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/ValueId/ExampleValueId", "local": false}]}, "valueType": "string"}, {"idShort": "InstanceId", "description": [{"language": "en-us", "text": "Legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation."}, {"language": "de", "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist"}], "modelType": {"name": "Property"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://opcfoundation.org/UA/DI/1.1/DeviceType/Serialnumber", "local": false}]}, "value": "978-8234-234-342", "valueId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/ValueId/ExampleValueId", "local": false}]}, "valueType": "string"}]}, {"idShort": "BillOfMaterial", "description": [{"language": "en-us", "text": "An example bill of material submodel for the test application"}, {"language": "de", "text": "Ein Beispiel-BillofMaterial-Submodel f\u00fcr eine Test-Anwendung"}], "modelType": {"name": "Submodel"}, "identification": {"id": "http://acplt.org/Submodels/Assets/TestAsset/BillOfMaterial", "idType": "IRI"}, "administration": {"version": "0.9"}, "semanticId": {"keys": [{"type": "Submodel", "idType": "IRI", "value": "http://acplt.org/SubmodelTemplates/BillOfMaterial", "local": false}]}, "submodelElements": [{"idShort": "ExampleEntity", "description": [{"language": "en-us", "text": "Legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation."}, {"language": "de", "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist"}], "modelType": {"name": "Entity"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://opcfoundation.org/UA/DI/1.1/DeviceType/Serialnumber", "local": false}]}, "statements": [{"idShort": "ExampleProperty2", "category": "CONSTANT", "description": [{"language": "en-us", "text": "Example Property object"}, {"language": "de", "text": "Beispiel Property Element"}], "modelType": {"name": "Property"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Properties/ExampleProperty", "local": false}]}, "value": "exampleValue2", "valueId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/ValueId/ExampleValueId", "local": false}]}, "valueType": "string"}, {"idShort": "ExampleProperty", "category": "CONSTANT", "description": [{"language": "en-us", "text": "Example Property object"}, {"language": "de", "text": "Beispiel Property Element"}], "modelType": {"name": "Property"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Properties/ExampleProperty", "local": false}]}, "value": "exampleValue", "valueId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/ValueId/ExampleValueId", "local": false}]}, "valueType": "string"}], "entityType": "CoManagedEntity"}, {"idShort": "ExampleEntity2", "description": [{"language": "en-us", "text": "Legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation."}, {"language": "de", "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist"}], "modelType": {"name": "Entity"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://opcfoundation.org/UA/DI/1.1/DeviceType/Serialnumber", "local": false}]}, "entityType": "SelfManagedEntity", "asset": {"keys": [{"type": "Asset", "idType": "IRI", "value": "https://acplt.org/Test_Asset2", "local": false}]}}]}, {"idShort": "TestSubmodel", "description": [{"language": "en-us", "text": "An example submodel for the test application"}, {"language": "de", "text": "Ein Beispiel-Teilmodell f\u00fcr eine Test-Anwendung"}], "modelType": {"name": "Submodel"}, "identification": {"id": "https://acplt.org/Test_Submodel", "idType": "IRI"}, "administration": {"version": "0.9", "revision": "0"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/SubmodelTemplates/ExampleSubmodel", "local": false}]}, "submodelElements": [{"idShort": "ExampleRelationshipElement", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example RelationshipElement object"}, {"language": "de", "text": "Beispiel RelationshipElement Element"}], "modelType": {"name": "RelationshipElement"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/RelationshipElements/ExampleRelationshipElement", "local": false}]}, "first": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}, "second": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty2", "local": true}]}}, {"idShort": "ExampleAnnotatedRelationshipElement", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example AnnotatedRelationshipElement object"}, {"language": "de", "text": "Beispiel AnnotatedRelationshipElement Element"}], "modelType": {"name": "AnnotatedRelationshipElement"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/RelationshipElements/ExampleAnnotatedRelationshipElement", "local": false}]}, "first": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}, "second": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty2", "local": true}]}, "annotation": [{"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty3", "local": true}]}]}, {"idShort": "ExampleOperation", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example Operation object"}, {"language": "de", "text": "Beispiel Operation Element"}], "modelType": {"name": "Operation"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Operations/ExampleOperation", "local": false}]}, "inputVariable": [{"value": {"idShort": "ExampleProperty", "category": "CONSTANT", "description": [{"language": "en-us", "text": "Example Property object"}, {"language": "de", "text": "Beispiel Property Element"}], "modelType": {"name": "Property"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Properties/ExampleProperty", "local": false}]}, "value": "exampleValue", "valueId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/ValueId/ExampleValueId", "local": false}]}, "valueType": "string"}}], "outputVariable": [{"value": {"idShort": "ExampleProperty", "category": "CONSTANT", "description": [{"language": "en-us", "text": "Example Property object"}, {"language": "de", "text": "Beispiel Property Element"}], "modelType": {"name": "Property"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Properties/ExampleProperty", "local": false}]}, "value": "exampleValue", "valueId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/ValueId/ExampleValueId", "local": false}]}, "valueType": "string"}}], "inoutputVariable": [{"value": {"idShort": "ExampleProperty", "category": "CONSTANT", "description": [{"language": "en-us", "text": "Example Property object"}, {"language": "de", "text": "Beispiel Property Element"}], "modelType": {"name": "Property"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Properties/ExampleProperty", "local": false}]}, "value": "exampleValue", "valueId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/ValueId/ExampleValueId", "local": false}]}, "valueType": "string"}}]}, {"idShort": "ExampleCapability", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example Capability object"}, {"language": "de", "text": "Beispiel Capability Element"}], "modelType": {"name": "Capability"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Capabilities/ExampleCapability", "local": false}]}}, {"idShort": "ExampleBasicEvent", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example BasicEvent object"}, {"language": "de", "text": "Beispiel BasicEvent Element"}], "modelType": {"name": "BasicEvent"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Events/ExampleBasicEvent", "local": false}]}, "observed": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}}, {"idShort": "ExampleSubmodelCollectionOrdered", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example SubmodelElementCollectionOrdered object"}, {"language": "de", "text": "Beispiel SubmodelElementCollectionOrdered Element"}], "modelType": {"name": "SubmodelElementCollection"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/SubmodelElementCollections/ExampleSubmodelElementCollectionOrdered", "local": false}]}, "value": [{"idShort": "ExampleProperty", "category": "CONSTANT", "description": [{"language": "en-us", "text": "Example Property object"}, {"language": "de", "text": "Beispiel Property Element"}], "modelType": {"name": "Property"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Properties/ExampleProperty", "local": false}]}, "value": "exampleValue", "valueId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/ValueId/ExampleValueId", "local": false}]}, "valueType": "string"}, {"idShort": "ExampleMultiLanguageProperty", "category": "CONSTANT", "description": [{"language": "en-us", "text": "Example MultiLanguageProperty object"}, {"language": "de", "text": "Beispiel MulitLanguageProperty Element"}], "modelType": {"name": "MultiLanguageProperty"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/MultiLanguageProperties/ExampleMultiLanguageProperty", "local": false}]}, "value": [{"language": "en-us", "text": "Example value of a MultiLanguageProperty element"}, {"language": "de", "text": "Beispielswert f\u00fcr ein MulitLanguageProperty-Element"}], "valueId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/ValueId/ExampleMultiLanguageValueId", "local": false}]}}, {"idShort": "ExampleRange", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example Range object"}, {"language": "de", "text": "Beispiel Range Element"}], "modelType": {"name": "Range"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Ranges/ExampleRange", "local": false}]}, "valueType": "int", "min": "0", "max": "100"}], "ordered": true}, {"idShort": "ExampleSubmodelCollectionUnordered", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example SubmodelElementCollectionUnordered object"}, {"language": "de", "text": "Beispiel SubmodelElementCollectionUnordered Element"}], "modelType": {"name": "SubmodelElementCollection"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/SubmodelElementCollections/ExampleSubmodelElementCollectionUnordered", "local": false}]}, "value": [{"idShort": "ExampleBlob", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example Blob object"}, {"language": "de", "text": "Beispiel Blob Element"}], "modelType": {"name": "Blob"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Blobs/ExampleBlob", "local": false}]}, "mimeType": "application/pdf", "value": "AQIDBAU="}, {"idShort": "ExampleFile", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example File object"}, {"language": "de", "text": "Beispiel File Element"}], "modelType": {"name": "File"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Files/ExampleFile", "local": false}]}, "value": "/TestFile.pdf", "mimeType": "application/pdf"}, {"idShort": "ExampleReferenceElement", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example Reference Element object"}, {"language": "de", "text": "Beispiel Reference Element Element"}], "modelType": {"name": "ReferenceElement"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/ReferenceElements/ExampleReferenceElement", "local": false}]}, "value": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}}], "ordered": false}]}, {"idShort": "", "modelType": {"name": "Submodel"}, "identification": {"id": "https://acplt.org/Test_Submodel_Mandatory", "idType": "IRI"}, "submodelElements": [{"idShort": "ExampleRelationshipElement", "modelType": {"name": "RelationshipElement"}, "first": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}, "second": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}}, {"idShort": "ExampleAnnotatedRelationshipElement", "modelType": {"name": "AnnotatedRelationshipElement"}, "first": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}, "second": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}}, {"idShort": "ExampleOperation", "modelType": {"name": "Operation"}}, {"idShort": "ExampleCapability", "modelType": {"name": "Capability"}}, {"idShort": "ExampleBasicEvent", "modelType": {"name": "BasicEvent"}, "observed": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}}, {"idShort": "ExampleSubmodelCollectionOrdered", "modelType": {"name": "SubmodelElementCollection"}, "value": [{"idShort": "ExampleProperty", "modelType": {"name": "Property"}, "value": null, "valueType": "string"}, {"idShort": "ExampleMultiLanguageProperty", "modelType": {"name": "MultiLanguageProperty"}}, {"idShort": "ExampleRange", "modelType": {"name": "Range"}, "valueType": "int", "min": null, "max": null}], "ordered": true}, {"idShort": "ExampleSubmodelCollectionUnordered", "modelType": {"name": "SubmodelElementCollection"}, "value": [{"idShort": "ExampleBlob", "modelType": {"name": "Blob"}, "mimeType": "application/pdf"}, {"idShort": "ExampleFile", "modelType": {"name": "File"}, "value": null, "mimeType": "application/pdf"}, {"idShort": "ExampleReferenceElement", "modelType": {"name": "ReferenceElement"}}], "ordered": false}, {"idShort": "ExampleSubmodelCollectionUnordered2", "modelType": {"name": "SubmodelElementCollection"}, "ordered": false}]}, {"idShort": "", "modelType": {"name": "Submodel"}, "identification": {"id": "https://acplt.org/Test_Submodel2_Mandatory", "idType": "IRI"}}, {"idShort": "TestSubmodel", "description": [{"language": "en-us", "text": "An example submodel for the test application"}, {"language": "de", "text": "Ein Beispiel-Teilmodell f\u00fcr eine Test-Anwendung"}], "modelType": {"name": "Submodel"}, "identification": {"id": "https://acplt.org/Test_Submodel_Missing", "idType": "IRI"}, "administration": {"version": "0.9", "revision": "0"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/SubmodelTemplates/ExampleSubmodel", "local": false}]}, "submodelElements": [{"idShort": "ExampleRelationshipElement", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example RelationshipElement object"}, {"language": "de", "text": "Beispiel RelationshipElement Element"}], "modelType": {"name": "RelationshipElement"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/RelationshipElements/ExampleRelationshipElement", "local": false}]}, "first": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}, "second": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}}, {"idShort": "ExampleAnnotatedRelationshipElement", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example AnnotatedRelationshipElement object"}, {"language": "de", "text": "Beispiel AnnotatedRelationshipElement Element"}], "modelType": {"name": "AnnotatedRelationshipElement"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/RelationshipElements/ExampleAnnotatedRelationshipElement", "local": false}]}, "first": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}, "second": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}, "annotation": [{"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}]}, {"idShort": "ExampleOperation", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example Operation object"}, {"language": "de", "text": "Beispiel Operation Element"}], "modelType": {"name": "Operation"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Operations/ExampleOperation", "local": false}]}, "inputVariable": [{"value": {"idShort": "ExampleProperty", "category": "CONSTANT", "description": [{"language": "en-us", "text": "Example Property object"}, {"language": "de", "text": "Beispiel Property Element"}], "modelType": {"name": "Property"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Properties/ExampleProperty", "local": false}]}, "qualifiers": [{"modelType": {"name": "Qualifier"}, "valueType": "string", "type": "http://acplt.org/Qualifier/ExampleQualifier"}], "value": "exampleValue", "valueType": "string"}}], "outputVariable": [{"value": {"idShort": "ExampleProperty", "category": "CONSTANT", "description": [{"language": "en-us", "text": "Example Property object"}, {"language": "de", "text": "Beispiel Property Element"}], "modelType": {"name": "Property"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Properties/ExampleProperty", "local": false}]}, "qualifiers": [{"modelType": {"name": "Qualifier"}, "valueType": "string", "type": "http://acplt.org/Qualifier/ExampleQualifier"}], "value": "exampleValue", "valueType": "string"}}], "inoutputVariable": [{"value": {"idShort": "ExampleProperty", "category": "CONSTANT", "description": [{"language": "en-us", "text": "Example Property object"}, {"language": "de", "text": "Beispiel Property Element"}], "modelType": {"name": "Property"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Properties/ExampleProperty", "local": false}]}, "qualifiers": [{"modelType": {"name": "Qualifier"}, "valueType": "string", "type": "http://acplt.org/Qualifier/ExampleQualifier"}], "value": "exampleValue", "valueType": "string"}}]}, {"idShort": "ExampleCapability", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example Capability object"}, {"language": "de", "text": "Beispiel Capability Element"}], "modelType": {"name": "Capability"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Capabilities/ExampleCapability", "local": false}]}}, {"idShort": "ExampleBasicEvent", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example BasicEvent object"}, {"language": "de", "text": "Beispiel BasicEvent Element"}], "modelType": {"name": "BasicEvent"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Events/ExampleBasicEvent", "local": false}]}, "observed": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}}, {"idShort": "ExampleSubmodelCollectionOrdered", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example SubmodelElementCollectionOrdered object"}, {"language": "de", "text": "Beispiel SubmodelElementCollectionOrdered Element"}], "modelType": {"name": "SubmodelElementCollection"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/SubmodelElementCollections/ExampleSubmodelElementCollectionOrdered", "local": false}]}, "value": [{"idShort": "ExampleProperty", "category": "CONSTANT", "description": [{"language": "en-us", "text": "Example Property object"}, {"language": "de", "text": "Beispiel Property Element"}], "modelType": {"name": "Property"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Properties/ExampleProperty", "local": false}]}, "qualifiers": [{"modelType": {"name": "Qualifier"}, "valueType": "string", "type": "http://acplt.org/Qualifier/ExampleQualifier"}], "value": "exampleValue", "valueType": "string"}, {"idShort": "ExampleMultiLanguageProperty", "category": "CONSTANT", "description": [{"language": "en-us", "text": "Example MultiLanguageProperty object"}, {"language": "de", "text": "Beispiel MulitLanguageProperty Element"}], "modelType": {"name": "MultiLanguageProperty"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/MultiLanguageProperties/ExampleMultiLanguageProperty", "local": false}]}, "value": [{"language": "en-us", "text": "Example value of a MultiLanguageProperty element"}, {"language": "de", "text": "Beispielswert f\u00fcr ein MulitLanguageProperty-Element"}]}, {"idShort": "ExampleRange", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example Range object"}, {"language": "de", "text": "Beispiel Range Element"}], "modelType": {"name": "Range"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Ranges/ExampleRange", "local": false}]}, "valueType": "int", "min": "0", "max": "100"}], "ordered": true}, {"idShort": "ExampleSubmodelCollectionUnordered", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example SubmodelElementCollectionUnordered object"}, {"language": "de", "text": "Beispiel SubmodelElementCollectionUnordered Element"}], "modelType": {"name": "SubmodelElementCollection"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/SubmodelElementCollections/ExampleSubmodelElementCollectionUnordered", "local": false}]}, "value": [{"idShort": "ExampleBlob", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example Blob object"}, {"language": "de", "text": "Beispiel Blob Element"}], "modelType": {"name": "Blob"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Blobs/ExampleBlob", "local": false}]}, "mimeType": "application/pdf", "value": "AQIDBAU="}, {"idShort": "ExampleFile", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example File object"}, {"language": "de", "text": "Beispiel File Element"}], "modelType": {"name": "File"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Files/ExampleFile", "local": false}]}, "value": "/TestFile.pdf", "mimeType": "application/pdf"}, {"idShort": "ExampleReferenceElement", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example Reference Element object"}, {"language": "de", "text": "Beispiel Reference Element Element"}], "modelType": {"name": "ReferenceElement"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/ReferenceElements/ExampleReferenceElement", "local": false}]}, "value": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}}], "ordered": false}]}, {"idShort": "TestSubmodel", "description": [{"language": "en-us", "text": "An example submodel for the test application"}, {"language": "de", "text": "Ein Beispiel-Teilmodell f\u00fcr eine Test-Anwendung"}], "modelType": {"name": "Submodel"}, "identification": {"id": "https://acplt.org/Test_Submodel_Template", "idType": "IRI"}, "administration": {"version": "0.9", "revision": "0"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/SubmodelTemplates/ExampleSubmodel", "local": false}]}, "kind": "Template", "submodelElements": [{"idShort": "ExampleRelationshipElement", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example RelationshipElement object"}, {"language": "de", "text": "Beispiel RelationshipElement Element"}], "modelType": {"name": "RelationshipElement"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/RelationshipElements/ExampleRelationshipElement", "local": false}]}, "kind": "Template", "first": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}, "second": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}}, {"idShort": "ExampleAnnotatedRelationshipElement", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example AnnotatedRelationshipElement object"}, {"language": "de", "text": "Beispiel AnnotatedRelationshipElement Element"}], "modelType": {"name": "AnnotatedRelationshipElement"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/RelationshipElements/ExampleAnnotatedRelationshipElement", "local": false}]}, "kind": "Template", "first": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}, "second": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}}, {"idShort": "ExampleOperation", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example Operation object"}, {"language": "de", "text": "Beispiel Operation Element"}], "modelType": {"name": "Operation"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Operations/ExampleOperation", "local": false}]}, "kind": "Template", "inputVariable": [{"value": {"idShort": "ExampleProperty", "category": "CONSTANT", "description": [{"language": "en-us", "text": "Example Property object"}, {"language": "de", "text": "Beispiel Property Element"}], "modelType": {"name": "Property"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Properties/ExampleProperty", "local": false}]}, "kind": "Template", "value": null, "valueType": "string"}}], "outputVariable": [{"value": {"idShort": "ExampleProperty", "category": "CONSTANT", "description": [{"language": "en-us", "text": "Example Property object"}, {"language": "de", "text": "Beispiel Property Element"}], "modelType": {"name": "Property"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Properties/ExampleProperty", "local": false}]}, "kind": "Template", "value": null, "valueType": "string"}}], "inoutputVariable": [{"value": {"idShort": "ExampleProperty", "category": "CONSTANT", "description": [{"language": "en-us", "text": "Example Property object"}, {"language": "de", "text": "Beispiel Property Element"}], "modelType": {"name": "Property"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Properties/ExampleProperty", "local": false}]}, "kind": "Template", "value": null, "valueType": "string"}}]}, {"idShort": "ExampleCapability", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example Capability object"}, {"language": "de", "text": "Beispiel Capability Element"}], "modelType": {"name": "Capability"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Capabilities/ExampleCapability", "local": false}]}, "kind": "Template"}, {"idShort": "ExampleBasicEvent", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example BasicEvent object"}, {"language": "de", "text": "Beispiel BasicEvent Element"}], "modelType": {"name": "BasicEvent"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Events/ExampleBasicEvent", "local": false}]}, "kind": "Template", "observed": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}}, {"idShort": "ExampleSubmodelCollectionOrdered", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example SubmodelElementCollectionOrdered object"}, {"language": "de", "text": "Beispiel SubmodelElementCollectionOrdered Element"}], "modelType": {"name": "SubmodelElementCollection"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/SubmodelElementCollections/ExampleSubmodelElementCollectionOrdered", "local": false}]}, "kind": "Template", "value": [{"idShort": "ExampleProperty", "category": "CONSTANT", "description": [{"language": "en-us", "text": "Example Property object"}, {"language": "de", "text": "Beispiel Property Element"}], "modelType": {"name": "Property"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Properties/ExampleProperty", "local": false}]}, "kind": "Template", "value": null, "valueType": "string"}, {"idShort": "ExampleMultiLanguageProperty", "category": "CONSTANT", "description": [{"language": "en-us", "text": "Example MultiLanguageProperty object"}, {"language": "de", "text": "Beispiel MulitLanguageProperty Element"}], "modelType": {"name": "MultiLanguageProperty"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/MultiLanguageProperties/ExampleMultiLanguageProperty", "local": false}]}, "kind": "Template"}, {"idShort": "ExampleRange", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example Range object"}, {"language": "de", "text": "Beispiel Range Element"}], "modelType": {"name": "Range"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Ranges/ExampleRange", "local": false}]}, "kind": "Template", "valueType": "int", "min": null, "max": "100"}, {"idShort": "ExampleRange2", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example Range object"}, {"language": "de", "text": "Beispiel Range Element"}], "modelType": {"name": "Range"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Ranges/ExampleRange", "local": false}]}, "kind": "Template", "valueType": "int", "min": "0", "max": null}], "ordered": true}, {"idShort": "ExampleSubmodelCollectionUnordered", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example SubmodelElementCollectionUnordered object"}, {"language": "de", "text": "Beispiel SubmodelElementCollectionUnordered Element"}], "modelType": {"name": "SubmodelElementCollection"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/SubmodelElementCollections/ExampleSubmodelElementCollectionUnordered", "local": false}]}, "kind": "Template", "value": [{"idShort": "ExampleBlob", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example Blob object"}, {"language": "de", "text": "Beispiel Blob Element"}], "modelType": {"name": "Blob"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Blobs/ExampleBlob", "local": false}]}, "kind": "Template", "mimeType": "application/pdf"}, {"idShort": "ExampleFile", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example File object"}, {"language": "de", "text": "Beispiel File Element"}], "modelType": {"name": "File"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Files/ExampleFile", "local": false}]}, "kind": "Template", "value": null, "mimeType": "application/pdf"}, {"idShort": "ExampleReferenceElement", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example Reference Element object"}, {"language": "de", "text": "Beispiel Reference Element Element"}], "modelType": {"name": "ReferenceElement"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/ReferenceElements/ExampleReferenceElement", "local": false}]}, "kind": "Template"}], "ordered": false}, {"idShort": "ExampleSubmodelCollectionUnordered2", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example SubmodelElementCollectionUnordered object"}, {"language": "de", "text": "Beispiel SubmodelElementCollectionUnordered Element"}], "modelType": {"name": "SubmodelElementCollection"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/SubmodelElementCollections/ExampleSubmodelElementCollectionUnordered", "local": false}]}, "kind": "Template", "ordered": false}]}], "assets": [{"idShort": "Test_Asset", "description": [{"language": "en-us", "text": "An example asset for the test application"}, {"language": "de", "text": "Ein Beispiel-Asset f\u00fcr eine Test-Anwendung"}], "modelType": {"name": "Asset"}, "identification": {"id": "https://acplt.org/Test_Asset", "idType": "IRI"}, "administration": {"version": "0.9", "revision": "0"}, "kind": "Instance", "assetIdentificationModel": {"keys": [{"type": "Submodel", "idType": "IRI", "value": "http://acplt.org/Submodels/Assets/TestAsset/Identification", "local": false}]}, "billOfMaterial": {"keys": [{"type": "Submodel", "idType": "IRI", "value": "http://acplt.org/Submodels/Assets/TestAsset/BillOfMaterial", "local": false}]}}, {"idShort": "", "modelType": {"name": "Asset"}, "identification": {"id": "https://acplt.org/Test_Asset_Mandatory", "idType": "IRI"}, "kind": "Instance"}, {"idShort": "Test_Asset", "description": [{"language": "en-us", "text": "An example asset for the test application"}, {"language": "de", "text": "Ein Beispiel-Asset f\u00fcr eine Test-Anwendung"}], "modelType": {"name": "Asset"}, "identification": {"id": "https://acplt.org/Test_Asset_Missing", "idType": "IRI"}, "administration": {}, "kind": "Instance"}], "conceptDescriptions": [{"idShort": "TestConceptDescription", "description": [{"language": "en-us", "text": "An example concept description for the test application"}, {"language": "de", "text": "Ein Beispiel-ConceptDescription f\u00fcr eine Test-Anwendung"}], "modelType": {"name": "ConceptDescription"}, "identification": {"id": "https://acplt.org/Test_ConceptDescription", "idType": "IRI"}, "administration": {"version": "0.9", "revision": "0"}, "isCaseOf": [{"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/DataSpecifications/ConceptDescriptions/TestConceptDescription", "local": false}]}]}, {"idShort": "", "modelType": {"name": "ConceptDescription"}, "identification": {"id": "https://acplt.org/Test_ConceptDescription_Mandatory", "idType": "IRI"}}, {"idShort": "TestConceptDescription", "description": [{"language": "en-us", "text": "An example concept description for the test application"}, {"language": "de", "text": "Ein Beispiel-ConceptDescription f\u00fcr eine Test-Anwendung"}], "modelType": {"name": "ConceptDescription"}, "identification": {"id": "https://acplt.org/Test_ConceptDescription_Missing", "idType": "IRI"}, "administration": {"version": "0.9", "revision": "0"}}, {"idShort": "TestSpec_01", "modelType": {"name": "ConceptDescription"}, "identification": {"id": "http://acplt.org/DataSpecifciations/Example/Identification", "idType": "IRI"}, "administration": {"version": "0.9", "revision": "0"}, "isCaseOf": [{"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/ReferenceElements/ConceptDescriptionX", "local": false}]}], "embeddedDataSpecifications": [{"dataSpecification": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/2/0", "local": false}]}, "dataSpecificationContent": {"preferredName": [{"language": "de", "text": "Test Specification"}, {"language": "en-us", "text": "TestSpecification"}], "dataType": "REAL_MEASURE", "definition": [{"language": "de", "text": "Dies ist eine Data Specification f\u00fcr Testzwecke"}, {"language": "en-us", "text": "This is a DataSpecification for testing purposes"}], "shortName": [{"language": "de", "text": "Test Spec"}, {"language": "en-us", "text": "TestSpec"}], "unit": "SpaceUnit", "unitId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Units/SpaceUnit", "local": false}]}, "sourceOfDefinition": "http://acplt.org/DataSpec/ExampleDef", "symbol": "SU", "valueFormat": "string", "valueList": {"valueReferencePairTypes": [{"value": "exampleValue", "valueId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/ValueId/ExampleValueId", "local": false}]}, "valueType": "string"}, {"value": "exampleValue2", "valueId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/ValueId/ExampleValueId2", "local": false}]}, "valueType": "string"}]}, "value": "TEST", "levelType": ["Min", "Max"]}}]}]}
\ No newline at end of file
{"assetAdministrationShells": [{"idShort": "TestAssetAdministrationShell", "description": [{"language": "en-us", "text": "An Example Asset Administration Shell for the test application"}, {"language": "de", "text": "Ein Beispiel-Verwaltungsschale f\u00fcr eine Test-Anwendung"}], "modelType": {"name": "AssetAdministrationShell"}, "identification": {"id": "https://acplt.org/Test_AssetAdministrationShell", "idType": "IRI"}, "administration": {"version": "0.9", "revision": "0"}, "derivedFrom": {"keys": [{"type": "AssetAdministrationShell", "idType": "IRI", "value": "https://acplt.org/TestAssetAdministrationShell2", "local": false}]}, "asset": {"keys": [{"type": "Asset", "idType": "IRI", "value": "https://acplt.org/Test_Asset", "local": false}]}, "submodels": [{"keys": [{"type": "Submodel", "idType": "IRI", "value": "https://acplt.org/Test_Submodel", "local": false}]}, {"keys": [{"type": "Submodel", "idType": "IRI", "value": "http://acplt.org/Submodels/Assets/TestAsset/BillOfMaterial", "local": false}]}, {"keys": [{"type": "Submodel", "idType": "IRI", "value": "http://acplt.org/Submodels/Assets/TestAsset/Identification", "local": false}]}], "conceptDictionaries": [{"idShort": "TestConceptDictionary", "description": [{"language": "en-us", "text": "An example concept dictionary for the test application"}, {"language": "de", "text": "Ein Beispiel-ConceptDictionary f\u00fcr eine Test-Anwendung"}], "modelType": {"name": "ConceptDictionary"}, "conceptDescriptions": [{"keys": [{"type": "ConceptDescription", "idType": "IRI", "value": "https://acplt.org/Test_ConceptDescription", "local": false}]}]}]}, {"idShort": "", "modelType": {"name": "AssetAdministrationShell"}, "identification": {"id": "https://acplt.org/Test_AssetAdministrationShell_Mandatory", "idType": "IRI"}, "asset": {"keys": [{"type": "Asset", "idType": "IRI", "value": "https://acplt.org/Test_Asset_Mandatory", "local": false}]}, "submodels": [{"keys": [{"type": "Submodel", "idType": "IRI", "value": "https://acplt.org/Test_Submodel_Mandatory", "local": false}]}, {"keys": [{"type": "Submodel", "idType": "IRI", "value": "https://acplt.org/Test_Submodel2_Mandatory", "local": false}]}], "conceptDictionaries": [{"idShort": "TestConceptDictionary", "modelType": {"name": "ConceptDictionary"}}]}, {"idShort": "", "modelType": {"name": "AssetAdministrationShell"}, "identification": {"id": "https://acplt.org/Test_AssetAdministrationShell2_Mandatory", "idType": "IRI"}, "asset": {"keys": [{"type": "Asset", "idType": "IRI", "value": "https://acplt.org/Test_Asset_Mandatory", "local": false}]}}, {"idShort": "TestAssetAdministrationShell", "description": [{"language": "en-us", "text": "An Example Asset Administration Shell for the test application"}, {"language": "de", "text": "Ein Beispiel-Verwaltungsschale f\u00fcr eine Test-Anwendung"}], "modelType": {"name": "AssetAdministrationShell"}, "identification": {"id": "https://acplt.org/Test_AssetAdministrationShell_Missing", "idType": "IRI"}, "administration": {"version": "0.9", "revision": "0"}, "asset": {"keys": [{"type": "Asset", "idType": "IRI", "value": "https://acplt.org/Test_Asset_Missing", "local": false}]}, "submodels": [{"keys": [{"type": "Submodel", "idType": "IRI", "value": "https://acplt.org/Test_Submodel_Missing", "local": false}]}], "views": [{"idShort": "ExampleView", "modelType": {"name": "View"}, "containedElements": [{"keys": [{"type": "Submodel", "idType": "IRI", "value": "https://acplt.org/Test_Submodel_Missing", "local": false}]}]}, {"idShort": "ExampleView2", "modelType": {"name": "View"}}], "conceptDictionaries": [{"idShort": "TestConceptDictionary", "description": [{"language": "en-us", "text": "An example concept dictionary for the test application"}, {"language": "de", "text": "Ein Beispiel-ConceptDictionary f\u00fcr eine Test-Anwendung"}], "modelType": {"name": "ConceptDictionary"}, "conceptDescriptions": [{"keys": [{"type": "ConceptDescription", "idType": "IRI", "value": "https://acplt.org/Test_ConceptDescription_Missing", "local": false}]}]}]}], "submodels": [{"idShort": "Identification", "description": [{"language": "en-us", "text": "An example asset identification submodel for the test application"}, {"language": "de", "text": "Ein Beispiel-Identifikations-Submodel f\u00fcr eine Test-Anwendung"}], "modelType": {"name": "Submodel"}, "identification": {"id": "http://acplt.org/Submodels/Assets/TestAsset/Identification", "idType": "IRI"}, "administration": {"version": "0.9", "revision": "0"}, "semanticId": {"keys": [{"type": "Submodel", "idType": "IRI", "value": "http://acplt.org/SubmodelTemplates/AssetIdentification", "local": false}]}, "submodelElements": [{"idShort": "ManufacturerName", "description": [{"language": "en-us", "text": "Legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation."}, {"language": "de", "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist"}], "modelType": {"name": "Property"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "0173-1#02-AAO677#002", "local": false}]}, "qualifiers": [{"modelType": {"name": "Qualifier"}, "value": "100", "valueId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/ValueId/ExampleValueId", "local": false}]}, "valueType": "int", "type": "http://acplt.org/Qualifier/ExampleQualifier"}, {"modelType": {"name": "Qualifier"}, "value": "50", "valueId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/ValueId/ExampleValueId", "local": false}]}, "valueType": "int", "type": "http://acplt.org/Qualifier/ExampleQualifier2"}], "value": "ACPLT", "valueId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/ValueId/ExampleValueId", "local": false}]}, "valueType": "string"}, {"idShort": "InstanceId", "description": [{"language": "en-us", "text": "Legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation."}, {"language": "de", "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist"}], "modelType": {"name": "Property"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://opcfoundation.org/UA/DI/1.1/DeviceType/Serialnumber", "local": false}]}, "value": "978-8234-234-342", "valueId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/ValueId/ExampleValueId", "local": false}]}, "valueType": "string"}]}, {"idShort": "BillOfMaterial", "description": [{"language": "en-us", "text": "An example bill of material submodel for the test application"}, {"language": "de", "text": "Ein Beispiel-BillofMaterial-Submodel f\u00fcr eine Test-Anwendung"}], "modelType": {"name": "Submodel"}, "identification": {"id": "http://acplt.org/Submodels/Assets/TestAsset/BillOfMaterial", "idType": "IRI"}, "administration": {"version": "0.9"}, "semanticId": {"keys": [{"type": "Submodel", "idType": "IRI", "value": "http://acplt.org/SubmodelTemplates/BillOfMaterial", "local": false}]}, "submodelElements": [{"idShort": "ExampleEntity", "description": [{"language": "en-us", "text": "Legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation."}, {"language": "de", "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist"}], "modelType": {"name": "Entity"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://opcfoundation.org/UA/DI/1.1/DeviceType/Serialnumber", "local": false}]}, "statements": [{"idShort": "ExampleProperty2", "category": "CONSTANT", "description": [{"language": "en-us", "text": "Example Property object"}, {"language": "de", "text": "Beispiel Property Element"}], "modelType": {"name": "Property"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Properties/ExampleProperty", "local": false}]}, "value": "exampleValue2", "valueId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/ValueId/ExampleValueId", "local": false}]}, "valueType": "string"}, {"idShort": "ExampleProperty", "category": "CONSTANT", "description": [{"language": "en-us", "text": "Example Property object"}, {"language": "de", "text": "Beispiel Property Element"}], "modelType": {"name": "Property"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Properties/ExampleProperty", "local": false}]}, "value": "exampleValue", "valueId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/ValueId/ExampleValueId", "local": false}]}, "valueType": "string"}], "entityType": "CoManagedEntity"}, {"idShort": "ExampleEntity2", "description": [{"language": "en-us", "text": "Legally valid designation of the natural or judicial person which is directly responsible for the design, production, packaging and labeling of a product in respect to its being brought into circulation."}, {"language": "de", "text": "Bezeichnung f\u00fcr eine nat\u00fcrliche oder juristische Person, die f\u00fcr die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist"}], "modelType": {"name": "Entity"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://opcfoundation.org/UA/DI/1.1/DeviceType/Serialnumber", "local": false}]}, "entityType": "SelfManagedEntity", "asset": {"keys": [{"type": "Asset", "idType": "IRI", "value": "https://acplt.org/Test_Asset2", "local": false}]}}]}, {"idShort": "TestSubmodel", "description": [{"language": "en-us", "text": "An example submodel for the test application"}, {"language": "de", "text": "Ein Beispiel-Teilmodell f\u00fcr eine Test-Anwendung"}], "modelType": {"name": "Submodel"}, "identification": {"id": "https://acplt.org/Test_Submodel", "idType": "IRI"}, "administration": {"version": "0.9", "revision": "0"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/SubmodelTemplates/ExampleSubmodel", "local": false}]}, "submodelElements": [{"idShort": "ExampleRelationshipElement", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example RelationshipElement object"}, {"language": "de", "text": "Beispiel RelationshipElement Element"}], "modelType": {"name": "RelationshipElement"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/RelationshipElements/ExampleRelationshipElement", "local": false}]}, "first": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}, "second": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty2", "local": true}]}}, {"idShort": "ExampleAnnotatedRelationshipElement", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example AnnotatedRelationshipElement object"}, {"language": "de", "text": "Beispiel AnnotatedRelationshipElement Element"}], "modelType": {"name": "AnnotatedRelationshipElement"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/RelationshipElements/ExampleAnnotatedRelationshipElement", "local": false}]}, "first": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}, "second": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty2", "local": true}]}, "annotation": [{"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty3", "local": true}]}]}, {"idShort": "ExampleOperation", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example Operation object"}, {"language": "de", "text": "Beispiel Operation Element"}], "modelType": {"name": "Operation"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Operations/ExampleOperation", "local": false}]}, "inputVariable": [{"value": {"idShort": "ExampleProperty", "category": "CONSTANT", "description": [{"language": "en-us", "text": "Example Property object"}, {"language": "de", "text": "Beispiel Property Element"}], "modelType": {"name": "Property"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Properties/ExampleProperty", "local": false}]}, "value": "exampleValue", "valueId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/ValueId/ExampleValueId", "local": false}]}, "valueType": "string"}}], "outputVariable": [{"value": {"idShort": "ExampleProperty", "category": "CONSTANT", "description": [{"language": "en-us", "text": "Example Property object"}, {"language": "de", "text": "Beispiel Property Element"}], "modelType": {"name": "Property"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Properties/ExampleProperty", "local": false}]}, "value": "exampleValue", "valueId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/ValueId/ExampleValueId", "local": false}]}, "valueType": "string"}}], "inoutputVariable": [{"value": {"idShort": "ExampleProperty", "category": "CONSTANT", "description": [{"language": "en-us", "text": "Example Property object"}, {"language": "de", "text": "Beispiel Property Element"}], "modelType": {"name": "Property"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Properties/ExampleProperty", "local": false}]}, "value": "exampleValue", "valueId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/ValueId/ExampleValueId", "local": false}]}, "valueType": "string"}}]}, {"idShort": "ExampleCapability", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example Capability object"}, {"language": "de", "text": "Beispiel Capability Element"}], "modelType": {"name": "Capability"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Capabilities/ExampleCapability", "local": false}]}}, {"idShort": "ExampleBasicEvent", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example BasicEvent object"}, {"language": "de", "text": "Beispiel BasicEvent Element"}], "modelType": {"name": "BasicEvent"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Events/ExampleBasicEvent", "local": false}]}, "observed": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}}, {"idShort": "ExampleSubmodelCollectionOrdered", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example SubmodelElementCollectionOrdered object"}, {"language": "de", "text": "Beispiel SubmodelElementCollectionOrdered Element"}], "modelType": {"name": "SubmodelElementCollection"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/SubmodelElementCollections/ExampleSubmodelElementCollectionOrdered", "local": false}]}, "value": [{"idShort": "ExampleProperty", "category": "CONSTANT", "description": [{"language": "en-us", "text": "Example Property object"}, {"language": "de", "text": "Beispiel Property Element"}], "modelType": {"name": "Property"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Properties/ExampleProperty", "local": false}]}, "value": "exampleValue", "valueId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/ValueId/ExampleValueId", "local": false}]}, "valueType": "string"}, {"idShort": "ExampleMultiLanguageProperty", "category": "CONSTANT", "description": [{"language": "en-us", "text": "Example MultiLanguageProperty object"}, {"language": "de", "text": "Beispiel MulitLanguageProperty Element"}], "modelType": {"name": "MultiLanguageProperty"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/MultiLanguageProperties/ExampleMultiLanguageProperty", "local": false}]}, "value": [{"language": "en-us", "text": "Example value of a MultiLanguageProperty element"}, {"language": "de", "text": "Beispielswert f\u00fcr ein MulitLanguageProperty-Element"}], "valueId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/ValueId/ExampleMultiLanguageValueId", "local": false}]}}, {"idShort": "ExampleRange", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example Range object"}, {"language": "de", "text": "Beispiel Range Element"}], "modelType": {"name": "Range"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Ranges/ExampleRange", "local": false}]}, "valueType": "int", "min": "0", "max": "100"}], "ordered": true}, {"idShort": "ExampleSubmodelCollectionUnordered", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example SubmodelElementCollectionUnordered object"}, {"language": "de", "text": "Beispiel SubmodelElementCollectionUnordered Element"}], "modelType": {"name": "SubmodelElementCollection"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/SubmodelElementCollections/ExampleSubmodelElementCollectionUnordered", "local": false}]}, "value": [{"idShort": "ExampleBlob", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example Blob object"}, {"language": "de", "text": "Beispiel Blob Element"}], "modelType": {"name": "Blob"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Blobs/ExampleBlob", "local": false}]}, "mimeType": "application/pdf", "value": "AQIDBAU="}, {"idShort": "ExampleFile", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example File object"}, {"language": "de", "text": "Beispiel File Element"}], "modelType": {"name": "File"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Files/ExampleFile", "local": false}]}, "value": "/TestFile.pdf", "mimeType": "application/pdf"}, {"idShort": "ExampleReferenceElement", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example Reference Element object"}, {"language": "de", "text": "Beispiel Reference Element Element"}], "modelType": {"name": "ReferenceElement"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/ReferenceElements/ExampleReferenceElement", "local": false}]}, "value": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}}], "ordered": false}]}, {"idShort": "", "modelType": {"name": "Submodel"}, "identification": {"id": "https://acplt.org/Test_Submodel_Mandatory", "idType": "IRI"}, "submodelElements": [{"idShort": "ExampleRelationshipElement", "modelType": {"name": "RelationshipElement"}, "first": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}, "second": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}}, {"idShort": "ExampleAnnotatedRelationshipElement", "modelType": {"name": "AnnotatedRelationshipElement"}, "first": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}, "second": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}}, {"idShort": "ExampleOperation", "modelType": {"name": "Operation"}}, {"idShort": "ExampleCapability", "modelType": {"name": "Capability"}}, {"idShort": "ExampleBasicEvent", "modelType": {"name": "BasicEvent"}, "observed": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}}, {"idShort": "ExampleSubmodelCollectionOrdered", "modelType": {"name": "SubmodelElementCollection"}, "value": [{"idShort": "ExampleProperty", "modelType": {"name": "Property"}, "value": null, "valueType": "string"}, {"idShort": "ExampleMultiLanguageProperty", "modelType": {"name": "MultiLanguageProperty"}}, {"idShort": "ExampleRange", "modelType": {"name": "Range"}, "valueType": "int", "min": null, "max": null}], "ordered": true}, {"idShort": "ExampleSubmodelCollectionUnordered", "modelType": {"name": "SubmodelElementCollection"}, "value": [{"idShort": "ExampleBlob", "modelType": {"name": "Blob"}, "mimeType": "application/pdf"}, {"idShort": "ExampleFile", "modelType": {"name": "File"}, "value": null, "mimeType": "application/pdf"}, {"idShort": "ExampleReferenceElement", "modelType": {"name": "ReferenceElement"}}], "ordered": false}, {"idShort": "ExampleSubmodelCollectionUnordered2", "modelType": {"name": "SubmodelElementCollection"}, "ordered": false}]}, {"idShort": "", "modelType": {"name": "Submodel"}, "identification": {"id": "https://acplt.org/Test_Submodel2_Mandatory", "idType": "IRI"}}, {"idShort": "TestSubmodel", "description": [{"language": "en-us", "text": "An example submodel for the test application"}, {"language": "de", "text": "Ein Beispiel-Teilmodell f\u00fcr eine Test-Anwendung"}], "modelType": {"name": "Submodel"}, "identification": {"id": "https://acplt.org/Test_Submodel_Missing", "idType": "IRI"}, "administration": {"version": "0.9", "revision": "0"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/SubmodelTemplates/ExampleSubmodel", "local": false}]}, "submodelElements": [{"idShort": "ExampleRelationshipElement", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example RelationshipElement object"}, {"language": "de", "text": "Beispiel RelationshipElement Element"}], "modelType": {"name": "RelationshipElement"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/RelationshipElements/ExampleRelationshipElement", "local": false}]}, "first": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}, "second": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}}, {"idShort": "ExampleAnnotatedRelationshipElement", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example AnnotatedRelationshipElement object"}, {"language": "de", "text": "Beispiel AnnotatedRelationshipElement Element"}], "modelType": {"name": "AnnotatedRelationshipElement"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/RelationshipElements/ExampleAnnotatedRelationshipElement", "local": false}]}, "first": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}, "second": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}, "annotation": [{"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}]}, {"idShort": "ExampleOperation", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example Operation object"}, {"language": "de", "text": "Beispiel Operation Element"}], "modelType": {"name": "Operation"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Operations/ExampleOperation", "local": false}]}, "inputVariable": [{"value": {"idShort": "ExampleProperty", "category": "CONSTANT", "description": [{"language": "en-us", "text": "Example Property object"}, {"language": "de", "text": "Beispiel Property Element"}], "modelType": {"name": "Property"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Properties/ExampleProperty", "local": false}]}, "qualifiers": [{"modelType": {"name": "Qualifier"}, "valueType": "string", "type": "http://acplt.org/Qualifier/ExampleQualifier"}], "value": "exampleValue", "valueType": "string"}}], "outputVariable": [{"value": {"idShort": "ExampleProperty", "category": "CONSTANT", "description": [{"language": "en-us", "text": "Example Property object"}, {"language": "de", "text": "Beispiel Property Element"}], "modelType": {"name": "Property"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Properties/ExampleProperty", "local": false}]}, "qualifiers": [{"modelType": {"name": "Qualifier"}, "valueType": "string", "type": "http://acplt.org/Qualifier/ExampleQualifier"}], "value": "exampleValue", "valueType": "string"}}], "inoutputVariable": [{"value": {"idShort": "ExampleProperty", "category": "CONSTANT", "description": [{"language": "en-us", "text": "Example Property object"}, {"language": "de", "text": "Beispiel Property Element"}], "modelType": {"name": "Property"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Properties/ExampleProperty", "local": false}]}, "qualifiers": [{"modelType": {"name": "Qualifier"}, "valueType": "string", "type": "http://acplt.org/Qualifier/ExampleQualifier"}], "value": "exampleValue", "valueType": "string"}}]}, {"idShort": "ExampleCapability", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example Capability object"}, {"language": "de", "text": "Beispiel Capability Element"}], "modelType": {"name": "Capability"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Capabilities/ExampleCapability", "local": false}]}}, {"idShort": "ExampleBasicEvent", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example BasicEvent object"}, {"language": "de", "text": "Beispiel BasicEvent Element"}], "modelType": {"name": "BasicEvent"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Events/ExampleBasicEvent", "local": false}]}, "observed": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}}, {"idShort": "ExampleSubmodelCollectionOrdered", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example SubmodelElementCollectionOrdered object"}, {"language": "de", "text": "Beispiel SubmodelElementCollectionOrdered Element"}], "modelType": {"name": "SubmodelElementCollection"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/SubmodelElementCollections/ExampleSubmodelElementCollectionOrdered", "local": false}]}, "value": [{"idShort": "ExampleProperty", "category": "CONSTANT", "description": [{"language": "en-us", "text": "Example Property object"}, {"language": "de", "text": "Beispiel Property Element"}], "modelType": {"name": "Property"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Properties/ExampleProperty", "local": false}]}, "qualifiers": [{"modelType": {"name": "Qualifier"}, "valueType": "string", "type": "http://acplt.org/Qualifier/ExampleQualifier"}], "value": "exampleValue", "valueType": "string"}, {"idShort": "ExampleMultiLanguageProperty", "category": "CONSTANT", "description": [{"language": "en-us", "text": "Example MultiLanguageProperty object"}, {"language": "de", "text": "Beispiel MulitLanguageProperty Element"}], "modelType": {"name": "MultiLanguageProperty"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/MultiLanguageProperties/ExampleMultiLanguageProperty", "local": false}]}, "value": [{"language": "en-us", "text": "Example value of a MultiLanguageProperty element"}, {"language": "de", "text": "Beispielswert f\u00fcr ein MulitLanguageProperty-Element"}]}, {"idShort": "ExampleRange", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example Range object"}, {"language": "de", "text": "Beispiel Range Element"}], "modelType": {"name": "Range"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Ranges/ExampleRange", "local": false}]}, "valueType": "int", "min": "0", "max": "100"}], "ordered": true}, {"idShort": "ExampleSubmodelCollectionUnordered", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example SubmodelElementCollectionUnordered object"}, {"language": "de", "text": "Beispiel SubmodelElementCollectionUnordered Element"}], "modelType": {"name": "SubmodelElementCollection"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/SubmodelElementCollections/ExampleSubmodelElementCollectionUnordered", "local": false}]}, "value": [{"idShort": "ExampleBlob", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example Blob object"}, {"language": "de", "text": "Beispiel Blob Element"}], "modelType": {"name": "Blob"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Blobs/ExampleBlob", "local": false}]}, "mimeType": "application/pdf", "value": "AQIDBAU="}, {"idShort": "ExampleFile", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example File object"}, {"language": "de", "text": "Beispiel File Element"}], "modelType": {"name": "File"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Files/ExampleFile", "local": false}]}, "value": "/TestFile.pdf", "mimeType": "application/pdf"}, {"idShort": "ExampleReferenceElement", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example Reference Element object"}, {"language": "de", "text": "Beispiel Reference Element Element"}], "modelType": {"name": "ReferenceElement"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/ReferenceElements/ExampleReferenceElement", "local": false}]}, "value": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}}], "ordered": false}]}, {"idShort": "TestSubmodel", "description": [{"language": "en-us", "text": "An example submodel for the test application"}, {"language": "de", "text": "Ein Beispiel-Teilmodell f\u00fcr eine Test-Anwendung"}], "modelType": {"name": "Submodel"}, "identification": {"id": "https://acplt.org/Test_Submodel_Template", "idType": "IRI"}, "administration": {"version": "0.9", "revision": "0"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/SubmodelTemplates/ExampleSubmodel", "local": false}]}, "kind": "Template", "submodelElements": [{"idShort": "ExampleRelationshipElement", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example RelationshipElement object"}, {"language": "de", "text": "Beispiel RelationshipElement Element"}], "modelType": {"name": "RelationshipElement"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/RelationshipElements/ExampleRelationshipElement", "local": false}]}, "kind": "Template", "first": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}, "second": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}}, {"idShort": "ExampleAnnotatedRelationshipElement", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example AnnotatedRelationshipElement object"}, {"language": "de", "text": "Beispiel AnnotatedRelationshipElement Element"}], "modelType": {"name": "AnnotatedRelationshipElement"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/RelationshipElements/ExampleAnnotatedRelationshipElement", "local": false}]}, "kind": "Template", "first": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}, "second": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}}, {"idShort": "ExampleOperation", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example Operation object"}, {"language": "de", "text": "Beispiel Operation Element"}], "modelType": {"name": "Operation"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Operations/ExampleOperation", "local": false}]}, "kind": "Template", "inputVariable": [{"value": {"idShort": "ExampleProperty", "category": "CONSTANT", "description": [{"language": "en-us", "text": "Example Property object"}, {"language": "de", "text": "Beispiel Property Element"}], "modelType": {"name": "Property"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Properties/ExampleProperty", "local": false}]}, "kind": "Template", "value": null, "valueType": "string"}}], "outputVariable": [{"value": {"idShort": "ExampleProperty", "category": "CONSTANT", "description": [{"language": "en-us", "text": "Example Property object"}, {"language": "de", "text": "Beispiel Property Element"}], "modelType": {"name": "Property"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Properties/ExampleProperty", "local": false}]}, "kind": "Template", "value": null, "valueType": "string"}}], "inoutputVariable": [{"value": {"idShort": "ExampleProperty", "category": "CONSTANT", "description": [{"language": "en-us", "text": "Example Property object"}, {"language": "de", "text": "Beispiel Property Element"}], "modelType": {"name": "Property"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Properties/ExampleProperty", "local": false}]}, "kind": "Template", "value": null, "valueType": "string"}}]}, {"idShort": "ExampleCapability", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example Capability object"}, {"language": "de", "text": "Beispiel Capability Element"}], "modelType": {"name": "Capability"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Capabilities/ExampleCapability", "local": false}]}, "kind": "Template"}, {"idShort": "ExampleBasicEvent", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example BasicEvent object"}, {"language": "de", "text": "Beispiel BasicEvent Element"}], "modelType": {"name": "BasicEvent"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Events/ExampleBasicEvent", "local": false}]}, "kind": "Template", "observed": {"keys": [{"type": "Property", "idType": "IdShort", "value": "ExampleProperty", "local": true}]}}, {"idShort": "ExampleSubmodelCollectionOrdered", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example SubmodelElementCollectionOrdered object"}, {"language": "de", "text": "Beispiel SubmodelElementCollectionOrdered Element"}], "modelType": {"name": "SubmodelElementCollection"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/SubmodelElementCollections/ExampleSubmodelElementCollectionOrdered", "local": false}]}, "kind": "Template", "value": [{"idShort": "ExampleProperty", "category": "CONSTANT", "description": [{"language": "en-us", "text": "Example Property object"}, {"language": "de", "text": "Beispiel Property Element"}], "modelType": {"name": "Property"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Properties/ExampleProperty", "local": false}]}, "kind": "Template", "value": null, "valueType": "string"}, {"idShort": "ExampleMultiLanguageProperty", "category": "CONSTANT", "description": [{"language": "en-us", "text": "Example MultiLanguageProperty object"}, {"language": "de", "text": "Beispiel MulitLanguageProperty Element"}], "modelType": {"name": "MultiLanguageProperty"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/MultiLanguageProperties/ExampleMultiLanguageProperty", "local": false}]}, "kind": "Template"}, {"idShort": "ExampleRange", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example Range object"}, {"language": "de", "text": "Beispiel Range Element"}], "modelType": {"name": "Range"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Ranges/ExampleRange", "local": false}]}, "kind": "Template", "valueType": "int", "min": null, "max": "100"}, {"idShort": "ExampleRange2", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example Range object"}, {"language": "de", "text": "Beispiel Range Element"}], "modelType": {"name": "Range"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Ranges/ExampleRange", "local": false}]}, "kind": "Template", "valueType": "int", "min": "0", "max": null}], "ordered": true}, {"idShort": "ExampleSubmodelCollectionUnordered", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example SubmodelElementCollectionUnordered object"}, {"language": "de", "text": "Beispiel SubmodelElementCollectionUnordered Element"}], "modelType": {"name": "SubmodelElementCollection"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/SubmodelElementCollections/ExampleSubmodelElementCollectionUnordered", "local": false}]}, "kind": "Template", "value": [{"idShort": "ExampleBlob", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example Blob object"}, {"language": "de", "text": "Beispiel Blob Element"}], "modelType": {"name": "Blob"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Blobs/ExampleBlob", "local": false}]}, "kind": "Template", "mimeType": "application/pdf"}, {"idShort": "ExampleFile", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example File object"}, {"language": "de", "text": "Beispiel File Element"}], "modelType": {"name": "File"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Files/ExampleFile", "local": false}]}, "kind": "Template", "value": null, "mimeType": "application/pdf"}, {"idShort": "ExampleReferenceElement", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example Reference Element object"}, {"language": "de", "text": "Beispiel Reference Element Element"}], "modelType": {"name": "ReferenceElement"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/ReferenceElements/ExampleReferenceElement", "local": false}]}, "kind": "Template"}], "ordered": false}, {"idShort": "ExampleSubmodelCollectionUnordered2", "category": "PARAMETER", "description": [{"language": "en-us", "text": "Example SubmodelElementCollectionUnordered object"}, {"language": "de", "text": "Beispiel SubmodelElementCollectionUnordered Element"}], "modelType": {"name": "SubmodelElementCollection"}, "semanticId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/SubmodelElementCollections/ExampleSubmodelElementCollectionUnordered", "local": false}]}, "kind": "Template", "ordered": false}]}], "assets": [{"idShort": "Test_Asset", "description": [{"language": "en-us", "text": "An example asset for the test application"}, {"language": "de", "text": "Ein Beispiel-Asset f\u00fcr eine Test-Anwendung"}], "modelType": {"name": "Asset"}, "identification": {"id": "https://acplt.org/Test_Asset", "idType": "IRI"}, "administration": {"version": "0.9", "revision": "0"}, "kind": "Instance", "assetIdentificationModel": {"keys": [{"type": "Submodel", "idType": "IRI", "value": "http://acplt.org/Submodels/Assets/TestAsset/Identification", "local": false}]}, "billOfMaterial": {"keys": [{"type": "Submodel", "idType": "IRI", "value": "http://acplt.org/Submodels/Assets/TestAsset/BillOfMaterial", "local": false}]}}, {"idShort": "", "modelType": {"name": "Asset"}, "identification": {"id": "https://acplt.org/Test_Asset_Mandatory", "idType": "IRI"}, "kind": "Instance"}, {"idShort": "Test_Asset", "description": [{"language": "en-us", "text": "An example asset for the test application"}, {"language": "de", "text": "Ein Beispiel-Asset f\u00fcr eine Test-Anwendung"}], "modelType": {"name": "Asset"}, "identification": {"id": "https://acplt.org/Test_Asset_Missing", "idType": "IRI"}, "administration": {}, "kind": "Instance"}], "conceptDescriptions": [{"idShort": "TestConceptDescription", "description": [{"language": "en-us", "text": "An example concept description for the test application"}, {"language": "de", "text": "Ein Beispiel-ConceptDescription f\u00fcr eine Test-Anwendung"}], "modelType": {"name": "ConceptDescription"}, "identification": {"id": "https://acplt.org/Test_ConceptDescription", "idType": "IRI"}, "administration": {"version": "0.9", "revision": "0"}, "isCaseOf": [{"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/DataSpecifications/ConceptDescriptions/TestConceptDescription", "local": false}]}]}, {"idShort": "", "modelType": {"name": "ConceptDescription"}, "identification": {"id": "https://acplt.org/Test_ConceptDescription_Mandatory", "idType": "IRI"}}, {"idShort": "TestConceptDescription", "description": [{"language": "en-us", "text": "An example concept description for the test application"}, {"language": "de", "text": "Ein Beispiel-ConceptDescription f\u00fcr eine Test-Anwendung"}], "modelType": {"name": "ConceptDescription"}, "identification": {"id": "https://acplt.org/Test_ConceptDescription_Missing", "idType": "IRI"}, "administration": {"version": "0.9", "revision": "0"}}, {"idShort": "TestSpec_01", "modelType": {"name": "ConceptDescription"}, "identification": {"id": "http://acplt.org/DataSpecifciations/Example/Identification", "idType": "IRI"}, "administration": {"version": "0.9", "revision": "0"}, "isCaseOf": [{"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/ReferenceElements/ConceptDescriptionX", "local": false}]}], "embeddedDataSpecifications": [{"dataSpecification": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/2/0", "local": false}]}, "dataSpecificationContent": {"preferredName": [{"language": "de", "text": "Test Specification"}, {"language": "en-us", "text": "TestSpecification"}], "dataType": "REAL_MEASURE", "definition": [{"language": "de", "text": "Dies ist eine Data Specification f\u00fcr Testzwecke"}, {"language": "en-us", "text": "This is a DataSpecification for testing purposes"}], "shortName": [{"language": "de", "text": "Test Spec"}, {"language": "en-us", "text": "TestSpec"}], "unit": "SpaceUnit", "unitId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/Units/SpaceUnit", "local": false}]}, "sourceOfDefinition": "http://acplt.org/DataSpec/ExampleDef", "symbol": "SU", "valueFormat": "string", "valueList": {"valueReferencePairTypes": [{"value": "exampleValue", "valueId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/ValueId/ExampleValueId", "local": false}]}, "valueType": "string"}, {"value": "exampleValue2", "valueId": {"keys": [{"type": "GlobalReference", "idType": "IRI", "value": "http://acplt.org/ValueId/ExampleValueId2", "local": false}]}, "valueType": "string"}]}, "value": "TEST", "levelType": ["Min", "Max"]}}]}]}
\ No newline at end of file
......@@ -15,7 +15,8 @@ import aas.compliance_tool.compliance_check_json as compliance_tool
from aas.compliance_tool.state_manager import ComplianceToolStateManager, Status
dirname = os.path.dirname
JSON_SCHEMA_FILE = os.path.join(dirname(dirname(dirname(__file__))), 'test\\adapter\\json\\aasJSONSchemaV2.0.json')
JSON_SCHEMA_FILE = os.path.join(dirname(dirname(dirname(__file__))), 'test', 'adapter', 'json',
'aasJSONSchemaV2.0.json')
class ComplianceToolJsonTest(unittest.TestCase):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment