From 1d87d2d0cfe56c38bb4df2efb6f5190fe64a3bb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leon=20M=C3=B6ller?= Date: Fri, 3 Nov 2023 17:18:53 +0100 Subject: [PATCH] make `Operation` a `Namespace` This commit makes `Operation` inherit from `UniqueIdShortNamespace`, to implement Constraint AASd-134: For an Operation, the idShort of all inputVariable/value, outputVariable/value, and inoutputVariable/value shall be unique. In the DotAAS spec, the attributes `inputVariable`, `outputVariable` and `inoutputVariable` of `Operation` are defined to be a collection of `OperationVariable` instances, which themselves just contain a single `SubmodelElement`. Thus, the `OperationVariable` isn't really required for `Operation`, as the `Operation` can just contain the `SubmodelElements` directly, without an unnecessary wrapper. This makes `Operation` less tedious to use and also allows us to use normal `NamespaceSets` for the 3 attributes, which together with the `UniqueIdShortNamespace` ensure, that the `idShort` of all contained `SubmodelElements` is unique across all 3 attributes. Aside this, the examples are updated since `SubmodelElements` as children of an `Operation` are now linked to the parent. This prevents us from reusing other `SubmodelElements` as `OperationVariables` as it was done previously, since each `SubmodelElement` can only have one parent. Fix #146 #148 --- .../aas/adapter/json/json_deserialization.py | 12 ++-- basyx/aas/adapter/json/json_serialization.py | 27 ++++---- basyx/aas/adapter/xml/xml_deserialization.py | 53 +++++++--------- basyx/aas/adapter/xml/xml_serialization.py | 35 +++++------ basyx/aas/examples/data/_helper.py | 30 +++------ basyx/aas/examples/data/example_aas.py | 57 +++++++++++++---- .../data/example_aas_missing_attributes.py | 63 ++++++++++++++++--- .../data/example_submodel_template.py | 48 +++++++++++--- basyx/aas/model/submodel.py | 42 ++++++------- .../files/test_demo_full_example.json | 36 +++++------ .../files/test_demo_full_example.xml | 36 +++++------ .../aasx/data.json | 36 +++++------ ...est_demo_full_example_wrong_attribute.json | 42 +++++++------ ...test_demo_full_example_wrong_attribute.xml | 36 +++++------ .../aasx/data.xml | 36 +++++------ .../aasx/data.xml | 36 +++++------ 16 files changed, 349 insertions(+), 276 deletions(-) diff --git a/basyx/aas/adapter/json/json_deserialization.py b/basyx/aas/adapter/json/json_deserialization.py index d2618735e..262aebea4 100644 --- a/basyx/aas/adapter/json/json_deserialization.py +++ b/basyx/aas/adapter/json/json_deserialization.py @@ -364,12 +364,14 @@ def _construct_administrative_information( return ret @classmethod - def _construct_operation_variable( - cls, dct: Dict[str, object], object_class=model.OperationVariable) -> model.OperationVariable: + def _construct_operation_variable(cls, dct: Dict[str, object]) -> model.SubmodelElement: + """ + Since we don't implement `OperationVariable`, this constructor discards the wrapping `OperationVariable` object + and just returns the contained :class:`~aas.model.submodel.SubmodelElement`. + """ # TODO: remove the following type: ignore comments when mypy supports abstract types for Type[T] # see https://github.com/python/mypy/issues/5374 - ret = object_class(value=_get_ts(dct, 'value', model.SubmodelElement)) # type: ignore - return ret + return _get_ts(dct, 'value', model.SubmodelElement) # type: ignore @classmethod def _construct_lang_string_set(cls, lst: List[Dict[str, object]], object_class: Type[LSS]) -> LSS: @@ -597,7 +599,7 @@ def _construct_operation(cls, dct: Dict[str, object], object_class=model.Operati if json_name in dct: for variable_data in _get_ts(dct, json_name, list): try: - target.append(cls._construct_operation_variable(variable_data)) + target.add(cls._construct_operation_variable(variable_data)) except (KeyError, TypeError) as e: error_message = "Error while trying to convert JSON object into {} of {}: {}".format( json_name, ret, pprint.pformat(variable_data, depth=2, width=2 ** 14, compact=True)) diff --git a/basyx/aas/adapter/json/json_serialization.py b/basyx/aas/adapter/json/json_serialization.py index 0ab6cddcb..17fff2680 100644 --- a/basyx/aas/adapter/json/json_serialization.py +++ b/basyx/aas/adapter/json/json_serialization.py @@ -79,7 +79,6 @@ def default(self, obj: object) -> object: model.LangStringSet: self._lang_string_set_to_json, model.MultiLanguageProperty: self._multi_language_property_to_json, model.Operation: self._operation_to_json, - model.OperationVariable: self._operation_variable_to_json, model.Property: self._property_to_json, model.Qualifier: self._qualifier_to_json, model.Range: self._range_to_json, @@ -576,16 +575,17 @@ def _annotated_relationship_element_to_json(cls, obj: model.AnnotatedRelationshi return data @classmethod - def _operation_variable_to_json(cls, obj: model.OperationVariable) -> Dict[str, object]: + def _operation_variable_to_json(cls, obj: model.SubmodelElement) -> Dict[str, object]: """ - serialization of an object from class OperationVariable to json + serialization of an object from class SubmodelElement to a json OperationVariable representation + Since we don't implement the `OperationVariable` class, which is just a wrapper for a single + :class:`~aas.model.submodel.SubmodelElement`, elements are serialized as the `value` attribute of an + `operationVariable` object. - :param obj: object of class OperationVariable - :return: dict with the serialized attributes of this object + :param obj: object of class `SubmodelElement` + :return: `OperationVariable` wrapper containing the serialized `SubmodelElement` """ - data = cls._abstract_classes_to_json(obj) - data['value'] = obj.value - return data + return {'value': obj} @classmethod def _operation_to_json(cls, obj: model.Operation) -> Dict[str, object]: @@ -596,12 +596,11 @@ def _operation_to_json(cls, obj: model.Operation) -> Dict[str, object]: :return: dict with the serialized attributes of this object """ data = cls._abstract_classes_to_json(obj) - if obj.input_variable: - data['inputVariables'] = list(obj.input_variable) - if obj.output_variable: - data['outputVariables'] = list(obj.output_variable) - if obj.in_output_variable: - data['inoutputVariables'] = list(obj.in_output_variable) + for tag, nss in (('inputVariables', obj.input_variable), + ('outputVariables', obj.output_variable), + ('inoutputVariables', obj.in_output_variable)): + if nss: + data[tag] = [cls._operation_variable_to_json(obj) for obj in nss] return data @classmethod diff --git a/basyx/aas/adapter/xml/xml_deserialization.py b/basyx/aas/adapter/xml/xml_deserialization.py index 98f4a9fa3..a2acc55a2 100644 --- a/basyx/aas/adapter/xml/xml_deserialization.py +++ b/basyx/aas/adapter/xml/xml_deserialization.py @@ -533,6 +533,20 @@ def _construct_referable_reference(cls, element: etree.Element, **kwargs: Any) \ # see https://github.com/python/mypy/issues/5374 return cls.construct_model_reference_expect_type(element, model.Referable, **kwargs) # type: ignore + @classmethod + def _construct_operation_variable(cls, element: etree.Element, **kwargs: Any) -> model.SubmodelElement: + """ + Since we don't implement `OperationVariable`, this constructor discards the wrapping `aas:operationVariable` + and `aas:value` and just returns the contained :class:`~aas.model.submodel.SubmodelElement`. + """ + value = _get_child_mandatory(element, NS_AAS + "value") + if len(value) == 0: + raise KeyError(f"{_element_pretty_identifier(value)} has no submodel element!") + if len(value) > 1: + logger.warning(f"{_element_pretty_identifier(value)} has more than one submodel element, " + "using the first one...") + return cls.construct_submodel_element(value[0], **kwargs) + @classmethod def construct_key(cls, element: etree.Element, object_class=model.Key, **_kwargs: Any) \ -> model.Key: @@ -722,19 +736,6 @@ def construct_data_element(cls, element: etree.Element, abstract_class_name: str raise KeyError(_element_pretty_identifier(element) + f" is not a valid {abstract_class_name}!") return data_elements[element.tag](element, **kwargs) - @classmethod - def construct_operation_variable(cls, element: etree.Element, object_class=model.OperationVariable, - **_kwargs: Any) -> model.OperationVariable: - value = _get_child_mandatory(element, NS_AAS + "value") - if len(value) == 0: - raise KeyError(f"{_element_pretty_identifier(value)} has no submodel element!") - if len(value) > 1: - logger.warning(f"{_element_pretty_identifier(value)} has more than one submodel element, " - "using the first one...") - return object_class( - _failsafe_construct_mandatory(value[0], cls.construct_submodel_element) - ) - @classmethod def construct_annotated_relationship_element(cls, element: etree.Element, object_class=model.AnnotatedRelationshipElement, **_kwargs: Any) \ @@ -860,21 +861,14 @@ def construct_multi_language_property(cls, element: etree.Element, object_class= def construct_operation(cls, element: etree.Element, object_class=model.Operation, **_kwargs: Any) \ -> model.Operation: operation = object_class(None) - input_variables = element.find(NS_AAS + "inputVariables") - if input_variables is not None: - for input_variable in _child_construct_multiple(input_variables, NS_AAS + "operationVariable", - cls.construct_operation_variable, cls.failsafe): - operation.input_variable.append(input_variable) - output_variables = element.find(NS_AAS + "outputVariables") - if output_variables is not None: - for output_variable in _child_construct_multiple(output_variables, NS_AAS + "operationVariable", - cls.construct_operation_variable, cls.failsafe): - operation.output_variable.append(output_variable) - in_output_variables = element.find(NS_AAS + "inoutputVariables") - if in_output_variables is not None: - for in_output_variable in _child_construct_multiple(in_output_variables, NS_AAS + "operationVariable", - cls.construct_operation_variable, cls.failsafe): - operation.in_output_variable.append(in_output_variable) + for tag, target in ((NS_AAS + "inputVariables", operation.input_variable), + (NS_AAS + "outputVariables", operation.output_variable), + (NS_AAS + "inoutputVariables", operation.in_output_variable)): + variables = element.find(tag) + if variables is not None: + for var in _child_construct_multiple(variables, NS_AAS + "operationVariable", + cls._construct_operation_variable, cls.failsafe): + target.add(var) cls._amend_abstract_attributes(operation, element) return operation @@ -1242,7 +1236,6 @@ class XMLConstructables(enum.Enum): ADMINISTRATIVE_INFORMATION = enum.auto() QUALIFIER = enum.auto() SECURITY = enum.auto() - OPERATION_VARIABLE = enum.auto() ANNOTATED_RELATIONSHIP_ELEMENT = enum.auto() BASIC_EVENT_ELEMENT = enum.auto() BLOB = enum.auto() @@ -1312,8 +1305,6 @@ def read_aas_xml_element(file: IO, construct: XMLConstructables, failsafe: bool constructor = decoder_.construct_administrative_information elif construct == XMLConstructables.QUALIFIER: constructor = decoder_.construct_qualifier - elif construct == XMLConstructables.OPERATION_VARIABLE: - constructor = decoder_.construct_operation_variable elif construct == XMLConstructables.ANNOTATED_RELATIONSHIP_ELEMENT: constructor = decoder_.construct_annotated_relationship_element elif construct == XMLConstructables.BASIC_EVENT_ELEMENT: diff --git a/basyx/aas/adapter/xml/xml_serialization.py b/basyx/aas/adapter/xml/xml_serialization.py index 0ba5c8629..c5d454631 100644 --- a/basyx/aas/adapter/xml/xml_serialization.py +++ b/basyx/aas/adapter/xml/xml_serialization.py @@ -726,18 +726,20 @@ def annotated_relationship_element_to_xml(obj: model.AnnotatedRelationshipElemen return et_annotated_relationship_element -def operation_variable_to_xml(obj: model.OperationVariable, - tag: str = NS_AAS+"operationVariable") -> etree.Element: +def operation_variable_to_xml(obj: model.SubmodelElement, tag: str = NS_AAS+"operationVariable") -> etree.Element: """ - Serialization of objects of class :class:`~aas.model.submodel.OperationVariable` to XML + Serialization of :class:`~aas.model.submodel.SubmodelElement` to the XML OperationVariable representation + Since we don't implement the `OperationVariable` class, which is just a wrapper for a single + :class:`~aas.model.submodel.SubmodelElement`, elements are serialized as the `aas:value` child of an + `aas:operationVariable` element. - :param obj: Object of class :class:`~aas.model.submodel.OperationVariable` + :param obj: Object of class :class:`~aas.model.submodel.SubmodelElement` :param tag: Namespace+Tag of the serialized element (optional). Default is "aas:operationVariable" :return: Serialized ElementTree object """ et_operation_variable = _generate_element(tag) et_value = _generate_element(NS_AAS+"value") - et_value.append(submodel_element_to_xml(obj.value)) + et_value.append(submodel_element_to_xml(obj)) et_operation_variable.append(et_value) return et_operation_variable @@ -752,21 +754,14 @@ def operation_to_xml(obj: model.Operation, :return: Serialized ElementTree object """ et_operation = abstract_classes_to_xml(tag, obj) - if obj.input_variable: - et_input_variables = _generate_element(NS_AAS+"inputVariables") - for input_ov in obj.input_variable: - et_input_variables.append(operation_variable_to_xml(input_ov, NS_AAS+"operationVariable")) - et_operation.append(et_input_variables) - if obj.output_variable: - et_output_variables = _generate_element(NS_AAS+"outputVariables") - for output_ov in obj.output_variable: - et_output_variables.append(operation_variable_to_xml(output_ov, NS_AAS+"operationVariable")) - et_operation.append(et_output_variables) - if obj.in_output_variable: - et_inoutput_variables = _generate_element(NS_AAS+"inoutputVariables") - for in_out_ov in obj.in_output_variable: - et_inoutput_variables.append(operation_variable_to_xml(in_out_ov, NS_AAS+"operationVariable")) - et_operation.append(et_inoutput_variables) + for tag, nss in ((NS_AAS+"inputVariables", obj.input_variable), + (NS_AAS+"outputVariables", obj.output_variable), + (NS_AAS+"inoutputVariables", obj.in_output_variable)): + if nss: + et_variables = _generate_element(tag) + for submodel_element in nss: + et_variables.append(operation_variable_to_xml(submodel_element)) + et_operation.append(et_variables) return et_operation diff --git a/basyx/aas/examples/data/_helper.py b/basyx/aas/examples/data/_helper.py index 01e8a6d66..b1ae387c9 100644 --- a/basyx/aas/examples/data/_helper.py +++ b/basyx/aas/examples/data/_helper.py @@ -550,17 +550,6 @@ def _find_extra_elements_by_id_short(self, object_list: model.NamespaceSet, sear found_elements.add(object_list_element) return found_elements - def _check_operation_variable_equal(self, object_: model.OperationVariable, - expected_value: model.OperationVariable): - """ - Checks if the given OperationVariable objects are equal - - :param object_: Given OperationVariable object to check - :param expected_value: expected OperationVariable object - :return: - """ - self._check_submodel_element(object_.value, expected_value.value) - def check_operation_equal(self, object_: model.Operation, expected_value: model.Operation): """ Checks if the given Operation objects are equal @@ -570,18 +559,13 @@ def check_operation_equal(self, object_: model.Operation, expected_value: model. :return: """ self._check_abstract_attributes_submodel_element_equal(object_, expected_value) - self.check_contained_element_length(object_, 'input_variable', model.OperationVariable, - len(expected_value.input_variable)) - self.check_contained_element_length(object_, 'output_variable', model.OperationVariable, - len(expected_value.output_variable)) - self.check_contained_element_length(object_, 'in_output_variable', model.OperationVariable, - len(expected_value.in_output_variable)) - for iv1, iv2 in zip(object_.input_variable, expected_value.input_variable): - self._check_operation_variable_equal(iv1, iv2) - for ov1, ov2 in zip(object_.output_variable, expected_value.output_variable): - self._check_operation_variable_equal(ov1, ov2) - for iov1, iov2 in zip(object_.in_output_variable, expected_value.in_output_variable): - self._check_operation_variable_equal(iov1, iov2) + for input_nss, expected_nss, attr_name in ( + (object_.input_variable, expected_value.input_variable, 'input_variable'), + (object_.output_variable, expected_value.output_variable, 'output_variable'), + (object_.in_output_variable, expected_value.in_output_variable, 'in_output_variable')): + self.check_contained_element_length(object_, attr_name, model.SubmodelElement, len(expected_nss)) + for var1, var2 in zip(input_nss, expected_nss): + self._check_submodel_element(var1, var2) def check_capability_equal(self, object_: model.Capability, expected_value: model.Capability): """ diff --git a/basyx/aas/examples/data/example_aas.py b/basyx/aas/examples/data/example_aas.py index 6d2a39326..49d3847c4 100644 --- a/basyx/aas/examples/data/example_aas.py +++ b/basyx/aas/examples/data/example_aas.py @@ -558,8 +558,8 @@ def create_example_submodel() -> model.Submodel: embedded_data_specifications=() ) - operation_variable_property = model.Property( - id_short='ExampleProperty', + input_variable_property = model.Property( + id_short='ExamplePropertyInput', value_type=model.datatypes.String, value='exampleValue', value_id=model.ExternalReference((model.Key(type_=model.KeyTypes.GLOBAL_REFERENCE, @@ -571,27 +571,58 @@ def create_example_submodel() -> model.Submodel: 'de': 'Beispiel Property Element'}), parent=None, semantic_id=model.ExternalReference((model.Key(type_=model.KeyTypes.GLOBAL_REFERENCE, - value='http://acplt.org/Properties/ExampleProperty'),)), + value='http://acplt.org/Properties/ExamplePropertyInput'),)), qualifier=(), extension=(), supplemental_semantic_id=(), embedded_data_specifications=() ) - submodel_element_operation_variable_input = model.OperationVariable( - value=operation_variable_property) - - submodel_element_operation_variable_output = model.OperationVariable( - value=operation_variable_property) + output_variable_property = model.Property( + id_short='ExamplePropertyOutput', + value_type=model.datatypes.String, + value='exampleValue', + value_id=model.ExternalReference((model.Key(type_=model.KeyTypes.GLOBAL_REFERENCE, + value='http://acplt.org/ValueId/ExampleValueId'),)), + display_name=model.MultiLanguageNameType({'en-US': 'ExampleProperty', + 'de': 'BeispielProperty'}), + category='CONSTANT', + description=model.MultiLanguageTextType({'en-US': 'Example Property object', + 'de': 'Beispiel Property Element'}), + parent=None, + semantic_id=model.ExternalReference((model.Key(type_=model.KeyTypes.GLOBAL_REFERENCE, + value='http://acplt.org/Properties/ExamplePropertyOutput'),)), + qualifier=(), + extension=(), + supplemental_semantic_id=(), + embedded_data_specifications=() + ) - submodel_element_operation_variable_in_output = model.OperationVariable( - value=operation_variable_property) + in_output_variable_property = model.Property( + id_short='ExamplePropertyInOutput', + value_type=model.datatypes.String, + value='exampleValue', + value_id=model.ExternalReference((model.Key(type_=model.KeyTypes.GLOBAL_REFERENCE, + value='http://acplt.org/ValueId/ExampleValueId'),)), + display_name=model.MultiLanguageNameType({'en-US': 'ExampleProperty', + 'de': 'BeispielProperty'}), + category='CONSTANT', + description=model.MultiLanguageTextType({'en-US': 'Example Property object', + 'de': 'Beispiel Property Element'}), + parent=None, + semantic_id=model.ExternalReference((model.Key(type_=model.KeyTypes.GLOBAL_REFERENCE, + value='http://acplt.org/Properties/ExamplePropertyInOutput'),)), + qualifier=(), + extension=(), + supplemental_semantic_id=(), + embedded_data_specifications=() + ) submodel_element_operation = model.Operation( id_short='ExampleOperation', - input_variable=[submodel_element_operation_variable_input], - output_variable=[submodel_element_operation_variable_output], - in_output_variable=[submodel_element_operation_variable_in_output], + input_variable=[input_variable_property], + output_variable=[output_variable_property], + in_output_variable=[in_output_variable_property], category='PARAMETER', description=model.MultiLanguageTextType({'en-US': 'Example Operation object', 'de': 'Beispiel Operation Element'}), diff --git a/basyx/aas/examples/data/example_aas_missing_attributes.py b/basyx/aas/examples/data/example_aas_missing_attributes.py index d33bf7221..cb296c764 100644 --- a/basyx/aas/examples/data/example_aas_missing_attributes.py +++ b/basyx/aas/examples/data/example_aas_missing_attributes.py @@ -193,20 +193,65 @@ def create_example_submodel() -> model.Submodel: value='http://acplt.org/Properties/ExampleProperty'),)), qualifier=()) - submodel_element_operation_variable_input = model.OperationVariable( - value=operation_variable_property) + input_variable_property = model.Property( + id_short='ExamplePropertyInput', + value_type=model.datatypes.String, + value='exampleValue', + value_id=model.ExternalReference((model.Key(type_=model.KeyTypes.GLOBAL_REFERENCE, + value='http://acplt.org/ValueId/ExampleValueId'),)), + display_name=model.MultiLanguageNameType({'en-US': 'ExampleProperty', + 'de': 'BeispielProperty'}), + category='CONSTANT', + description=model.MultiLanguageTextType({'en-US': 'Example Property object', + 'de': 'Beispiel Property Element'}), + parent=None, + semantic_id=model.ExternalReference((model.Key(type_=model.KeyTypes.GLOBAL_REFERENCE, + value='http://acplt.org/Properties/ExamplePropertyInput'),)), + qualifier=()) - submodel_element_operation_variable_output = model.OperationVariable( - value=operation_variable_property) + output_variable_property = model.Property( + id_short='ExamplePropertyOutput', + value_type=model.datatypes.String, + value='exampleValue', + value_id=model.ExternalReference((model.Key(type_=model.KeyTypes.GLOBAL_REFERENCE, + value='http://acplt.org/ValueId/ExampleValueId'),)), + display_name=model.MultiLanguageNameType({'en-US': 'ExampleProperty', + 'de': 'BeispielProperty'}), + category='CONSTANT', + description=model.MultiLanguageTextType({'en-US': 'Example Property object', + 'de': 'Beispiel Property Element'}), + parent=None, + semantic_id=model.ExternalReference((model.Key(type_=model.KeyTypes.GLOBAL_REFERENCE, + value='http://acplt.org/Properties/ExamplePropertyOutput'),)), + qualifier=(), + extension=(), + supplemental_semantic_id=(), + embedded_data_specifications=()) - submodel_element_operation_variable_in_output = model.OperationVariable( - value=operation_variable_property) + in_output_variable_property = model.Property( + id_short='ExamplePropertyInOutput', + value_type=model.datatypes.String, + value='exampleValue', + value_id=model.ExternalReference((model.Key(type_=model.KeyTypes.GLOBAL_REFERENCE, + value='http://acplt.org/ValueId/ExampleValueId'),)), + display_name=model.MultiLanguageNameType({'en-US': 'ExampleProperty', + 'de': 'BeispielProperty'}), + category='CONSTANT', + description=model.MultiLanguageTextType({'en-US': 'Example Property object', + 'de': 'Beispiel Property Element'}), + parent=None, + semantic_id=model.ExternalReference((model.Key(type_=model.KeyTypes.GLOBAL_REFERENCE, + value='http://acplt.org/Properties/ExamplePropertyInOutput'),)), + qualifier=(), + extension=(), + supplemental_semantic_id=(), + embedded_data_specifications=()) submodel_element_operation = model.Operation( id_short='ExampleOperation', - input_variable=[submodel_element_operation_variable_input], - output_variable=[submodel_element_operation_variable_output], - in_output_variable=[submodel_element_operation_variable_in_output], + input_variable=[input_variable_property], + output_variable=[output_variable_property], + in_output_variable=[in_output_variable_property], category='PARAMETER', description=model.MultiLanguageTextType({'en-US': 'Example Operation object', 'de': 'Beispiel Operation Element'}), diff --git a/basyx/aas/examples/data/example_submodel_template.py b/basyx/aas/examples/data/example_submodel_template.py index aab28f35a..ad930f794 100644 --- a/basyx/aas/examples/data/example_submodel_template.py +++ b/basyx/aas/examples/data/example_submodel_template.py @@ -154,20 +154,50 @@ def create_example_submodel_template() -> model.Submodel: 'ExampleAnnotatedRelationshipElement'),)), qualifier=()) - submodel_element_operation_variable_input = model.OperationVariable( - value=submodel_element_property) + input_variable_property = model.Property( + id_short='ExamplePropertyInput', + value_type=model.datatypes.String, + value=None, + value_id=None, + category='CONSTANT', + description=model.MultiLanguageTextType({'en-US': 'Example Property object', + 'de': 'Beispiel Property Element'}), + parent=None, + semantic_id=model.ExternalReference((model.Key(type_=model.KeyTypes.GLOBAL_REFERENCE, + value='http://acplt.org/Properties/ExamplePropertyInput'),)), + qualifier=()) - submodel_element_operation_variable_output = model.OperationVariable( - value=submodel_element_property) + output_variable_property = model.Property( + id_short='ExamplePropertyOutput', + value_type=model.datatypes.String, + value=None, + value_id=None, + category='CONSTANT', + description=model.MultiLanguageTextType({'en-US': 'Example Property object', + 'de': 'Beispiel Property Element'}), + parent=None, + semantic_id=model.ExternalReference((model.Key(type_=model.KeyTypes.GLOBAL_REFERENCE, + value='http://acplt.org/Properties/ExamplePropertyOutput'),)), + qualifier=()) - submodel_element_operation_variable_in_output = model.OperationVariable( - value=submodel_element_property) + in_output_variable_property = model.Property( + id_short='ExamplePropertyInOutput', + value_type=model.datatypes.String, + value=None, + value_id=None, + category='CONSTANT', + description=model.MultiLanguageTextType({'en-US': 'Example Property object', + 'de': 'Beispiel Property Element'}), + parent=None, + semantic_id=model.ExternalReference((model.Key(type_=model.KeyTypes.GLOBAL_REFERENCE, + value='http://acplt.org/Properties/ExamplePropertyInOutput'),)), + qualifier=()) submodel_element_operation = model.Operation( id_short='ExampleOperation', - input_variable=[submodel_element_operation_variable_input], - output_variable=[submodel_element_operation_variable_output], - in_output_variable=[submodel_element_operation_variable_in_output], + input_variable=[input_variable_property], + output_variable=[output_variable_property], + in_output_variable=[in_output_variable_property], category='PARAMETER', description=model.MultiLanguageTextType({'en-US': 'Example Operation object', 'de': 'Beispiel Operation Element'}), diff --git a/basyx/aas/model/submodel.py b/basyx/aas/model/submodel.py index af9c074fe..4dc2e5297 100644 --- a/basyx/aas/model/submodel.py +++ b/basyx/aas/model/submodel.py @@ -931,30 +931,24 @@ def __init__(self, self.annotation = base.NamespaceSet(self, [("id_short", True)], annotation) -class OperationVariable: +class Operation(SubmodelElement, base.UniqueIdShortNamespace): """ - An operation variable is part of an operation that is used to define an input or output variable of that operation. - - :ivar value: Describes the needed argument for an operation via a :class:`~.SubmodelElement` of `kind=TYPE`. - """ - - def __init__(self, - value: SubmodelElement): - """ - TODO: Add instruction what to do after construction - """ - self.value: SubmodelElement = value + An operation is a :class:`~.SubmodelElement` with input and output variables. + In- and output variables are implemented as :class:`SubmodelElements <.SubmodelElement>` directly without the + wrapping `OperationVariable`. This makes implementing *Constraint AASd-134* much easier since we can just use normal + :class:`NamespaceSets <~aas.model.base.NamespaceSet>`. Furthermore, an `OperationVariable` contains nothing besides + a single :class:`~.SubmodelElement` anyway, so implementing it would just make using `Operations` more tedious + for no reason. -class Operation(SubmodelElement): - """ - An operation is a :class:`~.SubmodelElement` with input and output variables. + *Constraint AASd-134:* For an Operation, the idShort of all inputVariable/value, outputVariable/value, + and inoutputVariable/value shall be unique. :ivar id_short: Identifying string of the element within its name space. (inherited from :class:`~aas.model.base.Referable`) - :ivar input_variable: List of input parameters (:class:`OperationVariables <.OperationVariable>`) of the operation - :ivar output_variable: List of output parameters (:class:`OperationVariables <.OperationVariable>`) of the operation - :ivar in_output_variable: List of parameters (:class:`OperationVariables <.OperationVariable>`) that are input and + :ivar input_variable: List of input parameters (:class:`SubmodelElements <.SubmodelElement>`) of the operation + :ivar output_variable: List of output parameters (:class:`SubmodelElements <.SubmodelElement>`) of the operation + :ivar in_output_variable: List of parameters (:class:`SubmodelElements <.SubmodelElement>`) that are input and output of the operation :ivar display_name: Can be provided in several languages. (inherited from :class:`~aas.model.base.Referable`) :ivar category: The category is a value that gives further meta information w.r.t. to the class of the element. @@ -978,9 +972,9 @@ class Operation(SubmodelElement): """ def __init__(self, id_short: Optional[base.NameType], - input_variable: Optional[List[OperationVariable]] = None, - output_variable: Optional[List[OperationVariable]] = None, - in_output_variable: Optional[List[OperationVariable]] = None, + input_variable: Iterable[SubmodelElement] = (), + output_variable: Iterable[SubmodelElement] = (), + in_output_variable: Iterable[SubmodelElement] = (), display_name: Optional[base.MultiLanguageNameType] = None, category: Optional[base.NameType] = None, description: Optional[base.MultiLanguageTextType] = None, @@ -996,9 +990,9 @@ def __init__(self, super().__init__(id_short, display_name, category, description, parent, semantic_id, qualifier, extension, supplemental_semantic_id, embedded_data_specifications) - self.input_variable = input_variable if input_variable is not None else [] - self.output_variable = output_variable if output_variable is not None else [] - self.in_output_variable = in_output_variable if in_output_variable is not None else [] + self.input_variable = base.NamespaceSet(self, [("id_short", True)], input_variable) + self.output_variable = base.NamespaceSet(self, [("id_short", True)], output_variable) + self.in_output_variable = base.NamespaceSet(self, [("id_short", True)], in_output_variable) class Capability(SubmodelElement): diff --git a/test/compliance_tool/files/test_demo_full_example.json b/test/compliance_tool/files/test_demo_full_example.json index 05371e694..95a70030f 100644 --- a/test/compliance_tool/files/test_demo_full_example.json +++ b/test/compliance_tool/files/test_demo_full_example.json @@ -944,7 +944,7 @@ "inputVariables": [ { "value": { - "idShort": "ExampleProperty", + "idShort": "ExamplePropertyInput", "displayName": [ { "language": "en-US", @@ -972,7 +972,7 @@ "keys": [ { "type": "GlobalReference", - "value": "http://acplt.org/Properties/ExampleProperty" + "value": "http://acplt.org/Properties/ExamplePropertyInput" } ] }, @@ -994,7 +994,7 @@ "outputVariables": [ { "value": { - "idShort": "ExampleProperty", + "idShort": "ExamplePropertyOutput", "displayName": [ { "language": "en-US", @@ -1022,7 +1022,7 @@ "keys": [ { "type": "GlobalReference", - "value": "http://acplt.org/Properties/ExampleProperty" + "value": "http://acplt.org/Properties/ExamplePropertyOutput" } ] }, @@ -1044,7 +1044,7 @@ "inoutputVariables": [ { "value": { - "idShort": "ExampleProperty", + "idShort": "ExamplePropertyInOutput", "displayName": [ { "language": "en-US", @@ -1072,7 +1072,7 @@ "keys": [ { "type": "GlobalReference", - "value": "http://acplt.org/Properties/ExampleProperty" + "value": "http://acplt.org/Properties/ExamplePropertyInOutput" } ] }, @@ -1975,7 +1975,7 @@ "inputVariables": [ { "value": { - "idShort": "ExampleProperty", + "idShort": "ExamplePropertyInput", "displayName": [ { "language": "en-US", @@ -2003,7 +2003,7 @@ "keys": [ { "type": "GlobalReference", - "value": "http://acplt.org/Properties/ExampleProperty" + "value": "http://acplt.org/Properties/ExamplePropertyInput" } ] }, @@ -2025,7 +2025,7 @@ "outputVariables": [ { "value": { - "idShort": "ExampleProperty", + "idShort": "ExamplePropertyOutput", "displayName": [ { "language": "en-US", @@ -2053,7 +2053,7 @@ "keys": [ { "type": "GlobalReference", - "value": "http://acplt.org/Properties/ExampleProperty" + "value": "http://acplt.org/Properties/ExamplePropertyOutput" } ] }, @@ -2075,7 +2075,7 @@ "inoutputVariables": [ { "value": { - "idShort": "ExampleProperty", + "idShort": "ExamplePropertyInOutput", "displayName": [ { "language": "en-US", @@ -2103,7 +2103,7 @@ "keys": [ { "type": "GlobalReference", - "value": "http://acplt.org/Properties/ExampleProperty" + "value": "http://acplt.org/Properties/ExamplePropertyInOutput" } ] }, @@ -2567,7 +2567,7 @@ "inputVariables": [ { "value": { - "idShort": "ExampleProperty", + "idShort": "ExamplePropertyInput", "category": "CONSTANT", "description": [ { @@ -2585,7 +2585,7 @@ "keys": [ { "type": "GlobalReference", - "value": "http://acplt.org/Properties/ExampleProperty" + "value": "http://acplt.org/Properties/ExamplePropertyInput" } ] }, @@ -2598,7 +2598,7 @@ "outputVariables": [ { "value": { - "idShort": "ExampleProperty", + "idShort": "ExamplePropertyOutput", "category": "CONSTANT", "description": [ { @@ -2616,7 +2616,7 @@ "keys": [ { "type": "GlobalReference", - "value": "http://acplt.org/Properties/ExampleProperty" + "value": "http://acplt.org/Properties/ExamplePropertyOutput" } ] }, @@ -2629,7 +2629,7 @@ "inoutputVariables": [ { "value": { - "idShort": "ExampleProperty", + "idShort": "ExamplePropertyInOutput", "category": "CONSTANT", "description": [ { @@ -2647,7 +2647,7 @@ "keys": [ { "type": "GlobalReference", - "value": "http://acplt.org/Properties/ExampleProperty" + "value": "http://acplt.org/Properties/ExamplePropertyInOutput" } ] }, diff --git a/test/compliance_tool/files/test_demo_full_example.xml b/test/compliance_tool/files/test_demo_full_example.xml index dccbd55b0..953c2bc2a 100644 --- a/test/compliance_tool/files/test_demo_full_example.xml +++ b/test/compliance_tool/files/test_demo_full_example.xml @@ -827,7 +827,7 @@ CONSTANT - ExampleProperty + ExamplePropertyInput en-US @@ -854,7 +854,7 @@ GlobalReference - http://acplt.org/Properties/ExampleProperty + http://acplt.org/Properties/ExamplePropertyInput @@ -878,7 +878,7 @@ CONSTANT - ExampleProperty + ExamplePropertyOutput en-US @@ -905,7 +905,7 @@ GlobalReference - http://acplt.org/Properties/ExampleProperty + http://acplt.org/Properties/ExamplePropertyOutput @@ -929,7 +929,7 @@ CONSTANT - ExampleProperty + ExamplePropertyInOutput en-US @@ -956,7 +956,7 @@ GlobalReference - http://acplt.org/Properties/ExampleProperty + http://acplt.org/Properties/ExamplePropertyInOutput @@ -1848,7 +1848,7 @@ CONSTANT - ExampleProperty + ExamplePropertyInput en-US @@ -1875,7 +1875,7 @@ GlobalReference - http://acplt.org/Properties/ExampleProperty + http://acplt.org/Properties/ExamplePropertyInput @@ -1899,7 +1899,7 @@ CONSTANT - ExampleProperty + ExamplePropertyOutput en-US @@ -1926,7 +1926,7 @@ GlobalReference - http://acplt.org/Properties/ExampleProperty + http://acplt.org/Properties/ExamplePropertyOutput @@ -1950,7 +1950,7 @@ CONSTANT - ExampleProperty + ExamplePropertyInOutput en-US @@ -1977,7 +1977,7 @@ GlobalReference - http://acplt.org/Properties/ExampleProperty + http://acplt.org/Properties/ExamplePropertyInOutput @@ -2439,7 +2439,7 @@ CONSTANT - ExampleProperty + ExamplePropertyInput en-US @@ -2456,7 +2456,7 @@ GlobalReference - http://acplt.org/Properties/ExampleProperty + http://acplt.org/Properties/ExamplePropertyInput @@ -2470,7 +2470,7 @@ CONSTANT - ExampleProperty + ExamplePropertyOutput en-US @@ -2487,7 +2487,7 @@ GlobalReference - http://acplt.org/Properties/ExampleProperty + http://acplt.org/Properties/ExamplePropertyOutput @@ -2501,7 +2501,7 @@ CONSTANT - ExampleProperty + ExamplePropertyInOutput en-US @@ -2518,7 +2518,7 @@ GlobalReference - http://acplt.org/Properties/ExampleProperty + http://acplt.org/Properties/ExamplePropertyInOutput diff --git a/test/compliance_tool/files/test_demo_full_example_json_aasx/aasx/data.json b/test/compliance_tool/files/test_demo_full_example_json_aasx/aasx/data.json index 93d0e3eda..28dca800d 100644 --- a/test/compliance_tool/files/test_demo_full_example_json_aasx/aasx/data.json +++ b/test/compliance_tool/files/test_demo_full_example_json_aasx/aasx/data.json @@ -952,7 +952,7 @@ "inputVariables": [ { "value": { - "idShort": "ExampleProperty", + "idShort": "ExamplePropertyInput", "displayName": [ { "language": "en-US", @@ -980,7 +980,7 @@ "keys": [ { "type": "GlobalReference", - "value": "http://acplt.org/Properties/ExampleProperty" + "value": "http://acplt.org/Properties/ExamplePropertyInput" } ] }, @@ -1002,7 +1002,7 @@ "outputVariables": [ { "value": { - "idShort": "ExampleProperty", + "idShort": "ExamplePropertyOutput", "displayName": [ { "language": "en-US", @@ -1030,7 +1030,7 @@ "keys": [ { "type": "GlobalReference", - "value": "http://acplt.org/Properties/ExampleProperty" + "value": "http://acplt.org/Properties/ExamplePropertyOutput" } ] }, @@ -1052,7 +1052,7 @@ "inoutputVariables": [ { "value": { - "idShort": "ExampleProperty", + "idShort": "ExamplePropertyInOutput", "displayName": [ { "language": "en-US", @@ -1080,7 +1080,7 @@ "keys": [ { "type": "GlobalReference", - "value": "http://acplt.org/Properties/ExampleProperty" + "value": "http://acplt.org/Properties/ExamplePropertyInOutput" } ] }, @@ -1983,7 +1983,7 @@ "inputVariables": [ { "value": { - "idShort": "ExampleProperty", + "idShort": "ExamplePropertyInput", "displayName": [ { "language": "en-US", @@ -2011,7 +2011,7 @@ "keys": [ { "type": "GlobalReference", - "value": "http://acplt.org/Properties/ExampleProperty" + "value": "http://acplt.org/Properties/ExamplePropertyInput" } ] }, @@ -2033,7 +2033,7 @@ "outputVariables": [ { "value": { - "idShort": "ExampleProperty", + "idShort": "ExamplePropertyOutput", "displayName": [ { "language": "en-US", @@ -2061,7 +2061,7 @@ "keys": [ { "type": "GlobalReference", - "value": "http://acplt.org/Properties/ExampleProperty" + "value": "http://acplt.org/Properties/ExamplePropertyOutput" } ] }, @@ -2083,7 +2083,7 @@ "inoutputVariables": [ { "value": { - "idShort": "ExampleProperty", + "idShort": "ExamplePropertyInOutput", "displayName": [ { "language": "en-US", @@ -2111,7 +2111,7 @@ "keys": [ { "type": "GlobalReference", - "value": "http://acplt.org/Properties/ExampleProperty" + "value": "http://acplt.org/Properties/ExamplePropertyInOutput" } ] }, @@ -2575,7 +2575,7 @@ "inputVariables": [ { "value": { - "idShort": "ExampleProperty", + "idShort": "ExamplePropertyInput", "category": "CONSTANT", "description": [ { @@ -2593,7 +2593,7 @@ "keys": [ { "type": "GlobalReference", - "value": "http://acplt.org/Properties/ExampleProperty" + "value": "http://acplt.org/Properties/ExamplePropertyInput" } ] }, @@ -2606,7 +2606,7 @@ "outputVariables": [ { "value": { - "idShort": "ExampleProperty", + "idShort": "ExamplePropertyOutput", "category": "CONSTANT", "description": [ { @@ -2624,7 +2624,7 @@ "keys": [ { "type": "GlobalReference", - "value": "http://acplt.org/Properties/ExampleProperty" + "value": "http://acplt.org/Properties/ExamplePropertyOutput" } ] }, @@ -2637,7 +2637,7 @@ "inoutputVariables": [ { "value": { - "idShort": "ExampleProperty", + "idShort": "ExamplePropertyInOutput", "category": "CONSTANT", "description": [ { @@ -2655,7 +2655,7 @@ "keys": [ { "type": "GlobalReference", - "value": "http://acplt.org/Properties/ExampleProperty" + "value": "http://acplt.org/Properties/ExamplePropertyInOutput" } ] }, diff --git a/test/compliance_tool/files/test_demo_full_example_wrong_attribute.json b/test/compliance_tool/files/test_demo_full_example_wrong_attribute.json index 4d05b2f55..0657301b9 100644 --- a/test/compliance_tool/files/test_demo_full_example_wrong_attribute.json +++ b/test/compliance_tool/files/test_demo_full_example_wrong_attribute.json @@ -680,7 +680,8 @@ "value": "http://acplt.org/ValueId/ExampleValueId" } ] - } + }, + "valueType": "xs:string" }, { "value": "exampleValue2", @@ -692,7 +693,8 @@ "value": "http://acplt.org/ValueId/ExampleValueId2" } ] - } + }, + "valueType": "xs:string" } ] }, @@ -942,7 +944,7 @@ "inputVariables": [ { "value": { - "idShort": "ExampleProperty", + "idShort": "ExamplePropertyInput", "displayName": [ { "language": "en-US", @@ -970,7 +972,7 @@ "keys": [ { "type": "GlobalReference", - "value": "http://acplt.org/Properties/ExampleProperty" + "value": "http://acplt.org/Properties/ExamplePropertyInput" } ] }, @@ -992,7 +994,7 @@ "outputVariables": [ { "value": { - "idShort": "ExampleProperty", + "idShort": "ExamplePropertyOutput", "displayName": [ { "language": "en-US", @@ -1020,7 +1022,7 @@ "keys": [ { "type": "GlobalReference", - "value": "http://acplt.org/Properties/ExampleProperty" + "value": "http://acplt.org/Properties/ExamplePropertyOutput" } ] }, @@ -1042,7 +1044,7 @@ "inoutputVariables": [ { "value": { - "idShort": "ExampleProperty", + "idShort": "ExamplePropertyInOutput", "displayName": [ { "language": "en-US", @@ -1070,7 +1072,7 @@ "keys": [ { "type": "GlobalReference", - "value": "http://acplt.org/Properties/ExampleProperty" + "value": "http://acplt.org/Properties/ExamplePropertyInOutput" } ] }, @@ -1973,7 +1975,7 @@ "inputVariables": [ { "value": { - "idShort": "ExampleProperty", + "idShort": "ExamplePropertyInput", "displayName": [ { "language": "en-US", @@ -2001,7 +2003,7 @@ "keys": [ { "type": "GlobalReference", - "value": "http://acplt.org/Properties/ExampleProperty" + "value": "http://acplt.org/Properties/ExamplePropertyInput" } ] }, @@ -2023,7 +2025,7 @@ "outputVariables": [ { "value": { - "idShort": "ExampleProperty", + "idShort": "ExamplePropertyOutput", "displayName": [ { "language": "en-US", @@ -2051,7 +2053,7 @@ "keys": [ { "type": "GlobalReference", - "value": "http://acplt.org/Properties/ExampleProperty" + "value": "http://acplt.org/Properties/ExamplePropertyOutput" } ] }, @@ -2073,7 +2075,7 @@ "inoutputVariables": [ { "value": { - "idShort": "ExampleProperty", + "idShort": "ExamplePropertyInOutput", "displayName": [ { "language": "en-US", @@ -2101,7 +2103,7 @@ "keys": [ { "type": "GlobalReference", - "value": "http://acplt.org/Properties/ExampleProperty" + "value": "http://acplt.org/Properties/ExamplePropertyInOutput" } ] }, @@ -2565,7 +2567,7 @@ "inputVariables": [ { "value": { - "idShort": "ExampleProperty", + "idShort": "ExamplePropertyInput", "category": "CONSTANT", "description": [ { @@ -2583,7 +2585,7 @@ "keys": [ { "type": "GlobalReference", - "value": "http://acplt.org/Properties/ExampleProperty" + "value": "http://acplt.org/Properties/ExamplePropertyInput" } ] }, @@ -2596,7 +2598,7 @@ "outputVariables": [ { "value": { - "idShort": "ExampleProperty", + "idShort": "ExamplePropertyOutput", "category": "CONSTANT", "description": [ { @@ -2614,7 +2616,7 @@ "keys": [ { "type": "GlobalReference", - "value": "http://acplt.org/Properties/ExampleProperty" + "value": "http://acplt.org/Properties/ExamplePropertyOutput" } ] }, @@ -2627,7 +2629,7 @@ "inoutputVariables": [ { "value": { - "idShort": "ExampleProperty", + "idShort": "ExamplePropertyInOutput", "category": "CONSTANT", "description": [ { @@ -2645,7 +2647,7 @@ "keys": [ { "type": "GlobalReference", - "value": "http://acplt.org/Properties/ExampleProperty" + "value": "http://acplt.org/Properties/ExamplePropertyInOutput" } ] }, diff --git a/test/compliance_tool/files/test_demo_full_example_wrong_attribute.xml b/test/compliance_tool/files/test_demo_full_example_wrong_attribute.xml index 4d3d5a561..0f9995991 100644 --- a/test/compliance_tool/files/test_demo_full_example_wrong_attribute.xml +++ b/test/compliance_tool/files/test_demo_full_example_wrong_attribute.xml @@ -827,7 +827,7 @@ CONSTANT - ExampleProperty + ExamplePropertyInput en-US @@ -854,7 +854,7 @@ GlobalReference - http://acplt.org/Properties/ExampleProperty + http://acplt.org/Properties/ExamplePropertyInput @@ -878,7 +878,7 @@ CONSTANT - ExampleProperty + ExamplePropertyOutput en-US @@ -905,7 +905,7 @@ GlobalReference - http://acplt.org/Properties/ExampleProperty + http://acplt.org/Properties/ExamplePropertyOutput @@ -929,7 +929,7 @@ CONSTANT - ExampleProperty + ExamplePropertyInOutput en-US @@ -956,7 +956,7 @@ GlobalReference - http://acplt.org/Properties/ExampleProperty + http://acplt.org/Properties/ExamplePropertyInOutput @@ -1848,7 +1848,7 @@ CONSTANT - ExampleProperty + ExamplePropertyInput en-US @@ -1875,7 +1875,7 @@ GlobalReference - http://acplt.org/Properties/ExampleProperty + http://acplt.org/Properties/ExamplePropertyInput @@ -1899,7 +1899,7 @@ CONSTANT - ExampleProperty + ExamplePropertyOutput en-US @@ -1926,7 +1926,7 @@ GlobalReference - http://acplt.org/Properties/ExampleProperty + http://acplt.org/Properties/ExamplePropertyOutput @@ -1950,7 +1950,7 @@ CONSTANT - ExampleProperty + ExamplePropertyInOutput en-US @@ -1977,7 +1977,7 @@ GlobalReference - http://acplt.org/Properties/ExampleProperty + http://acplt.org/Properties/ExamplePropertyInOutput @@ -2439,7 +2439,7 @@ CONSTANT - ExampleProperty + ExamplePropertyInput en-US @@ -2456,7 +2456,7 @@ GlobalReference - http://acplt.org/Properties/ExampleProperty + http://acplt.org/Properties/ExamplePropertyInput @@ -2470,7 +2470,7 @@ CONSTANT - ExampleProperty + ExamplePropertyOutput en-US @@ -2487,7 +2487,7 @@ GlobalReference - http://acplt.org/Properties/ExampleProperty + http://acplt.org/Properties/ExamplePropertyOutput @@ -2501,7 +2501,7 @@ CONSTANT - ExampleProperty + ExamplePropertyInOutput en-US @@ -2518,7 +2518,7 @@ GlobalReference - http://acplt.org/Properties/ExampleProperty + http://acplt.org/Properties/ExamplePropertyInOutput diff --git a/test/compliance_tool/files/test_demo_full_example_xml_aasx/aasx/data.xml b/test/compliance_tool/files/test_demo_full_example_xml_aasx/aasx/data.xml index 6ba3cc9c5..2c864dfff 100644 --- a/test/compliance_tool/files/test_demo_full_example_xml_aasx/aasx/data.xml +++ b/test/compliance_tool/files/test_demo_full_example_xml_aasx/aasx/data.xml @@ -835,7 +835,7 @@ CONSTANT - ExampleProperty + ExamplePropertyInput en-US @@ -862,7 +862,7 @@ GlobalReference - http://acplt.org/Properties/ExampleProperty + http://acplt.org/Properties/ExamplePropertyInput @@ -886,7 +886,7 @@ CONSTANT - ExampleProperty + ExamplePropertyOutput en-US @@ -913,7 +913,7 @@ GlobalReference - http://acplt.org/Properties/ExampleProperty + http://acplt.org/Properties/ExamplePropertyOutput @@ -937,7 +937,7 @@ CONSTANT - ExampleProperty + ExamplePropertyInOutput en-US @@ -964,7 +964,7 @@ GlobalReference - http://acplt.org/Properties/ExampleProperty + http://acplt.org/Properties/ExamplePropertyInOutput @@ -1856,7 +1856,7 @@ CONSTANT - ExampleProperty + ExamplePropertyInput en-US @@ -1883,7 +1883,7 @@ GlobalReference - http://acplt.org/Properties/ExampleProperty + http://acplt.org/Properties/ExamplePropertyInput @@ -1907,7 +1907,7 @@ CONSTANT - ExampleProperty + ExamplePropertyOutput en-US @@ -1934,7 +1934,7 @@ GlobalReference - http://acplt.org/Properties/ExampleProperty + http://acplt.org/Properties/ExamplePropertyOutput @@ -1958,7 +1958,7 @@ CONSTANT - ExampleProperty + ExamplePropertyInOutput en-US @@ -1985,7 +1985,7 @@ GlobalReference - http://acplt.org/Properties/ExampleProperty + http://acplt.org/Properties/ExamplePropertyInOutput @@ -2447,7 +2447,7 @@ CONSTANT - ExampleProperty + ExamplePropertyInput en-US @@ -2464,7 +2464,7 @@ GlobalReference - http://acplt.org/Properties/ExampleProperty + http://acplt.org/Properties/ExamplePropertyInput @@ -2478,7 +2478,7 @@ CONSTANT - ExampleProperty + ExamplePropertyOutput en-US @@ -2495,7 +2495,7 @@ GlobalReference - http://acplt.org/Properties/ExampleProperty + http://acplt.org/Properties/ExamplePropertyOutput @@ -2509,7 +2509,7 @@ CONSTANT - ExampleProperty + ExamplePropertyInOutput en-US @@ -2526,7 +2526,7 @@ GlobalReference - http://acplt.org/Properties/ExampleProperty + http://acplt.org/Properties/ExamplePropertyInOutput diff --git a/test/compliance_tool/files/test_demo_full_example_xml_wrong_attribute_aasx/aasx/data.xml b/test/compliance_tool/files/test_demo_full_example_xml_wrong_attribute_aasx/aasx/data.xml index 1ce64e565..30ebd5789 100644 --- a/test/compliance_tool/files/test_demo_full_example_xml_wrong_attribute_aasx/aasx/data.xml +++ b/test/compliance_tool/files/test_demo_full_example_xml_wrong_attribute_aasx/aasx/data.xml @@ -835,7 +835,7 @@ CONSTANT - ExampleProperty + ExamplePropertyInput en-US @@ -862,7 +862,7 @@ GlobalReference - http://acplt.org/Properties/ExampleProperty + http://acplt.org/Properties/ExamplePropertyInput @@ -886,7 +886,7 @@ CONSTANT - ExampleProperty + ExamplePropertyOutput en-US @@ -913,7 +913,7 @@ GlobalReference - http://acplt.org/Properties/ExampleProperty + http://acplt.org/Properties/ExamplePropertyOutput @@ -937,7 +937,7 @@ CONSTANT - ExampleProperty + ExamplePropertyInOutput en-US @@ -964,7 +964,7 @@ GlobalReference - http://acplt.org/Properties/ExampleProperty + http://acplt.org/Properties/ExamplePropertyInOutput @@ -1856,7 +1856,7 @@ CONSTANT - ExampleProperty + ExamplePropertyInput en-US @@ -1883,7 +1883,7 @@ GlobalReference - http://acplt.org/Properties/ExampleProperty + http://acplt.org/Properties/ExamplePropertyInput @@ -1907,7 +1907,7 @@ CONSTANT - ExampleProperty + ExamplePropertyOutput en-US @@ -1934,7 +1934,7 @@ GlobalReference - http://acplt.org/Properties/ExampleProperty + http://acplt.org/Properties/ExamplePropertyOutput @@ -1958,7 +1958,7 @@ CONSTANT - ExampleProperty + ExamplePropertyInOutput en-US @@ -1985,7 +1985,7 @@ GlobalReference - http://acplt.org/Properties/ExampleProperty + http://acplt.org/Properties/ExamplePropertyInOutput @@ -2447,7 +2447,7 @@ CONSTANT - ExampleProperty + ExamplePropertyInput en-US @@ -2464,7 +2464,7 @@ GlobalReference - http://acplt.org/Properties/ExampleProperty + http://acplt.org/Properties/ExamplePropertyInput @@ -2478,7 +2478,7 @@ CONSTANT - ExampleProperty + ExamplePropertyOutput en-US @@ -2495,7 +2495,7 @@ GlobalReference - http://acplt.org/Properties/ExampleProperty + http://acplt.org/Properties/ExamplePropertyOutput @@ -2509,7 +2509,7 @@ CONSTANT - ExampleProperty + ExamplePropertyInOutput en-US @@ -2526,7 +2526,7 @@ GlobalReference - http://acplt.org/Properties/ExampleProperty + http://acplt.org/Properties/ExamplePropertyInOutput