From 4b3f5d53224d04eee13d8c4434a4fef930480f35 Mon Sep 17 00:00:00 2001 From: martaf Date: Thu, 21 Mar 2024 17:09:45 +0100 Subject: [PATCH 01/16] removed es6numberserializer, jsoncanonicalizer --- src/AasxPackageExplorer.sln | 66 -------------------- src/AasxPackageLogic/AasxPackageLogic.csproj | 1 - 2 files changed, 67 deletions(-) diff --git a/src/AasxPackageExplorer.sln b/src/AasxPackageExplorer.sln index f6856e50d..637893148 100644 --- a/src/AasxPackageExplorer.sln +++ b/src/AasxPackageExplorer.sln @@ -129,10 +129,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxFileServerRestLibrary", EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxBammRdfImExport", "AasxBammRdfImExport\AasxBammRdfImExport.csproj", "{00F5EA49-F66D-4104-A621-AF668DD58C05}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "jsoncanonicalizer", "jsoncanonicalizer\jsoncanonicalizer.csproj", "{A713E962-38FB-4FD0-9687-30F530E95E91}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "es6numberserializer", "es6numberserializer\es6numberserializer.csproj", "{AB60370B-DC87-414D-8A6C-7B095F940A1B}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Setup", "Setup", "{5BA4D327-1907-4F5A-BC90-5EA939497BFC}" EndProject Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "AasxPackageExplorerSetup", "AASXPackageExplorerSetup\AasxPackageExplorerSetup.wixproj", "{8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}" @@ -1640,66 +1636,6 @@ Global {00F5EA49-F66D-4104-A621-AF668DD58C05}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU {00F5EA49-F66D-4104-A621-AF668DD58C05}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU {00F5EA49-F66D-4104-A621-AF668DD58C05}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.Debug|x64.ActiveCfg = Debug|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.Debug|x64.Build.0 = Debug|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.Debug|x86.ActiveCfg = Debug|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.Debug|x86.Build.0 = Debug|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.DebugSlow|x64.ActiveCfg = Debug|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.DebugSlow|x64.Build.0 = Debug|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.DebugSlow|x86.ActiveCfg = Debug|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.DebugSlow|x86.Build.0 = Debug|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.Release|Any CPU.Build.0 = Release|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.Release|x64.ActiveCfg = Release|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.Release|x64.Build.0 = Release|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.Release|x86.ActiveCfg = Release|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.Release|x86.Build.0 = Release|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {A713E962-38FB-4FD0-9687-30F530E95E91}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.Debug|x64.ActiveCfg = Debug|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.Debug|x64.Build.0 = Debug|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.Debug|x86.ActiveCfg = Debug|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.Debug|x86.Build.0 = Debug|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.DebugSlow|x64.ActiveCfg = Debug|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.DebugSlow|x64.Build.0 = Debug|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.DebugSlow|x86.ActiveCfg = Debug|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.DebugSlow|x86.Build.0 = Debug|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.Release|Any CPU.Build.0 = Release|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.Release|x64.ActiveCfg = Release|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.Release|x64.Build.0 = Release|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.Release|x86.ActiveCfg = Release|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.Release|x86.Build.0 = Release|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {AB60370B-DC87-414D-8A6C-7B095F940A1B}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.Debug|Any CPU.ActiveCfg = Debug|x86 {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.Debug|x64.ActiveCfg = Debug|x86 {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}.Debug|x86.ActiveCfg = Debug|x86 @@ -1987,8 +1923,6 @@ Global {4B7BB0FD-0025-4B9F-AE2E-DA3467DBB40A} = {DDA9C372-F8ED-4099-A53C-01B9333FD985} {6BBAE5AF-8993-48D7-A80C-AA9550EE49D6} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} {00F5EA49-F66D-4104-A621-AF668DD58C05} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} - {A713E962-38FB-4FD0-9687-30F530E95E91} = {98C89299-C429-4F0B-9938-4B7775943393} - {AB60370B-DC87-414D-8A6C-7B095F940A1B} = {98C89299-C429-4F0B-9938-4B7775943393} {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34} = {5BA4D327-1907-4F5A-BC90-5EA939497BFC} {4EB64F40-1A01-46BB-BEED-D1A75313C7F8} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} {BE68E42C-28CB-4298-9F34-A18AF92FC4DE} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} diff --git a/src/AasxPackageLogic/AasxPackageLogic.csproj b/src/AasxPackageLogic/AasxPackageLogic.csproj index fea93b71c..9592063c6 100644 --- a/src/AasxPackageLogic/AasxPackageLogic.csproj +++ b/src/AasxPackageLogic/AasxPackageLogic.csproj @@ -50,7 +50,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/AasxCsharpLib_bkp/Resources/schemaV201/AAS_ABAC.xsd b/src/AasxCsharpLib_bkp/Resources/schemaV201/AAS_ABAC.xsd deleted file mode 100644 index 4048a5746..000000000 --- a/src/AasxCsharpLib_bkp/Resources/schemaV201/AAS_ABAC.xsd +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLib_bkp/Resources/schemaV201/IEC61360.xsd b/src/AasxCsharpLib_bkp/Resources/schemaV201/IEC61360.xsd deleted file mode 100644 index d52f04f1e..000000000 --- a/src/AasxCsharpLib_bkp/Resources/schemaV201/IEC61360.xsd +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/AasxCsharpLib_bkp/Resources/schemaV201/aas.json b/src/AasxCsharpLib_bkp/Resources/schemaV201/aas.json deleted file mode 100644 index 9583c2b1f..000000000 --- a/src/AasxCsharpLib_bkp/Resources/schemaV201/aas.json +++ /dev/null @@ -1,1148 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2019-09/schema", - "title": "AssetAdministrationShellEnvironment", - "$id": "http://www.admin-shell.io/schema/json/v2.0.1", - "type": "object", - "required": ["assetAdministrationShells", "submodels", "assets", "conceptDescriptions"], - "properties": { - "assetAdministrationShells": { - "type": "array", - "items": { - "$ref": "#/definitions/AssetAdministrationShell" - } - }, - "submodels": { - "type": "array", - "items": { - "$ref": "#/definitions/Submodel" - } - }, - "assets": { - "type": "array", - "items": { - "$ref": "#/definitions/Asset" - } - }, - "conceptDescriptions": { - "type": "array", - "items": { - "$ref": "#/definitions/ConceptDescription" - } - } - }, - "definitions": { - "Referable": { - "type": "object", - "properties": { - "idShort": { - "type": "string" - }, - "category": { - "type": "string" - }, - "description": { - "type": "array", - "items": { - "$ref": "#/definitions/LangString" - } - }, - "parent": { - "$ref": "#/definitions/Reference" - }, - "modelType": { - "$ref": "#/definitions/ModelType" - } - }, - "required": [ "idShort", "modelType" ] - }, - "Identifiable": { - "allOf": [ - { "$ref": "#/definitions/Referable" }, - { "properties": { - "identification": { - "$ref": "#/definitions/Identifier" - }, - "administration": { - "$ref": "#/definitions/AdministrativeInformation" - } - }, - "required": [ "identification" ] - } - ] - }, - "Qualifiable": { - "type": "object", - "properties": { - "qualifiers": { - "type": "array", - "items": { - "$ref": "#/definitions/Constraint" - } - } - } - }, - "HasSemantics": { - "type": "object", - "properties": { - "semanticId": { - "$ref": "#/definitions/Reference" - } - } - }, - "HasDataSpecification": { - "type": "object", - "properties": { - "embeddedDataSpecifications": { - "type": "array", - "items": { - "$ref": "#/definitions/EmbeddedDataSpecification" - } - } - } - }, - "AssetAdministrationShell": { - "allOf": [ - { "$ref": "#/definitions/Identifiable" }, - { "$ref": "#/definitions/HasDataSpecification" }, - { "properties": { - "derivedFrom": { - "$ref": "#/definitions/Reference" - }, - "asset": { - "$ref": "#/definitions/Reference" - }, - "submodels": { - "type": "array", - "items": { - "$ref": "#/definitions/Reference" - } - }, - "views": { - "type": "array", - "items": { - "$ref": "#/definitions/View" - } - }, - "conceptDictionaries": { - "type": "array", - "items": { - "$ref": "#/definitions/ConceptDictionary" - } - }, - "security": { - "$ref": "#/definitions/Security" - } - }, - "required": [ "asset" ] - } - ] - }, - "Identifier": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "idType": { - "$ref": "#/definitions/KeyType" - } - }, - "required": [ "id", "idType" ] - }, - "KeyType": { - "type": "string", - "enum": ["Custom", "IRDI", "IRI", "IdShort", "FragmentId"] - }, - "AdministrativeInformation": { - "type": "object", - "properties": { - "version": { - "type": "string" - }, - "revision": { - "type": "string" - } - } - }, - "LangString": { - "type": "object", - "properties": { - "language": { - "type": "string" - }, - "text": { - "type": "string" - } - }, - "required": [ "language", "text" ] - }, - "Reference": { - "type": "object", - "properties": { - "keys": { - "type": "array", - "items": { - "$ref": "#/definitions/Key" - } - } - }, - "required": [ "keys" ] - }, - "Key": { - "type": "object", - "properties": { - "type": { - "$ref": "#/definitions/KeyElements" - }, - "idType": { - "$ref": "#/definitions/KeyType" - }, - "value": { - "type": "string" - }, - "local": { - "type": "boolean" - } - }, - "required": [ "type", "idType", "value", "local" ] - }, - "KeyElements": { - "type": "string", - "enum": [ - "Asset", - "AssetAdministrationShell", - "ConceptDescription", - "Submodel", - "AccessPermissionRule", - "AnnotatedRelationshipElement", - "BasicEvent", - "Blob", - "Capability", - "ConceptDictionary", - "DataElement", - "File", - "Entity", - "Event", - "MultiLanguageProperty", - "Operation", - "Property", - "Range", - "ReferenceElement", - "RelationshipElement", - "SubmodelElement", - "SubmodelElementCollection", - "View", - "GlobalReference", - "FragmentReference" - ] - }, - "ModelTypes": { - "type": "string", - "enum": [ - "Asset", - "AssetAdministrationShell", - "ConceptDescription", - "Submodel", - "AccessPermissionRule", - "AnnotatedRelationshipElement", - "BasicEvent", - "Blob", - "Capability", - "ConceptDictionary", - "DataElement", - "File", - "Entity", - "Event", - "MultiLanguageProperty", - "Operation", - "Property", - "Range", - "ReferenceElement", - "RelationshipElement", - "SubmodelElement", - "SubmodelElementCollection", - "View", - "GlobalReference", - "FragmentReference", - "Constraint", - "Formula", - "Qualifier" - ] - }, - "ModelType": { - "type": "object", - "properties": { - "name": { - "$ref": "#/definitions/ModelTypes" - } - }, - "required": [ "name" ] - }, - "EmbeddedDataSpecification": { - "type": "object", - "properties": { - "dataSpecification": { - "$ref": "#/definitions/Reference" - }, - "dataSpecificationContent": { - "$ref": "#/definitions/DataSpecificationContent" - } - }, - "required": [ "dataSpecification", "dataSpecificationContent" ] - }, - "DataSpecificationContent": { - "oneOf": [ - { "$ref": "#/definitions/DataSpecificationIEC61360Content" }, - { "$ref": "#/definitions/DataSpecificationPhysicalUnitContent" } - ] - }, - "DataSpecificationPhysicalUnitContent": { - "type": "object", - "properties": { - "unitName": { - "type": "string" - }, - "unitSymbol": { - "type": "string" - }, - "definition": { - "type": "array", - "items": { - "$ref": "#/definitions/LangString" - } - }, - "siNotation": { - "type": "string" - }, - "siName": { - "type": "string" - }, - "dinNotation": { - "type": "string" - }, - "eceName": { - "type": "string" - }, - "eceCode": { - "type": "string" - }, - "nistName": { - "type": "string" - }, - "sourceOfDefinition": { - "type": "string" - }, - "conversionFactor": { - "type": "string" - }, - "registrationAuthorityId": { - "type": "string" - }, - "supplier": { - "type": "string" - } - }, - "required": [ "unitName", "unitSymbol", "definition" ] - }, - "DataSpecificationIEC61360Content": { - "allOf": [ - { "$ref": "#/definitions/ValueObject" }, - { - "type": "object", - "properties": { - "dataType": { - "enum": [ - "DATE", - "STRING", - "STRING_TRANSLATABLE", - "REAL_MEASURE", - "REAL_COUNT", - "REAL_CURRENCY", - "BOOLEAN", - "URL", - "RATIONAL", - "RATIONAL_MEASURE", - "TIME", - "TIMESTAMP", - "INTEGER_COUNT", - "INTEGER_MEASURE", - "INTEGER_CURRENCY" - ] - }, - "definition": { - "type": "array", - "items": { - "$ref": "#/definitions/LangString" - } - }, - "preferredName": { - "type": "array", - "items": { - "$ref": "#/definitions/LangString" - } - }, - "shortName": { - "type": "array", - "items": { - "$ref": "#/definitions/LangString" - } - }, - "sourceOfDefinition": { - "type": "string" - }, - "symbol": { - "type": "string" - }, - "unit": { - "type": "string" - }, - "unitId": { - "$ref": "#/definitions/Reference" - }, - "valueFormat": { - "type": "string" - }, - "valueList": { - "$ref": "#/definitions/ValueList" - }, - "levelType": { - "type": "array", - "items": { - "$ref": "#/definitions/LevelType" - } - } - }, - "required": [ "preferredName" ] - } - ] - }, - "LevelType": { - "type": "string", - "enum": [ "Min", "Max", "Nom", "Typ" ] - }, - "ValueList": { - "type": "object", - "properties": { - "valueReferencePairTypes": { - "type": "array", - "minItems": 1, - "items": { - "$ref": "#/definitions/ValueReferencePairType" - } - } - }, - "required": [ "valueReferencePairTypes" ] - }, - "ValueReferencePairType": { - "allOf": [ - { "$ref": "#/definitions/ValueObject" } - ] - }, - "ValueObject": { - "type": "object", - "properties": { - "value": { "type": "string" }, - "valueId": { - "$ref": "#/definitions/Reference" - }, - "valueType": { - "type": "string", - "enum": [ - "anyUri", - "base64Binary", - "boolean", - "date", - "dateTime", - "dateTimeStamp", - "decimal", - "integer", - "long", - "int", - "short", - "byte", - "nonNegativeInteger", - "positiveInteger", - "unsignedLong", - "unsignedInt", - "unsignedShort", - "unsignedByte", - "nonPositiveInteger", - "negativeInteger", - "double", - "duration", - "dayTimeDuration", - "yearMonthDuration", - "float", - "gDay", - "gMonth", - "gMonthDay", - "gYear", - "gYearMonth", - "hexBinary", - "NOTATION", - "QName", - "string", - "normalizedString", - "token", - "language", - "Name", - "NCName", - "ENTITY", - "ID", - "IDREF", - "NMTOKEN", - "time" - ]} - } - }, - "Asset": { - "allOf": [ - { "$ref": "#/definitions/Identifiable" }, - { "$ref": "#/definitions/HasDataSpecification" }, - { "properties": { - "kind": { - "$ref": "#/definitions/AssetKind" - }, - "assetIdentificationModel": { - "$ref": "#/definitions/Reference" - }, - "billOfMaterial": { - "$ref": "#/definitions/Reference" - } - }, - "required": [ "kind" ] - } - ] - }, - "AssetKind": { - "type": "string", - "enum": ["Type", "Instance"] - }, - "ModelingKind": { - "type": "string", - "enum": ["Template", "Instance"] - }, - "Submodel": { - "allOf": [ - { "$ref": "#/definitions/Identifiable" }, - { "$ref": "#/definitions/HasDataSpecification" }, - { "$ref": "#/definitions/Qualifiable" }, - { "$ref": "#/definitions/HasSemantics" }, - { "properties": { - "kind": { - "$ref": "#/definitions/ModelingKind" - }, - "submodelElements": { - "type": "array", - "items": { - "$ref": "#/definitions/SubmodelElement" - } - } - } - } - ] - }, - "Constraint": { - "type": "object", - "properties": { - "modelType": { - "$ref": "#/definitions/ModelType" - } - }, - "required": [ "modelType" ] - }, - "Operation": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" }, - { "properties": { - "inputVariable": { - "type": "array", - "items": { - "$ref": "#/definitions/OperationVariable" - } - }, - "outputVariable": { - "type": "array", - "items": { - "$ref": "#/definitions/OperationVariable" - } - }, - "inoutputVariable": { - "type": "array", - "items": { - "$ref": "#/definitions/OperationVariable" - } - } - } - } - ] - }, - "OperationVariable": { - "type": "object", - "properties": { - "value": { - "oneOf": [ - { "$ref": "#/definitions/Blob" }, - { "$ref": "#/definitions/File" }, - { "$ref": "#/definitions/Capability" }, - { "$ref": "#/definitions/Entity" }, - { "$ref": "#/definitions/Event" }, - { "$ref": "#/definitions/BasicEvent" }, - { "$ref": "#/definitions/MultiLanguageProperty" }, - { "$ref": "#/definitions/Operation" }, - { "$ref": "#/definitions/Property" }, - { "$ref": "#/definitions/Range" }, - { "$ref": "#/definitions/ReferenceElement" }, - { "$ref": "#/definitions/RelationshipElement" }, - { "$ref": "#/definitions/SubmodelElementCollection" } - ] - } - }, - "required": [ "value" ] - }, - "SubmodelElement": { - "allOf": [ - { "$ref": "#/definitions/Referable" }, - { "$ref": "#/definitions/HasDataSpecification" }, - { "$ref": "#/definitions/HasSemantics" }, - { "$ref": "#/definitions/Qualifiable" }, - { "properties": { - "kind": { - "$ref": "#/definitions/ModelingKind" - } - } - } - ] - }, - "Event": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" } - ] - }, - "BasicEvent": { - "allOf": [ - { "$ref": "#/definitions/Event" }, - { "properties": { - "observed": { - "$ref": "#/definitions/Reference" - } - }, - "required": [ "observed" ] - } - ] - }, - "EntityType": { - "type": "string", - "enum": ["CoManagedEntity", "SelfManagedEntity"] - }, - "Entity": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" }, - { "properties": { - "statements": { - "type": "array", - "items": { - "$ref": "#/definitions/SubmodelElement" - } - }, - "entityType": { - "$ref": "#/definitions/EntityType" - }, - "asset": { - "$ref": "#/definitions/Reference" - } - }, - "required": [ "entityType" ] - } - ] - }, - "View": { - "allOf": [ - { "$ref": "#/definitions/Referable" }, - { "$ref": "#/definitions/HasDataSpecification" }, - { "$ref": "#/definitions/HasSemantics" }, - { "properties": { - "containedElements": { - "type": "array", - "items": { - "$ref": "#/definitions/Reference" - } - } - } - } - ] - }, - "ConceptDictionary": { - "allOf": [ - { "$ref": "#/definitions/Referable" }, - { "$ref": "#/definitions/HasDataSpecification" }, - { "properties": { - "conceptDescriptions": { - "type": "array", - "items": { - "$ref": "#/definitions/Reference" - } - } - } - } - ] - }, - "ConceptDescription": { - "allOf": [ - { "$ref": "#/definitions/Identifiable" }, - { "$ref": "#/definitions/HasDataSpecification" }, - { "properties": { - "isCaseOf": { - "type": "array", - "items": { - "$ref": "#/definitions/Reference" - } - } - } - } - ] - }, - "Capability": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" } - ] - }, - "Property": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" }, - { "$ref": "#/definitions/ValueObject" } - ] - }, - "Range": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" }, - { "properties": { - "valueType": { - "type": "string", - "enum": [ - "anyUri", - "base64Binary", - "boolean", - "date", - "dateTime", - "dateTimeStamp", - "decimal", - "integer", - "long", - "int", - "short", - "byte", - "nonNegativeInteger", - "positiveInteger", - "unsignedLong", - "unsignedInt", - "unsignedShort", - "unsignedByte", - "nonPositiveInteger", - "negativeInteger", - "double", - "duration", - "dayTimeDuration", - "yearMonthDuration", - "float", - "gDay", - "gMonth", - "gMonthDay", - "gYear", - "gYearMonth", - "hexBinary", - "NOTATION", - "QName", - "string", - "normalizedString", - "token", - "language", - "Name", - "NCName", - "ENTITY", - "ID", - "IDREF", - "NMTOKEN", - "time" - ] - }, - "min": { "type": "string" }, - "max": { "type": "string" } - }, - "required": [ "valueType"] - } - ] - }, - "MultiLanguageProperty": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" }, - { "properties": { - "value": { - "type": "array", - "items": { - "$ref": "#/definitions/LangString" - } - }, - "valueId": { - "$ref": "#/definitions/Reference" - } - } - } - ] - }, - "File": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" }, - { "properties": { - "value": { - "type": "string" - }, - "mimeType": { - "type": "string" - } - }, - "required": [ "mimeType" ] - } - ] - }, - "Blob": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" }, - { "properties": { - "value": { - "type": "string" - }, - "mimeType": { - "type": "string" - } - }, - "required": [ "mimeType" ] - } - ] - }, - "ReferenceElement": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" }, - { "properties": { - "value": { - "$ref": "#/definitions/Reference" - } - } - } - ] - }, - "SubmodelElementCollection": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" }, - { "properties": { - "value": { - "type": "array", - "items": { - "oneOf": [ - { "$ref": "#/definitions/Blob" }, - { "$ref": "#/definitions/File" }, - { "$ref": "#/definitions/Capability" }, - { "$ref": "#/definitions/Entity" }, - { "$ref": "#/definitions/Event" }, - { "$ref": "#/definitions/BasicEvent" }, - { "$ref": "#/definitions/MultiLanguageProperty" }, - { "$ref": "#/definitions/Operation" }, - { "$ref": "#/definitions/Property" }, - { "$ref": "#/definitions/Range" }, - { "$ref": "#/definitions/ReferenceElement" }, - { "$ref": "#/definitions/RelationshipElement" }, - { "$ref": "#/definitions/SubmodelElementCollection" } - ] - } - }, - "allowDuplicates": { - "type": "boolean" - }, - "ordered": { - "type": "boolean" - } - } - } - ] - }, - "RelationshipElement": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" }, - { "properties": { - "first": { - "$ref": "#/definitions/Reference" - }, - "second": { - "$ref": "#/definitions/Reference" - } - }, - "required": [ "first", "second" ] - } - ] - }, - "AnnotatedRelationshipElement": { - "allOf": [ - { "$ref": "#/definitions/RelationshipElement" }, - { "properties": { - "annotation": { - "type": "array", - "items": { - "oneOf": [ - { "$ref": "#/definitions/Blob" }, - { "$ref": "#/definitions/File" }, - { "$ref": "#/definitions/MultiLanguageProperty" }, - { "$ref": "#/definitions/Property" }, - { "$ref": "#/definitions/Range" }, - { "$ref": "#/definitions/ReferenceElement" } - ] - } - } - } - } - ] - }, - "Qualifier": { - "allOf": [ - { "$ref": "#/definitions/Constraint" }, - { "$ref": "#/definitions/HasSemantics" }, - { "$ref": "#/definitions/ValueObject" }, - { "properties": { - "type": { - "type": "string" - } - }, - "required": [ "type" ] - } - ] - }, - "Formula": { - "allOf": [ - { "$ref": "#/definitions/Constraint" }, - { "properties": { - "dependsOn": { - "type": "array", - "items": { - "$ref": "#/definitions/Reference" - } - } - } - } - ] - }, - "Security": { - "type": "object", - "properties": { - "accessControlPolicyPoints": { - "$ref": "#/definitions/AccessControlPolicyPoints" - }, - "certificate": { - "type": "array", - "items": { - "oneOf": [ - { "$ref": "#/definitions/BlobCertificate" } - ] - } - }, - "requiredCertificateExtension": { - "type": "array", - "items": { - "$ref": "#/definitions/Reference" - } - } - }, - "required": [ "accessControlPolicyPoints" ] - }, - "Certificate": { - "type": "object" - }, - "BlobCertificate": { - "allOf": [ - { "$ref": "#/definitions/Certificate" }, - { "properties": { - "blobCertificate": { - "$ref": "#/definitions/Blob" - }, - "containedExtension": { - "type": "array", - "items": { - "$ref": "#/definitions/Reference" - } - }, - "lastCertificate": { - "type": "boolean" - } - } - } - ] - }, - "AccessControlPolicyPoints": { - "type": "object", - "properties": { - "policyAdministrationPoint": { - "$ref": "#/definitions/PolicyAdministrationPoint" - }, - "policyDecisionPoint": { - "$ref": "#/definitions/PolicyDecisionPoint" - }, - "policyEnforcementPoint": { - "$ref": "#/definitions/PolicyEnforcementPoint" - }, - "policyInformationPoints": { - "$ref": "#/definitions/PolicyInformationPoints" - } - }, - "required": [ "policyAdministrationPoint", "policyDecisionPoint", "policyEnforcementPoint" ] - }, - "PolicyAdministrationPoint": { - "type": "object", - "properties": { - "localAccessControl": { - "$ref": "#/definitions/AccessControl" - }, - "externalAccessControl": { - "type": "boolean" - } - }, - "required": [ "externalAccessControl" ] - }, - "PolicyInformationPoints": { - "type": "object", - "properties": { - "internalInformationPoint": { - "type": "array", - "items": { - "$ref": "#/definitions/Reference" - } - }, - "externalInformationPoint": { - "type": "boolean" - } - }, - "required": [ "externalInformationPoint" ] - }, - "PolicyEnforcementPoint": { - "type": "object", - "properties": { - "externalPolicyEnforcementPoint": { - "type": "boolean" - } - }, - "required": [ "externalPolicyEnforcementPoint" ] - }, - "PolicyDecisionPoint": { - "type": "object", - "properties": { - "externalPolicyDecisionPoints": { - "type": "boolean" - } - }, - "required": [ "externalPolicyDecisionPoints" ] - }, - "AccessControl": { - "type": "object", - "properties": { - "selectableSubjectAttributes": { - "$ref": "#/definitions/Reference" - }, - "defaultSubjectAttributes": { - "$ref": "#/definitions/Reference" - }, - "selectablePermissions": { - "$ref": "#/definitions/Reference" - }, - "defaultPermissions": { - "$ref": "#/definitions/Reference" - }, - "selectableEnvironmentAttributes": { - "$ref": "#/definitions/Reference" - }, - "defaultEnvironmentAttributes": { - "$ref": "#/definitions/Reference" - }, - "accessPermissionRule": { - "type": "array", - "items": { - "$ref": "#/definitions/AccessPermissionRule" - } - } - } - }, - "AccessPermissionRule": { - "allOf": [ - { "$ref": "#/definitions/Referable" }, - { "$ref": "#/definitions/Qualifiable" }, - { "properties": { - "targetSubjectAttributes": { - "type": "array", - "items": { - "$ref": "#/definitions/SubjectAttributes" - }, - "minItems": 1 - }, - "permissionsPerObject": { - "type": "array", - "items": { - "$ref": "#/definitions/PermissionsPerObject" - } - } - }, - "required": [ "targetSubjectAttributes" ] - } - ] - }, - "SubjectAttributes": { - "type": "object", - "properties": { - "subjectAttributes": { - "type": "array", - "items": { - "$ref": "#/definitions/Reference" - }, - "minItems": 1 - } - } - }, - "PermissionsPerObject": { - "type": "object", - "properties": { - "object": { - "$ref": "#/definitions/Reference" - }, - "targetObjectAttributes": { - "$ref": "#/definitions/ObjectAttributes" - }, - "permission": { - "type": "array", - "items": { - "$ref": "#/definitions/Permission" - } - } - } - }, - "ObjectAttributes": { - "type": "object", - "properties": { - "objectAttribute": { - "type": "array", - "items": { - "$ref": "#/definitions/Property" - }, - "minItems": 1 - } - } - }, - "Permission": { - "type": "object", - "properties": { - "permission": { - "$ref": "#/definitions/Reference" - }, - "kindOfPermission": { - "type": "string", - "enum": ["Allow", "Deny", "NotApplicable", "Undefined"] - } - }, - "required": [ "permission", "kindOfPermission" ] - } - } -} diff --git a/src/AasxCsharpLibrary.Tests/AasxCsharpLibrary.Tests.csproj b/src/AasxCsharpLibrary.Tests/AasxCsharpLibrary.Tests.csproj deleted file mode 100644 index 65684b16f..000000000 --- a/src/AasxCsharpLibrary.Tests/AasxCsharpLibrary.Tests.csproj +++ /dev/null @@ -1,24 +0,0 @@ - - - net6.0-windows - Library - false - 8 - false - - - - PreserveNewest - - - - - Always - - - - - - - - diff --git a/src/AasxCsharpLibrary.Tests/DocTestAdminShellUtil.cs b/src/AasxCsharpLibrary.Tests/DocTestAdminShellUtil.cs deleted file mode 100644 index e6bd57845..000000000 --- a/src/AasxCsharpLibrary.Tests/DocTestAdminShellUtil.cs +++ /dev/null @@ -1,67 +0,0 @@ -// This file was automatically generated by doctest-csharp. -// !!! DO NOT EDIT OR APPEND !!! - -using NUnit.Framework; - -namespace AdminShellNS.Tests -{ - public class DocTest_AdminShellUtil_cs - { - [Test] - public void AtLine40AndColumn12() - { - Assert.AreEqual("someName", AdminShellUtil.FilterFriendlyName("someName")); - } - - [Test] - public void AtLine41AndColumn12() - { - Assert.AreEqual("some__name", AdminShellUtil.FilterFriendlyName("some!;name")); - } - - [Test] - public void AtLine51AndColumn12() - { - Assert.IsFalse(AdminShellUtil.HasWhitespace("")); - } - - [Test] - public void AtLine52AndColumn12() - { - Assert.IsTrue(AdminShellUtil.HasWhitespace(" ")); - } - - [Test] - public void AtLine53AndColumn12() - { - Assert.IsTrue(AdminShellUtil.HasWhitespace("aa bb")); - } - - [Test] - public void AtLine54AndColumn12() - { - Assert.IsTrue(AdminShellUtil.HasWhitespace(" aabb")); - } - - [Test] - public void AtLine55AndColumn12() - { - Assert.IsTrue(AdminShellUtil.HasWhitespace("aabb ")); - } - - [Test] - public void AtLine56AndColumn12() - { - Assert.IsFalse(AdminShellUtil.HasWhitespace("aabb")); - } - - [Test] - public void AtLine68AndColumn12() - { - Assert.IsTrue(AdminShellUtil.ComplyIdShort("")); - } - } -} - -// This file was automatically generated by doctest-csharp. -// !!! DO NOT EDIT OR APPEND !!! diff --git a/src/AasxCsharpLibrary.Tests/LICENSE.txt b/src/AasxCsharpLibrary.Tests/LICENSE.txt deleted file mode 100644 index 75f36a4ff..000000000 --- a/src/AasxCsharpLibrary.Tests/LICENSE.txt +++ /dev/null @@ -1,1475 +0,0 @@ -Copyright (c) 2018-2023 Festo AG & Co. KG -, -author: Michael Hoffmeister - -Copyright (c) 2019-2021 PHOENIX CONTACT GmbH & Co. KG -, -author: Andreas Orzelski - -Copyright (c) 2019-2020 Fraunhofer IOSB-INA Lemgo, - eine rechtlich nicht selbstaendige Einrichtung der Fraunhofer-Gesellschaft - zur Foerderung der angewandten Forschung e.V. - -Copyright (c) 2020 Schneider Electric Automation GmbH -, -author: Marco Mendes - -Copyright (c) 2020 SICK AG - -Copyright (c) 2021 KEB Automation KG - -Copyright (c) 2021 Lenze SE -author: Jonas Grote, Denis Göllner, Sebastian Bischof - -The AASX Package Explorer is licensed under the Apache License 2.0 -(Apache-2.0, see below). - -The AASX Package Explorer is a sample application for demonstration of the -features of the Asset Administration Shell. -The implementation uses the concepts of the document "Details of the Asset -Administration Shell" published on www.plattform-i40.de which is licensed -under Creative Commons CC BY-ND 3.0 DE. - -When using eCl@ss or IEC CDD data, please check the corresponding license -conditions. - -------------------------------------------------------------------------------- - -The components below are used in AASX Package Explorer. -The related licenses are listed for information purposes only. -Some licenses may only apply to their related plugins. - -The browser functionality is licensed under the cefSharp license (see below). - -The Newtonsoft.JSON serialization is licensed under the MIT License -(MIT, see below). - -The QR code generation is licensed under the MIT license (MIT, see below). - -The Zxing.Net Dot Matrix Code (DMC) generation is licensed under -the Apache License 2.0 (Apache-2.0, see below). - -The Grapevine REST server framework is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The AutomationML.Engine is licensed under the MIT license (MIT, see below). - -The MQTT server and client is licensed under the MIT license (MIT, see below). - -The ClosedXML Excel reader/writer is licensed under the MIT license (MIT, -see below). - -The CountryFlag WPF control is licensed under the Code Project Open License -(CPOL, see below). - -The DocumentFormat.OpenXml SDK is licensed under the MIT license (MIT, -see below). - -The ExcelNumberFormat number parser is licensed under the MIT license (MIT, -see below). - -The FastMember reflection access is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The IdentityModel OpenID client is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The jose-jwt object signing and encryption is licensed under the -MIT license (MIT, see below). - -The ExcelDataReader is licensed under the MIT license (MIT, see below). - -Portions copyright (c) by OPC Foundation, Inc. and licensed under the -Reciprocal Community License (RCL, see below) - -The OPC UA Example Code of OPC UA Standard is licensed under the MIT license -(MIT, see below). - -The MSAGL (Microsoft Automatic Graph Layout) is licensed under the MIT license -(MIT, see below) - -Glob (https://www.nuget.org/packages/Glob/) is licensed under the MIT license -(MIT, see below). - -The Magick.NET library is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The SSharp.NET library (https://github.com/PetroProtsyk/SSharp) is licensed -under Apache License 2.0 (Apache-2.0, see below). - -------------------------------------------------------------------------------- - - -With respect to AASX Package Explorer -===================================== - -(http://www.apache.org/licenses/LICENSE-2.0) - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - -With respect to cefSharp -======================== - -(https://raw.githubusercontent.com/cefsharp/CefSharp/master/LICENSE) - -Copyright © The CefSharp Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - - * Neither the name of Google Inc. nor the name Chromium Embedded - Framework nor the name CefSharp nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -With respect to Newtonsoft.Json -=============================== - -(https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md) - -The MIT License (MIT) - -Copyright (c) 2007 James Newton-King - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -With respect to QRcoder -======================= - -(https://github.com/codebude/QRCoder/blob/master/LICENSE.txt) - -The MIT License (MIT) - -Copyright (c) 2013-2018 Raffael Herrmann - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -With respect to ZXing.Net -========================= -With respect to Grapevine -========================= -With respect to FastMember -========================== -With respect to IdentityModel -============================= - -(http://www.apache.org/licenses/LICENSE-2.0) - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - -With respect to AutomationML.Engine -=================================== - -(https://raw.githubusercontent.com/AutomationML/AMLEngine2.1/master/license.txt) - -The MIT License (MIT) - -Copyright 2017 AutomationML e.V. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - - -With respect to MQTTnet -======================= - -(https://github.com/chkr1011/MQTTnet/blob/master/LICENSE) - -MIT License - -MQTTnet Copyright (c) 2016-2019 Christian Kratky - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With resepct to ClosedXML -========================= - -(https://github.com/ClosedXML/ClosedXML/blob/develop/LICENSE) - -MIT License - -Copyright (c) 2016 ClosedXML - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With resepct to CountryFlag -=========================== - -(https://www.codeproject.com/Articles/190722/WPF-CountryFlag-Control) - -The Code Project Open License (CPOL) 1.02 - -Copyright © 2017 Meshack Musundi - -Preamble - -This License governs Your use of the Work. This License is intended to allow -developers to use the Source Code and Executable Files provided as part of -the Work in any application in any form. - -The main points subject to the terms of the License are: - - Source Code and Executable Files can be used in commercial applications; - Source Code and Executable Files can be redistributed; and - Source Code can be modified to create derivative works. - No claim of suitability, guarantee, or any warranty whatsoever is provided. - The software is provided "as-is". - The Article(s) accompanying the Work may not be distributed or republished - without the Author's consent - -This License is entered between You, the individual or other entity reading or -otherwise making use of the Work licensed pursuant to this License and the -individual or other entity which offers the Work under the terms of this -License ("Author"). - -License - -THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS -CODE PROJECT OPEN LICENSE ("LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT -AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED -UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. - -BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HEREIN, YOU ACCEPT AND AGREE -TO BE BOUND BY THE TERMS OF THIS LICENSE. THE AUTHOR GRANTS YOU THE RIGHTS -CONTAINED HEREIN IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND -CONDITIONS. IF YOU DO NOT AGREE TO ACCEPT AND BE BOUND BY THE TERMS OF THIS -LICENSE, YOU CANNOT MAKE ANY USE OF THE WORK. - -Definitions. - "Articles" means, collectively, all articles written by Author which -describes how the Source Code and Executable Files for the Work may -be used by a user. - "Author" means the individual or entity that offers the Work under -the terms of this License. - "Derivative Work" means a work based upon the Work or upon the Work -and other pre-existing works. - "Executable Files" refer to the executables, binary files, -configuration and any required data files included in the Work. - "Publisher" means the provider of the website, magazine, CD-ROM, -DVD or other medium from or by which the Work is obtained by You. - "Source Code" refers to the collection of source code and -configuration files used to create the Executable Files. - "Standard Version" refers to such a Work if it has not been modified, -or has been modified in accordance with the consent of the Author, -such consent being in the full discretion of the Author. - "Work" refers to the collection of files distributed by the Publisher, -including the Source Code, Executable Files, binaries, data files, -documentation, whitepapers and the Articles. - "You" is you, an individual or entity wishing to use the Work and -exercise your rights under this License. - -Fair Use/Fair Use Rights. Nothing in this License is intended to reduce, -limit, or restrict any rights arising from fair use, fair dealing, -first sale or other limitations on the exclusive rights of the -copyright owner under copyright law or other applicable laws. - -License Grant. Subject to the terms and conditions of this License, the -Author hereby grants You a worldwide, royalty-free, non-exclusive, -perpetual (for the duration of the applicable copyright) license -to exercise the rights in the Work as stated below: - You may use the standard version of the Source Code or Executable -Files in Your own applications. - You may apply bug fixes, portability fixes and other modifications -obtained from the Public Domain or from the Author. A Work modified -in such a way shall still be considered the standard version and will -be subject to this License. - You may otherwise modify Your copy of this Work (excluding the Articles) -in any way to create a Derivative Work, provided that You insert a prominent -notice in each changed file stating how, when and where You changed that file. - You may distribute the standard version of the Executable Files and Source -Code or Derivative Work in aggregate with other (possibly commercial) -programs as part of a larger (possibly commercial) software distribution. - The Articles discussing the Work published in any form by the author may -not be distributed or republished without the Author's consent. The author -retains copyright to any such Articles. You may use the Executable Files and -Source Code pursuant to this License but you may not repost or republish or -otherwise distribute or make available the Articles, without the prior written -consent of the Author. - -Any subroutines or modules supplied by You and linked into the Source Code -or Executable Files of this Work shall not be considered part of this Work -and will not be subject to the terms of this License. - -Patent License. Subject to the terms and conditions of this License, each -Author hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, -royalty-free, irrevocable (except as stated in this section) patent license -to make, have made, use, import, and otherwise transfer the Work. - -Restrictions. The license granted in Section 3 above is expressly made subject -to and limited by the following restrictions: - You agree not to remove any of the original copyright, patent, trademark, -and attribution notices and associated disclaimers that may appear in the -Source Code or Executable Files. - You agree not to advertise or in any way imply that this Work is a product -of Your own. - The name of the Author may not be used to endorse or promote products -derived from the Work without the prior written consent of the Author. - You agree not to sell, lease, or rent any part of the Work. This does -not restrict you from including the Work or any part of the Work inside -a larger software distribution that itself is being sold. The Work by itself, -though, cannot be sold, leased or rented. - You may distribute the Executable Files and Source Code only under the terms -of this License, and You must include a copy of, or the Uniform Resource -Identifier for, this License with every copy of the Executable Files or -Source Code You distribute and ensure that anyone receiving such Executable -Files and Source Code agrees that the terms of this License apply to such -Executable Files and/or Source Code. You may not offer or impose any terms -on the Work that alter or restrict the terms of this License or the -recipients' exercise of the rights granted hereunder. You may not sublicense -the Work. You must keep intact all notices that refer to this License and to -the disclaimer of warranties. You may not distribute the Executable Files or -Source Code with any technological measures that control access or use of the -Work in a manner inconsistent with the terms of this License. - You agree not to use the Work for illegal, immoral or improper -purposes, or on pages containing illegal, immoral or improper material. -The Work is subject to applicable export laws. You agree to comply with all -such laws and regulations that may apply to the Work after Your receipt of -the Work. - -Representations, Warranties and Disclaimer. THIS WORK IS PROVIDED "AS IS", -"WHERE IS" AND "AS AVAILABLE", WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES OR -CONDITIONS OR GUARANTEES. YOU, THE USER, ASSUME ALL RISK IN ITS USE, -INCLUDING COPYRIGHT INFRINGEMENT, PATENT INFRINGEMENT, SUITABILITY, ETC. -AUTHOR EXPRESSLY DISCLAIMS ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES -OR CONDITIONS, INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS -OF MERCHANTABILITY, MERCHANTABLE QUALITY OR FITNESS FOR A PARTICULAR -PURPOSE, OR ANY WARRANTY OF TITLE OR NON-INFRINGEMENT, OR THAT THE WORK -(OR ANY PORTION THEREOF) IS CORRECT, USEFUL, BUG-FREE OR FREE OF VIRUSES. -YOU MUST PASS THIS DISCLAIMER ON WHENEVER YOU DISTRIBUTE THE WORK OR DERIVATIVE -WORKS. - -Indemnity. You agree to defend, indemnify and hold harmless the Author and the -Publisher from and against any claims, suits, losses, damages, liabilities, -costs, and expenses (including reasonable legal or attorneys’ fees) -resulting from or relating to any use of the Work by You. - -Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, -IN NO EVENT WILL THE AUTHOR OR THE PUBLISHER BE LIABLE TO YOU ON ANY LEGAL -THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY -DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK OR OTHERWISE, -EVEN IF THE AUTHOR OR THE PUBLISHER HAS BEEN ADVISED OF THE POSSIBILITY -OF SUCH DAMAGES. - -Termination. - This License and the rights granted hereunder will terminate -automatically upon any breach by You of any term of this License. -Individuals or entities who have received Derivative Works from You under -this License, however, will not have their licenses terminated provided such -individuals or entities remain in full compliance with those licenses. -Sections 1, 2, 6, 7, 8, 9, 10 and 11 will survive any termination of -this License. - If You bring a copyright, trademark, patent or any other infringement -claim against any contributor over infringements You claim are made by the -Work, your License from such contributor to the Work ends automatically. - Subject to the above terms and conditions, this License is perpetual -(for the duration of the applicable copyright in the Work). -Notwithstanding the above, the Author reserves the right to release the Work -under different license terms or to stop distributing the Work at any time; -provided, however that any such election will not serve to withdraw this -License (or any other license that has been, or is required to be, -granted under the terms of this License), and this License will continue -in full force and effect unless terminated as stated above. - -Publisher. The parties hereby confirm that the Publisher shall not, under -any circumstances, be responsible for and shall not have any liability -in respect of the subject matter of this License. The Publisher makes no -warranty whatsoever in connection with the Work and shall not be liable -to You or any party on any legal theory for any damages whatsoever, including -without limitation any general, special, incidental or consequential damages -arising in connection to this license. The Publisher reserves the right to -cease making the Work available to You at any time without notice - -Miscellaneous - This License shall be governed by the laws of the location of the head -office of the Author or if the Author is an individual, the laws of -location of the principal place of residence of the Author. - If any provision of this License is invalid or unenforceable under -applicable law, it shall not affect the validity or enforceability of the -remainder of the terms of this License, and without further action by the -parties to this License, such provision shall be reformed to the minimum -extent necessary to make such provision valid and enforceable. - No term or provision of this License shall be deemed waived and no -breach consented to unless such waiver or consent shall be in writing -and signed by the party to be charged with such waiver or consent. - This License constitutes the entire agreement between the parties -with respect to the Work licensed herein. There are no understandings, -agreements or representations with respect to the Work not specified herein. -The Author shall not be bound by any additional provisions that may appear -in any communication from You. This License may not be modified without -the mutual written agreement of the Author and You. - - -With respect to DocumentFormat.OpenXml -====================================== - -(https://github.com/OfficeDev/Open-XML-SDK/blob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) Microsoft Corporation - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With respect to ExcelNumberFormat -================================= - -(https://github.com/andersnm/ExcelNumberFormat/blob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2017 andersnm - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With respect to jose-jwt -======================== - -(https://github.com/dvsekhvalnov/jose-jwt/blob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2014-2019 dvsekhvalnov - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -With resepect to ExcelDataReader -================================ - -(https://github.com/ExcelDataReader/ExcelDataReader/blob/develop/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2014 ExcelDataReader - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With resepect to OPC UA Example Code -==================================== - - * Copyright (c) 2005-2019 The OPC Foundation, Inc. All rights reserved. - * - * OPC Foundation MIT License 1.00 - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - * The complete license agreement can be found here: - * http://opcfoundation.org/License/MIT/1.00/ - - -With respect to OPC Foundation -============================== - -RCL License -Reciprocal Community License 1.00 (RCL1.00) -Version 1.00, June 24, 2009 -Copyright (C) 2008,2009 OPC Foundation, Inc., All Rights Reserved. - -https://opcfoundation.org/license/rcl.html - -Remark: PHOENIX CONTACT GmbH & Co. KG and Festo SE & Co. KG are members -of OPC foundation. - -With respect to MSAGL (Microsoft Automatic Graph Layout) -======================================================== -(see: https://github.com/microsoft/automatic-graph-layout/blob/master/LICENSE) - -Microsoft Automatic Graph Layout, MSAGL - -Copyright (c) Microsoft Corporation - -All rights reserved. - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -""Software""), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -With respect to Glob (https://www.nuget.org/packages/Glob/) -=========================================================== -(see: https://raw.githubusercontent.com/kthompson/glob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2013-2019 Kevin Thompson - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -With respect to Magick.NET -========================== - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - 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. - -With respect to SSharp.NET library -================================== - - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - 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. diff --git a/src/AasxCsharpLibrary.Tests/Properties/AssemblyInfo.cs b/src/AasxCsharpLibrary.Tests/Properties/AssemblyInfo.cs deleted file mode 100644 index e76309e43..000000000 --- a/src/AasxCsharpLibrary.Tests/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// Allgemeine Informationen über eine Assembly werden über die folgenden -// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, -// die einer Assembly zugeordnet sind. -[assembly: AssemblyTitle("AasxCsharpLibrary.TestsNew")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("AasxCsharpLibrary.TestsNew")] -[assembly: AssemblyCopyright("Copyright © 2020")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly -// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von -// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen. -[assembly: ComVisible(false)] - -// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird -[assembly: Guid("2f21feff-f0ef-40b5-ba05-09fc9f499ae9")] - -// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: -// -// Hauptversion -// Nebenversion -// Buildnummer -// Revision -// -// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, -// indem Sie "*" wie unten gezeigt eingeben: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/AasxCsharpLibrary.Tests/TemporaryDirectory.cs b/src/AasxCsharpLibrary.Tests/TemporaryDirectory.cs deleted file mode 100644 index 94c002bf0..000000000 --- a/src/AasxCsharpLibrary.Tests/TemporaryDirectory.cs +++ /dev/null @@ -1,23 +0,0 @@ -using IDisposable = System.IDisposable; - -namespace AdminShellNS.Tests -{ - class TemporaryDirectory : IDisposable - { - public readonly string Path; - - public TemporaryDirectory() - { - this.Path = System.IO.Path.Combine( - System.IO.Path.GetTempPath(), - System.IO.Path.GetRandomFileName()); - - System.IO.Directory.CreateDirectory(this.Path); - } - - public void Dispose() - { - System.IO.Directory.Delete(this.Path, true); - } - } -} diff --git a/src/AasxCsharpLibrary.Tests/TestAdminShellUtil.cs b/src/AasxCsharpLibrary.Tests/TestAdminShellUtil.cs deleted file mode 100644 index b6ce2eac3..000000000 --- a/src/AasxCsharpLibrary.Tests/TestAdminShellUtil.cs +++ /dev/null @@ -1,28 +0,0 @@ -using NUnit.Framework; - -namespace AdminShellNS.Tests -{ - // ReSharper disable UnusedType.Global - public class Test_EvalToNonNullString - { - [Test] - public void NonNull_Gives_Formatted() - { - var result = AdminShellNS.AdminShellUtil.EvalToNonNullString( - "some message: {0}", 1984, "something else"); - - Assert.That(result, Is.EqualTo("some message: 1984")); - } - - [Test] - public void Null_Gives_ElseString() - { - var result = AdminShellNS.AdminShellUtil.EvalToNonNullString( - "some message: {0}", null, "something else"); - - Assert.That(result, Is.EqualTo("something else")); - } - } - // ReSharper restore UnusedType.Global - -} diff --git a/src/AasxCsharpLibrary.Tests/TestAgainstAasCorePackage.cs b/src/AasxCsharpLibrary.Tests/TestAgainstAasCorePackage.cs deleted file mode 100644 index dfe5fc069..000000000 --- a/src/AasxCsharpLibrary.Tests/TestAgainstAasCorePackage.cs +++ /dev/null @@ -1,85 +0,0 @@ -using System; -using System.IO; -using System.Linq; -using System.Text; -using NUnit.Framework; - -namespace AdminShellNS.Tests -{ - public class TestAgainstAasCorePackage - { - /** - * Retrieve the bytes of the valid XML file 01_Festo.aasx.xml from the - * test resources. - */ - private static byte[] Get01FestoAasxXmlBytes() - { - string pth = Path.Combine( - TestContext.CurrentContext.TestDirectory, - "TestResources\\AasxCsharpLibrary.Tests\\XmlValidation\\expectedOk\\" + - "01_Festo.aasx.xml"); - - if (!File.Exists(pth)) - { - throw new FileNotFoundException( - $"Could not find the XML file: {pth}"); - } - - return File.ReadAllBytes(pth); - } - - [Test] - public void TestThatSupplementaryMaterialIsLoaded() - { - var packaging = new AasCore.Aas3.Package.Packaging(); - using var tmpDir = new TemporaryDirectory(); - - var pth = System.IO.Path.Combine(tmpDir.Path, "dummy.aasx"); - - var supplUri = new Uri( - "/aasx-suppl/some-company/some-manual.pdf", - UriKind.Relative); - - var supplContent = Encoding.UTF8.GetBytes("some content"); - - // Create a package - { - using var pkg = packaging.Create(pth); - - var spec = pkg.MakeSpec( - pkg.PutPart( - new Uri("/aasx/some-company/data.xml", UriKind.Relative), - "text/xml", - Get01FestoAasxXmlBytes())); - - pkg.RelateSupplementaryToSpec( - pkg.PutPart( - supplUri, - "application/pdf", - supplContent), - spec); - - pkg.Flush(); - } - - // Load the AASX using AasxCsharpLibrary - { - using var package = new AdminShellPackageEnv(pth); - - Assert.IsTrue(package.IsOpen); - - var lst = package.GetListOfSupplementaryFiles(); - - Assert.AreEqual(1, lst.Count); - var suppl = lst.First(); - Assert.AreEqual(supplUri, suppl.Uri); - Assert.AreEqual( - Encoding.UTF8.GetString(supplContent), - Encoding.UTF8.GetString( - package.GetByteArrayFromUriOrLocalPackage( - suppl.Uri.ToString())) - ); - } - } - } -} \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestLoadSaveChain.cs b/src/AasxCsharpLibrary.Tests/TestLoadSaveChain.cs deleted file mode 100644 index 48b7b66a9..000000000 --- a/src/AasxCsharpLibrary.Tests/TestLoadSaveChain.cs +++ /dev/null @@ -1,189 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Environment = System.Environment; -using InvalidOperationException = System.InvalidOperationException; -using Path = System.IO.Path; - -namespace AdminShellNS.Tests -{ - static class SamplesAasxDir - { - public static List ListAasxPaths() - { - var variable = "SAMPLE_AASX_DIR"; - - var sampleAasxDir = System.Environment.GetEnvironmentVariable(variable); - if (sampleAasxDir == null) - { - throw new InvalidOperationException( - $"The environment variable {variable} has not been set. " + - "Did you set it manually to the directory containing sample AASXs? " + - "Otherwise, run the test through Test.ps1?"); - } - - if (!System.IO.Directory.Exists(sampleAasxDir)) - { - throw new InvalidOperationException( - $"The directory containing the sample AASXs does not exist or is not a directory: " + - $"{sampleAasxDir}; did you download the samples with DownloadSamples.ps1?"); - } - - var result = System.IO.Directory.GetFiles(sampleAasxDir) - .Where(p => System.IO.Path.GetExtension(p) == ".aasx") - .ToList(); - - result.Sort(); - - return result; - } - } - - /* - TODO (mristin, 2020-10-05): The class is unused since all its tests were disabled temporarily and - will be fixed in the near future. - - Once the tests are enabled, please remove this Resharper directive. - */ - // ReSharper disable once UnusedType.Global - public class TestLoadSaveChain - { - private static void AssertFilesEqual(string firstPath, string secondPath, string aasxPath) - { - string firstContent = System.IO.File.ReadAllText(firstPath); - string secondContent = System.IO.File.ReadAllText(secondPath); - - string[] firstLines = firstContent.Split( - new[] { "\r\n", "\r", "\n" }, - System.StringSplitOptions.None - ); - - string[] secondLines = secondContent.Split( - new[] { "\r\n", "\r", "\n" }, - System.StringSplitOptions.None - ); - - int min = (firstLines.Length < secondLines.Length) - ? firstLines.Length - : secondLines.Length; - - for (var i = 0; i < min; i++) - { - if (firstLines[i] != secondLines[i]) - { - int start = (i < 20) ? 0 : i - 20; - var sb = new System.Text.StringBuilder(); - sb.AppendLine("The first and the second export in the chain differ:"); - - for (var j = start; j < i; j++) - { - sb.AppendLine($"[{i,6}:SAME IN BOTH]{firstLines[j]}"); - } - - sb.AppendLine($"[{i,6}:IN FIRST ]{firstLines[i]}"); - sb.AppendLine($"[{i,6}:IN SECOND ]{secondLines[i]}"); - - sb.AppendLine($"The AASX sample used was: {aasxPath}"); - throw new AssertionException(sb.ToString()); - } - } - } - - /* - TODO (mristin, 2020-10-05): This test has been temporary disabled so that we can merge in the branch - MIHO/EnhanceDocumentShelf. The test should be fixed in a future pull request and we will then re-enable it - again. - - Please do not forget to remove the Resharper directive at the top of this class. - - [TestCase(".xml")] - - dead-csharp ignore this comment - */ - public void TestLoadSaveLoadAssertEqual(string extension) - { - List aasxPaths = SamplesAasxDir.ListAasxPaths(); - - using var tmpDir = new TemporaryDirectory(); - foreach (string aasxPath in aasxPaths) - { - /* - * The chain is as follows: - * - First load from AASX (package A) - * - Convert package 1 to `extension` format and save as path 1 - * - Load from the path 1 in `extension` format (package B) - * - Save package B in `extension` format to path 2 - * - * We expect the content of the two files (path 1 and path 2, respectively) to be equal. - */ - using var packageA = new AdminShellPackageEnv(aasxPath); - string path1 = System.IO.Path.Combine(tmpDir.Path, $"first{extension}"); - string path2 = System.IO.Path.Combine(tmpDir.Path, $"second{extension}"); - - packageA.SaveAs(path1, writeFreshly: true); - - using var packageB = new AdminShellPackageEnv(path1); - packageB.SaveAs(path2, writeFreshly: true); - AssertFilesEqual(path1, path2, aasxPath); - } - } - - - /* - TODO (mristin, 2020-10-05): This test has been temporary disabled so that we can merge in the branch - MIHO/EnhanceDocumentShelf. The test should be fixed in a future pull request and we will then re-enable it - again. - - Please do not forget to remove the Resharper directive at the top of this class. - - [Test] - - dead-csharp ignore this comment - */ - public void TestLoadSaveXmlValidate() - { - var validator = AasSchemaValidation.NewXmlValidator(); - - List aasxPaths = SamplesAasxDir.ListAasxPaths(); - - using var tmpDir = new TemporaryDirectory(); - string tmpDirPath = tmpDir.Path; - - foreach (string aasxPath in aasxPaths) - { - using var package = new AdminShellPackageEnv(aasxPath); - /* - TODO (mristin, 2020-09-17): Remove autofix once XSD and Aasx library in sync - - Package has been loaded, now we need to do an automatic check & fix. - - This is necessary as Aasx library is still not conform with the XSD AASX schema and breaks - certain constraints (*e.g.*, the cardinality of langString = 1..*). - */ - var recs = package.AasEnv.ValidateAll(); - if (recs != null) - { - package.AasEnv.AutoFix(recs); - } - - // Save as XML - string name = Path.GetFileName(aasxPath); - string outPath = System.IO.Path.Combine(tmpDirPath, $"{name}.converted.xml"); - package.SaveAs(outPath, writeFreshly: true); - - using var fileStream = System.IO.File.OpenRead(outPath); - var records = new AasValidationRecordList(); - validator.Validate(records, fileStream); - if (records.Count != 0) - { - var parts = new List - { - $"Failed to validate XML file exported from {aasxPath} to {outPath}:" - }; - parts.AddRange(records.Select((r) => r.Message)); - throw new AssertionException(string.Join(Environment.NewLine, parts)); - } - } - } - } -} diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/01_Festo.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/01_Festo.aasx.xml deleted file mode 100644 index ac57a24bd..000000000 --- a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/01_Festo.aasx.xml +++ /dev/null @@ -1,8384 +0,0 @@ - - - - - Festo_3S7PM0CP4BD - CONSTANT - smart.festo.com/demo/aas/1/1/454576463545648365874 - - - HTTP://PK.FESTO.COM/3S7PM0CP4BD - - - - - - www.company.com/ids/sm/4343_5072_7091_3242 - - - - - www.company.com/ids/sm/2543_5072_7091_2660 - - - - - www.company.com/ids/sm/6053_5072_7091_5102 - - - - - www.company.com/ids/sm/6563_5072_7091_4267 - - - - - smart.festo.com/demo/sm/instance/1/1/13B7CCD9BF7A3F24 - - - - - - - - - FPK_3s7plfdrs35 - - Festo OVEL Vacuum generator - Festo OVEL Vakuumsaugdüse - - HTTP://PK.FESTO.COM/3S7PM0CP4BD - Instance - - - - - Nameplate - www.company.com/ids/sm/4343_5072_7091_3242 - - - https://www.hsu-hh.de/aut/aas/nameplate - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Festo AG & Co. KG - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - OVEL Vacuum generator - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Ruiter Straße 82 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 73734 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Esslingen-Berkheim - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Baden-Württemberg - - - - false - false - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - OVEL-5-H-10-P-VQ4-UA-Z-C-A-V1PNLK-H3 - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - JO43 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - ProductCountryOfOrigin - PARAMETER - - - 0173-1#02-AAO841#001 - - - Instance - - string - DE - - - - - YearOfConstruction - PARAMETER - - - 0173-1#02-AAP906#001 - - - Instance - - integer - 2019 - - - - - Marking_CE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - 0173-1#07-CAA016#001 - - - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/marking_ce.png - - - - false - false - - - - - Marking_CRUUS - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CRUUSLabelingPresent - PARAMETER - - - 0173-1#02-AAR528#005 - - - Instance - - boolean - 1 - - - 0173-1#07-CAA016#001 - - - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/marking_cruus.jpg - - - - false - false - - - - - Marking_RCM - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - RCMLabelingPresent - PARAMETER - - - 0173-1#02-AAR528#005 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/marking_rcm.jpg - - - - false - false - - - - - - Document - www.company.com/ids/sm/2543_5072_7091_2660 - - - https://www.hsu-hh.de/aut/aas/document - - - Instance - - - - - DeclarationCEMarking - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Festo - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Festo AG & Co. KG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Erklärung zur CE-Kennzeichnung bei Produkten der Festo AG & Co.KG - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - CE_Kennzeichnung_2016_de.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/CE_Kennzeichnung_2016_de.pdf - - - - false - false - - - - - DeclarationRoHS - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Festo - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Festo AG & Co. KG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - RoHS 2011/65/EU und delegierte Fassung (EU) 2015/863 - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - RoHS_2011_65_EU_Konzern_Information_de.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/RoHS_2011_65_EU_Konzern_Information_de.pdf - - - - false - false - - - - - DeclarationCRUUS - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - UL - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Underwriter Laboratories LLC - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Certificate of compliance - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - SPAE_UL_4531318_-_2_EN.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/SPAE_UL_4531318_-_2_EN.pdf - - - - false - false - - - - - DeclarationIOLink - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Festo - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Festo AG & Co. KG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Manufacturer's declaration of conformity - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - OVEL_IO_Link_5439356_-_3_EN.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/OVEL_IO_Link_5439356_-_3_EN.pdf - - - - false - false - - - - - Manual_OVEL_EN - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - 8070874 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Festo - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Festo AG & Co. KG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - 2017-05 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Operating instructions Vacuum generator OVEL - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - The OVEL vacuum generator is used to generate a vacuum. - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - OVEL_2017-05_8070876g1_EN.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/OVEL_2017-05_8070876g1_EN.pdf - - - - false - false - - - - - Manual_OVEL_DE - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - 8070874 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Festo - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Festo AG & Co. KG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - 2017-05 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Bedienungsanleitung Vakuumsaugdüse OVEL - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - Die Vakuumsaugdüse OVEL wird bestimmungsgemäß zur Erzeugung von Vakuum eingesetzt. - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - OVEL_2017-05_8070875d1_DE.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/OVEL_2017-05_8070875d1_DE.pdf - - - - false - false - - - - - Manual_SPAE_EN - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - 8058480 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Festo - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Festo AG & Co. KG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - 2017-03b - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Operating instructions Pressure sensor SPAE - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - The SPAE pressure sensor is intended for measuring the relative pressure in pneumatic applications. The SPAE converts pneumatic pressure values into a pressure proportional voltage. The measurement result is shown on the display. - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - SPAE_2017-03b_8058481d1_EN.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/SPAE_2017-03b_8058481d1_EN.pdf - - - - false - false - - - - - Manual_SPAE_DE - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - 8058480 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Festo - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Festo AG & Co. KG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - 2017-03b - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Bedienungsanleitung Drucksensor SPAE - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - Der Drucksensor SPAE dient bestimmungsgemäß zur Erfassung des Relativdrucks in Pneumatikapplikationen. Der SPAE wandelt pneumatische Druckwerte in eine druckproportionale Spannung. Das Messergebnis wird im Display angezeigt. - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - SPAE_2017-03b_8058481d1_DE.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/SPAE_2017-03b_8058481d1_DE.pdf - - - - false - false - - - - - ApplicationNote_SPAE_EN - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Festo - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Festo AG & Co. KG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - 1.10 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Application Note IO-Link parameter description - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - A brief explanation of the contents (identification, parameter and commands, block parameterization, teach-In, process data, using different pressure units, diagnosis) - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - 09.02.2015 - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - SPAE_100017_ApplNote.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/SPAE_100017_ApplNote.pdf - - - - false - false - - - - - - Service - www.company.com/ids/sm/6053_5072_7091_5102 - - - https://www.hsu-hh.de/aut/aas/service - - - Instance - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Festo AG & Co. KG - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Ruiter Straße 82 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 73734 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Esslingen-Berkheim - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Baden-Württemberg - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - technikservice@festo.com - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - string - https://www.festo.com - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +49711347-3000 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - +49711 347-2190 - - - - false - false - - - - - - Identification - www.company.com/ids/sm/6563_5072_7091_4267 - - - https://www.hsu-hh.de/aut/aas/identification - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Festo AG & Co. KG - - - - - GLNOfManufacturer - PARAMETER - - - 0173-1#02-AAY812#001 - - - Instance - - string - 2220000020640 - - - - - SupplierOfTheIdentifier - - - 0173-1#02-AAP796#004 - - - Instance - - - - - - - - MAN_PROD_NUM - - - 0173-1#02-AAO676#003 - - - Instance - - - - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - OVEL Vacuum generator - - - - - ManufacturerProductDescription - PARAMETER - - - 0173-1#02-AAU734#001 - - - Instance - - langString - Compact vacuum generator with IO-Link sensor - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Festo AG & Co. KG - - - - - GLNOfSupplier - PARAMETER - - - 0173-1#02-AAY813#001 - - - Instance - - string - 2220000020640 - - - - - SupplierIdProvider - PARAMETER - - - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - Instance - - - - - - - - SUP_PROD_NUM - PARAMETER - - - 0173-1#02-AAO736#004 - - - Instance - - - - - - - - SupplierProductDesignation - - - 0173-1#02-AAM551#002 - - - Instance - - string - OVEL Vacuum generator - - - - - SupplierProductDescription - PARAMETER - - - 0173-1#02-AAU730#001 - - - Instance - - langString - Compact vacuum generator with IO-Link sensor - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - string - OVEL-5-H-10-P-VQ4-UA-Z-C-A-V1PNLK-H3 - - - - - ClassificationSystem - PARAMETER - - - 0173-1#02-AAO715#002 - - - Instance - - string - eclass - - - - - SecondaryKeyTyp - - - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - Instance - - - - - - - - TypThumbnail - PARAMETER - - - https://www.hsu-hh.de/aut/aas/thumbnail - - - Instance - - image/jpeg - /Festo_OVEL_product_rendering.png - - - - - AssetId - PARAMETER - - - https://www.hsu-hh.de/aut/aas/assetid - - - Instance - - anyURI - HTTP://PK.FESTO.COM/3S7PM0CP4BD - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - smart.festo.com/demo/aas/1/1/454576463545648365874 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - SecondaryKeyInstance - PARAMETER - - - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - Instance - - - - - - - - DateOfManufacture - PARAMETER - - - 0173-1#02-AAR972#002 - - - Instance - - date - - - - - - DeviceRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/devicerevision - - - Instance - - - - - - - - SoftwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/softwarerevision - - - Instance - - - - - - - - HardwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - Instance - - - - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Festo AG & Co. KG - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - langString - Ruiter Straße 82 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 73734 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Esslingen-Berkheim - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Baden-Württemberg - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - technikservice@festo.com - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.festo.com - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +49711347-3000 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - +49711 347-2190 - - - - false - false - - - - - CompanyLogo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/companylogo - - - Instance - - image/png - /aasx/assetIdentification/logo.png - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://pk.festo.com/3s7plfdrs35 - - - - - - DeviceDescriptionFiles - smart.festo.com/demo/sm/instance/1/1/13B7CCD9BF7A3F24 - - - http://admin-shell/sample/submodel/type/device-description-files - - - Instance - - - - - IODD - - - http://admin-shell.io/sample/conceptdescriptions/437857438753457473 - - - Instance - - application/general - /aasx/Software/Festo-SPAE-kPa-20171025-IODD1.1.zip - - - - - - - - ManufacturerName - 0173-1#02-AAO677#002 - - - - - - - - Herstellername - Manufacturer Name - - Manufacturer Name - - - - - Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist - 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 - - - - - - - GLNOfManufacturer - 0173-1#02-AAY812#001 - - - - - - - - GLN of manufacturer - GLN des Herstellers - - GLN of manufacturer - - - - - international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort - internationally unique identification number for the manufacturer of the device or the product and for the physical location - - - - - - - SupplierOfTheIdentifier - 0173-1#02-AAP796#004 - - - - - - - - Supplier of the identifier - Anbieter der Identifikationsnummer für Hersteller - - Supplier of the identifier - - - STRING_TRANSLATABLE - - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - - - - - - - MAN_PROD_NUM - - product article number of manufacturer - - 0173-1#02-AAO676#003 - - - - - - - - product article number of manufacturer - Herstellerartikelnummer - - MAN_PROD_NUM - - - STRING_TRANSLATABLE - - eindeutiger Bestellschlüssel des Herstellers - unique product identifier of the manufacturer - - - - - - - ManufacturerProductDesignation - 0173-1#02-AAW338#001 - - - - - - - - Manufacturer product designation - Herstellerproduktbezeichnung - - ManufacturerTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - ManufacturerProductDescription - 0173-1#02-AAU734#001 - - - - - - - - Manufacturer product description - Herstellerproduktbeschreibung - - Manufacturer product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - NameOfSupplier - 0173-1#02-AAO735#003 - - - - - - - - - - - - name of supplier - Lieferantenname - - name of supplier - - - - - Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt - name of supplier which provides the customer with a product or a service - - - - - - - GLNOfSupplier - 0173-1#02-AAY813#001 - - - - - - - - GLN of supplier - GLN des Lieferanten - - GLN of supplier - - - - - international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort - internationally unique identification number for the supplier of the device or the product and for the physical location - - - - - - - SupplierIdProvider - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - - - - - - SupplierIdProvider - Anbieter der Identifikationsnummer - - SupplierIdProvider - - - STRING_TRANSLATABLE - - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - - - - - - - SUP_PROD_NUM - 0173-1#02-AAO736#004 - - - - - - - - product article number of supplier - Lieferantenartikelnummer - - product article number of supplier - - - - - eindeutiger Bestellschlüssel des Lieferanten - unique product order identifier of the supplier - - - - - - - SupplierProductDesignation - 0173-1#02-AAM551#002 - - - - - - - - Supplier product designation - Lieferantenproduktbezeichnung - - SupplierTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - SupplierProductDescription - 0173-1#02-AAU730#001 - - - - - - - - Supplier product description - Lieferantenproduktbeschreibung - - Supplier product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - ManufacturerProductFamily - 0173-1#02-AAU731#001 - - - - - - - - Manufacturer product family - Herstellerproduktfamilie - - TypClass - - - - - 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie - 2nd level of a 3 level manufacturer specific product hierarchy - - - - - - - ClassificationSystem - 0173-1#02-AAO715#002 - - - - - - - - classification system - Klassifizierungssystem - - ClassificationSystem - - - - - Klassifizierungssystem - Classification System - - - - - - - SecondaryKeyTyp - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - - - - - - SecondaryKeyTyp - Typnummer des IT Systems - - SecondaryKeyTyp - - - - - Führende technische ID im IT System des Typs - SecondaryKeyTyp - - - - - - - TypThumbnail - https://www.hsu-hh.de/aut/aas/thumbnail - - - - - - - - TypThumbnail - Vorschaubild - - TypThumbnail - - - - - Darstellung des Produkttyps in kleinem Format - Small picture of the product type - - - - - - - AssetId - https://www.hsu-hh.de/aut/aas/assetid - - - - - - - - AssetId - Asset ID - - AssetId - - - - - Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. - Global unique ID of an asset, which can be read by both human and machine. - - - - - - - SerialNumber - 0173-1#02-AAM556#002 - - - - - - - - Serial number - Seriennummer - - InstanceId - - - - - eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist - unique combination of numbers and letters used to identify the device once it has been manufactured - - - - - - - BatchNumber - 0173-1#02-AAQ196#001 - - - - - - - - Batch number - Chargen-Nummer - - ChargeId - - - - - Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge - Number assigned by the manufacturer of a material to identify the manufacturer's batch - - - - - - - SecondaryKeyInstance - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - - - - - - SecondaryKeyInstance - Instanznummer des IT Systems - - SecondaryKeyInstance - - - - - Führende technische ID im IT System der Instanz - SecondaryKeyInstance - - - - - - - DateOfManufacture - 0173-1#02-AAR972#002 - - - - - - - - Date of manufacture - Herstellungsdatum - - Date of manufacture - - - DATE - - Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist - Date from which the production and / or development process is completed or from which a service is provided completely - - - - - - - DeviceRevision - https://www.hsu-hh.de/aut/aas/devicerevision - - - - - - - - DeviceRevision - DeviceRevision - - DeviceRevision - - - - - DeviceRevision - DeviceRevision - - - - - - - SoftwareRevision - https://www.hsu-hh.de/aut/aas/softwarerevision - - - - - - - - SoftwareRevision - SoftwareRevision - - SoftwareRevision - - - - - SoftwareRevision - SoftwareRevision - - - - - - - HardwareRevision - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - - - - - - HardwareRevision - HardwareRevision - - HardwareRevision - - - - - HardwareRevision - HardwareRevision - - - - - - - QrCode - https://www.hsu-hh.de/aut/aas/qrcode - - - - - - - - QrCode - QrCode - - QrCode - - - - - In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. - QrCode - - - - - - - OrganisationContactInfo - https://www.hsu-hh.de/aut/aas/contactinfo - - - - - - - - Contact Info - Kontakt Info - - OrganisationContactInfo - - - - - Sammlung für die allgemeinen Kontaktdaten - Collection for general contact data - - - - - - - PhysicalAddress - https://www.hsu-hh.de/aut/aas/physicaladdress - - - - - - - - PhysicalAddress - Physische Adresse - - PhysicalAddress - - - - - Sammlung für reale physische Adresse - Collection for real physical address - - - - - - - CountryCode - 0173-1#02-AAO730#001 - - - - - - - - - - - - Landeskennung - Country code - - Country code - - - - - Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes - agreed upon symbol for unambiguous identification of a country - - - - - - - Street - 0173-1#02-AAO128#001 - - - - - - - - Strasse - Street - - Street - - - - - Name der Strasse und Hausnummer - Street name and house number - - - - - - - Zip - 0173-1#02-AAO129#002 - - - - - - - - Zip - Postleitzahl - - PostalCode - - - - - ZIP code of address - Postleitzahl der Anschrift - - - - - - - CityTown - 0173-1#02-AAO132#001 - - - - - - - - Ort - City/town - - City/town - - - - - Town or city of the company - Ortsangabe - - - - - - - StateCounty - 0173-1#02-AAO133#002 - - - - - - - - state/county - Bundesland - - StateCounty - - - - - Bundesland - state/county - - - - - - - Email - https://www.hsu-hh.de/aut/aas/email - - - - - - - - Emailadresse - Email address - - Email - - - - - Emailadresse - Email address - - - - - - - TelephoneContact - https://www.hsu-hh.de/aut/aas/ContactInfo/TelephoneContact - - - - - - - - Telephone Contact - Telefonkontakt - - TelephoneContact - - - - - Sammlung für Kontaktdaten über Telefon - Collection for contact data via telephone - - - - - - - PhoneNumber - 0173-1#02-AAO136#002 - - - - - - - - Telefonnummer - telephone number - - Phone - - - - - vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist - complete telephone number to be called to reach a business partner - - - - - - - CompanyLogo - https://www.hsu-hh.de/aut/aas/companylogo - - - - - - - - Firmenlogo - CompanyLogo - - CompanyLogo - - - - - Firmenlogo - CompanyLogo - - - - - - - URL - 0173-1#02-AAO694#001 - - - - - - - - Internetadresse - Internet address - - URL - - - - - stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html - Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html - - - - - - - ProductCountryOfOrigin - 0173-1#02-AAO841#001 - - - - - - - - Produkt Ursprungsland - Product country of origin - - CountryOfOrigin - - - - - Land in dem das Produkt hergestellt wurde (Hersteller Land) - Country in which the product is manufactured (manufacturer country) - - - - - - - YearOfConstruction - 0173-1#02-AAP906#001 - - - - - - - - Year of construction - Baujahr - - YearOfConstruction - - - - - Jahreszahl als Datumsangabe für die Fertigstellung des Objektes - Year as completion date of object - - - - - - - File - 0173-1#02-AAD005#008 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Enthaltene Doku. Datei - Embedded Doc. file - - File - - - - - Verweis/ BLOB auf enthaltene Dokumentations-Datei. - Reference/ BLOB to embedded documentation file. - - - - - - - ProductMarking - https://www.hsu-hh.de/aut/aas/productmarking - - - - - - - - Produktkennzeichnung - Product Marking - - ProductMarking - - - - - Sammlungsdatei für Produktkennzeichnung - Collection file for product marking - - - - - - - CEQualificationPresent - 0173-1#02-BAF053#008 - - - - - - - - CE-Kennzeichnung vorhanden - CE- qualification present - - CEMarkingPresent - - - BOOLEAN - - whether CE- qualification is present - Angabe, ob CE-Kennzeichnung vorhanden ist - - - - - - - CRUUSLabelingPresent - 0173-1#02-AAR528#005 - - - - - - - - Kennzeichnung (RCM) vorhanden - RCM labeling present - - CRUUSLabelingPresent - - - BOOLEAN - - indication whether the product is equipped with a specified RCM labeling - Angabe, ob das Produkt mit einer spezifizierten RCM-Kennzeichnung ausgestattet ist - - - - - - - DocumentClassification_ClassId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - - - - Dokumentkategorie - Document category - - DocCategory - - - - - Dokumentkategorie nach VDI 2770:2018/10 - Document category after VDI 2770:2018/10 - - - - - - - DocumentId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - - - - - - DocumentId - Dokumenten-Nummer - - DocumentId - - - - - Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. - TBD - - - - - - - VDI2770_DomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - - - - - - Domain-Nummer - DomainId - - DomainId - - - - - Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. - TBD - - - - - - - VDI2770_IdType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - - - - - - Nummerntyp - IdType - - IdType - - - - - Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. - TBD - - - - - - - ValString - www.company.com/ids/cd/4490_8182_7091_6124 - - - - - - - - Wert - Value String - - ValString - - - - - Ausdruck für den Wert der übergeordneten Collection. - Value string for the collection value on the next superordinate level - - - - - - - DocumentationItem - 0173-1#02-AAD001#001 - - - - - - - - Dokumentationsgruppe - Documentation item - - DocumentationItem - - - - - Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. - Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. - - - - - - - DocumentIdDomain - www.company.com/ids/cd/6003_8182_7091_9350 - - - - - - - - DocumentIdDomain - DocumentIdDomain - - DocumentIdDomain - - - - - Angabe einer Liste von Domänen, in de-nen die DocumentIds des Dokuments eindeutig sind - TBD - - - - - - - DocumentDomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - - - - - - DocumentDomainId - DocumentDomainId - - DocumentDomainId - - - - - Kennung oder Kennzeichen einer Domäne - TBD - - - - - - - VDI2770_Party - www.company.com/ids/cd/3153_8182_7091_4327 - - - - - - - - Party - Party - - Party - - - - - Verweis auf eine Party (siehe VDI 2770 Anhang C1.17), die für diese Domäne verantwortlich ist - TBD - - - - - - - VDI2770_Role - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - - - - - - Rolle - Role - - Role - - - - - Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) - TBD - - - - - - - VDI2770_Organisation - www.company.com/ids/cd/9214_8182_7091_6391 - - - - - - - - Organisation - Organisation - - Organisation - - - - - Angabe einer Organisation - TBD - - - - - - - VDI2770_OrganisationId - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - - - - - - Organisation ID - Organisation ID - - OrganisationId - - - - - eindeutige ID für die Organisation - TBD - - - - - - - VDI2770_OrganisationName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - - - - - - OrganisationName - OrganisationName - - OrganisationName - - - - - gebräuchliche Bezeichnung für die Organisation - TBD - - - - - - - VDI2770_OrganisationOfficialName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - - - - - - Offizieller Name der Organisation - Organisation Official Name - - OrganisationOfficialName - - - - - offizieller Name der Organisation - TBD - - - - - - - DocumentPartId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - - - - - - Dokumenten-Teilnummer - DocumentPartId - - DocumentPartId - - - - - Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. - TBD - - - - - - - VDI2770_Description - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - - - - - - Beschreibung - Description - - Description - - - - - Beschreibung für die nächste übergeordnete Collection - TBD - - - - - - - VDI2770_ClassName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - - - - - - Klassenname - Class Name - - ClassName - - - - - Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. - TBD - - - - - - - DocumentVersion_LanguageCode - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - - - - - - Sprachenschlüssel - LanguageCode - - LanguageCode - - - - - Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 - TBD - - - - - - - VDI2770_ClassificationSystem - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - - - - - - Klassifizierungssystem - classification system - - ClassificationSystem - - - - - Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. - TBD - - - - - - - DocumentVersion - www.company.com/ids/cd/2580_0282_7091_6213 - - - - - - - - Dokumenten-Version - DocumentVersion - - DocumentVersion - - - - - Zu jedem Dokument muss eine Menge von mindestens einer Dokumentenversion existieren. Es können auch mehrere Dokumentenversionen ausgeliefert werden. - TBD - - - - - - - DocumentVersionId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - - - - - - Dokumenten-Versionsnummer - DocumentVersionId - - DocumentVersionId - - - - - Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. - TBD - - - - - - - VDI2770_Language - www.company.com/ids/cd/0231_0282_7091_5062 - - - - - - - - Sprache - Language - - Language - - - - - Liste der im Dokument verwendeten Sprachen - TBD - - - - - - - DocumentVersion_Description - www.company.com/ids/cd/9151_0282_7091_8032 - - - - - - - - Beschreibung zur DocumentVersion - DocumentVersion Description - - DocumentVersion_Description - - - - - Zusammenfassende Beschreibungen zur Dokumentenversion in ggf. unterschiedlichen Sprachen. - TBD - - - - - - - VDI2770_Title - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - - - - - - Titel - Title - - VDI2770_Title - - - - - sprachabhängiger Titel des Dokuments - TBD - - - - - - - VDI2770_Summary - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - - - - - - Zusammenfassung - Summary - - Summary - - - - - sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts - TBD - - - - - - - VDI2770_Keywords - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - - - - - - Schlagwörter - Keywords - - Keywords - - - - - sprachabhängige, durch Komma getrennte Liste von Schlagwörtern - TBD - - - - - - - VDI2770_LifeCycleStatus - www.company.com/ids/cd/0282_0282_7091_7878 - - - - - - - - Lebenszyklus Status - LifeCycleStatus - - LifeCycleStatus - - - - - Liste von Statusdefinitionen mit Bezug zum Dokumentenlebenszyklus inklusive der Angabe der Beteiligten und einem zugehörigen Zeitstempel - TBD - - - - - - - VDI2770_StatusValue - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - - - - - - Statuswert - StatusValue - - StatusValue - - - - - Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) - TBD - - - - - - - VDI2770_SetDate - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - - - - - - Erstellungsdatum - Set Date - - SetDate - - - - - Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). - TBD - - - - - - - VDI2770_Purpose - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - - - - - - Zweck - Purpose - - Purpose - - - - - Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. - TBD - - - - - - - VDI2770_BasedOnProcedure - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - - - - - - Prozedur - Procedure - - BasedOnProcedure - - - - - textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt - TBD - - - - - - - VDI2770_Comments - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - - - - - - Kommentar - Comments - - Comments - - - - - textuelle Bemerkungen und Anmerkungen zum Status - TBD - - - - - - - DocumentRelationship - www.company.com/ids/cd/1204_0282_7091_7896 - - - - - - - - Dokumenten-Beziehung - Document Relationship - - DocumentRelationship - - - - - Liste von Beziehungen zu anderen Dokumenten. Es ist möglich, auf einen Dokument, ein Dokument in einer spezifischen Dokumentenversion oder auch ein Teildokument zu verweisen. - TBD - - - - - - - DocumentRelationship_Type - www.company.com/ids/cd/5044_0282_7091_6924 - - - - - - - - Typ der Dokumenten-Beziehung - DocumentRelationship_Type - - DocumentRelationship_Type - - - - - Typisierung der Beziehung zwischen den beiden DocumentVersions. Folgende Beziehungsarten können verwendet werden: Affecting (hat Auswirkungen auf), ReferesTo (bezieht sich auf), BasedOn (basiert auf) - TBD - - - - - - - StoredDocumentRepresentation - www.company.com/ids/cd/3094_0282_7091_2090 - - - - - - - - StoredDocumentRepresentation - StoredDocumentRepresentation - - StoredDocumentRepresentation - - - - - Liste von digitalen Repräsentationen zur DocumentVersion - TBD - - - - - - - VDI2770_DigitalFile - www.company.com/ids/cd/2305_0282_7091_2077 - - - - - - - - Digitaler-File - DigitalFile - - DigitalFile - - - - - Datei, die die DocumentVersion (siehe VDI 2770:2018 Anhang C1.5) repräsentiert Neben der obligatorischen PDF/A-Datei können weitere Dateien angegeben werden. - TBD - - - - - - - VDI2770_FileId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - - - - - - ID der Datei - File ID - - FileId - - - - - eindeutige ID für die Datei - TBD - - - - - - - VDI2770_FileName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - - - - - - Dateiname - File name - - FileName - - - - - Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. - TBD - - - - - - - VDI2770_FileFormat - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - - - - - - Datei Format - File format - - FileFormat - - - - - Angabe eines Media Typs gemäß der Liste der IANA - TBD - - - - - - - DocumentType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - - - - - - Dokumententyp - Document Type - - DocumentType - - - - - Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) - TBD - - - - - - - VDI2770_ReferencedObject - www.company.com/ids/cd/2570_2282_7091_0055 - - - - - - - - ReferencedObject - ReferencedObject - - ReferencedObject - - - - - Liste von IDs für ein Objekt, auf das sich das Dokument bezieht - TBD - - - - - - - VDI2770_ReferencedObject_Type - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - - - - - - Typ - Type - - Type - - - - - Für Type des Objekts muss immer Product angegeben werden. - TBD - - - - - - - VDI2770_ReferencedObject_RefType - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - - - - - - RefType - RefType - - RefType - - - - - Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) - TBD - - - - - - - VDI2770_ReferencedObject_ObjectId - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - - - - - - ObjectId - ObjectId - - ObjectId - - - - - Angabe der Identifikationsnummer zum Objekt - TBD - - - - - - - ContactInfo_Role - https://www.hsu-hh.de/aut/aas/role - - - - - - - - Rolle - Role - - Role - - - - - Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt - Information to specify the role which the organisation of ContactInfo plays - - - - - - - Fax - https://www.hsu-hh.de/aut/aas/fax - - - - - - - - Fax - Fax - - Fax - - - - - Faxnummer - Fax number - - - - - - - 0173-1#02-AAO136#002 - - - - - DocGroup_01 - www.company.com/ids/cd/1420_0113_7091_0891 - - - - - - - - 01 Identifikation - 01 Identification - - DocGroup_01 - - - - - Der Gruppe „Identifikation“ werden alle Dokumente zugeordnet, die der Identifikation des Objekts dienen, zu dem die Herstellerdokumentation gehört. Sie enthält insbesondere Informationen, die die elektronische Datenverarbeitung unterstützen und die es dem Hersteller und dem Nutzer erlauben, das Objekt in ihren jeweiligen elektronischen Datenverarbeitungssystemen zu identifizieren. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocGroup_02 - www.company.com/ids/cd/4323_0113_7091_2591 - - - - - - - - 02 Technische Beschaffenheit - 02 Technical characteristics - - DocGroup_02 - - - - - Die Gruppe „Technische Beschaffenheit“ beinhaltet alle Dokumente, die die technischen Anforderungen, deren Erfüllung und die Bescheinigung der Eigenschaften eines Objekts betreffen. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocGroup_03 - www.company.com/ids/cd/5053_0113_7091_5741 - - - - - - - - 03 Tätigkeitsbezogene Dokumente - 03 Work-related documents - - DocGroup_03 - - - - - Die Gruppe „Tätigkeitsbezogene Dokumente“ beinhaltet alle Dokumente, die Anforderungen, Hinweise und Hilfestellungen für Tätigkeiten an und mit dem Objekt nach der Übergabe an den Nutzer betreffen. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocGroup_04 - www.company.com/ids/cd/5473_0113_7091_1588 - - - - - - - - 04 Vertragsunterlagen - 04 Contract documents - - DocGroup_04 - - - - - Der Gruppe „Vertragsunterlagen“ werden alle Dokumente zugeordnet, die im Zusammenhang mit der kaufmännischen Abwicklung eines Vertrages stehen, aber nicht selbst Gegenstand des Vertrags sind und lediglich zur Erfüllung des Vertrags dienen. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_01-01 - www.company.com/ids/cd/9593_0113_7091_2401 - - - - - - - - 01-01 Identifikation - 01-01 Identification - - DocCategory_01-01 - - - - - Der Kategorie „Identifikation“ werden alle Dokumente zugeordnet, die der Identifikation des Objekts dienen, zu dem die Herstellerdokumentation gehört. Sie enthält insbesondere Informationen, die die elektronische Datenverarbeitung unterstützen und die es dem Hersteller und dem Nutzer erlauben, das Objekt in ihren jeweiligen elektronischen Datenverarbeitungssystemen zu identifizieren. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_02-01 - www.company.com/ids/cd/5314_0113_7091_8640 - - - - - - - - 02-01 Techn. Spezifikation - 02-01 Technical specification - - DocCategory_02-01 - - - - - Der Kategorie „Technische Spezifikation“ werden alle Dokumente zugeordnet, die die Anforderungen an ein Objekt sowie dessen Eigenschaften beschreiben. Dazu gehören die Auslegungsdaten, Berechnungen (Verfahrenstechnik, Festigkeit usw.) sowie alle relevanten Eigenschaften des übergebenen Objekts. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_02-02 - www.company.com/ids/cd/5515_0113_7091_8581 - - - - - - - - 02-02 Zeichnungen, Pläne - 02-02 Drawings and diagrams - - DocCategory_02-02 - - - - - Der Kategorie „Zeichnungen, Pläne“ werden alle Dokumente zugeordnet, die Zeichnungscharakter haben, das heißt eine grafische Darstellung zur Übermittlung von Information nutzen. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_02-03 - www.company.com/ids/cd/0335_0113_7091_0312 - - - - - - - - 02-03 Bauteile - 02-03 Components - - DocCategory_02-03 - - - - - Der Kategorie „Bauteile“ werden alle Dokumente zugeordnet, die eine strukturierte Auflistung der Teile eines Objekts beinhalten. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_02-04 - www.company.com/ids/cd/2155_0113_7091_3955 - - - - - - - - 02-04 Zeugnisse, Zertifikate, Bescheinigungen - 02-04 Reports, Certificates, declarations - - DocCategory_02-04 - - - - - Der Kategorie „Zeugnisse, Zertifikate, Bescheinigungen“ werden alle Dokumente zugeordnet, die Urkundencharakter haben. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_03-01 - www.company.com/ids/cd/3565_0113_7091_2704 - - - - - - - - 03-01 Montage, Inbetriebnahme, Demontage - 03-01 Assembly, commissioning, disassembly - - DocCategory_03-01 - - - - - Der Kategorie „Montage, Demontage“ werden alle Dokumente zugeordnet, die Tätigkeiten und Maßnahmen beschreiben, die erforderlich sind, um ein Objekt: zu transportieren oder zu lagern, als Ganzes in ein übergeordnetes Objekt einzubauen, auszubauen oder an dieses anzuschließen, so weit vorzubereiten, dass es zur Inbetriebnahme bereitsteht, nach Abschluss der Nutzungsphase zu demontieren und zu entsorgen - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_03-02 - www.company.com/ids/cd/4290_1113_7091_7266 - - - - - - - - 03-02 Bedienung - 03-02 Operation - - DocCategory_03-02 - - - - - Der Kategorie „Bedienung“ werden Dokumente zur bestimmungsgemäßen Verwendung und sicheren Bedienung eines Objekts zugeordnet. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_03-03 - www.company.com/ids/cd/2211_1113_7091_3911 - - - - - - - - 03-03 Allgemeine Sicherheit - 03-03 Safety in general - - DocCategory_03-03 - - - - - Der Kategorie „Allgemeine Sicherheit“ werden Dokumente zugeordnet, die Sicherheitshinweise auf mögliche Gefährdungen bei der Verwendung des Objekts geben. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_03-04 - www.company.com/ids/cd/7521_1113_7091_4471 - - - - - - - - 03-04 Inspektion, Wartung, Prüfung - 03-04 Inspection, maintenance, test - - DocCategory_03-04 - - - - - Der Kategorie „Inspektion, Wartung, Prüfung“ werden alle Dokumente zugeordnet, die vom Hersteller vorgeschlagene wiederkehrende Maßnahmen zur Feststellung oder zum Erhalt des funktionsfähigen Zustands beschreiben. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_03-05 - www.company.com/ids/cd/5161_1113_7091_0458 - - - - - - - - 03-05 Instandsetzung - 03-05 Repair - - DocCategory_03-05 - - - - - Der Kategorie „Instandsetzung“ werden alle Dokumente zugeordnet, die Maßnahmen zur Wiederherstellung der Funktion eines Objekts betreffen. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_03-06 - www.company.com/ids/cd/2181_1113_7091_5948 - - - - - - - - 03-06 Ersatzteile - 03-06 Spare parts - - DocCategory_03-06 - - - - - Der Kategorie „Ersatzteile“ werden Dokumente zugeordnet, die Informationen zu Ersatzteilen und Hilfs- und Betriebsstoffen enthalten. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_04-01 - www.company.com/ids/cd/5391_1113_7091_8996 - - - - - - - - 04-01 Vertragsunterlagen - 04-01 Contract documents - - DocCategory_04-01 - - - - - Der Kategorie „Vertragsunterlagen“ werden alle Dokumente zugeordnet, die im Zusammenhang mit der kaufmännischen Abwicklung eines Vertrages stehen, aber nicht selbst Gegenstand des Vertrags sind und lediglich zur Erfüllung des Vertrags dienen. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/02_Bosch.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/02_Bosch.aasx.xml deleted file mode 100644 index 43b134291..000000000 --- a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/02_Bosch.aasx.xml +++ /dev/null @@ -1,6811 +0,0 @@ - - - - - Bosch_NexoPistolGripNutrunner - http://boschrexroth.com/shells/0608842005/917004878 - - - http://dc-qr.com?m=0608842005&s=917004878 - - - - - - http://boschrexroth.com/shells/0608842005/917004878/submodels/nameplate - - - - - http://boschrexroth.com/shells/0608842005/917004878/submodels/document - - - - - http://boschrexroth.com/shells/0608842005/917004878/submodels/service - - - - - http://boschrexroth.com/shells/0608842005/917004878/submodels/identification - - - - - - - - - M0608842005_S917004878 - http://dc-qr.com?m=0608842005&s=917004878 - Instance - - - - - Nameplate - http://boschrexroth.com/shells/0608842005/917004878/submodels/nameplate - - - https://www.hsu-hh.de/aut/aas/nameplate - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Bosch Rexroth AG - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - Nexo Wi-Fi Cordless Nutrunner - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Fornsbacher Straße 92 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 71540 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Murrhardt - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Baden-Württemberg - - - - false - false - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - string - Cordless Nutrunner - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 917004878 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - ProductCountryOfOrigin - PARAMETER - - - 0173-1#02-AAO841#001 - - - Instance - - string - DE - - - - - YearOfConstruction - PARAMETER - - - 0173-1#02-AAP906#001 - - - Instance - - string - xxxxxxxxxxxxxxxxxxxxxxx - - - - - Marking_CE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/marking_ce.png - - - - false - false - - - - - - Document - http://boschrexroth.com/shells/0608842005/917004878/submodels/document - - - https://www.hsu-hh.de/aut/aas/document - - - Instance - - - - - DeclarationCEMarking - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - DCTC-30434-002_KOE_M_NN_2019-01-01 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - 2019-01-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - EG-Konformitätserklärung - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - DCTC-30434-002_KOE_M_NN_2019-01-01.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/DCTC-30434-002_KOE_M_NN_2019-01-01.pdf - - - - false - false - - - - - EU_Declaration_of_Conformity - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - DCTC-30434-002:2019-01-01 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - 2019-01-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de/en/fr/es/pt/it/pl/cs/sk/hu/bg/da/et/fi/el/hr/lv/lt/nl/ro/sv/sl/ru/zh/ar/id/ja/ko/no/th/tr/vi - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - EU-Konformitätserklärung (DE) EU Declaration of Conformity (EN) - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - EU_Declaration_of_Conformity.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/EU_Declaration_of_Conformity.pdf - - - - false - false - - - - - Certificat_ISO_9001_2015 - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Zertifikat für Bosch Rexroth AG Normen ISO 9001:2015 - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - DCMC-01001-000_KOB_N_EN_2019-06-14.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/DCMC-01001-000_KOB_N_EN_2019-06-14.pdf - - - - false - false - - - - - 3608870EF2_OperatingInstructions - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - 3608870EF2 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung (DE) Operating Instructions (EN) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - AC / 01.2018 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en-US/​cs-CZ/​de-DE/​es-ES/​fr-FR/​hu-HU/​it-IT/​pl-PL/​pt-BR/​sl-SI/​ru-RU/​zh-CN - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - NXA, NXP, NXV012T - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - 3608870EF2_AC.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/3608870EF2_AC.pdf - - - - false - false - - - - - 3608870A47_ProjectPlanning_DE - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - 3 608 870 A47_DE - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - A47/05.2017 DE - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Rexroth Funk-Akkuschrauber Nexo - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - 3608870A47_AE_DE.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/3608870A47_AE_DE.pdf - - - - false - false - - - - - 3608870A47_ProjectPlanning_EN - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - 3 608 870 A47_EN - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Operating - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - A47/05.2017 EN - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Nexo cordless Wi-Fi nutrunner by Rexroth - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - 3608870A47_AE_EN.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/3608870A47_AE_EN.pdf - - - - false - false - - - - - 36088702_SafetyInstructions_DE - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - 3 608 870 2DE - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-03 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Allgemeine Sicherheit - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - AA/01.2010 DE - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Sicherheitshinweise für Rexroth Schraubsysteme - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - 36088702DE_AA.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/36088702DE_AA.pdf - - - - false - false - - - - - 36088702_SafetyInstructions_EN - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - 3 608 870 2EN - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-03 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - General Safety - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - AA/01.2010 EN - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Safety Instructions for Rexroth Tightening Systems - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - 36088702EN_AA.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/36088702EN_AA.pdf - - - - false - false - - - - - - Service - http://boschrexroth.com/shells/0608842005/917004878/submodels/service - - - https://www.hsu-hh.de/aut/aas/service - - - Instance - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Bosch Rexroth AG Service Tightening Systems - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Bgm.-Dr.-Nebel-Str. 8 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 97816 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Lohr - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Bayern - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - service@boschrexroth.de - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.boschrexroth.com/de/de/service/startseite-service - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +499352405060 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - - - - - false - false - - - - - - Identification - http://boschrexroth.com/shells/0608842005/917004878/submodels/identification - - - https://www.hsu-hh.de/aut/aas/identification - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Bosch Rexroth AG - - - - - GLNOfManufacturer - PARAMETER - - - 0173-1#02-AAY812#001 - - - Instance - - string - 4048118000006 - - - - - SupplierOfTheIdentifier - - - 0173-1#02-AAP796#004 - - - Instance - - string - GLN GS1 - - - - - MAN_PROD_NUM - - - 0173-1#02-AAO676#003 - - - Instance - - string - 0608842005 - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - NXP012QD-36V - - - - - ManufacturerProductDescription - PARAMETER - - - 0173-1#02-AAU734#001 - - - Instance - - langString - The most intelligent hand-held nutrunner in the world - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - string - Cordless Nutrunner - - - - - ClassificationSystem - PARAMETER - - - 0173-1#02-AAO715#002 - - - Instance - - string - eCl@ss - - - - - SecondaryKeyTyp - - - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - Instance - - - - - - - - TypThumbnail - PARAMETER - - - www.company.com/ids/cd/4401_1272_7091_3437 - - - Instance - - image/jpeg - /ST_Mittelgriffschrauber_NXP_Produktbild_V01_20160822_161306.jpg - - - - - AssetId - PARAMETER - - - https://www.hsu-hh.de/aut/aas/assetid - - - Instance - - string - http://dc-qr.com?m=0608842005&s=917004878 - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 917004878 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - SecondaryKeyInstance - PARAMETER - - - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - Instance - - - - - - - - DateOfManufacture - PARAMETER - - - 0173-1#02-AAR972#002 - - - Instance - - - 2019 - - - - - DeviceRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/devicerevision - - - Instance - - - - - - - - SoftwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/softwarerevision - - - Instance - - - - - - - - HardwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - Instance - - - - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Bosch Rexroth AG - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Zum Eisengießer 1 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 97816 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Lohr am Main - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Bayern - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - service@boschrexroth.de - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.boschrexroth.com/de/de/home/index - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +499352405060 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - - - - - false - false - - - - - CompanyLogo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/companylogo - - - Instance - - image/png - /aasx/Identification/logo.png - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - http://dc-qr.com?m=0608842005&s=917004878 - - - - - - - - ManufacturerName - 0173-1#02-AAO677#002 - - - - - - - - Herstellername - Manufacturer Name - - Manufacturer Name - - - - - Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist - 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 - - - - - - - ManufacturerProductDesignation - 0173-1#02-AAW338#001 - - - - - - - - Manufacturer product designation - Herstellerproduktbezeichnung - - ManufacturerTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - PhysicalAddress - https://www.hsu-hh.de/aut/aas/physicaladdress - - - - - - - - PhysicalAddress - Physische Adresse - - PhysicalAddress - - - - - Sammlung für reale physische Adresse - Collection for real physical address - - - - - - - CountryCode - 0173-1#02-AAO730#001 - - - - - - - - - - - - Landeskennung - Country code - - Country code - - - - - Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes - agreed upon symbol for unambiguous identification of a country - - - - - - - Street - 0173-1#02-AAO128#001 - - - - - - - - Strasse - Street - - Street - - - - - Name der Strasse und Hausnummer - Street name and house number - - - - - - - Zip - 0173-1#02-AAO129#002 - - - - - - - - Zip - Postleitzahl - - PostalCode - - - - - ZIP code of address - Postleitzahl der Anschrift - - - - - - - CityTown - 0173-1#02-AAO132#001 - - - - - - - - Ort - City/town - - City/town - - - - - Town or city of the company - Ortsangabe - - - - - - - StateCounty - 0173-1#02-AAO133#002 - - - - - - - - state/county - Bundesland - - StateCounty - - - - - Bundesland - state/county - - - - - - - ManufacturerProductFamily - 0173-1#02-AAU731#001 - - - - - - - - Manufacturer product family - Herstellerproduktfamilie - - TypClass - - - - - 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie - 2nd level of a 3 level manufacturer specific product hierarchy - - - - - - - SerialNumber - 0173-1#02-AAM556#002 - - - - - - - - Serial number - Seriennummer - - InstanceId - - - - - eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist - unique combination of numbers and letters used to identify the device once it has been manufactured - - - - - - - BatchNumber - 0173-1#02-AAQ196#001 - - - - - - - - Batch number - Chargen-Nummer - - ChargeId - - - - - Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge - Number assigned by the manufacturer of a material to identify the manufacturer's batch - - - - - - - ProductCountryOfOrigin - 0173-1#02-AAO841#001 - - - - - - - - Produkt Ursprungsland - Product country of origin - - CountryOfOrigin - - - - - Land in dem das Produkt hergestellt wurde (Hersteller Land) - Country in which the product is manufactured (manufacturer country) - - - - - - - YearOfConstruction - 0173-1#02-AAP906#001 - - - - - - - - Year of construction - Baujahr - - YearOfConstruction - - - - - Jahreszahl als Datumsangabe für die Fertigstellung des Objektes - Year as completion date of object - - - - - - - ProductMarking - https://www.hsu-hh.de/aut/aas/productmarking - - - - - - - - Produktkennzeichnung - Product Marking - - ProductMarking - - - - - Sammlungsdatei für Produktkennzeichnung - Collection file for product marking - - - - - - - CEQualificationPresent - 0173-1#02-BAF053#008 - - - - - - - - CE-Kennzeichnung vorhanden - CE- qualification present - - CEMarkingPresent - - - BOOLEAN - - whether CE- qualification is present - Angabe, ob CE-Kennzeichnung vorhanden ist - - - - - - - File - 0173-1#02-AAD005#008 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Enthaltene Doku. Datei - Embedded Doc. file - - File - - - - - Verweis/ BLOB auf enthaltene Dokumentations-Datei. - Reference/ BLOB to embedded documentation file. - - - - - - - DocumentationItem - 0173-1#02-AAD001#001 - - - - - - - - Dokumentationsgruppe - Documentation item - - DocumentationItem - - - - - Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. - Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. - - - - - - - DocumentType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - - - - - - Dokumententyp - Document Type - - DocumentType - - - - - Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) - TBD - - - - - - - VDI2770_DomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - - - - - - Domain-Nummer - DomainId - - DomainId - - - - - Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. - TBD - - - - - - - VDI2770_IdType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - - - - - - Nummerntyp - IdType - - IdType - - - - - Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. - TBD - - - - - - - DocumentId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - - - - - - DocumentId - Dokumenten-Nummer - - DocumentId - - - - - Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. - TBD - - - - - - - DocumentDomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - - - - - - DocumentDomainId - DocumentDomainId - - DocumentDomainId - - - - - Kennung oder Kennzeichen einer Domäne - TBD - - - - - - - VDI2770_Role - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - - - - - - Rolle - Role - - Role - - - - - Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) - TBD - - - - - - - VDI2770_OrganisationId - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - - - - - - Organisation ID - Organisation ID - - OrganisationId - - - - - eindeutige ID für die Organisation - TBD - - - - - - - VDI2770_OrganisationName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - - - - - - OrganisationName - OrganisationName - - OrganisationName - - - - - gebräuchliche Bezeichnung für die Organisation - TBD - - - - - - - VDI2770_OrganisationOfficialName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - - - - - - Offizieller Name der Organisation - Organisation Official Name - - OrganisationOfficialName - - - - - offizieller Name der Organisation - TBD - - - - - - - VDI2770_Description - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - - - - - - Beschreibung - Description - - Description - - - - - Beschreibung für die nächste übergeordnete Collection - TBD - - - - - - - DocumentPartId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - - - - - - Dokumenten-Teilnummer - DocumentPartId - - DocumentPartId - - - - - Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. - TBD - - - - - - - DocumentClassification_ClassId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - - - - Dokumentkategorie - Document category - - DocCategory - - - - - Dokumentkategorie nach VDI 2770:2018/10 - Document category after VDI 2770:2018/10 - - - - - - - VDI2770_ClassName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - - - - - - Klassenname - Class Name - - ClassName - - - - - Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. - TBD - - - - - - - VDI2770_ClassificationSystem - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - - - - - - Klassifizierungssystem - classification system - - ClassificationSystem - - - - - Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. - TBD - - - - - - - DocumentVersionId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - - - - - - Dokumenten-Versionsnummer - DocumentVersionId - - DocumentVersionId - - - - - Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. - TBD - - - - - - - DocumentVersion_LanguageCode - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - - - - - - Sprachenschlüssel - LanguageCode - - LanguageCode - - - - - Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 - TBD - - - - - - - VDI2770_Title - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - - - - - - Titel - Title - - VDI2770_Title - - - - - sprachabhängiger Titel des Dokuments - TBD - - - - - - - VDI2770_Summary - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - - - - - - Zusammenfassung - Summary - - Summary - - - - - sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts - TBD - - - - - - - VDI2770_Keywords - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - - - - - - Schlagwörter - Keywords - - Keywords - - - - - sprachabhängige, durch Komma getrennte Liste von Schlagwörtern - TBD - - - - - - - VDI2770_StatusValue - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - - - - - - Statuswert - StatusValue - - StatusValue - - - - - Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) - TBD - - - - - - - VDI2770_SetDate - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - - - - - - Erstellungsdatum - Set Date - - SetDate - - - - - Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). - TBD - - - - - - - VDI2770_Purpose - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - - - - - - Zweck - Purpose - - Purpose - - - - - Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. - TBD - - - - - - - VDI2770_BasedOnProcedure - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - - - - - - Prozedur - Procedure - - BasedOnProcedure - - - - - textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt - TBD - - - - - - - VDI2770_Comments - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - - - - - - Kommentar - Comments - - Comments - - - - - textuelle Bemerkungen und Anmerkungen zum Status - TBD - - - - - - - VDI2770_ReferencedObject_Type - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - - - - - - Typ - Type - - Type - - - - - Für Type des Objekts muss immer Product angegeben werden. - TBD - - - - - - - VDI2770_ReferencedObject_RefType - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - - - - - - RefType - RefType - - RefType - - - - - Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) - TBD - - - - - - - VDI2770_ReferencedObject_ObjectId - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - - - - - - ObjectId - ObjectId - - ObjectId - - - - - Angabe der Identifikationsnummer zum Objekt - TBD - - - - - - - VDI2770_FileId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - - - - - - ID der Datei - File ID - - FileId - - - - - eindeutige ID für die Datei - TBD - - - - - - - VDI2770_FileName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - - - - - - Dateiname - File name - - FileName - - - - - Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. - TBD - - - - - - - VDI2770_FileFormat - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - - - - - - Datei Format - File format - - FileFormat - - - - - Angabe eines Media Typs gemäß der Liste der IANA - TBD - - - - - - - OrganisationContactInfo - https://www.hsu-hh.de/aut/aas/contactinfo - - - - - - - - Contact Info - Kontakt Info - - OrganisationContactInfo - - - - - Sammlung für die allgemeinen Kontaktdaten - Collection for general contact data - - - - - - - NameOfSupplier - 0173-1#02-AAO735#003 - - - - - - - - - - - - name of supplier - Lieferantenname - - name of supplier - - - - - Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt - name of supplier which provides the customer with a product or a service - - - - - - - ContactInfo_Role - https://www.hsu-hh.de/aut/aas/role - - - - - - - - Rolle - Role - - Role - - - - - Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt - Information to specify the role which the organisation of ContactInfo plays - - - - - - - Email - https://www.hsu-hh.de/aut/aas/email - - - - - - - - Emailadresse - Email address - - Email - - - - - Emailadresse - Email address - - - - - - - URL - 0173-1#02-AAO694#001 - - - - - - - - Internetadresse - Internet address - - URL - - - - - stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html - Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html - - - - - - - PhoneNumber - 0173-1#02-AAO136#002 - - - - - - - - Telefonnummer - telephone number - - Phone - - - - - vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist - complete telephone number to be called to reach a business partner - - - - - - - Fax - https://www.hsu-hh.de/aut/aas/fax - - - - - - - - Fax - Fax - - Fax - - - - - Faxnummer - Fax number - - - - - - - 0173-1#02-AAO136#002 - - - - - GLNOfManufacturer - 0173-1#02-AAY812#001 - - - - - - - - GLN of manufacturer - GLN des Herstellers - - GLN of manufacturer - - - - - international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort - internationally unique identification number for the manufacturer of the device or the product and for the physical location - - - - - - - SupplierOfTheIdentifier - 0173-1#02-AAP796#004 - - - - - - - - Supplier of the identifier - Anbieter der Identifikationsnummer für Hersteller - - Supplier of the identifier - - - STRING_TRANSLATABLE - - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - - - - - - - MAN_PROD_NUM - - product article number of manufacturer - - 0173-1#02-AAO676#003 - - - - - - - - product article number of manufacturer - Herstellerartikelnummer - - MAN_PROD_NUM - - - STRING_TRANSLATABLE - - eindeutiger Bestellschlüssel des Herstellers - unique product identifier of the manufacturer - - - - - - - ManufacturerProductDescription - 0173-1#02-AAU734#001 - - - - - - - - Manufacturer product description - Herstellerproduktbeschreibung - - Manufacturer product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - GLNOfSupplier - 0173-1#02-AAY813#001 - - - - - - - - GLN of supplier - GLN des Lieferanten - - GLN of supplier - - - - - international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort - internationally unique identification number for the supplier of the device or the product and for the physical location - - - - - - - SupplierIdProvider - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - - - - - - SupplierIdProvider - Anbieter der Identifikationsnummer - - SupplierIdProvider - - - STRING_TRANSLATABLE - - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - - - - - - - SUP_PROD_NUM - 0173-1#02-AAO736#004 - - - - - - - - product article number of supplier - Lieferantenartikelnummer - - product article number of supplier - - - - - eindeutiger Bestellschlüssel des Lieferanten - unique product order identifier of the supplier - - - - - - - SupplierProductDesignation - 0173-1#02-AAM551#002 - - - - - - - - Supplier product designation - Lieferantenproduktbezeichnung - - SupplierTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - SupplierProductDescription - 0173-1#02-AAU730#001 - - - - - - - - Supplier product description - Lieferantenproduktbeschreibung - - Supplier product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - ClassificationSystem - 0173-1#02-AAO715#002 - - - - - - - - classification system - Klassifizierungssystem - - ClassificationSystem - - - - - Klassifizierungssystem - Classification System - - - - - - - SecondaryKeyTyp - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - - - - - - SecondaryKeyTyp - Typnummer des IT Systems - - SecondaryKeyTyp - - - - - Führende technische ID im IT System des Typs - SecondaryKeyTyp - - - - - - - TypThumbnail - www.company.com/ids/cd/4401_1272_7091_3437 - - - - - - - - TypThumbnail - Vorschaubild - - TypThumbnail - - - - - Darstellung des Produkttyps in kleinem Format - Small picture of the product type - - - - - - - AssetId - https://www.hsu-hh.de/aut/aas/assetid - - - - - - - - AssetId - Asset ID - - AssetId - - - - - Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. - Global unique ID of an asset, which can be read by both human and machine. - - - - - - - SecondaryKeyInstance - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - - - - - - SecondaryKeyInstance - Instanznummer des IT Systems - - SecondaryKeyInstance - - - - - Führende technische ID im IT System der Instanz - SecondaryKeyInstance - - - - - - - DateOfManufacture - 0173-1#02-AAR972#002 - - - - - - - - Date of manufacture - Herstellungsdatum - - Date of manufacture - - - DATE - - Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist - Date from which the production and / or development process is completed or from which a service is provided completely - - - - - - - DeviceRevision - https://www.hsu-hh.de/aut/aas/devicerevision - - - - - - - - DeviceRevision - DeviceRevision - - DeviceRevision - - - - - DeviceRevision - DeviceRevision - - - - - - - SoftwareRevision - https://www.hsu-hh.de/aut/aas/softwarerevision - - - - - - - - SoftwareRevision - SoftwareRevision - - SoftwareRevision - - - - - SoftwareRevision - SoftwareRevision - - - - - - - HardwareRevision - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - - - - - - HardwareRevision - HardwareRevision - - HardwareRevision - - - - - HardwareRevision - HardwareRevision - - - - - - - QrCode - https://www.hsu-hh.de/aut/aas/qrcode - - - - - - - - QrCode - QrCode - - QrCode - - - - - In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. - QrCode - - - - - - - CompanyLogo - https://www.hsu-hh.de/aut/aas/companylogo - - - - - - - - Firmenlogo - CompanyLogo - - CompanyLogo - - - - - Firmenlogo - CompanyLogo - - - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/03_Bosch.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/03_Bosch.aasx.xml deleted file mode 100644 index 59ae3d081..000000000 --- a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/03_Bosch.aasx.xml +++ /dev/null @@ -1,13753 +0,0 @@ - - - - - Bosch_R901509807_1201694127 - https://boschrexroth.com/ids/aas?p=p652370&m=R90150807&s=1201694127 - - - http://dc-qr.com?m=R901509807&s=1&f=1202044787 - - - - - - http://boschrexroth.com/ids/sm/4343_5072_7091_3242 - - - - - http://boschrexroth.com/ids/sm/2543_5072_7091_2660 - - - - - http://boschrexroth.com/ids/sm/6053_5072_7091_5102 - - - - - http://boschrexroth.com/ids/sm/6563_5072_7091_4267 - - - - - - - - - R901509807_1202044787 - http://dc-qr.com?m=R901509807&s=1&f=1202044787 - Instance - - - - - Nameplate - http://boschrexroth.com/ids/sm/4343_5072_7091_3242 - - - https://www.hsu-hh.de/aut/aas/nameplate - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Bosch Rexroth AG - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - 4WRPEH 6 C3 B40L-3X/M/24L1 - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Zum Eisengießer 1 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 97816 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Lohr am Main - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Bayern - - - - false - false - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - High-respones directional valve, direct operated - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 1201694127 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - ProductCountryOfOrigin - PARAMETER - - - 0173-1#02-AAO841#001 - - - Instance - - string - DE - - - - - YearOfConstruction - PARAMETER - - - 0173-1#02-AAP906#001 - - - Instance - - string - 2019 - - - - - Marking_CE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/marking_ce.png - - - - false - false - - - - - Marking_IO-Link - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - IO-LinkMarkingPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/Logo_IO-link.jpg - - - - false - false - - - - - Connector_IO-Link - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - IO-LinkConnectorPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/IO_Link_Steckerbelegung.png - - - - false - false - - - - - - Document - http://boschrexroth.com/ids/sm/2543_5072_7091_2660 - - - https://www.hsu-hh.de/aut/aas/document - - - Instance - - - - - DeclarationCEMarking - PARAMETER - - - www.company.com/ids/sm/2543_5072_7091_2660 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - DCTC-31003-003_KOE_N_DE_2016-07-20 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2016-07-20 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - EG-Konformitatserklarung - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - DCTC-31003-003_KOE_N_DE_2016-07-20.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/DCTC-31003-003_KOE_N_DE_2016-07-20.pdf - - - - false - false - - - - - Declaration_IO-Link - PARAMETER - - - www.company.com/ids/sm/2543_5072_7091_2660 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - DCTC-31000-136_HEK_N_EN_2019-09-18 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-09-18 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - HerstellererklärungIO-Link - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - DCTC-31000-136_HEK_N_EN_2019-09-18.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/DCTC-31000-136_HEK_N_EN_2019-09-18.pdf - - - - false - false - - - - - Certificat_DIN_EN_ISO_14001_2015 - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - string - Lohr_Bosch-Rexroth-AG_ISO_14001_BR_Matrix_en_20090723 - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Zertifikat für Bosch Rexroth AG Normen DIN EN ISO 14001:2015 - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - Lohr_Bosch-Rexroth-AG_ISO_14001_BR_Matrix_en_20090723 - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/Lohr_Bosch-Rexroth-AG_ISO_14001_BR_Matrix_en_20090723.pdf - - - - false - false - - - - - Datasheet_4WRPEH6-3x-EN - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - RE29131 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-01 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Technische Spezifikation - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-02 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Datasheet: Directional control valves, direct operated, with electrical position feedback and integrated electronics (OBE) - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - re29121_2019-02 - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/re29121_2019-02.pdf - - - - false - false - - - - - UserManual_4WRPEH6-3x_EN - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - RE07600 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-01 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Montage, Demontage - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - RE07600-B_web_01_2019 - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/RE07600-B_web_01_2019.pdf - - - - false - false - - - - - Parameter_IO-Link_EN - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - RE29400 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - string - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-01 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Technische Spezifikation - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Parameter description: High-response directional valves with electrical position feedback and IO-Link interface - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - RE29400_01-2019 - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/RE29400_01-2019.pdf - - - - false - false - - - - - UserManual_4WRPEH6-3x_DE - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - RD07600 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-01 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Montage, Demontage - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - RD07600-B_web_01_2019 - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/RD07600_web_01_2019.pdf - - - - false - false - - - - - UserManual_4WRPEH6-3x_RO - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - RU07600 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-01 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Montage, Demontage - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - ro - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - RU07600-B_web_01_2019 - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/RU07600-B_web_01_2019.pdf - - - - false - false - - - - - UserManual_4WRPEH6-3x_ES - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - RS07600 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-01 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Montage, Demontage - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - es - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - RS07600-B_web_01_2019 - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/RS07600-B_web_01_2019.pdf - - - - false - false - - - - - UserManual_4WRPEH6-3x_FI - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R-SF07600 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-01 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Montage, Demontage - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - fi - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - R-SF07600-B_web_01_2019 - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/R-SF07600_01_2019_web.pdf - - - - false - false - - - - - UserManual_4WRPEH6-3x_FR - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - RF07600 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-01 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Montage, Demontage - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - fr - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - RF07600-B_web_01_2019 - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/RF07600-B_web_01_2019.pdf - - - - false - false - - - - - UserManual_4WRPEH6-3x_NL - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R-NL07600 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-01 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Montage, Demontage - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - nl - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - R-NL07600-B_web_01_2019 - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/R-NL07600-B_web_01_2019.pdf - - - - false - false - - - - - UserManual_4WRPEH6-3x_PL - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R-PL07600 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-01 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Montage, Demontage - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - pl - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - R-PL07600-B_web_01_2019 - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/R-PL07600-B_web_01_2019 - - - - false - false - - - - - UserManual_4WRPEH6-3x_PT - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - RP07600 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-01 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Montage, Demontage - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - pt - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - RP07600-B_web_01_2019 - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/RP07600-B_web_01_2019.pdf - - - - false - false - - - - - UserManual_4WRPEH6-3x_RU - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R-RS07600 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-01 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Montage, Demontage - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - ru - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - R-RS07600-B_web_01_2019 - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/R-RS07600-B_web_30_03_2016.pdf - - - - false - false - - - - - UserManual_4WRPEH6-3x_SV - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R-SK07600 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-01 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Montage, Demontage - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - sv - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - R-SK07600-B_web_01_2019 - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/R-SK07600_web_B_01_2019.pdf - - - - false - false - - - - - UserManual_4WRPEH6-3x_TR - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - RT07600 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-01 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Montage, Demontage - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - tr - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - RT07600-B_web_01_2019 - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/RT07600_web_01_2019.pdf - - - - false - false - - - - - UserManual_4WRPEH6-3x_IT - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - RI07600 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-01 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Montage, Demontage - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - it - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - RI07600-B_web_01_2019 - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/RI07600-B_web_01_2019.pdf - - - - false - false - - - - - UserManual_4WRPEH6-3x_CS - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R-CZ07600 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-01 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Montage, Demontage - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - cs - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - R-CZ07600-B_web_01_2019 - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/R-CZ 07600-B_web_01_2019.pdf - - - - false - false - - - - - Datasheet_4WRPEH6-3x_DE - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - RD29131 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-01 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Technische Spezifikation - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-02 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Datasheet: Directional control valves, direct operated, with electrical position feedback and integrated electronics (OBE) - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - rd29121_2019-02 - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/rd29121_2019-02.pdf - - - - false - false - - - - - Datasheet_4WRPEH6-3x-zh - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - RC29131 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-01 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Technische Spezifikation - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-02 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - zh - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Datasheet: Directional control valves, direct operated, with electrical position feedback and integrated electronics (OBE) - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - rc29121_2019-02 - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/rc29121_2019-02.pdf - - - - false - false - - - - - Parameter_IO-Link-DE - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - RD29400 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - string - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-01 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Technische Spezifikation - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Parameter description: High-response directional valves with electrical position feedback and IO-Link interface - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - RD29400_01-2019 - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/RD29400_01_2019_web.pdf - - - - false - false - - - - - - Service - http://boschrexroth.com/ids/sm/6053_5072_7091_5102 - - - https://www.hsu-hh.de/aut/aas/service - - - Instance - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Bosch Rexroth AG - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Bgm.-Dr.-Nebel-Str. 8 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 97816 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Lohr - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Bayern - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - service@boschrexroth.de - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.boschrexroth.com/de/de/service/startseite-service - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +499352405060 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - - - - - false - false - - - - - - Identification - http://boschrexroth.com/ids/sm/6563_5072_7091_4267 - - - https://www.hsu-hh.de/aut/aas/identification - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Bosch Rexroth AG - - - - - GLNOfManufacturer - PARAMETER - - - 0173-1#02-AAY812#001 - - - Instance - - string - 4048118000006 - - - - - SupplierOfTheIdentifier - - - 0173-1#02-AAP796#004 - - - Instance - - string - GLN GS1 - - - - - MAN_PROD_NUM - - - 0173-1#02-AAO676#003 - - - Instance - - string - R901509807 - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - 4WRPEH 6 C3 B40L-3X/M/24L1 - - - - - ManufacturerProductDescription - PARAMETER - - - 0173-1#02-AAU734#001 - - - Instance - - langString - High-response directional valves, direct operated, with electrical position feedback and integrated electronics (OBE)“ oder auch „• Size 6 • Component series 3X • Maximum operating pressure 350 bar • Nominal flow 4 … 40 l/min • Digital interface IO-Link - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - string - Proportional directional control valve, spool design (hydraulics) - - - - - ClassificationSystem - PARAMETER - - - 0173-1#02-AAO715#002 - - - Instance - - string - eCl@ss - - - - - SecondaryKeyTyp - - - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - Instance - - - - - - - - TypThumbnail - PARAMETER - - - www.company.com/ids/cd/4401_1272_7091_3437 - - - Instance - - image/jpeg - /aasx/4WRPEH6_3X.png - - - - - AssetId - PARAMETER - - - https://www.hsu-hh.de/aut/aas/assetid - - - Instance - - string - http://dc-qr.com?m=R901509807&s=1&f=1202044787 - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 1202044787 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - SecondaryKeyInstance - PARAMETER - - - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - Instance - - - - - - - - DateOfManufacture - PARAMETER - - - 0173-1#02-AAR972#002 - - - Instance - - - 2018 - - - - - DeviceRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/devicerevision - - - Instance - - - 30 - - - - - SoftwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/softwarerevision - - - Instance - - string - 02V08 - - - - - HardwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - Instance - - string - P.017.0014 - - - - - QrCode - PARAMETER - - - https://www.hsu-hh.de/aut/aas/qrcode - - - Instance - - image/jpeg - /aasx/Identification/QR-Code.jpg - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Bosch Rexroth AG - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Zum Eisengießer 1 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 97816 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Lohr am Main - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Bayern - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - service@boschrexroth.de - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.boschrexroth.com/de/de/home/index - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +499352405060 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - - - - - false - false - - - - - CompanyLogo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/companylogo - - - Instance - - image/png - /aasx/Identification/Rexroth-Logo_RGB_M.jpg - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - http://dc-qr.com?m=R901509807&s=1&f=1202044787 - - - - - - - - ManufacturerName - 0173-1#02-AAO677#002 - - - - - - - - Herstellername - Manufacturer Name - - Manufacturer Name - - - - - Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist - 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 - - - - - - - ManufacturerProductDesignation - 0173-1#02-AAW338#001 - - - - - - - - Manufacturer product designation - Herstellerproduktbezeichnung - - ManufacturerTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - PhysicalAddress - https://www.hsu-hh.de/aut/aas/physicaladdress - - - - - - - - PhysicalAddress - Physische Adresse - - PhysicalAddress - - - - - Sammlung für reale physische Adresse - Collection for real physical address - - - - - - - CountryCode - 0173-1#02-AAO730#001 - - - - - - - - - - - - Landeskennung - Country code - - Country code - - - - - Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes - agreed upon symbol for unambiguous identification of a country - - - - - - - Street - 0173-1#02-AAO128#001 - - - - - - - - Strasse - Street - - Street - - - - - Name der Strasse und Hausnummer - Street name and house number - - - - - - - Zip - 0173-1#02-AAO129#002 - - - - - - - - Zip - Postleitzahl - - PostalCode - - - - - ZIP code of address - Postleitzahl der Anschrift - - - - - - - CityTown - 0173-1#02-AAO132#001 - - - - - - - - Ort - City/town - - City/town - - - - - Town or city of the company - Ortsangabe - - - - - - - StateCounty - 0173-1#02-AAO133#002 - - - - - - - - state/county - Bundesland - - StateCounty - - - - - Bundesland - state/county - - - - - - - ManufacturerProductFamily - 0173-1#02-AAU731#001 - - - - - - - - Manufacturer product family - Herstellerproduktfamilie - - TypClass - - - - - 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie - 2nd level of a 3 level manufacturer specific product hierarchy - - - - - - - SerialNumber - 0173-1#02-AAM556#002 - - - - - - - - Serial number - Seriennummer - - InstanceId - - - - - eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist - unique combination of numbers and letters used to identify the device once it has been manufactured - - - - - - - BatchNumber - 0173-1#02-AAQ196#001 - - - - - - - - Batch number - Chargen-Nummer - - ChargeId - - - - - Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge - Number assigned by the manufacturer of a material to identify the manufacturer's batch - - - - - - - ProductCountryOfOrigin - 0173-1#02-AAO841#001 - - - - - - - - Produkt Ursprungsland - Product country of origin - - CountryOfOrigin - - - - - Land in dem das Produkt hergestellt wurde (Hersteller Land) - Country in which the product is manufactured (manufacturer country) - - - - - - - YearOfConstruction - 0173-1#02-AAP906#001 - - - - - - - - Year of construction - Baujahr - - YearOfConstruction - - - - - Jahreszahl als Datumsangabe für die Fertigstellung des Objektes - Year as completion date of object - - - - - - - ProductMarking - https://www.hsu-hh.de/aut/aas/productmarking - - - - - - - - Produktkennzeichnung - Product Marking - - ProductMarking - - - - - Sammlungsdatei für Produktkennzeichnung - Collection file for product marking - - - - - - - CEQualificationPresent - 0173-1#02-BAF053#008 - - - - - - - - IO-Link-Kennzeichnung vorhanden - IO-Link marking present - - CEMarkingPresent - - - BOOLEAN - - whether CE- qualification is present - Angabe, ob CE-Kennzeichnung vorhanden ist - - - - - - - File - 0173-1#02-AAD005#008 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Enthaltene Doku. Datei - Embedded Doc. file - - File - - - - - Verweis/ BLOB auf enthaltene Dokumentations-Datei. - Reference/ BLOB to embedded documentation file. - - - - - - - DocumentationItem - - 0173-1#02-AAD001#001 - - - - - - - - Dokumentationsgruppe - Documentation item - - DocumentationItem - - - - - Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. - Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. - - - - - - - DocumentType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - - - - - - Dokumententyp - Document Type - - DocumentType - - - - - Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) - TBD - - - - - - - VDI2770_DomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - - - - - - Domain-Nummer - DomainId - - DomainId - - - - - Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. - TBD - - - - - - - VDI2770_IdType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - - - - - - Nummerntyp - IdType - - IdType - - - - - Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. - TBD - - - - - - - DocumentId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - - - - - - DocumentId - Dokumenten-Nummer - - DocumentId - - - - - Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. - TBD - - - - - - - DocumentDomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - - - - - - DocumentDomainId - DocumentDomainId - - DocumentDomainId - - - - - Kennung oder Kennzeichen einer Domäne - TBD - - - - - - - VDI2770_Role - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - - - - - - Rolle - Role - - Role - - - - - Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) - TBD - - - - - - - VDI2770_OrganisationId - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - - - - - - Organisation ID - Organisation ID - - OrganisationId - - - - - eindeutige ID für die Organisation - TBD - - - - - - - VDI2770_OrganisationName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - - - - - - OrganisationName - OrganisationName - - OrganisationName - - - - - gebräuchliche Bezeichnung für die Organisation - TBD - - - - - - - VDI2770_OrganisationOfficialName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - - - - - - Offizieller Name der Organisation - Organisation Official Name - - OrganisationOfficialName - - - - - offizieller Name der Organisation - TBD - - - - - - - VDI2770_Description - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - - - - - - Beschreibung - Description - - Description - - - - - Beschreibung für die nächste übergeordnete Collection - TBD - - - - - - - DocumentPartId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - - - - - - Dokumenten-Teilnummer - DocumentPartId - - DocumentPartId - - - - - Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. - TBD - - - - - - - DocumentClassification_ClassId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - - - - Dokumentkategorie - Document category - - DocCategory - - - - - Dokumentkategorie nach VDI 2770:2018/10 - Document category after VDI 2770:2018/10 - - - - - - - VDI2770_ClassName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - - - - - - Klassenname - Class Name - - ClassName - - - - - Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. - TBD - - - - - - - VDI2770_ClassificationSystem - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - - - - - - Klassifizierungssystem - classification system - - ClassificationSystem - - - - - Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. - TBD - - - - - - - DocumentVersionId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - - - - - - Dokumenten-Versionsnummer - DocumentVersionId - - DocumentVersionId - - - - - Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. - TBD - - - - - - - DocumentVersion_LanguageCode - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - - - - - - Sprachenschlüssel - LanguageCode - - LanguageCode - - - - - Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 - TBD - - - - - - - VDI2770_Title - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - - - - - - Titel - Title - - VDI2770_Title - - - - - sprachabhängiger Titel des Dokuments - TBD - - - - - - - VDI2770_Summary - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - - - - - - Zusammenfassung - Summary - - Summary - - - - - sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts - TBD - - - - - - - VDI2770_Keywords - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - - - - - - Schlagwörter - Keywords - - Keywords - - - - - sprachabhängige, durch Komma getrennte Liste von Schlagwörtern - TBD - - - - - - - VDI2770_StatusValue - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - - - - - - Statuswert - StatusValue - - StatusValue - - - - - Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) - TBD - - - - - - - VDI2770_SetDate - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - - - - - - Erstellungsdatum - Set Date - - SetDate - - - - - Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). - TBD - - - - - - - VDI2770_Purpose - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - - - - - - Zweck - Purpose - - Purpose - - - - - Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. - TBD - - - - - - - VDI2770_BasedOnProcedure - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - - - - - - Prozedur - Procedure - - BasedOnProcedure - - - - - textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt - TBD - - - - - - - VDI2770_Comments - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - - - - - - Kommentar - Comments - - Comments - - - - - textuelle Bemerkungen und Anmerkungen zum Status - TBD - - - - - - - VDI2770_ReferencedObject_Type - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - - - - - - Typ - Type - - Type - - - - - Für Type des Objekts muss immer Product angegeben werden. - TBD - - - - - - - VDI2770_ReferencedObject_RefType - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - - - - - - RefType - RefType - - RefType - - - - - Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) - TBD - - - - - - - VDI2770_ReferencedObject_ObjectId - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - - - - - - ObjectId - ObjectId - - ObjectId - - - - - Angabe der Identifikationsnummer zum Objekt - TBD - - - - - - - VDI2770_FileId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - - - - - - ID der Datei - File ID - - FileId - - - - - eindeutige ID für die Datei - TBD - - - - - - - VDI2770_FileName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - - - - - - Dateiname - File name - - FileName - - - - - Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. - TBD - - - - - - - VDI2770_FileFormat - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - - - - - - Datei Format - File format - - FileFormat - - - - - Angabe eines Media Typs gemäß der Liste der IANA - TBD - - - - - - - OrganisationContactInfo - https://www.hsu-hh.de/aut/aas/contactinfo - - - - - - - - Contact Info - Kontakt Info - - OrganisationContactInfo - - - - - Sammlung für die allgemeinen Kontaktdaten - Collection for general contact data - - - - - - - NameOfSupplier - 0173-1#02-AAO735#003 - - - - - - - - - - - - name of supplier - Lieferantenname - - name of supplier - - - - - Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt - name of supplier which provides the customer with a product or a service - - - - - - - ContactInfo_Role - https://www.hsu-hh.de/aut/aas/role - - - - - - - - Rolle - Role - - Role - - - - - Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt - Information to specify the role which the organisation of ContactInfo plays - - - - - - - Email - https://www.hsu-hh.de/aut/aas/email - - - - - - - - Emailadresse - Email address - - Email - - - - - Emailadresse - Email address - - - - - - - URL - 0173-1#02-AAO694#001 - - - - - - - - Internetadresse - Internet address - - URL - - - - - stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html - Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html - - - - - - - PhoneNumber - 0173-1#02-AAO136#002 - - - - - - - - Telefonnummer - telephone number - - Phone - - - - - vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist - complete telephone number to be called to reach a business partner - - - - - - - Fax - https://www.hsu-hh.de/aut/aas/fax - - - - - - - - Fax - Fax - - Fax - - - - - Faxnummer - Fax number - - - - - - - 0173-1#02-AAO136#002 - - - - - GLNOfManufacturer - 0173-1#02-AAY812#001 - - - - - - - - GLN of manufacturer - GLN des Herstellers - - GLN of manufacturer - - - - - international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort - internationally unique identification number for the manufacturer of the device or the product and for the physical location - - - - - - - SupplierOfTheIdentifier - 0173-1#02-AAP796#004 - - - - - - - - Supplier of the identifier - Anbieter der Identifikationsnummer für Hersteller - - Supplier of the identifier - - - STRING_TRANSLATABLE - - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - - - - - - - MAN_PROD_NUM - - product article number of manufacturer - - 0173-1#02-AAO676#003 - - - - - - - - product article number of manufacturer - Herstellerartikelnummer - - MAN_PROD_NUM - - - STRING_TRANSLATABLE - - eindeutiger Bestellschlüssel des Herstellers - unique product identifier of the manufacturer - - - - - - - ManufacturerProductDescription - 0173-1#02-AAU734#001 - - - - - - - - Manufacturer product description - Herstellerproduktbeschreibung - - Manufacturer product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - GLNOfSupplier - 0173-1#02-AAY813#001 - - - - - - - - GLN of supplier - GLN des Lieferanten - - GLN of supplier - - - - - international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort - internationally unique identification number for the supplier of the device or the product and for the physical location - - - - - - - SupplierIdProvider - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - - - - - - SupplierIdProvider - Anbieter der Identifikationsnummer - - SupplierIdProvider - - - STRING_TRANSLATABLE - - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - - - - - - - SUP_PROD_NUM - 0173-1#02-AAO736#004 - - - - - - - - product article number of supplier - Lieferantenartikelnummer - - product article number of supplier - - - - - eindeutiger Bestellschlüssel des Lieferanten - unique product order identifier of the supplier - - - - - - - SupplierProductDesignation - 0173-1#02-AAM551#002 - - - - - - - - Supplier product designation - Lieferantenproduktbezeichnung - - SupplierTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - SupplierProductDescription - 0173-1#02-AAU730#001 - - - - - - - - Supplier product description - Lieferantenproduktbeschreibung - - Supplier product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - ClassificationSystem - 0173-1#02-AAO715#002 - - - - - - - - classification system - Klassifizierungssystem - - ClassificationSystem - - - - - Klassifizierungssystem - Classification System - - - - - - - SecondaryKeyTyp - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - - - - - - SecondaryKeyTyp - Typnummer des IT Systems - - SecondaryKeyTyp - - - - - Führende technische ID im IT System des Typs - SecondaryKeyTyp - - - - - - - TypThumbnail - www.company.com/ids/cd/4401_1272_7091_3437 - - - - - - - - TypThumbnail - Vorschaubild - - TypThumbnail - - - - - Darstellung des Produkttyps in kleinem Format - Small picture of the product type - - - - - - - AssetId - https://www.hsu-hh.de/aut/aas/assetid - - - - - - - - AssetId - Asset ID - - AssetId - - - - - Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. - Global unique ID of an asset, which can be read by both human and machine. - - - - - - - SecondaryKeyInstance - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - - - - - - SecondaryKeyInstance - Instanznummer des IT Systems - - SecondaryKeyInstance - - - - - Führende technische ID im IT System der Instanz - SecondaryKeyInstance - - - - - - - DateOfManufacture - 0173-1#02-AAR972#002 - - - - - - - - Date of manufacture - Herstellungsdatum - - Date of manufacture - - - DATE - - Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist - Date from which the production and / or development process is completed or from which a service is provided completely - - - - - - - DeviceRevision - https://www.hsu-hh.de/aut/aas/devicerevision - - - - - - - - DeviceRevision - DeviceRevision - - DeviceRevision - - - - - DeviceRevision - DeviceRevision - - - - - - - SoftwareRevision - https://www.hsu-hh.de/aut/aas/softwarerevision - - - - - - - - SoftwareRevision - SoftwareRevision - - SoftwareRevision - - - - - SoftwareRevision - SoftwareRevision - - - - - - - HardwareRevision - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - - - - - - HardwareRevision - HardwareRevision - - HardwareRevision - - - - - HardwareRevision - HardwareRevision - - - - - - - QrCode - https://www.hsu-hh.de/aut/aas/qrcode - - - - - - - - QrCode - QrCode - - QrCode - - - - - In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. - QrCode - - - - - - - CompanyLogo - https://www.hsu-hh.de/aut/aas/companylogo - - - - - - - - Firmenlogo - CompanyLogo - - CompanyLogo - - - - - Firmenlogo - CompanyLogo - - - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/04_Bosch.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/04_Bosch.aasx.xml deleted file mode 100644 index eb7d7280c..000000000 --- a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/04_Bosch.aasx.xml +++ /dev/null @@ -1,6691 +0,0 @@ - - - - - Bosch_CompactModuleBallRailSystem - http://boschrexroth.com/shells/R036037000/1005625831090001 - - - http://dc-qr.com?m=R036037000&s=1005625831090001&vc=CKK-090-NN-1 - - - - - - http://boschrexroth.com/shells/R036037000/1005625831090001/submodels/nameplate/ - - - - - http://boschrexroth.com/shells/R036037000/1005625831090001/submodels/document/ - - - - - http://boschrexroth.com/shells/R036037000/1005625831090001/submodels/service/ - - - - - http://boschrexroth.com/shells/R036037000/1005625831090001/submodels/identification/ - - - - - http://boschrexroth.com/shells/R036037000/1005625831090001/submodels/technicalSpecification/ - - - - - - - - - MR036037000_S1005625831090001 - CONSTANT - http://dc-qr.com?m=R036037000&s=1005625831090001&vc=CKK-090-NN-1 - Instance - - - - - Nameplate - http://boschrexroth.com/shells/R036037000/1005625831090001/submodels/nameplate/ - - - https://www.hsu-hh.de/aut/aas/nameplate - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Bosch Rexroth AG - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - Compact Module with ball screw drive (CKK) - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Zum Eisengießer 1 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 97816 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Lohr am Main - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Bayern - - - - false - false - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - string - Compact module - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 1005625831090001 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - ProductCountryOfOrigin - PARAMETER - - - 0173-1#02-AAO841#001 - - - Instance - - string - DE - - - - - YearOfConstruction - PARAMETER - - - 0173-1#02-AAP906#001 - - - Instance - - string - 2019 - - - - - Marking_CE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/marking_ce.png - - - - false - false - - - - - - Document - http://boschrexroth.com/shells/R036037000/1005625831090001/submodels/document/ - - - https://www.hsu-hh.de/aut/aas/document - - - Instance - - - - - Doku_Schmierung_CKx_V01_R320103051_2017_03 - PARAMETER - - - - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - R320103051 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung (DE) Operating Instructions (EN) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - 2017-03 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de/en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Erweiterungsdokumentation Schmierung CKK und CRK (de) / Extension instructions lubrication of CKK and CKR (en) - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - Doku_Schmierung_CKx_V01_R320103051_2017_03.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/Doku_Schmierung_CKx_V01_R320103051_2017_03.pdf - - - - false - false - - - - - R320103141_2015_06_Einbauerklaerung_einachsig - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R320103141 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung (DE) Operating Instructions (EN) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2015-06 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de/en/es/fr/it/pt/bg/cs/da/et/el/fi/ga/hu/is/lt/lv/mt/nl/no/pl/ro/sk/sl/sv/tr - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Einbauerklärung für einachsige Linearsysteme - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - R320103141_2015_06_Einbauerklaerung_einachsig.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/R320103141_2015_06_Einbauerklaerung_einachsig.pdf - - - - false - false - - - - - R320103152_2015_01_DE_Safety_LS_Media_22_01_2015 - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R320103152 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-03 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Allgemeine Sicherheit (DE) General Security (EN) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2015-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Sicherheitshinweise für Linearsysteme - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - R320103152_2015_01_DE_Safety_LS_Media_22_01_2015.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/R320103152_2015_01_DE_Safety_LS_Media_22_01_2015.pdf - - - - false - false - - - - - R320103152_2015_01_EN_Safety_LS_22_01_2015_web - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R320103152 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-03 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Allgemeine Sicherheit (DE) General Security (EN) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2015-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Sicherheitshinweise für Linearsysteme - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - R320103152_2015_01_EN_Safety_LS_22_01_2015_web.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/R320103152_2015_01_EN_Safety_LS_22_01_2015_web.pdf - - - - false - false - - - - - R320103982_DE_EN_FR_IT_2015-05_CKK - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R320103982 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung (DE) Operating Instructions (EN) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2015-05 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de/en/fr/it - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Anleitung / Instructions / Instructions / Istruzioni - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - R320103982_DE_EN_FR_IT_(2015_05)_CKK.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/R320103982_DE_EN_FR_IT_(2015_05)_CKK.pdf - - - - false - false - - - - - R999000479_2019_03_DE_18_07_2019_CKx - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R999000479 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung (DE) Operating Instructions (EN) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-03 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Katalog CKK / CKR - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - R999000479_2019_03_DE_18_07_2019_CKx.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/R999000479_2019_03_DE_18_07_2019_CKx.pdf - - - - false - false - - - - - R999000499_2019_03_EN_18_07_2019_CKx - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R999000499 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung (DE) Operating Instructions (EN) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-03 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Catalog CKK / CKR - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - R999000499_2019_03_EN_18_07_2019_CKx.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/R999000499_2019_03_EN_18_07_2019_CKx.pdf - - - - false - false - - - - - - Service - http://boschrexroth.com/shells/R036037000/1005625831090001/submodels/service/ - - - https://www.hsu-hh.de/aut/aas/service - - - Instance - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Bosch Rexroth AG Linear Motion Technologies - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Röntgenstraße 5 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 97424 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Schweinfurt - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Bayern - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - service.lt@boschrexroth.de - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.boschrexroth.com/en/xc/products/product-groups/linear-motion-technology/service-linear-motion-technology - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +49 9721 937 8617 - - - - false - false - - - - - - Identification - http://boschrexroth.com/shells/R036037000/1005625831090001/submodels/identification/ - - - https://www.hsu-hh.de/aut/aas/identification - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Bosch Rexroth AG - - - - - GLNOfManufacturer - PARAMETER - - - 0173-1#02-AAY812#001 - - - Instance - - string - 4048118000006 - - - - - SupplierOfTheIdentifier - - - 0173-1#02-AAP796#004 - - - Instance - - string - GLN GS1 - - - - - MAN_PROD_NUM - - - 0173-1#02-AAO676#003 - - - Instance - - string - R036037000 - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - CKK-090-NN-1 - - - - - ManufacturerProductDescription - PARAMETER - - - 0173-1#02-AAU734#001 - - - Instance - - langString - Compact Module with ball screw drive (CKK) - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - string - Compact Module - - - - - ClassificationSystem - PARAMETER - - - 0173-1#02-AAO715#002 - - - Instance - - string - eCl@ss - - - - - SecondaryKeyTyp - - - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - Instance - - - - - - - - TypThumbnail - PARAMETER - - - www.company.com/ids/cd/4401_1272_7091_3437 - - - Instance - - image/jpeg - /CKK.jpg - - - - - AssetId - PARAMETER - - - https://www.hsu-hh.de/aut/aas/assetid - - - Instance - - string - http://dc-qr.com?m=R036037000&s=1005625831090001&vc=CKK-090-NN-1 - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 1005625831090001 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - SecondaryKeyInstance - PARAMETER - - - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - Instance - - - - - - - - DateOfManufacture - PARAMETER - - - 0173-1#02-AAR972#002 - - - Instance - - - 2019 - - - - - DeviceRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/devicerevision - - - Instance - - - - - - - - SoftwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/softwarerevision - - - Instance - - - - - - - - HardwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - Instance - - - - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Bosch Rexroth AG - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Zum Eisengießer 1 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 97816 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Lohr am Main - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Bayern - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - service@boschrexroth.de - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.boschrexroth.com/de/de/home/index - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +499352405060 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - - - - - false - false - - - - - CompanyLogo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/companylogo - - - Instance - - image/png - /aasx/Identification/logo.png - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - http://dc-qr.com?m=R036037000&s=1005625831090001&vc=CKK-090-NN-1 - - - - - - TechnicalSpecification - http://boschrexroth.com/shells/R036037000/1005625831090001/submodels/technicalSpecification/ - - - https://www.hsu-hh.de/aut/aas/technicalspecification - - - Instance - - - - - MaxTraversePath - PARAMETER - - - - http://boschrexroth.com/cds/lt/maxTraversePath - - - Instance - - float - 210 - - - - - FormFeedConstant - PARAMETER - - - - http://boschrexroth.com/cds/lt/formFeedConstant - - - Instance - - float - 10,00 - - - - - MaxPermissibleSpeed - PARAMETER - - - - http://boschrexroth.com/cds/lt/maxPermissibleSpeed - - - Instance - - float - 1,13 - - - - - MaxPermissibleAcceleration - PARAMETER - - - - http://boschrexroth.com/cds/lt/maxPermissibleAcceleration - - - Instance - - float - 50,00 - - - - - MaxPermissibleTorque - PARAMETER - - - - http://boschrexroth.com/cds/lt/maxPermissibleTorque - - - Instance - - float - 4,42 - - - - - RotationDirectionPositiveMovement - PARAMETER - - - - http://boschrexroth.com/cds/lt/RotationDirectionPositiveMovement - - - Instance - - string - CW - - - - - GearTransmissionRatio - PARAMETER - - - - http://boschrexroth.com/cds/lt/GearTransmissionRatio - - - Instance - - float - 1,00 - - - - - - - - ManufacturerName - 0173-1#02-AAO677#002 - - - - - - - - Herstellername - Manufacturer Name - - Manufacturer Name - - - - - Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist - 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 - - - - - - - ManufacturerProductDesignation - 0173-1#02-AAW338#001 - - - - - - - - Manufacturer product designation - Herstellerproduktbezeichnung - - ManufacturerTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - PhysicalAddress - https://www.hsu-hh.de/aut/aas/physicaladdress - - - - - - - - PhysicalAddress - Physische Adresse - - PhysicalAddress - - - - - Sammlung für reale physische Adresse - Collection for real physical address - - - - - - - CountryCode - 0173-1#02-AAO730#001 - - - - - - - - - - - - Landeskennung - Country code - - Country code - - - - - Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes - agreed upon symbol for unambiguous identification of a country - - - - - - - Street - 0173-1#02-AAO128#001 - - - - - - - - Strasse - Street - - Street - - - - - Name der Strasse und Hausnummer - Street name and house number - - - - - - - Zip - 0173-1#02-AAO129#002 - - - - - - - - Zip - Postleitzahl - - PostalCode - - - - - ZIP code of address - Postleitzahl der Anschrift - - - - - - - CityTown - 0173-1#02-AAO132#001 - - - - - - - - Ort - City/town - - City/town - - - - - Town or city of the company - Ortsangabe - - - - - - - StateCounty - 0173-1#02-AAO133#002 - - - - - - - - state/county - Bundesland - - StateCounty - - - - - Bundesland - state/county - - - - - - - ManufacturerProductFamily - 0173-1#02-AAU731#001 - - - - - - - - Manufacturer product family - Herstellerproduktfamilie - - TypClass - - - - - 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie - 2nd level of a 3 level manufacturer specific product hierarchy - - - - - - - SerialNumber - 0173-1#02-AAM556#002 - - - - - - - - Serial number - Seriennummer - - InstanceId - - - - - eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist - unique combination of numbers and letters used to identify the device once it has been manufactured - - - - - - - BatchNumber - 0173-1#02-AAQ196#001 - - - - - - - - Batch number - Chargen-Nummer - - ChargeId - - - - - Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge - Number assigned by the manufacturer of a material to identify the manufacturer's batch - - - - - - - ProductCountryOfOrigin - 0173-1#02-AAO841#001 - - - - - - - - Produkt Ursprungsland - Product country of origin - - CountryOfOrigin - - - - - Land in dem das Produkt hergestellt wurde (Hersteller Land) - Country in which the product is manufactured (manufacturer country) - - - - - - - YearOfConstruction - 0173-1#02-AAP906#001 - - - - - - - - Year of construction - Baujahr - - YearOfConstruction - - - - - Jahreszahl als Datumsangabe für die Fertigstellung des Objektes - Year as completion date of object - - - - - - - ProductMarking - https://www.hsu-hh.de/aut/aas/productmarking - - - - - - - - Produktkennzeichnung - Product Marking - - ProductMarking - - - - - Sammlungsdatei für Produktkennzeichnung - Collection file for product marking - - - - - - - CEQualificationPresent - 0173-1#02-BAF053#008 - - - - - - - - CE-Kennzeichnung vorhanden - CE- qualification present - - CEMarkingPresent - - - BOOLEAN - - whether CE- qualification is present - Angabe, ob CE-Kennzeichnung vorhanden ist - - - - - - - File - 0173-1#02-AAD005#008 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Enthaltene Doku. Datei - Embedded Doc. file - - File - - - - - Verweis/ BLOB auf enthaltene Dokumentations-Datei. - Reference/ BLOB to embedded documentation file. - - - - - - - DocumentationItem - 0173-1#02-AAD001#001 - - - - - - - - Dokumentationsgruppe - Documentation item - - DocumentationItem - - - - - Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. - Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. - - - - - - - DocumentType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - - - - - - Dokumententyp - Document Type - - DocumentType - - - - - Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) - TBD - - - - - - - VDI2770_DomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - - - - - - Domain-Nummer - DomainId - - DomainId - - - - - Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. - TBD - - - - - - - VDI2770_IdType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - - - - - - Nummerntyp - IdType - - IdType - - - - - Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. - TBD - - - - - - - DocumentId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - - - - - - DocumentId - Dokumenten-Nummer - - DocumentId - - - - - Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. - TBD - - - - - - - DocumentDomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - - - - - - DocumentDomainId - DocumentDomainId - - DocumentDomainId - - - - - Kennung oder Kennzeichen einer Domäne - TBD - - - - - - - VDI2770_Role - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - - - - - - Rolle - Role - - Role - - - - - Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) - TBD - - - - - - - VDI2770_OrganisationId - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - - - - - - Organisation ID - Organisation ID - - OrganisationId - - - - - eindeutige ID für die Organisation - TBD - - - - - - - VDI2770_OrganisationName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - - - - - - OrganisationName - OrganisationName - - OrganisationName - - - - - gebräuchliche Bezeichnung für die Organisation - TBD - - - - - - - VDI2770_OrganisationOfficialName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - - - - - - Offizieller Name der Organisation - Organisation Official Name - - OrganisationOfficialName - - - - - offizieller Name der Organisation - TBD - - - - - - - VDI2770_Description - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - - - - - - Beschreibung - Description - - Description - - - - - Beschreibung für die nächste übergeordnete Collection - TBD - - - - - - - DocumentPartId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - - - - - - Dokumenten-Teilnummer - DocumentPartId - - DocumentPartId - - - - - Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. - TBD - - - - - - - DocumentClassification_ClassId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - - - - Dokumentkategorie - Document category - - DocCategory - - - - - Dokumentkategorie nach VDI 2770:2018/10 - Document category after VDI 2770:2018/10 - - - - - - - VDI2770_ClassName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - - - - - - Klassenname - Class Name - - ClassName - - - - - Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. - TBD - - - - - - - VDI2770_ClassificationSystem - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - - - - - - Klassifizierungssystem - classification system - - ClassificationSystem - - - - - Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. - TBD - - - - - - - DocumentVersionId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - - - - - - Dokumenten-Versionsnummer - DocumentVersionId - - DocumentVersionId - - - - - Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. - TBD - - - - - - - DocumentVersion_LanguageCode - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - - - - - - Sprachenschlüssel - LanguageCode - - LanguageCode - - - - - Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 - TBD - - - - - - - VDI2770_Title - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - - - - - - Titel - Title - - VDI2770_Title - - - - - sprachabhängiger Titel des Dokuments - TBD - - - - - - - VDI2770_Summary - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - - - - - - Zusammenfassung - Summary - - Summary - - - - - sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts - TBD - - - - - - - VDI2770_Keywords - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - - - - - - Schlagwörter - Keywords - - Keywords - - - - - sprachabhängige, durch Komma getrennte Liste von Schlagwörtern - TBD - - - - - - - VDI2770_StatusValue - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - - - - - - Statuswert - StatusValue - - StatusValue - - - - - Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) - TBD - - - - - - - VDI2770_SetDate - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - - - - - - Erstellungsdatum - Set Date - - SetDate - - - - - Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). - TBD - - - - - - - VDI2770_Purpose - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - - - - - - Zweck - Purpose - - Purpose - - - - - Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. - TBD - - - - - - - VDI2770_BasedOnProcedure - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - - - - - - Prozedur - Procedure - - BasedOnProcedure - - - - - textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt - TBD - - - - - - - VDI2770_Comments - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - - - - - - Kommentar - Comments - - Comments - - - - - textuelle Bemerkungen und Anmerkungen zum Status - TBD - - - - - - - VDI2770_ReferencedObject_Type - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - - - - - - Typ - Type - - Type - - - - - Für Type des Objekts muss immer Product angegeben werden. - TBD - - - - - - - VDI2770_ReferencedObject_RefType - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - - - - - - RefType - RefType - - RefType - - - - - Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) - TBD - - - - - - - VDI2770_ReferencedObject_ObjectId - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - - - - - - ObjectId - ObjectId - - ObjectId - - - - - Angabe der Identifikationsnummer zum Objekt - TBD - - - - - - - VDI2770_FileId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - - - - - - ID der Datei - File ID - - FileId - - - - - eindeutige ID für die Datei - TBD - - - - - - - VDI2770_FileName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - - - - - - Dateiname - File name - - FileName - - - - - Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. - TBD - - - - - - - VDI2770_FileFormat - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - - - - - - Datei Format - File format - - FileFormat - - - - - Angabe eines Media Typs gemäß der Liste der IANA - TBD - - - - - - - OrganisationContactInfo - https://www.hsu-hh.de/aut/aas/contactinfo - - - - - - - - Contact Info - Kontakt Info - - OrganisationContactInfo - - - - - Sammlung für die allgemeinen Kontaktdaten - Collection for general contact data - - - - - - - NameOfSupplier - 0173-1#02-AAO735#003 - - - - - - - - - - - - name of supplier - Lieferantenname - - name of supplier - - - - - Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt - name of supplier which provides the customer with a product or a service - - - - - - - ContactInfo_Role - https://www.hsu-hh.de/aut/aas/role - - - - - - - - Rolle - Role - - Role - - - - - Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt - Information to specify the role which the organisation of ContactInfo plays - - - - - - - Email - https://www.hsu-hh.de/aut/aas/email - - - - - - - - Emailadresse - Email address - - Email - - - - - Emailadresse - Email address - - - - - - - URL - 0173-1#02-AAO694#001 - - - - - - - - Internetadresse - Internet address - - URL - - - - - stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html - Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html - - - - - - - PhoneNumber - 0173-1#02-AAO136#002 - - - - - - - - Telefonnummer - telephone number - - Phone - - - - - vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist - complete telephone number to be called to reach a business partner - - - - - - - Fax - https://www.hsu-hh.de/aut/aas/fax - - - - - - - - Fax - Fax - - Fax - - - - - Faxnummer - Fax number - - - - - - - 0173-1#02-AAO136#002 - - - - - GLNOfManufacturer - 0173-1#02-AAY812#001 - - - - - - - - GLN of manufacturer - GLN des Herstellers - - GLN of manufacturer - - - - - international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort - internationally unique identification number for the manufacturer of the device or the product and for the physical location - - - - - - - SupplierOfTheIdentifier - 0173-1#02-AAP796#004 - - - - - - - - Supplier of the identifier - Anbieter der Identifikationsnummer für Hersteller - - Supplier of the identifier - - - STRING_TRANSLATABLE - - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - - - - - - - MAN_PROD_NUM - - product article number of manufacturer - - 0173-1#02-AAO676#003 - - - - - - - - product article number of manufacturer - Herstellerartikelnummer - - MAN_PROD_NUM - - - STRING_TRANSLATABLE - - eindeutiger Bestellschlüssel des Herstellers - unique product identifier of the manufacturer - - - - - - - ManufacturerProductDescription - 0173-1#02-AAU734#001 - - - - - - - - Manufacturer product description - Herstellerproduktbeschreibung - - Manufacturer product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - GLNOfSupplier - 0173-1#02-AAY813#001 - - - - - - - - GLN of supplier - GLN des Lieferanten - - GLN of supplier - - - - - international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort - internationally unique identification number for the supplier of the device or the product and for the physical location - - - - - - - SupplierIdProvider - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - - - - - - SupplierIdProvider - Anbieter der Identifikationsnummer - - SupplierIdProvider - - - STRING_TRANSLATABLE - - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - - - - - - - SUP_PROD_NUM - 0173-1#02-AAO736#004 - - - - - - - - product article number of supplier - Lieferantenartikelnummer - - product article number of supplier - - - - - eindeutiger Bestellschlüssel des Lieferanten - unique product order identifier of the supplier - - - - - - - SupplierProductDesignation - 0173-1#02-AAM551#002 - - - - - - - - Supplier product designation - Lieferantenproduktbezeichnung - - SupplierTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - SupplierProductDescription - 0173-1#02-AAU730#001 - - - - - - - - Supplier product description - Lieferantenproduktbeschreibung - - Supplier product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - ClassificationSystem - 0173-1#02-AAO715#002 - - - - - - - - classification system - Klassifizierungssystem - - ClassificationSystem - - - - - Klassifizierungssystem - Classification System - - - - - - - SecondaryKeyTyp - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - - - - - - SecondaryKeyTyp - Typnummer des IT Systems - - SecondaryKeyTyp - - - - - Führende technische ID im IT System des Typs - SecondaryKeyTyp - - - - - - - TypThumbnail - www.company.com/ids/cd/4401_1272_7091_3437 - - - - - - - - TypThumbnail - Vorschaubild - - TypThumbnail - - - - - Darstellung des Produkttyps in kleinem Format - Small picture of the product type - - - - - - - AssetId - https://www.hsu-hh.de/aut/aas/assetid - - - - - - - - AssetId - Asset ID - - AssetId - - - - - Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. - Global unique ID of an asset, which can be read by both human and machine. - - - - - - - SecondaryKeyInstance - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - - - - - - SecondaryKeyInstance - Instanznummer des IT Systems - - SecondaryKeyInstance - - - - - Führende technische ID im IT System der Instanz - SecondaryKeyInstance - - - - - - - DateOfManufacture - 0173-1#02-AAR972#002 - - - - - - - - Date of manufacture - Herstellungsdatum - - Date of manufacture - - - DATE - - Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist - Date from which the production and / or development process is completed or from which a service is provided completely - - - - - - - DeviceRevision - https://www.hsu-hh.de/aut/aas/devicerevision - - - - - - - - DeviceRevision - DeviceRevision - - DeviceRevision - - - - - DeviceRevision - DeviceRevision - - - - - - - SoftwareRevision - https://www.hsu-hh.de/aut/aas/softwarerevision - - - - - - - - SoftwareRevision - SoftwareRevision - - SoftwareRevision - - - - - SoftwareRevision - SoftwareRevision - - - - - - - HardwareRevision - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - - - - - - HardwareRevision - HardwareRevision - - HardwareRevision - - - - - HardwareRevision - HardwareRevision - - - - - - - QrCode - https://www.hsu-hh.de/aut/aas/qrcode - - - - - - - - QrCode - QrCode - - QrCode - - - - - In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. - QrCode - - - - - - - CompanyLogo - https://www.hsu-hh.de/aut/aas/companylogo - - - - - - - - Firmenlogo - CompanyLogo - - CompanyLogo - - - - - Firmenlogo - CompanyLogo - - - - - - - MaxTraversePath - http://boschrexroth.com/cds/lt/MaxTraversePath - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Max. Verfahrweg (mm) - Max. traverse path (mm) - - MaxTraversePath - mm - - - 0173-1#05-AAA480#003 - - - - smax_mm - REAL_MEASURE - - - - - - - FormFeedConstant - http://boschrexroth.com/cds/lt/FormFeedConstant - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Vorschubkonstante (mm/U) - Form feed constant (mm/U) - - FormFeedConstant - mm/U - - - - - u_mmpU - REAL_MEASURE - - - - - - - MaxPermissibleSpeed - http://boschrexroth.com/cds/lt/MaxPermissibleSpeed - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Maximal zulässige Geschwindigkeit (m/s) - Maximum permissible speed (m/s) - - MaxPermissibleSpeed - m/s - - - 0173-1#05-AAA434#003 - - - - vmax_mps - REAL_MEASURE - - - - - - - MaxPermissibleAcceleration - http://boschrexroth.com/cds/lt/MaxPermissibleAcceleration - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Maximal zulässige Beschleunigung (m/s²) - Maximum permissible acceleration (m/s²) - - MaxPermissibleAcceleration - m/s² - - - 0173-1#05-AAA597#003 - - - - amax_mps2 - REAL_MEASURE - - - - - - - MaxPermissibleTorque - http://boschrexroth.com/cds/lt/MaxPermissibleTorque - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Maximal zulässiges Drehmoment (Nm) - Maximum permissible torque (Nm) - - MaxPermissibleTorque - Nm - - - - - M1max_Nm - REAL_MEASURE - - - - - - - RotationDirectionPositiveMovement - http://boschrexroth.com/cds/lt/RotationDirectionPositiveMovement - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Drehrichtung für positive Fahrrichtung (weg vom Motor) - Rotation direction for positive movement - - RotationDirectionPositiveMovement - - - - - - d - STRING - - - - - - - GearTransmissionRatio - http://boschrexroth.com/cds/lt/GearTransmissionRatio - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Getriebeübersetzung - Gear transmission ratio - - GearTransmissionRatio - - - - - - i - REAL_MEASURE - - - - - - - CEQualificationPresent - 0173-1#02-BAF053#008 - - - - - - - - CE-Kennzeichnung vorhanden - CE- qualification present - - CEMarkingPresent - - - BOOLEAN - - whether CE- qualification is present - Angabe, ob CE-Kennzeichnung vorhanden ist - - - - - - - ProductMarking - https://www.hsu-hh.de/aut/aas/productmarking - - - - - - - - Produktkennzeichnung - Product Marking - - ProductMarking - - - - - Sammlungsdatei für Produktkennzeichnung - Collection file for product marking - - - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/05_Bosch.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/05_Bosch.aasx.xml deleted file mode 100644 index ebf6a52ff..000000000 --- a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/05_Bosch.aasx.xml +++ /dev/null @@ -1,6177 +0,0 @@ - - - - - Bosch_CompactModuleToothedBeltDrive - http://boschrexroth.com/shells/R036447000/1005625831070001 - - - http://dc-qr.com?m=R036447000&s=1005625831070001 - - - - - - http://boschrexroth.com/shells/R036447000/1005625831070001/submodels/nameplate/ - - - - - http://boschrexroth.com/shells/R036447000/1005625831070001/submodels/document/ - - - - - http://boschrexroth.com/shells/R036447000/1005625831070001/submodels/service/ - - - - - http://boschrexroth.com/shells/R036447000/1005625831070001/submodels/identification/ - - - - - http://boschrexroth.com/shells/R036447000/1005625831070001/submodels/technicalSpecification/ - - - - - - - - - MR036447000_S1005625831070001 - http://dc-qr.com?m=R036447000&s=1005625831070001 - Instance - - - - - Nameplate - http://boschrexroth.com/shells/R036447000/1005625831070001/submodels/nameplate/ - - - https://www.hsu-hh.de/aut/aas/nameplate - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Bosch Rexroth AG - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - Compact Module with toothed belt drive (CKR) - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Zum Eisengießer 1 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 97816 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Lohr am Main - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Bayern - - - - false - false - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - string - Compact Module - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 1005625831070001 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - ProductCountryOfOrigin - PARAMETER - - - 0173-1#02-AAO841#001 - - - Instance - - string - DE - - - - - YearOfConstruction - PARAMETER - - - 0173-1#02-AAP906#001 - - - Instance - - string - 2019 - - - - - Marking_CE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/marking_ce.png - - - - false - false - - - - - - Service - http://boschrexroth.com/shells/R036447000/1005625831070001/submodels/service/ - - - https://www.hsu-hh.de/aut/aas/service - - - Instance - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Bosch Rexroth AG Linear Motion Technologies - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Röntgenstraße 5 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 97424 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Schweinfurt - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Bayern - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - service.lt@boschrexroth.de - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.boschrexroth.com/en/xc/products/product-groups/linear-motion-technology/service-linear-motion-technology - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +49 9721 937 8617 - - - - false - false - - - - - - Identification - http://boschrexroth.com/shells/R036447000/1005625831070001/submodels/identification/ - - - https://www.hsu-hh.de/aut/aas/identification - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Bosch Rexroth AG - - - - - GLNOfManufacturer - PARAMETER - - - 0173-1#02-AAY812#001 - - - Instance - - string - 4048118000006 - - - - - SupplierOfTheIdentifier - - - 0173-1#02-AAP796#004 - - - Instance - - string - GLN GS1 - - - - - MAN_PROD_NUM - - - 0173-1#02-AAO676#003 - - - Instance - - string - R036447000 - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - CKR-110-NN-1 - - - - - ManufacturerProductDescription - PARAMETER - - - 0173-1#02-AAU734#001 - - - Instance - - langString - Compact Modules with toothed belt drive (CKR) - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - string - Compact Module - - - - - ClassificationSystem - PARAMETER - - - 0173-1#02-AAO715#002 - - - Instance - - string - eCl@ss - - - - - SecondaryKeyTyp - - - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - Instance - - - - - - - - TypThumbnail - PARAMETER - - - www.company.com/ids/cd/4401_1272_7091_3437 - - - Instance - - image/jpeg - /CKR.jpg - - - - - AssetId - PARAMETER - - - https://www.hsu-hh.de/aut/aas/assetid - - - Instance - - string - http://dc-qr.com?m=R036447000&s=1005625831070001 - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 1005625831070001 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - SecondaryKeyInstance - PARAMETER - - - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - Instance - - - - - - - - DateOfManufacture - PARAMETER - - - 0173-1#02-AAR972#002 - - - Instance - - - 2019 - - - - - DeviceRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/devicerevision - - - Instance - - - - - - - - SoftwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/softwarerevision - - - Instance - - - - - - - - HardwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - Instance - - - - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Bosch Rexroth AG - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Zum Eisengießer 1 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 97816 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Lohr am Main - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Bayern - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - service@boschrexroth.de - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.boschrexroth.com/de/de/home/index - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +499352405060 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - - - - - false - false - - - - - CompanyLogo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/companylogo - - - Instance - - image/png - /aasx/Identification/logo.png - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - http://dc-qr.com?m=R036447000&s=1005625831070001 - - - - - - TechnicalSpecification - http://boschrexroth.com/shells/R036447000/1005625831070001/submodels/technicalSpecification/ - - - https://www.hsu-hh.de/aut/aas/technicalspecification - - - Instance - - - - - MaxTraversePath - PARAMETER - - - - http://boschrexroth.com/cds/lt/maxTraversePath - - - Instance - - float - 280 - - - - - FormFeedConstant - PARAMETER - - - - http://boschrexroth.com/cds/lt/formFeedConstant - - - Instance - - float - 120,00 - - - - - MaxPermissibleSpeed - PARAMETER - - - - http://boschrexroth.com/cds/lt/maxPermissibleSpeed - - - Instance - - float - 2,00 - - - - - MaxPermissibleAcceleration - PARAMETER - - - - http://boschrexroth.com/cds/lt/maxPermissibleAcceleration - - - Instance - - float - 50,00 - - - - - MaxPermissibleTorque - PARAMETER - - - - http://boschrexroth.com/cds/lt/maxPermissibleTorque - - - Instance - - float - 1,30 - - - - - RotationDirectionPositiveMovement - PARAMETER - - - - http://boschrexroth.com/cds/lt/RotationDirectionPositiveMovement - - - Instance - - string - CCW - - - - - GearTransmissionRatio - PARAMETER - - - - http://boschrexroth.com/cds/lt/GearTransmissionRatio - - - Instance - - float - 10,00 - - - - - - Document - http://boschrexroth.com/shells/R036447000/1005625831070001/submodels/document/ - - - https://www.hsu-hh.de/aut/aas/document - - - Instance - - - - - Doku_Schmierung_CKx_V01_R320103051_2017_03 - PARAMETER - - - - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - R320103051 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung (DE) Operating Instructions (EN) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - 2017-03 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de/en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Erweiterungsdokumentation Schmierung CKK und CRK (DE) / Extension instructions lubrication of CKK and CKR (EN) - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - Doku_Schmierung_CKx_V01_R320103051_2017_03.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/Doku_Schmierung_CKx_V01_R320103051_2017_03.pdf - - - - false - false - - - - - R320103141_2015_06_Einbauerklaerung_einachsig - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R320103141 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung (DE) Operating Instructions (EN) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2015-06 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de/en/es/fr/it/pt/bg/cs/da/et/el/fi/ga/hu/is/lt/lv/mt/nl/no/pl/ro/sk/sl/sv/tr - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Einbauerklärung für einachsige Linearsysteme - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - R320103141_2015_06_Einbauerklaerung_einachsig.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/R320103141_2015_06_Einbauerklaerung_einachsig.pdf - - - - false - false - - - - - R320103152_2015_01_DE_Safety_LS_Media_22_01_2015 - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R320103152 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-03 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Allgemeine Sicherheit (DE) General Security (EN) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2015-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Sicherheitshinweise für Linearsysteme - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - R320103152_2015_01_DE_Safety_LS_Media_22_01_2015.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/R320103152_2015_01_DE_Safety_LS_Media_22_01_2015.pdf - - - - false - false - - - - - R320103152_2015_01_EN_Safety_LS_22_01_2015_web - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R320103152 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-03 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Allgemeine Sicherheit (DE) General Security (EN) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2015-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Safety Instructions for Linear Motion Systems - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - R320103152_2015_01_EN_Safety_LS_22_01_2015_web.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/R320103152_2015_01_EN_Safety_LS_22_01_2015_web.pdf - - - - false - false - - - - - R999000479_2019_03_DE_18_07_2019_CKx - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R999000479 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung (DE) Operating Instructions (EN) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-03 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Compactmodule CKK / CKR - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - R999000479_2019_03_DE_18_07_2019_CKx.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/R999000479_2019_03_DE_18_07_2019_CKx.pdf - - - - false - false - - - - - R999000499_2019_03_EN_18_07_2019_CKx - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R999000499 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung (DE) Operating Instructions (EN) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-03 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Compact Modules CKK / CKR - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - R999000499_2019_03_EN_18_07_2019_CKx_(1).pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/R999000499_2019_03_EN_18_07_2019_CKx_(1).pdf - - - - false - false - - - - - - - - ManufacturerName - 0173-1#02-AAO677#002 - - - - - - - - Herstellername - Manufacturer Name - - Manufacturer Name - - - - - Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist - 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 - - - - - - - ManufacturerProductDesignation - 0173-1#02-AAW338#001 - - - - - - - - Manufacturer product designation - Herstellerproduktbezeichnung - - ManufacturerTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - PhysicalAddress - https://www.hsu-hh.de/aut/aas/physicaladdress - - - - - - - - PhysicalAddress - Physische Adresse - - PhysicalAddress - - - - - Sammlung für reale physische Adresse - Collection for real physical address - - - - - - - CountryCode - 0173-1#02-AAO730#001 - - - - - - - - - - - - Landeskennung - Country code - - Country code - - - - - Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes - agreed upon symbol for unambiguous identification of a country - - - - - - - Street - 0173-1#02-AAO128#001 - - - - - - - - Strasse - Street - - Street - - - - - Name der Strasse und Hausnummer - Street name and house number - - - - - - - Zip - 0173-1#02-AAO129#002 - - - - - - - - Zip - Postleitzahl - - PostalCode - - - - - ZIP code of address - Postleitzahl der Anschrift - - - - - - - CityTown - 0173-1#02-AAO132#001 - - - - - - - - Ort - City/town - - City/town - - - - - Town or city of the company - Ortsangabe - - - - - - - StateCounty - 0173-1#02-AAO133#002 - - - - - - - - state/county - Bundesland - - StateCounty - - - - - Bundesland - state/county - - - - - - - ManufacturerProductFamily - 0173-1#02-AAU731#001 - - - - - - - - Manufacturer product family - Herstellerproduktfamilie - - TypClass - - - - - 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie - 2nd level of a 3 level manufacturer specific product hierarchy - - - - - - - SerialNumber - 0173-1#02-AAM556#002 - - - - - - - - Serial number - Seriennummer - - InstanceId - - - - - eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist - unique combination of numbers and letters used to identify the device once it has been manufactured - - - - - - - BatchNumber - 0173-1#02-AAQ196#001 - - - - - - - - Batch number - Chargen-Nummer - - ChargeId - - - - - Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge - Number assigned by the manufacturer of a material to identify the manufacturer's batch - - - - - - - ProductCountryOfOrigin - 0173-1#02-AAO841#001 - - - - - - - - Produkt Ursprungsland - Product country of origin - - CountryOfOrigin - - - - - Land in dem das Produkt hergestellt wurde (Hersteller Land) - Country in which the product is manufactured (manufacturer country) - - - - - - - YearOfConstruction - 0173-1#02-AAP906#001 - - - - - - - - Year of construction - Baujahr - - YearOfConstruction - - - - - Jahreszahl als Datumsangabe für die Fertigstellung des Objektes - Year as completion date of object - - - - - - - ProductMarking - https://www.hsu-hh.de/aut/aas/productmarking - - - - - - - - Produktkennzeichnung - Product Marking - - ProductMarking - - - - - Sammlungsdatei für Produktkennzeichnung - Collection file for product marking - - - - - - - CEQualificationPresent - 0173-1#02-BAF053#008 - - - - - - - - CE-Kennzeichnung vorhanden - CE- qualification present - - CEMarkingPresent - - - BOOLEAN - - whether CE- qualification is present - Angabe, ob CE-Kennzeichnung vorhanden ist - - - - - - - File - 0173-1#02-AAD005#008 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Enthaltene Doku. Datei - Embedded Doc. file - - File - - - - - Verweis/ BLOB auf enthaltene Dokumentations-Datei. - Reference/ BLOB to embedded documentation file. - - - - - - - DocumentationItem - - - - - - - - - Dokumentationsgruppe - Documentation item - - DocumentationItem - - - - - Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. - Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. - - - - - - - DocumentType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - - - - - - Dokumententyp - Document Type - - DocumentType - - - - - Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) - TBD - - - - - - - VDI2770_DomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - - - - - - Domain-Nummer - DomainId - - DomainId - - - - - Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. - TBD - - - - - - - VDI2770_IdType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - - - - - - Nummerntyp - IdType - - IdType - - - - - Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. - TBD - - - - - - - DocumentId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - - - - - - DocumentId - Dokumenten-Nummer - - DocumentId - - - - - Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. - TBD - - - - - - - DocumentDomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - - - - - - DocumentDomainId - DocumentDomainId - - DocumentDomainId - - - - - Kennung oder Kennzeichen einer Domäne - TBD - - - - - - - VDI2770_Role - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - - - - - - Rolle - Role - - Role - - - - - Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) - TBD - - - - - - - VDI2770_OrganisationId - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - - - - - - Organisation ID - Organisation ID - - OrganisationId - - - - - eindeutige ID für die Organisation - TBD - - - - - - - VDI2770_OrganisationName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - - - - - - OrganisationName - OrganisationName - - OrganisationName - - - - - gebräuchliche Bezeichnung für die Organisation - TBD - - - - - - - VDI2770_OrganisationOfficialName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - - - - - - Offizieller Name der Organisation - Organisation Official Name - - OrganisationOfficialName - - - - - offizieller Name der Organisation - TBD - - - - - - - VDI2770_Description - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - - - - - - Beschreibung - Description - - Description - - - - - Beschreibung für die nächste übergeordnete Collection - TBD - - - - - - - DocumentPartId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - - - - - - Dokumenten-Teilnummer - DocumentPartId - - DocumentPartId - - - - - Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. - TBD - - - - - - - DocumentClassification_ClassId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - - - - Dokumentkategorie - Document category - - DocCategory - - - - - Dokumentkategorie nach VDI 2770:2018/10 - Document category after VDI 2770:2018/10 - - - - - - - VDI2770_ClassName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - - - - - - Klassenname - Class Name - - ClassName - - - - - Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. - TBD - - - - - - - VDI2770_ClassificationSystem - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - - - - - - Klassifizierungssystem - classification system - - ClassificationSystem - - - - - Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. - TBD - - - - - - - DocumentVersionId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - - - - - - Dokumenten-Versionsnummer - DocumentVersionId - - DocumentVersionId - - - - - Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. - TBD - - - - - - - DocumentVersion_LanguageCode - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - - - - - - Sprachenschlüssel - LanguageCode - - LanguageCode - - - - - Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 - TBD - - - - - - - VDI2770_Title - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - - - - - - Titel - Title - - VDI2770_Title - - - - - sprachabhängiger Titel des Dokuments - TBD - - - - - - - VDI2770_Summary - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - - - - - - Zusammenfassung - Summary - - Summary - - - - - sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts - TBD - - - - - - - VDI2770_Keywords - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - - - - - - Schlagwörter - Keywords - - Keywords - - - - - sprachabhängige, durch Komma getrennte Liste von Schlagwörtern - TBD - - - - - - - VDI2770_StatusValue - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - - - - - - Statuswert - StatusValue - - StatusValue - - - - - Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) - TBD - - - - - - - VDI2770_SetDate - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - - - - - - Erstellungsdatum - Set Date - - SetDate - - - - - Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). - TBD - - - - - - - VDI2770_Purpose - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - - - - - - Zweck - Purpose - - Purpose - - - - - Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. - TBD - - - - - - - VDI2770_BasedOnProcedure - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - - - - - - Prozedur - Procedure - - BasedOnProcedure - - - - - textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt - TBD - - - - - - - VDI2770_Comments - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - - - - - - Kommentar - Comments - - Comments - - - - - textuelle Bemerkungen und Anmerkungen zum Status - TBD - - - - - - - VDI2770_ReferencedObject_Type - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - - - - - - Typ - Type - - Type - - - - - Für Type des Objekts muss immer Product angegeben werden. - TBD - - - - - - - VDI2770_ReferencedObject_RefType - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - - - - - - RefType - RefType - - RefType - - - - - Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) - TBD - - - - - - - VDI2770_ReferencedObject_ObjectId - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - - - - - - ObjectId - ObjectId - - ObjectId - - - - - Angabe der Identifikationsnummer zum Objekt - TBD - - - - - - - VDI2770_FileId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - - - - - - ID der Datei - File ID - - FileId - - - - - eindeutige ID für die Datei - TBD - - - - - - - VDI2770_FileName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - - - - - - Dateiname - File name - - FileName - - - - - Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. - TBD - - - - - - - VDI2770_FileFormat - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - - - - - - Datei Format - File format - - FileFormat - - - - - Angabe eines Media Typs gemäß der Liste der IANA - TBD - - - - - - - OrganisationContactInfo - https://www.hsu-hh.de/aut/aas/contactinfo - - - - - - - - Contact Info - Kontakt Info - - OrganisationContactInfo - - - - - Sammlung für die allgemeinen Kontaktdaten - Collection for general contact data - - - - - - - NameOfSupplier - 0173-1#02-AAO735#003 - - - - - - - - - - - - name of supplier - Lieferantenname - - name of supplier - - - - - Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt - name of supplier which provides the customer with a product or a service - - - - - - - ContactInfo_Role - https://www.hsu-hh.de/aut/aas/role - - - - - - - - Rolle - Role - - Role - - - - - Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt - Information to specify the role which the organisation of ContactInfo plays - - - - - - - Email - https://www.hsu-hh.de/aut/aas/email - - - - - - - - Emailadresse - Email address - - Email - - - - - Emailadresse - Email address - - - - - - - URL - 0173-1#02-AAO694#001 - - - - - - - - Internetadresse - Internet address - - URL - - - - - stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html - Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html - - - - - - - PhoneNumber - 0173-1#02-AAO136#002 - - - - - - - - Telefonnummer - telephone number - - Phone - - - - - vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist - complete telephone number to be called to reach a business partner - - - - - - - Fax - https://www.hsu-hh.de/aut/aas/fax - - - - - - - - Fax - Fax - - Fax - - - - - Faxnummer - Fax number - - - - - - - 0173-1#02-AAO136#002 - - - - - GLNOfManufacturer - 0173-1#02-AAY812#001 - - - - - - - - GLN of manufacturer - GLN des Herstellers - - GLN of manufacturer - - - - - international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort - internationally unique identification number for the manufacturer of the device or the product and for the physical location - - - - - - - SupplierOfTheIdentifier - 0173-1#02-AAP796#004 - - - - - - - - Supplier of the identifier - Anbieter der Identifikationsnummer für Hersteller - - Supplier of the identifier - - - STRING_TRANSLATABLE - - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - - - - - - - MAN_PROD_NUM - - product article number of manufacturer - - 0173-1#02-AAO676#003 - - - - - - - - product article number of manufacturer - Herstellerartikelnummer - - MAN_PROD_NUM - - - STRING_TRANSLATABLE - - eindeutiger Bestellschlüssel des Herstellers - unique product identifier of the manufacturer - - - - - - - ManufacturerProductDescription - 0173-1#02-AAU734#001 - - - - - - - - Manufacturer product description - Herstellerproduktbeschreibung - - Manufacturer product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - GLNOfSupplier - 0173-1#02-AAY813#001 - - - - - - - - GLN of supplier - GLN des Lieferanten - - GLN of supplier - - - - - international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort - internationally unique identification number for the supplier of the device or the product and for the physical location - - - - - - - SupplierIdProvider - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - - - - - - SupplierIdProvider - Anbieter der Identifikationsnummer - - SupplierIdProvider - - - STRING_TRANSLATABLE - - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - - - - - - - SUP_PROD_NUM - 0173-1#02-AAO736#004 - - - - - - - - product article number of supplier - Lieferantenartikelnummer - - product article number of supplier - - - - - eindeutiger Bestellschlüssel des Lieferanten - unique product order identifier of the supplier - - - - - - - SupplierProductDesignation - 0173-1#02-AAM551#002 - - - - - - - - Supplier product designation - Lieferantenproduktbezeichnung - - SupplierTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - SupplierProductDescription - 0173-1#02-AAU730#001 - - - - - - - - Supplier product description - Lieferantenproduktbeschreibung - - Supplier product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - ClassificationSystem - 0173-1#02-AAO715#002 - - - - - - - - classification system - Klassifizierungssystem - - ClassificationSystem - - - - - Klassifizierungssystem - Classification System - - - - - - - SecondaryKeyTyp - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - - - - - - SecondaryKeyTyp - Typnummer des IT Systems - - SecondaryKeyTyp - - - - - Führende technische ID im IT System des Typs - SecondaryKeyTyp - - - - - - - TypThumbnail - www.company.com/ids/cd/4401_1272_7091_3437 - - - - - - - - TypThumbnail - Vorschaubild - - TypThumbnail - - - - - Darstellung des Produkttyps in kleinem Format - Small picture of the product type - - - - - - - AssetId - https://www.hsu-hh.de/aut/aas/assetid - - - - - - - - AssetId - Asset ID - - AssetId - - - - - Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. - Global unique ID of an asset, which can be read by both human and machine. - - - - - - - SecondaryKeyInstance - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - - - - - - SecondaryKeyInstance - Instanznummer des IT Systems - - SecondaryKeyInstance - - - - - Führende technische ID im IT System der Instanz - SecondaryKeyInstance - - - - - - - DateOfManufacture - 0173-1#02-AAR972#002 - - - - - - - - Date of manufacture - Herstellungsdatum - - Date of manufacture - - - DATE - - Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist - Date from which the production and / or development process is completed or from which a service is provided completely - - - - - - - DeviceRevision - https://www.hsu-hh.de/aut/aas/devicerevision - - - - - - - - DeviceRevision - DeviceRevision - - DeviceRevision - - - - - DeviceRevision - DeviceRevision - - - - - - - SoftwareRevision - https://www.hsu-hh.de/aut/aas/softwarerevision - - - - - - - - SoftwareRevision - SoftwareRevision - - SoftwareRevision - - - - - SoftwareRevision - SoftwareRevision - - - - - - - HardwareRevision - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - - - - - - HardwareRevision - HardwareRevision - - HardwareRevision - - - - - HardwareRevision - HardwareRevision - - - - - - - QrCode - https://www.hsu-hh.de/aut/aas/qrcode - - - - - - - - QrCode - QrCode - - QrCode - - - - - In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. - QrCode - - - - - - - CompanyLogo - https://www.hsu-hh.de/aut/aas/companylogo - - - - - - - - Firmenlogo - CompanyLogo - - CompanyLogo - - - - - Firmenlogo - CompanyLogo - - - - - - - MaxTraversePath - http://boschrexroth.com/cds/lt/MaxTraversePath - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Max. Verfahrweg (mm) - Max. traverse path (mm) - - MaxTraversePath - mm - - - 0173-1#05-AAA480#003 - - - - smax_mm - REAL_MEASURE - - - - - - - FormFeedConstant - http://boschrexroth.com/cds/lt/FormFeedConstant - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Vorschubkonstante (mm/U) - Form feed constant (mm/U) - - FormFeedConstant - mm/U - - - - - u_mmpU - REAL_MEASURE - - - - - - - MaxPermissibleSpeed - http://boschrexroth.com/cds/lt/MaxPermissibleSpeed - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Maximal zulässige Geschwindigkeit (m/s) - Maximum permissible speed (m/s) - - MaxPermissibleSpeed - m/s - - - 0173-1#05-AAA434#003 - - - - vmax_mps - REAL_MEASURE - - - - - - - MaxPermissibleAcceleration - http://boschrexroth.com/cds/lt/MaxPermissibleAcceleration - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Maximal zulässige Beschleunigung (m/s²) - Maximum permissible acceleration (m/s²) - - MaxPermissibleAcceleration - m/s² - - - 0173-1#05-AAA597#003 - - - - amax_mps2 - REAL_MEASURE - - - - - - - MaxPermissibleTorque - http://boschrexroth.com/cds/lt/MaxPermissibleTorque - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Maximal zulässiges Drehmoment (Nm) - Maximum permissible torque (Nm) - - MaxPermissibleTorque - Nm - - - - - M1max_Nm - REAL_MEASURE - - - - - - - RotationDirectionPositiveMovement - http://boschrexroth.com/cds/lt/RotationDirectionPositiveMovement - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Drehrichtung für positive Fahrrichtung (weg vom Motor) - Rotation direction for positive movement - - RotationDirectionPositiveMovement - - - - - - d - STRING - - - - - - - GearTransmissionRatio - http://boschrexroth.com/cds/lt/GearTransmissionRatio - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Getriebeübersetzung - Gear transmission ratio - - GearTransmissionRatio - - - - - - i - REAL_MEASURE - - - - - - - DocumentationItem - 0173-1#02-AAD001#001 - - - - - - - - Dokumentationsgruppe - Documentation item - - DocumentationItem - - - - - Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. - Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. - - - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/06_Bosch.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/06_Bosch.aasx.xml deleted file mode 100644 index 067ccce55..000000000 --- a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/06_Bosch.aasx.xml +++ /dev/null @@ -1,6640 +0,0 @@ - - - - - Bosch_PrecisionModulePSK - http://boschrexroth.com/shells/R055732577/1012160102010001 - - - http://dc-qr.com?m=R055732577&t=PSK-060-NN-1&s=1012160102010001 - - - - - - http://boschrexroth.com/shells/R055732577/1012160102010001/submodels/nameplate/ - - - - - http://boschrexroth.com/shells/R055732577/1012160102010001/submodels/document/ - - - - - http://boschrexroth.com/shells/R055732577/1012160102010001/submodels/service/ - - - - - http://boschrexroth.com/shells/R055732577/1012160102010001/submodels/identification/ - - - - - http://boschrexroth.com/shells/R055732577/1012160102010001/submodels/technicalSpecification/ - - - - - - - - - MR055732577_S1012160102010001 - http://dc-qr.com?m=R055732577&t=PSK-060-NN-1&s=1012160102010001 - Instance - - - - - Nameplate - http://boschrexroth.com/shells/R055732577/1012160102010001/submodels/nameplate/ - - - https://www.hsu-hh.de/aut/aas/nameplate - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Bosch Rexroth AG - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - Precision Module PSK - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Zum Eisengießer 1 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 97816 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Lohr am Main - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Bayern - - - - false - false - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - string - Precision Module PSK - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 1012160102010001 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - ProductCountryOfOrigin - PARAMETER - - - 0173-1#02-AAO841#001 - - - Instance - - string - DE - - - - - YearOfConstruction - PARAMETER - - - 0173-1#02-AAP906#001 - - - Instance - - string - 2019 - - - - - Marking_CE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/marking_ce.png - - - - false - false - - - - - - Service - http://boschrexroth.com/shells/R055732577/1012160102010001/submodels/service/ - - - https://www.hsu-hh.de/aut/aas/service - - - Instance - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Bosch Rexroth AG Service Linear Motion Technologies - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Röntgenstraße 5 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 97424 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Schweinfurt - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Bayern - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - service.lt@boschrexroth.de - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.boschrexroth.com/en/xc/products/product-groups/linear-motion-technology/service-linear-motion-technology - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +49 9721 937 8617 - - - - false - false - - - - - - Identification - http://boschrexroth.com/shells/R055732577/1012160102010001/submodels/identification/ - - - https://www.hsu-hh.de/aut/aas/identification - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Bosch Rexroth AG - - - - - GLNOfManufacturer - PARAMETER - - - 0173-1#02-AAY812#001 - - - Instance - - string - 4048118000006 - - - - - SupplierOfTheIdentifier - - - 0173-1#02-AAP796#004 - - - Instance - - string - GLN GS1 - - - - - MAN_PROD_NUM - - - 0173-1#02-AAO676#003 - - - Instance - - string - PSK-060-NN-1 - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - Precision Module - - - - - ManufacturerProductDescription - PARAMETER - - - 0173-1#02-AAU734#001 - - - Instance - - langString - Precision Module + Integrated Ball Rail System + Precision Ball Screw Assembly - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - string - Linear motion system - - - - - ClassificationSystem - PARAMETER - - - 0173-1#02-AAO715#002 - - - Instance - - string - eCl@ss - - - - - SecondaryKeyTyp - - - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - Instance - - - - - - - - TypThumbnail - PARAMETER - - - www.company.com/ids/cd/4401_1272_7091_3437 - - - Instance - - image/jpeg - /PSK.jpg - - - - - AssetId - PARAMETER - - - https://www.hsu-hh.de/aut/aas/assetid - - - Instance - - string - http://dc-qr.com?m=R055732577&s=1012160102010001&t=PSK-060-NN-1 - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 1012160102010001 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - SecondaryKeyInstance - PARAMETER - - - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - Instance - - - - - - - - DateOfManufacture - PARAMETER - - - 0173-1#02-AAR972#002 - - - Instance - - - 2019 - - - - - DeviceRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/devicerevision - - - Instance - - - - - - - - SoftwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/softwarerevision - - - Instance - - - - - - - - HardwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - Instance - - - - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Bosch Rexroth AG - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Zum Eisengießer 1 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 97816 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Lohr am Main - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Bayern - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - service@boschrexroth.de - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.boschrexroth.com/de/de/home/index - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +499352405060 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - - - - - false - false - - - - - CompanyLogo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/companylogo - - - Instance - - image/png - /aasx/Identification/logo.png - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - http://dc-qr.com?m=R055732577&s=1012160102010001 - - - - - - TechnicalSpecification - http://boschrexroth.com/shells/R055732577/1012160102010001/submodels/technicalSpecification/ - - - https://www.hsu-hh.de/aut/aas/technicalspecification - - - Instance - - - - - MaxTraversePath - PARAMETER - - - - http://boschrexroth.com/cds/lt/maxTraversePath - - - Instance - - float - 140,00 - - - - - FormFeedConstant - PARAMETER - - - - http://boschrexroth.com/cds/lt/formFeedConstant - - - Instance - - float - 10,00 - - - - - MaxPermissibleSpeed - PARAMETER - - - - http://boschrexroth.com/cds/lt/maxPermissibleSpeed - - - Instance - - float - 1,17 - - - - - MaxPermissibleAcceleration - PARAMETER - - - - http://boschrexroth.com/cds/lt/maxPermissibleAcceleration - - - Instance - - float - 50,00 - - - - - MaxPermissibleTorque - PARAMETER - - - - http://boschrexroth.com/cds/lt/maxPermissibleTorque - - - Instance - - float - 3,20 - - - - - RotationDirectionPositiveMovement - PARAMETER - - - - http://boschrexroth.com/cds/lt/RotationDirectionPositiveMovement - - - Instance - - string - CW - - - - - GearTransmissionRatio - PARAMETER - - - - http://boschrexroth.com/cds/lt/GearTransmissionRatio - - - Instance - - float - 1,00 - - - - - - Document - http://boschrexroth.com/shells/R055732577/1012160102010001/submodels/document/ - - - https://www.hsu-hh.de/aut/aas/document - - - Instance - - - - - EU_Declaration_of_Conformity - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - DCTC-30434-002:2019-01-01 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - 2019-01-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de/en/fr/es/pt/it/pl/cs/sk/hu/bg/da/et/fi/el/hr/lv/lt/nl/ro/sv/sl/ru/zh/ar/id/ja/ko/no/th/tr/vi - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - EU-Konformitätserklärung (DE) EU Declaration of Conformity (EN) - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - EU_Declaration_of_Conformity.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/EU_Declaration_of_Conformity.pdf - - - - false - false - - - - - Katalog-DE_R999000480_2015-12_PSK_24_10_2018_Gy - PARAMETER - - - - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - R999000480 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung (DE) Operating Instructions (EN) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - 2015-12 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Präzisionsmodule PSK - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - Katalog-DE_R999000480_2015-12_PSK_24_10_2018_Gy.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/Katalog-DE_R999000480_2015-12_PSK_24_10_2018_Gy.pdf - - - - false - false - - - - - Katalog-EN_R999000500_2015-12_PSK_24_10_2018_Gy - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R999000500 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung (DE) Operating Instructions (EN) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2015-12 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Precision Modules PSK - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - Katalog-EN_R999000500_2015-12_PSK_24_10_2018_Gy.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/Katalog-EN_R999000500_2015-12_PSK_24_10_2018_Gy.pdf - - - - false - false - - - - - Anleitung-R320103187_2006_09_2 - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R320103187 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung (DE) Operating Instructions (EN) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2006-09 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de/en/fr/it - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Anleitung Präzisionsmodule (EN) Instructions Precision Module PSK (EN) - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - Anleitung-R320103187_2006_09_2.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/Anleitung-R320103187_2006_09_2.pdf - - - - false - false - - - - - R320103141_2015_06_Einbauerklaerung_einachsig - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R320103141 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung (DE) Operating Instructions (EN) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2015-06 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de/en/es/fr/it/pt/bg/cs/da/et/el/fi/ga/hu/is/lt/lv/mt/nl/no/pl/ro/sk/sl/sv/tr - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Einbauerklärung für einachsige Linearsysteme (DE) Declaration of Incorporation for single axis Linear Motion Systems (EN) - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - R320103141_2015_06_Einbauerklaerung_einachsig.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/R320103141_2015_06_Einbauerklaerung_einachsig.pdf - - - - false - false - - - - - R320103152_2015_01_DE_Safety_LS_Media_22_01_2015 - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R320103152 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-03 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Allgemeine Sicherheit (DE) General Security (EN) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2015-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Sicherheitshinweise für Linearsysteme - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - R320103152_2015_01_DE_Safety_LS_Media_22_01_2015.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/R320103152_2015_01_DE_Safety_LS_Media_22_01_2015.pdf - - - - false - false - - - - - R320103152_2015_01_EN_Safety_LS_22_01_2015_web - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R320103152 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-03 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Allgemeine Sicherheit (DE) General Security (EN) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2015-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Safety Instructions for Linear Motion Systems - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - R320103152_2015_01_EN_Safety_LS_22_01_2015_web.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/R320103152_2015_01_EN_Safety_LS_22_01_2015_web.pdf - - - - false - false - - - - - - - - ManufacturerName - 0173-1#02-AAO677#002 - - - - - - - - Herstellername - Manufacturer Name - - Manufacturer Name - - - - - Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist - 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 - - - - - - - ManufacturerProductDesignation - 0173-1#02-AAW338#001 - - - - - - - - Manufacturer product designation - Herstellerproduktbezeichnung - - ManufacturerTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - PhysicalAddress - https://www.hsu-hh.de/aut/aas/physicaladdress - - - - - - - - PhysicalAddress - Physische Adresse - - PhysicalAddress - - - - - Sammlung für reale physische Adresse - Collection for real physical address - - - - - - - CountryCode - 0173-1#02-AAO730#001 - - - - - - - - - - - - Landeskennung - Country code - - Country code - - - - - Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes - agreed upon symbol for unambiguous identification of a country - - - - - - - Street - 0173-1#02-AAO128#001 - - - - - - - - Strasse - Street - - Street - - - - - Name der Strasse und Hausnummer - Street name and house number - - - - - - - Zip - 0173-1#02-AAO129#002 - - - - - - - - Zip - Postleitzahl - - PostalCode - - - - - ZIP code of address - Postleitzahl der Anschrift - - - - - - - CityTown - 0173-1#02-AAO132#001 - - - - - - - - Ort - City/town - - City/town - - - - - Town or city of the company - Ortsangabe - - - - - - - StateCounty - 0173-1#02-AAO133#002 - - - - - - - - state/county - Bundesland - - StateCounty - - - - - Bundesland - state/county - - - - - - - ManufacturerProductFamily - 0173-1#02-AAU731#001 - - - - - - - - Manufacturer product family - Herstellerproduktfamilie - - TypClass - - - - - 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie - 2nd level of a 3 level manufacturer specific product hierarchy - - - - - - - SerialNumber - 0173-1#02-AAM556#002 - - - - - - - - Serial number - Seriennummer - - InstanceId - - - - - eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist - unique combination of numbers and letters used to identify the device once it has been manufactured - - - - - - - BatchNumber - 0173-1#02-AAQ196#001 - - - - - - - - Batch number - Chargen-Nummer - - ChargeId - - - - - Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge - Number assigned by the manufacturer of a material to identify the manufacturer's batch - - - - - - - ProductCountryOfOrigin - 0173-1#02-AAO841#001 - - - - - - - - Produkt Ursprungsland - Product country of origin - - CountryOfOrigin - - - - - Land in dem das Produkt hergestellt wurde (Hersteller Land) - Country in which the product is manufactured (manufacturer country) - - - - - - - YearOfConstruction - 0173-1#02-AAP906#001 - - - - - - - - Year of construction - Baujahr - - YearOfConstruction - - - - - Jahreszahl als Datumsangabe für die Fertigstellung des Objektes - Year as completion date of object - - - - - - - ProductMarking - https://www.hsu-hh.de/aut/aas/productmarking - - - - - - - - Produktkennzeichnung - Product Marking - - ProductMarking - - - - - Sammlungsdatei für Produktkennzeichnung - Collection file for product marking - - - - - - - CEQualificationPresent - 0173-1#02-BAF053#008 - - - - - - - - CE-Kennzeichnung vorhanden - CE- qualification present - - CEMarkingPresent - - - BOOLEAN - - whether CE- qualification is present - Angabe, ob CE-Kennzeichnung vorhanden ist - - - - - - - File - 0173-1#02-AAD005#008 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Enthaltene Doku. Datei - Embedded Doc. file - - File - - - - - Verweis/ BLOB auf enthaltene Dokumentations-Datei. - Reference/ BLOB to embedded documentation file. - - - - - - - DocumentationItem - 0173-1#02-AAD001#001 - - - - - - - - Dokumentationsgruppe - Documentation item - - DocumentationItem - - - - - Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. - Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. - - - - - - - DocumentType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - - - - - - Dokumententyp - Document Type - - DocumentType - - - - - Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) - TBD - - - - - - - VDI2770_DomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - - - - - - Domain-Nummer - DomainId - - DomainId - - - - - Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. - TBD - - - - - - - VDI2770_IdType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - - - - - - Nummerntyp - IdType - - IdType - - - - - Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. - TBD - - - - - - - DocumentId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - - - - - - DocumentId - Dokumenten-Nummer - - DocumentId - - - - - Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. - TBD - - - - - - - DocumentDomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - - - - - - DocumentDomainId - DocumentDomainId - - DocumentDomainId - - - - - Kennung oder Kennzeichen einer Domäne - TBD - - - - - - - VDI2770_Role - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - - - - - - Rolle - Role - - Role - - - - - Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) - TBD - - - - - - - VDI2770_OrganisationId - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - - - - - - Organisation ID - Organisation ID - - OrganisationId - - - - - eindeutige ID für die Organisation - TBD - - - - - - - VDI2770_OrganisationName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - - - - - - OrganisationName - OrganisationName - - OrganisationName - - - - - gebräuchliche Bezeichnung für die Organisation - TBD - - - - - - - VDI2770_OrganisationOfficialName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - - - - - - Offizieller Name der Organisation - Organisation Official Name - - OrganisationOfficialName - - - - - offizieller Name der Organisation - TBD - - - - - - - VDI2770_Description - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - - - - - - Beschreibung - Description - - Description - - - - - Beschreibung für die nächste übergeordnete Collection - TBD - - - - - - - DocumentPartId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - - - - - - Dokumenten-Teilnummer - DocumentPartId - - DocumentPartId - - - - - Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. - TBD - - - - - - - DocumentClassification_ClassId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - - - - Dokumentkategorie - Document category - - DocCategory - - - - - Dokumentkategorie nach VDI 2770:2018/10 - Document category after VDI 2770:2018/10 - - - - - - - VDI2770_ClassName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - - - - - - Klassenname - Class Name - - ClassName - - - - - Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. - TBD - - - - - - - VDI2770_ClassificationSystem - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - - - - - - Klassifizierungssystem - classification system - - ClassificationSystem - - - - - Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. - TBD - - - - - - - DocumentVersionId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - - - - - - Dokumenten-Versionsnummer - DocumentVersionId - - DocumentVersionId - - - - - Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. - TBD - - - - - - - DocumentVersion_LanguageCode - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - - - - - - Sprachenschlüssel - LanguageCode - - LanguageCode - - - - - Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 - TBD - - - - - - - VDI2770_Title - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - - - - - - Titel - Title - - VDI2770_Title - - - - - sprachabhängiger Titel des Dokuments - TBD - - - - - - - VDI2770_Summary - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - - - - - - Zusammenfassung - Summary - - Summary - - - - - sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts - TBD - - - - - - - VDI2770_Keywords - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - - - - - - Schlagwörter - Keywords - - Keywords - - - - - sprachabhängige, durch Komma getrennte Liste von Schlagwörtern - TBD - - - - - - - VDI2770_StatusValue - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - - - - - - Statuswert - StatusValue - - StatusValue - - - - - Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) - TBD - - - - - - - VDI2770_SetDate - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - - - - - - Erstellungsdatum - Set Date - - SetDate - - - - - Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). - TBD - - - - - - - VDI2770_Purpose - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - - - - - - Zweck - Purpose - - Purpose - - - - - Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. - TBD - - - - - - - VDI2770_BasedOnProcedure - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - - - - - - Prozedur - Procedure - - BasedOnProcedure - - - - - textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt - TBD - - - - - - - VDI2770_Comments - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - - - - - - Kommentar - Comments - - Comments - - - - - textuelle Bemerkungen und Anmerkungen zum Status - TBD - - - - - - - VDI2770_ReferencedObject_Type - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - - - - - - Typ - Type - - Type - - - - - Für Type des Objekts muss immer Product angegeben werden. - TBD - - - - - - - VDI2770_ReferencedObject_RefType - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - - - - - - RefType - RefType - - RefType - - - - - Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) - TBD - - - - - - - VDI2770_ReferencedObject_ObjectId - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - - - - - - ObjectId - ObjectId - - ObjectId - - - - - Angabe der Identifikationsnummer zum Objekt - TBD - - - - - - - VDI2770_FileId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - - - - - - ID der Datei - File ID - - FileId - - - - - eindeutige ID für die Datei - TBD - - - - - - - VDI2770_FileName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - - - - - - Dateiname - File name - - FileName - - - - - Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. - TBD - - - - - - - VDI2770_FileFormat - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - - - - - - Datei Format - File format - - FileFormat - - - - - Angabe eines Media Typs gemäß der Liste der IANA - TBD - - - - - - - OrganisationContactInfo - https://www.hsu-hh.de/aut/aas/contactinfo - - - - - - - - Contact Info - Kontakt Info - - OrganisationContactInfo - - - - - Sammlung für die allgemeinen Kontaktdaten - Collection for general contact data - - - - - - - NameOfSupplier - 0173-1#02-AAO735#003 - - - - - - - - - - - - name of supplier - Lieferantenname - - name of supplier - - - - - Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt - name of supplier which provides the customer with a product or a service - - - - - - - ContactInfo_Role - https://www.hsu-hh.de/aut/aas/role - - - - - - - - Rolle - Role - - Role - - - - - Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt - Information to specify the role which the organisation of ContactInfo plays - - - - - - - Email - https://www.hsu-hh.de/aut/aas/email - - - - - - - - Emailadresse - Email address - - Email - - - - - Emailadresse - Email address - - - - - - - URL - 0173-1#02-AAO694#001 - - - - - - - - Internetadresse - Internet address - - URL - - - - - stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html - Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html - - - - - - - PhoneNumber - 0173-1#02-AAO136#002 - - - - - - - - Telefonnummer - telephone number - - Phone - - - - - vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist - complete telephone number to be called to reach a business partner - - - - - - - Fax - https://www.hsu-hh.de/aut/aas/fax - - - - - - - - Fax - Fax - - Fax - - - - - Faxnummer - Fax number - - - - - - - 0173-1#02-AAO136#002 - - - - - GLNOfManufacturer - 0173-1#02-AAY812#001 - - - - - - - - GLN of manufacturer - GLN des Herstellers - - GLN of manufacturer - - - - - international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort - internationally unique identification number for the manufacturer of the device or the product and for the physical location - - - - - - - SupplierOfTheIdentifier - 0173-1#02-AAP796#004 - - - - - - - - Supplier of the identifier - Anbieter der Identifikationsnummer für Hersteller - - Supplier of the identifier - - - STRING_TRANSLATABLE - - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - - - - - - - MAN_PROD_NUM - - product article number of manufacturer - - 0173-1#02-AAO676#003 - - - - - - - - product article number of manufacturer - Herstellerartikelnummer - - MAN_PROD_NUM - - - STRING_TRANSLATABLE - - eindeutiger Bestellschlüssel des Herstellers - unique product identifier of the manufacturer - - - - - - - ManufacturerProductDescription - 0173-1#02-AAU734#001 - - - - - - - - Manufacturer product description - Herstellerproduktbeschreibung - - Manufacturer product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - GLNOfSupplier - 0173-1#02-AAY813#001 - - - - - - - - GLN of supplier - GLN des Lieferanten - - GLN of supplier - - - - - international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort - internationally unique identification number for the supplier of the device or the product and for the physical location - - - - - - - SupplierIdProvider - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - - - - - - SupplierIdProvider - Anbieter der Identifikationsnummer - - SupplierIdProvider - - - STRING_TRANSLATABLE - - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - - - - - - - SUP_PROD_NUM - 0173-1#02-AAO736#004 - - - - - - - - product article number of supplier - Lieferantenartikelnummer - - product article number of supplier - - - - - eindeutiger Bestellschlüssel des Lieferanten - unique product order identifier of the supplier - - - - - - - SupplierProductDesignation - 0173-1#02-AAM551#002 - - - - - - - - Supplier product designation - Lieferantenproduktbezeichnung - - SupplierTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - SupplierProductDescription - 0173-1#02-AAU730#001 - - - - - - - - Supplier product description - Lieferantenproduktbeschreibung - - Supplier product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - ClassificationSystem - 0173-1#02-AAO715#002 - - - - - - - - classification system - Klassifizierungssystem - - ClassificationSystem - - - - - Klassifizierungssystem - Classification System - - - - - - - SecondaryKeyTyp - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - - - - - - SecondaryKeyTyp - Typnummer des IT Systems - - SecondaryKeyTyp - - - - - Führende technische ID im IT System des Typs - SecondaryKeyTyp - - - - - - - TypThumbnail - www.company.com/ids/cd/4401_1272_7091_3437 - - - - - - - - TypThumbnail - Vorschaubild - - TypThumbnail - - - - - Darstellung des Produkttyps in kleinem Format - Small picture of the product type - - - - - - - AssetId - https://www.hsu-hh.de/aut/aas/assetid - - - - - - - - AssetId - Asset ID - - AssetId - - - - - Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. - Global unique ID of an asset, which can be read by both human and machine. - - - - - - - SecondaryKeyInstance - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - - - - - - SecondaryKeyInstance - Instanznummer des IT Systems - - SecondaryKeyInstance - - - - - Führende technische ID im IT System der Instanz - SecondaryKeyInstance - - - - - - - DateOfManufacture - 0173-1#02-AAR972#002 - - - - - - - - Date of manufacture - Herstellungsdatum - - Date of manufacture - - - DATE - - Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist - Date from which the production and / or development process is completed or from which a service is provided completely - - - - - - - DeviceRevision - https://www.hsu-hh.de/aut/aas/devicerevision - - - - - - - - DeviceRevision - DeviceRevision - - DeviceRevision - - - - - DeviceRevision - DeviceRevision - - - - - - - SoftwareRevision - https://www.hsu-hh.de/aut/aas/softwarerevision - - - - - - - - SoftwareRevision - SoftwareRevision - - SoftwareRevision - - - - - SoftwareRevision - SoftwareRevision - - - - - - - HardwareRevision - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - - - - - - HardwareRevision - HardwareRevision - - HardwareRevision - - - - - HardwareRevision - HardwareRevision - - - - - - - QrCode - https://www.hsu-hh.de/aut/aas/qrcode - - - - - - - - QrCode - QrCode - - QrCode - - - - - In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. - QrCode - - - - - - - CompanyLogo - https://www.hsu-hh.de/aut/aas/companylogo - - - - - - - - Firmenlogo - CompanyLogo - - CompanyLogo - - - - - Firmenlogo - CompanyLogo - - - - - - - MaxTraversePath - http://boschrexroth.com/cds/lt/MaxTraversePath - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Max. Verfahrweg (mm) - Max. traverse path (mm) - - MaxTraversePath - mm - - - 0173-1#05-AAA480#003 - - - - smax_mm - REAL_MEASURE - - - - - - - FormFeedConstant - http://boschrexroth.com/cds/lt/FormFeedConstant - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Vorschubkonstante (mm/U) - Form feed constant (mm/U) - - FormFeedConstant - mm/U - - - - - u_mmpU - REAL_MEASURE - - - - - - - MaxPermissibleSpeed - http://boschrexroth.com/cds/lt/MaxPermissibleSpeed - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Maximal zulässige Geschwindigkeit (m/s) - Maximum permissible speed (m/s) - - MaxPermissibleSpeed - m/s - - - 0173-1#05-AAA434#003 - - - - vmax_mps - REAL_MEASURE - - - - - - - MaxPermissibleAcceleration - http://boschrexroth.com/cds/lt/MaxPermissibleAcceleration - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Maximal zulässige Beschleunigung (m/s²) - Maximum permissible acceleration (m/s²) - - MaxPermissibleAcceleration - m/s² - - - 0173-1#05-AAA597#003 - - - - amax_mps2 - REAL_MEASURE - - - - - - - MaxPermissibleTorque - http://boschrexroth.com/cds/lt/MaxPermissibleTorque - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Maximal zulässiges Drehmoment (Nm) - Maximum permissible torque (Nm) - - MaxPermissibleTorque - Nm - - - - - M1max_Nm - REAL_MEASURE - - - - - - - RotationDirectionPositiveMovement - http://boschrexroth.com/cds/lt/RotationDirectionPositiveMovement - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Drehrichtung für positive Fahrrichtung (weg vom Motor) - Rotation direction for positive movement - - RotationDirectionPositiveMovement - - - - - - d - STRING - - - - - - - GearTransmissionRatio - http://boschrexroth.com/cds/lt/GearTransmissionRatio - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Getriebeübersetzung - Gear transmission ratio - - GearTransmissionRatio - - - - - - i - REAL_MEASURE - - - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/07_PhoenixContact.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/07_PhoenixContact.aasx.xml deleted file mode 100644 index b97555d7f..000000000 --- a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/07_PhoenixContact.aasx.xml +++ /dev/null @@ -1,3507 +0,0 @@ - - - - - PhoenixContact_R901278815_25 - CONSTANT - www.company.com/ids/aas/2520_6010_8091_1277 - - - www.company.com/ids/asset/8220_6010_8091_3593 - - - - - - www.company.com/ids/sm/4343_5072_7091_3242 - - - - - www.company.com/ids/sm/2543_5072_7091_2660 - - - - - www.company.com/ids/sm/6053_5072_7091_5102 - - - - - www.company.com/ids/sm/6563_5072_7091_4267 - - - - - - - - - R901278815_25 - www.company.com/ids/asset/8220_6010_8091_3593 - Instance - - - - - Nameplate - www.company.com/ids/sm/4343_5072_7091_3242 - - - https://www.hsu-hh.de/aut/aas/nameplate - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - PHOENIX CONTACT GmbH & Co. KG - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - QUINT4-PS/3AC/24DC/20 - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Flachsmarktstr. 8 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 32825 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Blomberg - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Nordrhein-Westfalen - - - - false - false - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 2904622001634T0008 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - ProductCountryOfOrigin - PARAMETER - - - 0173-1#02-AAO841#001 - - - Instance - - string - DE - - - - - YearOfConstruction - PARAMETER - - - 0173-1#02-AAP906#001 - - - Instance - - string - 2016 - - - - - Marking_CE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/marking_ce.png - - - - false - false - - - - - - Document - www.company.com/ids/sm/2543_5072_7091_2660 - - - https://www.hsu-hh.de/aut/aas/document - - - Instance - - - - - DeclarationCEMarking - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Phoenix Contact - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - PHOENIX CONTACT GmbH & Co. KG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en, de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - EU_Declaration_of_Conformity.pdf - - - - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - - - - Instance - - string - EU_Declaration_of_Conformity.pdf Nr. 2904622.CE.01 - - - - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/EU_Declaration_of_Conformity.pdf - - - - false - false - - - - - - Service - www.company.com/ids/sm/6053_5072_7091_5102 - - - https://www.hsu-hh.de/aut/aas/service - - - Instance - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - PHOENIX CONTACT GmbH & Co. KG - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Flachsmarktstraße 8 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 32825 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Blomberg - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Nordrhein-Westfalen - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - aftersales@phoenixcontact.com - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.phoenixcontact.com/online/portal/de?1dmy&urile=wcm:path:/dede/web/main/service_and_support/entry_page/entry_page - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +49 52 35/3-4 00 50 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - - - - - false - false - - - - - - Identification - www.company.com/ids/sm/6563_5072_7091_4267 - - - https://www.hsu-hh.de/aut/aas/identification - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - PHOENIX CONTACT GmbH & Co. KG - - - - - GLNOfManufacturer - PARAMETER - - - 0173-1#02-AAY812#001 - - - Instance - - string - - - - - - SupplierOfTheIdentifier - - - 0173-1#02-AAP796#004 - - - Instance - - - - - - - - MAN_PROD_NUM - - - 0173-1#02-AAO676#003 - - - Instance - - - - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - QUINT4-PS/3AC/24DC/20 - - - - - ManufacturerProductDescription - PARAMETER - - - 0173-1#02-AAU734#001 - - - Instance - - langString - Primary-switched QUINT POWER power supply with free choice of output characteristic curve, SFB (selective fuse breaking) technology, and NFC interface, input: 3-phase, output: 24 V DC/20 A - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - PHOENIX CONTACT GmbH & Co. KG - - - - - GLNOfSupplier - PARAMETER - - - 0173-1#02-AAY813#001 - - - Instance - - string - - - - - - SupplierIdProvider - PARAMETER - - - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - Instance - - - - - - - - SUP_PROD_NUM - PARAMETER - - - 0173-1#02-AAO736#004 - - - Instance - - - - - - - - SupplierProductDesignation - - - 0173-1#02-AAM551#002 - - - Instance - - string - QUINT4-PS/3AC/24DC/20 - - - - - SupplierProductDescription - PARAMETER - - - 0173-1#02-AAU730#001 - - - Instance - - langString - Primary-switched QUINT POWER power supply with free choice of output characteristic curve, SFB (selective fuse breaking) technology, and NFC interface, input: 3-phase, output: 24 V DC/20 A - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - - - - - - ClassificationSystem - PARAMETER - - - 0173-1#02-AAO715#002 - - - Instance - - string - eclass - - - - - SecondaryKeyTyp - - - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - Instance - - - - - - - - TypThumbnail - PARAMETER - - - - Instance - - image/jpeg - /aasx/2904622.jpeg - - - - - AssetId - PARAMETER - - - https://www.hsu-hh.de/aut/aas/assetid - - - Instance - - string - www.company.com/ids/asset/8220_6010_8091_3593 - - - - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 25 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - SecondaryKeyInstance - PARAMETER - - - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - Instance - - - - - - - - DateOfManufacture - PARAMETER - - - 0173-1#02-AAR972#002 - - - Instance - - - - - - - - DeviceRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/devicerevision - - - Instance - - - - - - - - SoftwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/softwarerevision - - - Instance - - - - - - - - HardwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - Instance - - - 02 - - - - - QrCode - PARAMETER - - - https://www.hsu-hh.de/aut/aas/qrcode - - - Instance - - image/jpeg - /aasx/2904622_QRCode.jpeg - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - PHOENIX CONTACT GmbH & Co. KG - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Flachsmarktstr. 8 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 32825 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Blomberg - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Nordrhein-Westfalen - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - info@phoenixcontact.de - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.phoenixcontact.com/online/portal/pc - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +49 52 35/3-1 20 00 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - - - - - false - false - - - - - CompanyLogo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/companylogo - - - Instance - - image/png - /aasx/PhoenixContact_Logo.png - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - http://phoenixcontact.net/qr/2904622 - - - - - - - - ManufacturerName - 0173-1#02-AAO677#002 - - - - - - - - Herstellername - Manufacturer Name - - Manufacturer Name - - - - - Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist - 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 - - - - - - - ManufacturerProductDesignation - 0173-1#02-AAW338#001 - - - - - - - - Manufacturer product designation - Herstellerproduktbezeichnung - - ManufacturerTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - PhysicalAddress - https://www.hsu-hh.de/aut/aas/physicaladdress - - - - - - - - PhysicalAddress - Physische Adresse - - PhysicalAddress - - - - - Sammlung für reale physische Adresse - Collection for real physical address - - - - - - - CountryCode - 0173-1#02-AAO730#001 - - - - - - - - - - - - Landeskennung - Country code - - Country code - - - - - Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes - agreed upon symbol for unambiguous identification of a country - - - - - - - Street - 0173-1#02-AAO128#001 - - - - - - - - Strasse - Street - - Street - - - - - Name der Strasse und Hausnummer - Street name and house number - - - - - - - Zip - 0173-1#02-AAO129#002 - - - - - - - - Zip - Postleitzahl - - PostalCode - - - - - ZIP code of address - Postleitzahl der Anschrift - - - - - - - CityTown - 0173-1#02-AAO132#001 - - - - - - - - Ort - City/town - - City/town - - - - - Town or city of the company - Ortsangabe - - - - - - - StateCounty - 0173-1#02-AAO133#002 - - - - - - - - state/county - Bundesland - - StateCounty - - - - - Bundesland - state/county - - - - - - - ManufacturerProductFamily - 0173-1#02-AAU731#001 - - - - - - - - Manufacturer product family - Herstellerproduktfamilie - - TypClass - - - - - 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie - 2nd level of a 3 level manufacturer specific product hierarchy - - - - - - - SerialNumber - 0173-1#02-AAM556#002 - - - - - - - - Serial number - Seriennummer - - InstanceId - - - - - eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist - unique combination of numbers and letters used to identify the device once it has been manufactured - - - - - - - BatchNumber - 0173-1#02-AAQ196#001 - - - - - - - - Batch number - Chargen-Nummer - - ChargeId - - - - - Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge - Number assigned by the manufacturer of a material to identify the manufacturer's batch - - - - - - - ProductCountryOfOrigin - 0173-1#02-AAO841#001 - - - - - - - - Produkt Ursprungsland - Product country of origin - - CountryOfOrigin - - - - - Land in dem das Produkt hergestellt wurde (Hersteller Land) - Country in which the product is manufactured (manufacturer country) - - - - - - - YearOfConstruction - 0173-1#02-AAP906#001 - - - - - - - - Year of construction - Baujahr - - YearOfConstruction - - - - - Jahreszahl als Datumsangabe für die Fertigstellung des Objektes - Year as completion date of object - - - - - - - ProductMarking - https://www.hsu-hh.de/aut/aas/productmarking - - - - - - - - Produktkennzeichnung - Product Marking - - ProductMarking - - - - - Sammlungsdatei für Produktkennzeichnung - Collection file for product marking - - - - - - - CEQualificationPresent - 0173-1#02-BAF053#008 - - - - - - - - CE-Kennzeichnung vorhanden - CE- qualification present - - CEMarkingPresent - - - BOOLEAN - - whether CE- qualification is present - Angabe, ob CE-Kennzeichnung vorhanden ist - - - - - - - File - 0173-1#02-AAD005#008 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Enthaltene Doku. Datei - Embedded Doc. file - - File - - - - - Verweis/ BLOB auf enthaltene Dokumentations-Datei. - Reference/ BLOB to embedded documentation file. - - - - - - - DocumentationItem - 0173-1#02-AAD001#001 - - - - - - - - Dokumentationsgruppe - Documentation item - - DocumentationItem - - - - - Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. - Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. - - - - - - - DocumentType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - - - - - - Dokumententyp - Document Type - - DocumentType - - - - - Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) - TBD - - - - - - - VDI2770_DomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - - - - - - Domain-Nummer - DomainId - - DomainId - - - - - Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. - TBD - - - - - - - VDI2770_IdType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - - - - - - Nummerntyp - IdType - - IdType - - - - - Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. - TBD - - - - - - - DocumentId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - - - - - - DocumentId - Dokumenten-Nummer - - DocumentId - - - - - Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. - TBD - - - - - - - DocumentDomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - - - - - - DocumentDomainId - DocumentDomainId - - DocumentDomainId - - - - - Kennung oder Kennzeichen einer Domäne - TBD - - - - - - - VDI2770_Role - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - - - - - - Rolle - Role - - Role - - - - - Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) - TBD - - - - - - - VDI2770_OrganisationId - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - - - - - - Organisation ID - Organisation ID - - OrganisationId - - - - - eindeutige ID für die Organisation - TBD - - - - - - - VDI2770_OrganisationName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - - - - - - OrganisationName - OrganisationName - - OrganisationName - - - - - gebräuchliche Bezeichnung für die Organisation - TBD - - - - - - - VDI2770_OrganisationOfficialName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - - - - - - Offizieller Name der Organisation - Organisation Official Name - - OrganisationOfficialName - - - - - offizieller Name der Organisation - TBD - - - - - - - VDI2770_Description - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - - - - - - Beschreibung - Description - - Description - - - - - Beschreibung für die nächste übergeordnete Collection - TBD - - - - - - - DocumentPartId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - - - - - - Dokumenten-Teilnummer - DocumentPartId - - DocumentPartId - - - - - Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. - TBD - - - - - - - DocumentClassification_ClassId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - - - - Dokumentkategorie - Document category - - DocCategory - - - - - Dokumentkategorie nach VDI 2770:2018/10 - Document category after VDI 2770:2018/10 - - - - - - - VDI2770_ClassName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - - - - - - Klassenname - Class Name - - ClassName - - - - - Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. - TBD - - - - - - - VDI2770_ClassificationSystem - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - - - - - - Klassifizierungssystem - classification system - - ClassificationSystem - - - - - Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. - TBD - - - - - - - DocumentVersionId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - - - - - - Dokumenten-Versionsnummer - DocumentVersionId - - DocumentVersionId - - - - - Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. - TBD - - - - - - - DocumentVersion_LanguageCode - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - - - - - - Sprachenschlüssel - LanguageCode - - LanguageCode - - - - - Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 - TBD - - - - - - - VDI2770_Title - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - - - - - - Titel - Title - - VDI2770_Title - - - - - sprachabhängiger Titel des Dokuments - TBD - - - - - - - VDI2770_Summary - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - - - - - - Zusammenfassung - Summary - - Summary - - - - - sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts - TBD - - - - - - - VDI2770_Keywords - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - - - - - - Schlagwörter - Keywords - - Keywords - - - - - sprachabhängige, durch Komma getrennte Liste von Schlagwörtern - TBD - - - - - - - VDI2770_StatusValue - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - - - - - - Statuswert - StatusValue - - StatusValue - - - - - Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) - TBD - - - - - - - VDI2770_SetDate - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - - - - - - Erstellungsdatum - Set Date - - SetDate - - - - - Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). - TBD - - - - - - - VDI2770_Purpose - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - - - - - - Zweck - Purpose - - Purpose - - - - - Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. - TBD - - - - - - - VDI2770_BasedOnProcedure - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - - - - - - Prozedur - Procedure - - BasedOnProcedure - - - - - textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt - TBD - - - - - - - VDI2770_Comments - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - - - - - - Kommentar - Comments - - Comments - - - - - textuelle Bemerkungen und Anmerkungen zum Status - TBD - - - - - - - VDI2770_ReferencedObject_Type - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - - - - - - Typ - Type - - Type - - - - - Für Type des Objekts muss immer Product angegeben werden. - TBD - - - - - - - VDI2770_ReferencedObject_RefType - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - - - - - - RefType - RefType - - RefType - - - - - Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) - TBD - - - - - - - VDI2770_ReferencedObject_ObjectId - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - - - - - - ObjectId - ObjectId - - ObjectId - - - - - Angabe der Identifikationsnummer zum Objekt - TBD - - - - - - - VDI2770_FileId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - - - - - - ID der Datei - File ID - - FileId - - - - - eindeutige ID für die Datei - TBD - - - - - - - VDI2770_FileName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - - - - - - Dateiname - File name - - FileName - - - - - Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. - TBD - - - - - - - VDI2770_FileFormat - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - - - - - - Datei Format - File format - - FileFormat - - - - - Angabe eines Media Typs gemäß der Liste der IANA - TBD - - - - - - - OrganisationContactInfo - https://www.hsu-hh.de/aut/aas/contactinfo - - - - - - - - Contact Info - Kontakt Info - - OrganisationContactInfo - - - - - Sammlung für die allgemeinen Kontaktdaten - Collection for general contact data - - - - - - - NameOfSupplier - 0173-1#02-AAO735#003 - - - - - - - - - - - - name of supplier - Lieferantenname - - name of supplier - - - - - Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt - name of supplier which provides the customer with a product or a service - - - - - - - ContactInfo_Role - https://www.hsu-hh.de/aut/aas/role - - - - - - - - Rolle - Role - - Role - - - - - Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt - Information to specify the role which the organisation of ContactInfo plays - - - - - - - Email - https://www.hsu-hh.de/aut/aas/email - - - - - - - - Emailadresse - Email address - - Email - - - - - Emailadresse - Email address - - - - - - - URL - 0173-1#02-AAO694#001 - - - - - - - - Internetadresse - Internet address - - URL - - - - - stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html - Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html - - - - - - - PhoneNumber - 0173-1#02-AAO136#002 - - - - - - - - Telefonnummer - telephone number - - Phone - - - - - vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist - complete telephone number to be called to reach a business partner - - - - - - - Fax - https://www.hsu-hh.de/aut/aas/fax - - - - - - - - Fax - Fax - - Fax - - - - - Faxnummer - Fax number - - - - - - - 0173-1#02-AAO136#002 - - - - - GLNOfManufacturer - 0173-1#02-AAY812#001 - - - - - - - - GLN of manufacturer - GLN des Herstellers - - GLN of manufacturer - - - - - international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort - internationally unique identification number for the manufacturer of the device or the product and for the physical location - - - - - - - SupplierOfTheIdentifier - 0173-1#02-AAP796#004 - - - - - - - - Supplier of the identifier - Anbieter der Identifikationsnummer für Hersteller - - Supplier of the identifier - - - STRING_TRANSLATABLE - - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - - - - - - - MAN_PROD_NUM - - product article number of manufacturer - - 0173-1#02-AAO676#003 - - - - - - - - product article number of manufacturer - Herstellerartikelnummer - - MAN_PROD_NUM - - - STRING_TRANSLATABLE - - eindeutiger Bestellschlüssel des Herstellers - unique product identifier of the manufacturer - - - - - - - ManufacturerProductDescription - 0173-1#02-AAU734#001 - - - - - - - - Manufacturer product description - Herstellerproduktbeschreibung - - Manufacturer product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - GLNOfSupplier - 0173-1#02-AAY813#001 - - - - - - - - GLN of supplier - GLN des Lieferanten - - GLN of supplier - - - - - international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort - internationally unique identification number for the supplier of the device or the product and for the physical location - - - - - - - SupplierIdProvider - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - - - - - - SupplierIdProvider - Anbieter der Identifikationsnummer - - SupplierIdProvider - - - STRING_TRANSLATABLE - - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - - - - - - - SUP_PROD_NUM - 0173-1#02-AAO736#004 - - - - - - - - product article number of supplier - Lieferantenartikelnummer - - product article number of supplier - - - - - eindeutiger Bestellschlüssel des Lieferanten - unique product order identifier of the supplier - - - - - - - SupplierProductDesignation - 0173-1#02-AAM551#002 - - - - - - - - Supplier product designation - Lieferantenproduktbezeichnung - - SupplierTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - SupplierProductDescription - 0173-1#02-AAU730#001 - - - - - - - - Supplier product description - Lieferantenproduktbeschreibung - - Supplier product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - ClassificationSystem - 0173-1#02-AAO715#002 - - - - - - - - classification system - Klassifizierungssystem - - ClassificationSystem - - - - - Klassifizierungssystem - Classification System - - - - - - - SecondaryKeyTyp - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - - - - - - SecondaryKeyTyp - Typnummer des IT Systems - - SecondaryKeyTyp - - - - - Führende technische ID im IT System des Typs - SecondaryKeyTyp - - - - - - - TypThumbnail - www.company.com/ids/cd/4401_1272_7091_3437 - - - - - - - - TypThumbnail - Vorschaubild - - TypThumbnail - - - - - Darstellung des Produkttyps in kleinem Format - Small picture of the product type - - - - - - - AssetId - https://www.hsu-hh.de/aut/aas/assetid - - - - - - - - AssetId - Asset ID - - AssetId - - - - - Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. - Global unique ID of an asset, which can be read by both human and machine. - - - - - - - SecondaryKeyInstance - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - - - - - - SecondaryKeyInstance - Instanznummer des IT Systems - - SecondaryKeyInstance - - - - - Führende technische ID im IT System der Instanz - SecondaryKeyInstance - - - - - - - DateOfManufacture - 0173-1#02-AAR972#002 - - - - - - - - Date of manufacture - Herstellungsdatum - - Date of manufacture - - - DATE - - Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist - Date from which the production and / or development process is completed or from which a service is provided completely - - - - - - - DeviceRevision - https://www.hsu-hh.de/aut/aas/devicerevision - - - - - - - - DeviceRevision - DeviceRevision - - DeviceRevision - - - - - DeviceRevision - DeviceRevision - - - - - - - SoftwareRevision - https://www.hsu-hh.de/aut/aas/softwarerevision - - - - - - - - SoftwareRevision - SoftwareRevision - - SoftwareRevision - - - - - SoftwareRevision - SoftwareRevision - - - - - - - HardwareRevision - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - - - - - - HardwareRevision - HardwareRevision - - HardwareRevision - - - - - HardwareRevision - HardwareRevision - - - - - - - QrCode - https://www.hsu-hh.de/aut/aas/qrcode - - - - - - - - QrCode - QrCode - - QrCode - - - - - In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. - QrCode - - - - - - - CompanyLogo - https://www.hsu-hh.de/aut/aas/companylogo - - - - - - - - Firmenlogo - CompanyLogo - - CompanyLogo - - - - - Firmenlogo - CompanyLogo - - - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/08_SchneiderElectric.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/08_SchneiderElectric.aasx.xml deleted file mode 100644 index b85815050..000000000 --- a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/08_SchneiderElectric.aasx.xml +++ /dev/null @@ -1,4570 +0,0 @@ - - - - - SE_Tesys_Island_Header - www.company.com/ids/aas/2520_6010_8091_1277 - - - www.company.com/ids/asset/8220_6010_8091_3593 - - - - - - www.company.com/ids/sm/4343_5072_7091_3242 - - - - - www.company.com/ids/sm/2543_5072_7091_2660 - - - - - www.company.com/ids/sm/6053_5072_7091_5102 - - - - - www.company.com/ids/sm/6563_5072_7091_4267 - - - - - - - - - SE_Tesys_Island_Header - www.company.com/ids/asset/8220_6010_8091_3593 - Instance - - - - - Nameplate - www.company.com/ids/sm/4343_5072_7091_3242 - - - https://www.hsu-hh.de/aut/aas/nameplate - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Schneider Electric - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - Bus coupler TeSys island, Ethernet switch (EtherNet IP / Modbus TCP) - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - FR - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Rue Joseph Monier - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 92506 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Rueil Malmaison - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Hauts de Seine - - - - false - false - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 1x14F4023C - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - ProductCountryOfOrigin - PARAMETER - - - 0173-1#02-AAO841#001 - - - Instance - - string - FR - - - - - YearOfConstruction - PARAMETER - - - 0173-1#02-AAP906#001 - - - Instance - - string - 2019 - - - - - Marking_CE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/marking_ce.png - - - - false - false - - - - - Marking_UL - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/UL.png - - - - false - false - - - - - Marking_WEEE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/Marking_WEEE.png - - - - false - false - - - - - - Document - www.company.com/ids/sm/2543_5072_7091_2660 - - - https://www.hsu-hh.de/aut/aas/document - - - Instance - - - - - DeclarationCEMarking - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Schneider Electric - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Schneider Electric SAS - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - SC19062501 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - EU - Declaration of conformity - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - EU - Declaration of conformity - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - string - Bus Coupler for TeSys Island offer - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - string - TPRBCEIP, TPRBCPFN, TPRBETC - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - CE_TPRBC_SC19062501.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/CE_TPRBC_SC19062501.pdf - - - - false - false - - - - - DeclarationULMarking - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Schneider Electric - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Schneider Electric Automation SAS - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - NRAQ.E3220218 - PROGRAMMABLE CONTROLLERS - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - string - 2019 - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - PROGRAMMABLE_CONTROLLERS___UL_Product_iQ.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/PROGRAMMABLE_CONTROLLERS___UL_Product_iQ.pdf - - - - false - false - - - - - Instruction Bulletin - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Technical Documentation - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Schneider Electric - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Schneider Electric SAS - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 8536IB1901EN - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - System Guide - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Instruction bulletin - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - string - This instruction bulletin introduces and describes the main functions of TeSys island. - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - string - TeSys Island - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - instal_EN.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/Instal_EN.pdf - - - - false - false - - - - - - Service - www.company.com/ids/sm/6053_5072_7091_5102 - - - https://www.hsu-hh.de/aut/aas/service - - - Instance - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Schneider Elcetric - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Schneider Platz - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 97816 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Marktheidenfeld - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.schneider-electric.com/en/work/support/ - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - - - - - false - false - - - - - - Identification - www.company.com/ids/sm/6563_5072_7091_4267 - - - https://www.hsu-hh.de/aut/aas/identification - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Schneider Electric - - - - - GLNOfManufacturer - PARAMETER - - - 0173-1#02-AAY812#001 - - - Instance - - string - TPRBCEIP - - - - - SupplierOfTheIdentifier - - - 0173-1#02-AAP796#004 - - - Instance - - - - - - - - MAN_PROD_NUM - - - 0173-1#02-AAO676#003 - - - Instance - - - - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - Bus coupler TeSys island, Ethernet switch (EtherNet IP / Modbus TCP) - - - - - ManufacturerProductDescription - PARAMETER - - - 0173-1#02-AAU734#001 - - - Instance - - langString - Bus coupler Ethernet IP / Modbus TCP, point of connection between a group of starters and an automation controller - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Schneider Electric - - - - - GLNOfSupplier - PARAMETER - - - 0173-1#02-AAY813#001 - - - Instance - - string - TPRBCEIP - - - - - SupplierIdProvider - PARAMETER - - - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - Instance - - - - - - - - SUP_PROD_NUM - PARAMETER - - - 0173-1#02-AAO736#004 - - - Instance - - - - - - - - SupplierProductDesignation - - - 0173-1#02-AAM551#002 - - - Instance - - string - Bus coupler TeSys island, Ethernet switch (EtherNet IP / Modbus TCP) - - - - - SupplierProductDescription - PARAMETER - - - 0173-1#02-AAU730#001 - - - Instance - - langString - Bus coupler Ethernet IP / Modbus TCP, point of connection between a group of starters and an automation controller - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - - - - - - ClassificationSystem - PARAMETER - - - 0173-1#02-AAO715#002 - - - Instance - - string - eclass - - - - - SecondaryKeyTyp - - - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - Instance - - - - - - - - TypThumbnail - PARAMETER - - - www.company.com/ids/cd/4401_1272_7091_3437 - - - Instance - - image/jpeg - /aasx/Identification/TPRBCEIP.PNG - - - - - AssetId - PARAMETER - - - https://www.hsu-hh.de/aut/aas/assetid - - - Instance - - string - www.company.com/ids/asset/8220_6010_8091_3593 - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 1x14F4023C - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - SecondaryKeyInstance - PARAMETER - - - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - Instance - - - - - - - - DateOfManufacture - PARAMETER - - - 0173-1#02-AAR972#002 - - - Instance - - - - - - - - DeviceRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/devicerevision - - - Instance - - - - - - - - SoftwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/softwarerevision - - - Instance - - - - - - - - HardwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - Instance - - - - - - - - QrCode - PARAMETER - - - https://www.hsu-hh.de/aut/aas/qrcode - - - Instance - - image/jpeg - /aasx/Identification/QRCode_Tesys_Island_Header.jpg - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Schneider Electric - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - FR - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Rue Joseph Monier - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 92506 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Rueil Malmaison - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Hauts de Seine - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.se.com/ww/en/ - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - - - - - false - false - - - - - CompanyLogo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/companylogo - - - Instance - - image/png - /aasx/Identification/logo_SE.png - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.schneider-electric.com/en/product-range-presentation/65746-tesys-island/?parent-category-id=3000&parent-subcategory-id=3080&filter=business-4-low-voltage-products-and-systems#tabs-top - - - - - - - - ManufacturerName - 0173-1#02-AAO677#002 - - - - - - - - Herstellername - Manufacturer Name - - Manufacturer Name - - - - - Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist - 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 - - - - - - - ManufacturerProductDesignation - 0173-1#02-AAW338#001 - - - - - - - - Manufacturer product designation - Herstellerproduktbezeichnung - - - ManufacturerTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - PhysicalAddress - https://www.hsu-hh.de/aut/aas/physicaladdress - - - - - - - - PhysicalAddress - Physische Adresse - - PhysicalAddress - - - - - Sammlung für reale physische Adresse - Collection for real physical address - - - - - - - CountryCode - 0173-1#02-AAO730#001 - - - - - - - - - - - - Landeskennung - Country code - - Country code - - - - - Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes - agreed upon symbol for unambiguous identification of a country - - - - - - - Street - 0173-1#02-AAO128#001 - - - - - - - - Strasse - Street - - Street - - - - - Name der Strasse und Hausnummer - Street name and house number - - - - - - - Zip - 0173-1#02-AAO129#002 - - - - - - - - Zip - Postleitzahl - - PostalCode - - - - - ZIP code of address - Postleitzahl der Anschrift - - - - - - - CityTown - 0173-1#02-AAO132#001 - - - - - - - - Ort - City/town - - City/town - - - - - Town or city of the company - Ortsangabe - - - - - - - StateCounty - 0173-1#02-AAO133#002 - - - - - - - - state/county - Bundesland - - StateCounty - - - - - Bundesland - state/county - - - - - - - ManufacturerProductFamily - 0173-1#02-AAU731#001 - - - - - - - - Manufacturer product family - Herstellerproduktfamilie - - TypClass - - - - - 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie - 2nd level of a 3 level manufacturer specific product hierarchy - - - - - - - SerialNumber - 0173-1#02-AAM556#002 - - - - - - - - Serial number - Seriennummer - - InstanceId - - - - - eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist - unique combination of numbers and letters used to identify the device once it has been manufactured - - - - - - - BatchNumber - 0173-1#02-AAQ196#001 - - - - - - - - Batch number - Chargen-Nummer - - ChargeId - - - - - Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge - Number assigned by the manufacturer of a material to identify the manufacturer's batch - - - - - - - ProductCountryOfOrigin - 0173-1#02-AAO841#001 - - - - - - - - Produkt Ursprungsland - Product country of origin - - CountryOfOrigin - - - - - Land in dem das Produkt hergestellt wurde (Hersteller Land) - Country in which the product is manufactured (manufacturer country) - - - - - - - YearOfConstruction - 0173-1#02-AAP906#001 - - - - - - - - Year of construction - Baujahr - - YearOfConstruction - - - - - Jahreszahl als Datumsangabe für die Fertigstellung des Objektes - Year as completion date of object - - - - - - - ProductMarking - https://www.hsu-hh.de/aut/aas/productmarking - - - - - - - - Produktkennzeichnung - Product Marking - - ProductMarking - - - - - Sammlungsdatei für Produktkennzeichnung - Collection file for product marking - - - - - - - CEQualificationPresent - 0173-1#02-BAF053#008 - - - - - - - - CE-Kennzeichnung vorhanden - CE- qualification present - - CEMarkingPresent - - - BOOLEAN - - whether CE- qualification is present - Angabe, ob CE-Kennzeichnung vorhanden ist - - - - - - - File - 0173-1#02-AAD005#008 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Enthaltene Doku. Datei - Embedded Doc. file - - File - - - - - Verweis/ BLOB auf enthaltene Dokumentations-Datei. - Reference/ BLOB to embedded documentation file. - - - - - - - DocumentationItem - 0173-1#02-AAD001#001 - - - - - - - - Dokumentationsgruppe - Documentation item - - DocumentationItem - - - - - Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. - Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. - - - - - - - DocumentType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - - - - - - Dokumententyp - Document Type - - DocumentType - - - - - Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) - TBD - - - - - - - VDI2770_DomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - - - - - - Domain-Nummer - DomainId - - DomainId - - - - - Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. - TBD - - - - - - - VDI2770_IdType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - - - - - - Nummerntyp - IdType - - IdType - - - - - Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. - TBD - - - - - - - DocumentId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - - - - - - DocumentId - Dokumenten-Nummer - - DocumentId - - - - - Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. - TBD - - - - - - - DocumentDomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - - - - - - DocumentDomainId - DocumentDomainId - - DocumentDomainId - - - - - Kennung oder Kennzeichen einer Domäne - TBD - - - - - - - VDI2770_Role - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - - - - - - Rolle - Role - - Role - - - - - Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) - TBD - - - - - - - VDI2770_OrganisationId - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - - - - - - Organisation ID - Organisation ID - - OrganisationId - - - - - eindeutige ID für die Organisation - TBD - - - - - - - VDI2770_OrganisationName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - - - - - - OrganisationName - OrganisationName - - OrganisationName - - - - - gebräuchliche Bezeichnung für die Organisation - TBD - - - - - - - VDI2770_OrganisationOfficialName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - - - - - - Offizieller Name der Organisation - Organisation Official Name - - OrganisationOfficialName - - - - - offizieller Name der Organisation - TBD - - - - - - - VDI2770_Description - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - - - - - - Beschreibung - Description - - Description - - - - - Beschreibung für die nächste übergeordnete Collection - TBD - - - - - - - DocumentPartId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - - - - - - Dokumenten-Teilnummer - DocumentPartId - - DocumentPartId - - - - - Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. - TBD - - - - - - - DocumentClassification_ClassId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - - - - Dokumentkategorie - Document category - - DocCategory - - - - - Dokumentkategorie nach VDI 2770:2018/10 - Document category after VDI 2770:2018/10 - - - - - - - VDI2770_ClassName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - - - - - - Klassenname - Class Name - - ClassName - - - - - Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. - TBD - - - - - - - VDI2770_ClassificationSystem - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - - - - - - Klassifizierungssystem - classification system - - ClassificationSystem - - - - - Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. - TBD - - - - - - - DocumentVersionId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - - - - - - Dokumenten-Versionsnummer - DocumentVersionId - - DocumentVersionId - - - - - Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. - TBD - - - - - - - DocumentVersion_LanguageCode - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - - - - - - Sprachenschlüssel - LanguageCode - - LanguageCode - - - - - Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 - TBD - - - - - - - VDI2770_Title - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - - - - - - Titel - Title - - VDI2770_Title - - - - - sprachabhängiger Titel des Dokuments - TBD - - - - - - - VDI2770_Summary - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - - - - - - Zusammenfassung - Summary - - Summary - - - - - sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts - TBD - - - - - - - VDI2770_Keywords - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - - - - - - Schlagwörter - Keywords - - Keywords - - - - - sprachabhängige, durch Komma getrennte Liste von Schlagwörtern - TBD - - - - - - - VDI2770_StatusValue - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - - - - - - Statuswert - StatusValue - - StatusValue - - - - - Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) - TBD - - - - - - - VDI2770_SetDate - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - - - - - - Erstellungsdatum - Set Date - - SetDate - - - - - Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). - TBD - - - - - - - VDI2770_Purpose - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - - - - - - Zweck - Purpose - - Purpose - - - - - Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. - TBD - - - - - - - VDI2770_BasedOnProcedure - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - - - - - - Prozedur - Procedure - - BasedOnProcedure - - - - - textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt - TBD - - - - - - - VDI2770_Comments - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - - - - - - Kommentar - Comments - - Comments - - - - - textuelle Bemerkungen und Anmerkungen zum Status - TBD - - - - - - - VDI2770_ReferencedObject_Type - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - - - - - - Typ - Type - - Type - - - - - Für Type des Objekts muss immer Product angegeben werden. - TBD - - - - - - - VDI2770_ReferencedObject_RefType - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - - - - - - RefType - RefType - - RefType - - - - - Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) - TBD - - - - - - - VDI2770_ReferencedObject_ObjectId - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - - - - - - ObjectId - ObjectId - - ObjectId - - - - - Angabe der Identifikationsnummer zum Objekt - TBD - - - - - - - VDI2770_FileId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - - - - - - ID der Datei - File ID - - FileId - - - - - eindeutige ID für die Datei - TBD - - - - - - - VDI2770_FileName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - - - - - - Dateiname - File name - - FileName - - - - - Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. - TBD - - - - - - - VDI2770_FileFormat - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - - - - - - Datei Format - File format - - FileFormat - - - - - Angabe eines Media Typs gemäß der Liste der IANA - TBD - - - - - - - OrganisationContactInfo - https://www.hsu-hh.de/aut/aas/contactinfo - - - - - - - - Contact Info - Kontakt Info - - OrganisationContactInfo - - - - - Sammlung für die allgemeinen Kontaktdaten - Collection for general contact data - - - - - - - NameOfSupplier - 0173-1#02-AAO735#003 - - - - - - - - - - - - name of supplier - Lieferantenname - - name of supplier - - - - - Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt - name of supplier which provides the customer with a product or a service - - - - - - - ContactInfo_Role - https://www.hsu-hh.de/aut/aas/role - - - - - - - - Rolle - Role - - Role - - - - - Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt - Information to specify the role which the organisation of ContactInfo plays - - - - - - - Email - https://www.hsu-hh.de/aut/aas/email - - - - - - - - Emailadresse - Email address - - Email - - - - - Emailadresse - Email address - - - - - - - URL - 0173-1#02-AAO694#001 - - - - - - - - Internetadresse - Internet address - - URL - - - - - stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html - Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html - - - - - - - PhoneNumber - 0173-1#02-AAO136#002 - - - - - - - - Telefonnummer - telephone number - - Phone - - - - - vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist - complete telephone number to be called to reach a business partner - - - - - - - Fax - https://www.hsu-hh.de/aut/aas/fax - - - - - - - - Fax - Fax - - Fax - - - - - Faxnummer - Fax number - - - - - - - 0173-1#02-AAO136#002 - - - - - GLNOfManufacturer - 0173-1#02-AAY812#001 - - - - - - - - GLN of manufacturer - GLN des Herstellers - - GLN of manufacturer - - - - - international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort - internationally unique identification number for the manufacturer of the device or the product and for the physical location - - - - - - - SupplierOfTheIdentifier - 0173-1#02-AAP796#004 - - - - - - - - Supplier of the identifier - Anbieter der Identifikationsnummer für Hersteller - - Supplier of the identifier - - - STRING_TRANSLATABLE - - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - - - - - - - MAN_PROD_NUM - - product article number of manufacturer - - 0173-1#02-AAO676#003 - - - - - - - - product article number of manufacturer - Herstellerartikelnummer - - MAN_PROD_NUM - - - STRING_TRANSLATABLE - - eindeutiger Bestellschlüssel des Herstellers - unique product identifier of the manufacturer - - - - - - - ManufacturerProductDescription - 0173-1#02-AAU734#001 - - - - - - - - Manufacturer product description - Herstellerproduktbeschreibung - - Manufacturer product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - GLNOfSupplier - 0173-1#02-AAY813#001 - - - - - - - - GLN of supplier - GLN des Lieferanten - - GLN of supplier - - - - - international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort - internationally unique identification number for the supplier of the device or the product and for the physical location - - - - - - - SupplierIdProvider - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - - - - - - SupplierIdProvider - Anbieter der Identifikationsnummer - - SupplierIdProvider - - - STRING_TRANSLATABLE - - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - - - - - - - SUP_PROD_NUM - 0173-1#02-AAO736#004 - - - - - - - - product article number of supplier - Lieferantenartikelnummer - - product article number of supplier - - - - - eindeutiger Bestellschlüssel des Lieferanten - unique product order identifier of the supplier - - - - - - - SupplierProductDesignation - 0173-1#02-AAM551#002 - - - - - - - - Supplier product designation - Lieferantenproduktbezeichnung - - SupplierTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - SupplierProductDescription - 0173-1#02-AAU730#001 - - - - - - - - Supplier product description - Lieferantenproduktbeschreibung - - Supplier product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - ClassificationSystem - 0173-1#02-AAO715#002 - - - - - - - - classification system - Klassifizierungssystem - - ClassificationSystem - - - - - Klassifizierungssystem - Classification System - - - - - - - SecondaryKeyTyp - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - - - - - - SecondaryKeyTyp - Typnummer des IT Systems - - SecondaryKeyTyp - - - - - Führende technische ID im IT System des Typs - SecondaryKeyTyp - - - - - - - TypThumbnail - www.company.com/ids/cd/6044_0150_1191_5121 - - - - - - - - TypThumbnail - Vorschaubild - - TypThumbnail - - - - - Darstellung des Produkttyps in kleinem Format - Small picture of the product type - - - - - - - AssetId - https://www.hsu-hh.de/aut/aas/assetid - - - - - - - - AssetId - Asset ID - - AssetId - - - - - Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. - Global unique ID of an asset, which can be read by both human and machine. - - - - - - - SecondaryKeyInstance - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - - - - - - SecondaryKeyInstance - Instanznummer des IT Systems - - SecondaryKeyInstance - - - - - Führende technische ID im IT System der Instanz - SecondaryKeyInstance - - - - - - - DateOfManufacture - 0173-1#02-AAR972#002 - - - - - - - - Date of manufacture - Herstellungsdatum - - Date of manufacture - - - DATE - - Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist - Date from which the production and / or development process is completed or from which a service is provided completely - - - - - - - DeviceRevision - https://www.hsu-hh.de/aut/aas/devicerevision - - - - - - - - DeviceRevision - DeviceRevision - - DeviceRevision - - - - - DeviceRevision - DeviceRevision - - - - - - - SoftwareRevision - https://www.hsu-hh.de/aut/aas/softwarerevision - - - - - - - - SoftwareRevision - SoftwareRevision - - SoftwareRevision - - - - - SoftwareRevision - SoftwareRevision - - - - - - - HardwareRevision - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - - - - - - HardwareRevision - HardwareRevision - - HardwareRevision - - - - - HardwareRevision - HardwareRevision - - - - - - - QrCode - https://www.hsu-hh.de/aut/aas/qrcode - - - - - - - - QrCode - QrCode - - QrCode - - - - - In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. - QrCode - - - - - - - CompanyLogo - https://www.hsu-hh.de/aut/aas/companylogo - - - - - - - - Firmenlogo - CompanyLogo - - CompanyLogo - - - - - Firmenlogo - CompanyLogo - - - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/09_SchneiderElectric.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/09_SchneiderElectric.aasx.xml deleted file mode 100644 index 89372c86b..000000000 --- a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/09_SchneiderElectric.aasx.xml +++ /dev/null @@ -1,4570 +0,0 @@ - - - - - SE_Tesys_Island_Power - www.company.com/ids/aas/2520_6010_8091_1277 - - - www.company.com/ids/asset/8220_6010_8091_3593 - - - - - - www.company.com/ids/sm/4343_5072_7091_3242 - - - - - www.company.com/ids/sm/2543_5072_7091_2660 - - - - - www.company.com/ids/sm/6053_5072_7091_5102 - - - - - www.company.com/ids/sm/6563_5072_7091_4267 - - - - - - - - - SE_Tesys_Island_Power - www.company.com/ids/asset/8220_6010_8091_3593 - Instance - - - - - Nameplate - www.company.com/ids/sm/4343_5072_7091_3242 - - - https://www.hsu-hh.de/aut/aas/nameplate - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Schneider Electric - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - Voltage interface Module, TeSys island - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - FR - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Rue Joseph Monier - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 92506 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Rueil Malmaison - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Hauts de Seine - - - - false - false - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 190730000777 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - ProductCountryOfOrigin - PARAMETER - - - 0173-1#02-AAO841#001 - - - Instance - - string - FR - - - - - YearOfConstruction - PARAMETER - - - 0173-1#02-AAP906#001 - - - Instance - - string - 2019 - - - - - Marking_CE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/marking_ce.png - - - - false - false - - - - - Marking_UL - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/UL.png - - - - false - false - - - - - Marking_WEEE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/Marking_WEEE.png - - - - false - false - - - - - - Document - www.company.com/ids/sm/2543_5072_7091_2660 - - - https://www.hsu-hh.de/aut/aas/document - - - Instance - - - - - DeclarationCEMarking - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Schneider Electric - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Schneider Electric SAS - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - SC19062503 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - EU - Declaration of conformity - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - EU - Declaration of conformity - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - string - Voltage Measurement Module for TeSys Island offer - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - string - TPRVM001 - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - CE_TPRVM_SC19062503.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/CE_TPRVM_SC19062503.pdf - - - - false - false - - - - - DeclarationULMarking - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Schneider Electric - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Schneider Electric Automation SAS - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - NRAQ.E3220218 - PROGRAMMABLE CONTROLLERS - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - string - 2019 - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - PROGRAMMABLE_CONTROLLERS___UL_Product_iQ.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/PROGRAMMABLE_CONTROLLERS___UL_Product_iQ.pdf - - - - false - false - - - - - Instruction Bulletin - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Technical Documentation - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Schneider Electric - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Schneider Electric SAS - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 8536IB1901EN - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - System Guide - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Instruction bulletin - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - string - This instruction bulletin introduces and describes the main functions of TeSys island. - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - string - TeSys Island - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - instal_EN.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/Instal_EN.pdf - - - - false - false - - - - - - Service - www.company.com/ids/sm/6053_5072_7091_5102 - - - https://www.hsu-hh.de/aut/aas/service - - - Instance - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Schneider Elcetric - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Schneider Platz - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 97816 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Marktheidenfeld - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.schneider-electric.com/en/work/support/ - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - - - - - false - false - - - - - - Identification - www.company.com/ids/sm/6563_5072_7091_4267 - - - https://www.hsu-hh.de/aut/aas/identification - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Schneider Electric - - - - - GLNOfManufacturer - PARAMETER - - - 0173-1#02-AAY812#001 - - - Instance - - string - TPRVM001 - - - - - SupplierOfTheIdentifier - - - 0173-1#02-AAP796#004 - - - Instance - - - - - - - - MAN_PROD_NUM - - - 0173-1#02-AAO676#003 - - - Instance - - - - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - Voltage interface Module, TeSys island - - - - - ManufacturerProductDescription - PARAMETER - - - 0173-1#02-AAU734#001 - - - Instance - - langString - Monitoring of the mains voltage powering the island and Reporting of the voltage to the bus coupler to enable power & energy monitoring - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Schneider Electric - - - - - GLNOfSupplier - PARAMETER - - - 0173-1#02-AAY813#001 - - - Instance - - string - TPRVM001 - - - - - SupplierIdProvider - PARAMETER - - - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - Instance - - - - - - - - SUP_PROD_NUM - PARAMETER - - - 0173-1#02-AAO736#004 - - - Instance - - - - - - - - SupplierProductDesignation - - - 0173-1#02-AAM551#002 - - - Instance - - string - Voltage interface Module, TeSys island - - - - - SupplierProductDescription - PARAMETER - - - 0173-1#02-AAU730#001 - - - Instance - - langString - Monitoring of the mains voltage powering the island and Reporting of the voltage to the bus coupler to enable power & energy monitoring - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - - - - - - ClassificationSystem - PARAMETER - - - 0173-1#02-AAO715#002 - - - Instance - - string - eclass - - - - - SecondaryKeyTyp - - - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - Instance - - - - - - - - TypThumbnail - PARAMETER - - - www.company.com/ids/cd/4401_1272_7091_3437 - - - Instance - - image/jpeg - /aasx/Identification/TPRVM001.PNG - - - - - AssetId - PARAMETER - - - https://www.hsu-hh.de/aut/aas/assetid - - - Instance - - string - www.company.com/ids/asset/8220_6010_8091_3593 - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 190730000777 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - SecondaryKeyInstance - PARAMETER - - - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - Instance - - - - - - - - DateOfManufacture - PARAMETER - - - 0173-1#02-AAR972#002 - - - Instance - - - - - - - - DeviceRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/devicerevision - - - Instance - - - - - - - - SoftwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/softwarerevision - - - Instance - - - - - - - - HardwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - Instance - - - - - - - - QrCode - PARAMETER - - - https://www.hsu-hh.de/aut/aas/qrcode - - - Instance - - image/jpeg - /aasx/Identification/QRCode_Tesys_Island_Power.jpg - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Schneider Electric - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - FR - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Rue Joseph Monier - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 92506 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Rueil Malmaison - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Hauts de Seine - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.schneider-electric.com/en/ - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - - - - - false - false - - - - - CompanyLogo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/companylogo - - - Instance - - image/png - /aasx/Identification/logo_SE.png - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.schneider-electric.com/en/product-range-presentation/65746-tesys-island/?parent-category-id=3000&parent-subcategory-id=3080&filter=business-4-low-voltage-products-and-systems#tabs-top - - - - - - - - ManufacturerName - 0173-1#02-AAO677#002 - - - - - - - - Herstellername - Manufacturer Name - - Manufacturer Name - - - - - Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist - 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 - - - - - - - ManufacturerProductDesignation - 0173-1#02-AAW338#001 - - - - - - - - Manufacturer product designation - Herstellerproduktbezeichnung - - - ManufacturerTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - PhysicalAddress - https://www.hsu-hh.de/aut/aas/physicaladdress - - - - - - - - PhysicalAddress - Physische Adresse - - PhysicalAddress - - - - - Sammlung für reale physische Adresse - Collection for real physical address - - - - - - - CountryCode - 0173-1#02-AAO730#001 - - - - - - - - - - - - Landeskennung - Country code - - Country code - - - - - Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes - agreed upon symbol for unambiguous identification of a country - - - - - - - Street - 0173-1#02-AAO128#001 - - - - - - - - Strasse - Street - - Street - - - - - Name der Strasse und Hausnummer - Street name and house number - - - - - - - Zip - 0173-1#02-AAO129#002 - - - - - - - - Zip - Postleitzahl - - PostalCode - - - - - ZIP code of address - Postleitzahl der Anschrift - - - - - - - CityTown - 0173-1#02-AAO132#001 - - - - - - - - Ort - City/town - - City/town - - - - - Town or city of the company - Ortsangabe - - - - - - - StateCounty - 0173-1#02-AAO133#002 - - - - - - - - state/county - Bundesland - - StateCounty - - - - - Bundesland - state/county - - - - - - - ManufacturerProductFamily - 0173-1#02-AAU731#001 - - - - - - - - Manufacturer product family - Herstellerproduktfamilie - - TypClass - - - - - 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie - 2nd level of a 3 level manufacturer specific product hierarchy - - - - - - - SerialNumber - 0173-1#02-AAM556#002 - - - - - - - - Serial number - Seriennummer - - InstanceId - - - - - eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist - unique combination of numbers and letters used to identify the device once it has been manufactured - - - - - - - BatchNumber - 0173-1#02-AAQ196#001 - - - - - - - - Batch number - Chargen-Nummer - - ChargeId - - - - - Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge - Number assigned by the manufacturer of a material to identify the manufacturer's batch - - - - - - - ProductCountryOfOrigin - 0173-1#02-AAO841#001 - - - - - - - - Produkt Ursprungsland - Product country of origin - - CountryOfOrigin - - - - - Land in dem das Produkt hergestellt wurde (Hersteller Land) - Country in which the product is manufactured (manufacturer country) - - - - - - - YearOfConstruction - 0173-1#02-AAP906#001 - - - - - - - - Year of construction - Baujahr - - YearOfConstruction - - - - - Jahreszahl als Datumsangabe für die Fertigstellung des Objektes - Year as completion date of object - - - - - - - ProductMarking - https://www.hsu-hh.de/aut/aas/productmarking - - - - - - - - Produktkennzeichnung - Product Marking - - ProductMarking - - - - - Sammlungsdatei für Produktkennzeichnung - Collection file for product marking - - - - - - - CEQualificationPresent - 0173-1#02-BAF053#008 - - - - - - - - CE-Kennzeichnung vorhanden - CE- qualification present - - CEMarkingPresent - - - BOOLEAN - - whether CE- qualification is present - Angabe, ob CE-Kennzeichnung vorhanden ist - - - - - - - File - 0173-1#02-AAD005#008 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Enthaltene Doku. Datei - Embedded Doc. file - - File - - - - - Verweis/ BLOB auf enthaltene Dokumentations-Datei. - Reference/ BLOB to embedded documentation file. - - - - - - - DocumentationItem - 0173-1#02-AAD001#001 - - - - - - - - Dokumentationsgruppe - Documentation item - - DocumentationItem - - - - - Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. - Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. - - - - - - - DocumentType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - - - - - - Dokumententyp - Document Type - - DocumentType - - - - - Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) - TBD - - - - - - - VDI2770_DomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - - - - - - Domain-Nummer - DomainId - - DomainId - - - - - Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. - TBD - - - - - - - VDI2770_IdType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - - - - - - Nummerntyp - IdType - - IdType - - - - - Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. - TBD - - - - - - - DocumentId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - - - - - - DocumentId - Dokumenten-Nummer - - DocumentId - - - - - Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. - TBD - - - - - - - DocumentDomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - - - - - - DocumentDomainId - DocumentDomainId - - DocumentDomainId - - - - - Kennung oder Kennzeichen einer Domäne - TBD - - - - - - - VDI2770_Role - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - - - - - - Rolle - Role - - Role - - - - - Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) - TBD - - - - - - - VDI2770_OrganisationId - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - - - - - - Organisation ID - Organisation ID - - OrganisationId - - - - - eindeutige ID für die Organisation - TBD - - - - - - - VDI2770_OrganisationName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - - - - - - OrganisationName - OrganisationName - - OrganisationName - - - - - gebräuchliche Bezeichnung für die Organisation - TBD - - - - - - - VDI2770_OrganisationOfficialName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - - - - - - Offizieller Name der Organisation - Organisation Official Name - - OrganisationOfficialName - - - - - offizieller Name der Organisation - TBD - - - - - - - VDI2770_Description - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - - - - - - Beschreibung - Description - - Description - - - - - Beschreibung für die nächste übergeordnete Collection - TBD - - - - - - - DocumentPartId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - - - - - - Dokumenten-Teilnummer - DocumentPartId - - DocumentPartId - - - - - Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. - TBD - - - - - - - DocumentClassification_ClassId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - - - - Dokumentkategorie - Document category - - DocCategory - - - - - Dokumentkategorie nach VDI 2770:2018/10 - Document category after VDI 2770:2018/10 - - - - - - - VDI2770_ClassName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - - - - - - Klassenname - Class Name - - ClassName - - - - - Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. - TBD - - - - - - - VDI2770_ClassificationSystem - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - - - - - - Klassifizierungssystem - classification system - - ClassificationSystem - - - - - Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. - TBD - - - - - - - DocumentVersionId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - - - - - - Dokumenten-Versionsnummer - DocumentVersionId - - DocumentVersionId - - - - - Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. - TBD - - - - - - - DocumentVersion_LanguageCode - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - - - - - - Sprachenschlüssel - LanguageCode - - LanguageCode - - - - - Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 - TBD - - - - - - - VDI2770_Title - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - - - - - - Titel - Title - - VDI2770_Title - - - - - sprachabhängiger Titel des Dokuments - TBD - - - - - - - VDI2770_Summary - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - - - - - - Zusammenfassung - Summary - - Summary - - - - - sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts - TBD - - - - - - - VDI2770_Keywords - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - - - - - - Schlagwörter - Keywords - - Keywords - - - - - sprachabhängige, durch Komma getrennte Liste von Schlagwörtern - TBD - - - - - - - VDI2770_StatusValue - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - - - - - - Statuswert - StatusValue - - StatusValue - - - - - Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) - TBD - - - - - - - VDI2770_SetDate - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - - - - - - Erstellungsdatum - Set Date - - SetDate - - - - - Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). - TBD - - - - - - - VDI2770_Purpose - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - - - - - - Zweck - Purpose - - Purpose - - - - - Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. - TBD - - - - - - - VDI2770_BasedOnProcedure - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - - - - - - Prozedur - Procedure - - BasedOnProcedure - - - - - textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt - TBD - - - - - - - VDI2770_Comments - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - - - - - - Kommentar - Comments - - Comments - - - - - textuelle Bemerkungen und Anmerkungen zum Status - TBD - - - - - - - VDI2770_ReferencedObject_Type - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - - - - - - Typ - Type - - Type - - - - - Für Type des Objekts muss immer Product angegeben werden. - TBD - - - - - - - VDI2770_ReferencedObject_RefType - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - - - - - - RefType - RefType - - RefType - - - - - Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) - TBD - - - - - - - VDI2770_ReferencedObject_ObjectId - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - - - - - - ObjectId - ObjectId - - ObjectId - - - - - Angabe der Identifikationsnummer zum Objekt - TBD - - - - - - - VDI2770_FileId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - - - - - - ID der Datei - File ID - - FileId - - - - - eindeutige ID für die Datei - TBD - - - - - - - VDI2770_FileName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - - - - - - Dateiname - File name - - FileName - - - - - Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. - TBD - - - - - - - VDI2770_FileFormat - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - - - - - - Datei Format - File format - - FileFormat - - - - - Angabe eines Media Typs gemäß der Liste der IANA - TBD - - - - - - - OrganisationContactInfo - https://www.hsu-hh.de/aut/aas/contactinfo - - - - - - - - Contact Info - Kontakt Info - - OrganisationContactInfo - - - - - Sammlung für die allgemeinen Kontaktdaten - Collection for general contact data - - - - - - - NameOfSupplier - 0173-1#02-AAO735#003 - - - - - - - - - - - - name of supplier - Lieferantenname - - name of supplier - - - - - Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt - name of supplier which provides the customer with a product or a service - - - - - - - ContactInfo_Role - https://www.hsu-hh.de/aut/aas/role - - - - - - - - Rolle - Role - - Role - - - - - Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt - Information to specify the role which the organisation of ContactInfo plays - - - - - - - Email - https://www.hsu-hh.de/aut/aas/email - - - - - - - - Emailadresse - Email address - - Email - - - - - Emailadresse - Email address - - - - - - - URL - 0173-1#02-AAO694#001 - - - - - - - - Internetadresse - Internet address - - URL - - - - - stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html - Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html - - - - - - - PhoneNumber - 0173-1#02-AAO136#002 - - - - - - - - Telefonnummer - telephone number - - Phone - - - - - vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist - complete telephone number to be called to reach a business partner - - - - - - - Fax - https://www.hsu-hh.de/aut/aas/fax - - - - - - - - Fax - Fax - - Fax - - - - - Faxnummer - Fax number - - - - - - - 0173-1#02-AAO136#002 - - - - - GLNOfManufacturer - 0173-1#02-AAY812#001 - - - - - - - - GLN of manufacturer - GLN des Herstellers - - GLN of manufacturer - - - - - international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort - internationally unique identification number for the manufacturer of the device or the product and for the physical location - - - - - - - SupplierOfTheIdentifier - 0173-1#02-AAP796#004 - - - - - - - - Supplier of the identifier - Anbieter der Identifikationsnummer für Hersteller - - Supplier of the identifier - - - STRING_TRANSLATABLE - - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - - - - - - - MAN_PROD_NUM - - product article number of manufacturer - - 0173-1#02-AAO676#003 - - - - - - - - product article number of manufacturer - Herstellerartikelnummer - - MAN_PROD_NUM - - - STRING_TRANSLATABLE - - eindeutiger Bestellschlüssel des Herstellers - unique product identifier of the manufacturer - - - - - - - ManufacturerProductDescription - 0173-1#02-AAU734#001 - - - - - - - - Manufacturer product description - Herstellerproduktbeschreibung - - Manufacturer product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - GLNOfSupplier - 0173-1#02-AAY813#001 - - - - - - - - GLN of supplier - GLN des Lieferanten - - GLN of supplier - - - - - international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort - internationally unique identification number for the supplier of the device or the product and for the physical location - - - - - - - SupplierIdProvider - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - - - - - - SupplierIdProvider - Anbieter der Identifikationsnummer - - SupplierIdProvider - - - STRING_TRANSLATABLE - - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - - - - - - - SUP_PROD_NUM - 0173-1#02-AAO736#004 - - - - - - - - product article number of supplier - Lieferantenartikelnummer - - product article number of supplier - - - - - eindeutiger Bestellschlüssel des Lieferanten - unique product order identifier of the supplier - - - - - - - SupplierProductDesignation - 0173-1#02-AAM551#002 - - - - - - - - Supplier product designation - Lieferantenproduktbezeichnung - - SupplierTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - SupplierProductDescription - 0173-1#02-AAU730#001 - - - - - - - - Supplier product description - Lieferantenproduktbeschreibung - - Supplier product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - ClassificationSystem - 0173-1#02-AAO715#002 - - - - - - - - classification system - Klassifizierungssystem - - ClassificationSystem - - - - - Klassifizierungssystem - Classification System - - - - - - - SecondaryKeyTyp - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - - - - - - SecondaryKeyTyp - Typnummer des IT Systems - - SecondaryKeyTyp - - - - - Führende technische ID im IT System des Typs - SecondaryKeyTyp - - - - - - - TypThumbnail - www.company.com/ids/cd/6044_0150_1191_5121 - - - - - - - - TypThumbnail - Vorschaubild - - TypThumbnail - - - - - Darstellung des Produkttyps in kleinem Format - Small picture of the product type - - - - - - - AssetId - https://www.hsu-hh.de/aut/aas/assetid - - - - - - - - AssetId - Asset ID - - AssetId - - - - - Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. - Global unique ID of an asset, which can be read by both human and machine. - - - - - - - SecondaryKeyInstance - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - - - - - - SecondaryKeyInstance - Instanznummer des IT Systems - - SecondaryKeyInstance - - - - - Führende technische ID im IT System der Instanz - SecondaryKeyInstance - - - - - - - DateOfManufacture - 0173-1#02-AAR972#002 - - - - - - - - Date of manufacture - Herstellungsdatum - - Date of manufacture - - - DATE - - Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist - Date from which the production and / or development process is completed or from which a service is provided completely - - - - - - - DeviceRevision - https://www.hsu-hh.de/aut/aas/devicerevision - - - - - - - - DeviceRevision - DeviceRevision - - DeviceRevision - - - - - DeviceRevision - DeviceRevision - - - - - - - SoftwareRevision - https://www.hsu-hh.de/aut/aas/softwarerevision - - - - - - - - SoftwareRevision - SoftwareRevision - - SoftwareRevision - - - - - SoftwareRevision - SoftwareRevision - - - - - - - HardwareRevision - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - - - - - - HardwareRevision - HardwareRevision - - HardwareRevision - - - - - HardwareRevision - HardwareRevision - - - - - - - QrCode - https://www.hsu-hh.de/aut/aas/qrcode - - - - - - - - QrCode - QrCode - - QrCode - - - - - In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. - QrCode - - - - - - - CompanyLogo - https://www.hsu-hh.de/aut/aas/companylogo - - - - - - - - Firmenlogo - CompanyLogo - - CompanyLogo - - - - - Firmenlogo - CompanyLogo - - - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/10_SchneiderElectric.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/10_SchneiderElectric.aasx.xml deleted file mode 100644 index 90a9a45d2..000000000 --- a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/10_SchneiderElectric.aasx.xml +++ /dev/null @@ -1,4570 +0,0 @@ - - - - - SE_Tesys_Island_Starter - www.company.com/ids/aas/2520_6010_8091_1277 - - - www.company.com/ids/asset/8220_6010_8091_3593 - - - - - - www.company.com/ids/sm/4343_5072_7091_3242 - - - - - www.company.com/ids/sm/2543_5072_7091_2660 - - - - - www.company.com/ids/sm/6053_5072_7091_5102 - - - - - www.company.com/ids/sm/6563_5072_7091_4267 - - - - - - - - - SE_Tesys_Island_Starter - www.company.com/ids/asset/8220_6010_8091_3593 - Instance - - - - - Nameplate - www.company.com/ids/sm/4343_5072_7091_3242 - - - https://www.hsu-hh.de/aut/aas/nameplate - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Schneider Electric - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - Motor Starter, TeSys island - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - FR - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Rue Joseph Monier - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 92506 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Rueil Malmaison - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Hauts de Seine - - - - false - false - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 2F184031001 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - ProductCountryOfOrigin - PARAMETER - - - 0173-1#02-AAO841#001 - - - Instance - - string - FR - - - - - YearOfConstruction - PARAMETER - - - 0173-1#02-AAP906#001 - - - Instance - - string - 2019 - - - - - Marking_CE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/marking_ce.png - - - - false - false - - - - - Marking_UL - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/UL.png - - - - false - false - - - - - Marking_WEEE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/Marking_WEEE.png - - - - false - false - - - - - - Document - www.company.com/ids/sm/2543_5072_7091_2660 - - - https://www.hsu-hh.de/aut/aas/document - - - Instance - - - - - DeclarationCEMarking - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Schneider Electric - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Schneider Electric SAS - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - SC19062505 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - EU - Declaration of conformity - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - EU - Declaration of conformity - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - string - Motor Starters for TeSys Island offer - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - string - TPRSx009, TPRSx025, TPRSx038, TPRSx065, TPRSx080, *where x can be T or S - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - CE_TPRSx_SC19062505.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/CE_TPRSx_SC19062505.pdf - - - - false - false - - - - - DeclarationULMarking - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Schneider Electric - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Schneider Electric Automation SAS - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - NRAQ.E3220218 - PROGRAMMABLE CONTROLLERS - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - string - 2019 - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - PROGRAMMABLE_CONTROLLERS___UL_Product_iQ.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/PROGRAMMABLE_CONTROLLERS___UL_Product_iQ.pdf - - - - false - false - - - - - Instruction Bulletin - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Technical Documentation - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Schneider Electric - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Schneider Electric SAS - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 8536IB1901EN - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - System Guide - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Instruction bulletin - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - string - This instruction bulletin introduces and describes the main functions of TeSys island. - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - string - TeSys Island - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - instal_EN.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/Instal_EN.pdf - - - - false - false - - - - - - Service - www.company.com/ids/sm/6053_5072_7091_5102 - - - https://www.hsu-hh.de/aut/aas/service - - - Instance - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Schneider Elcetric - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Schneider Platz - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 97816 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Marktheidenfeld - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.schneider-electric.com/en/work/support/ - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - - - - - false - false - - - - - - Identification - www.company.com/ids/sm/6563_5072_7091_4267 - - - https://www.hsu-hh.de/aut/aas/identification - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Schneider Electric - - - - - GLNOfManufacturer - PARAMETER - - - 0173-1#02-AAY812#001 - - - Instance - - string - TPRST009 - - - - - SupplierOfTheIdentifier - - - 0173-1#02-AAP796#004 - - - Instance - - - - - - - - MAN_PROD_NUM - - - 0173-1#02-AAO676#003 - - - Instance - - - - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - Motor Starter, TeSys island - - - - - ManufacturerProductDescription - PARAMETER - - - 0173-1#02-AAU734#001 - - - Instance - - langString - Direct starter connected to an automation controller through a bus coupler, Operational only when connected to a bus coupler - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Schneider Electric - - - - - GLNOfSupplier - PARAMETER - - - 0173-1#02-AAY813#001 - - - Instance - - string - TPRST009 - - - - - SupplierIdProvider - PARAMETER - - - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - Instance - - - - - - - - SUP_PROD_NUM - PARAMETER - - - 0173-1#02-AAO736#004 - - - Instance - - - - - - - - SupplierProductDesignation - - - 0173-1#02-AAM551#002 - - - Instance - - string - Motor Starter, TeSys island - - - - - SupplierProductDescription - PARAMETER - - - 0173-1#02-AAU730#001 - - - Instance - - langString - Direct starter connected to an automation controller through a bus coupler, Operational only when connected to a bus coupler - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - - - - - - ClassificationSystem - PARAMETER - - - 0173-1#02-AAO715#002 - - - Instance - - string - eclass - - - - - SecondaryKeyTyp - - - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - Instance - - - - - - - - TypThumbnail - PARAMETER - - - www.company.com/ids/cd/4401_1272_7091_3437 - - - Instance - - image/jpeg - /TPRST009.PNG - - - - - AssetId - PARAMETER - - - https://www.hsu-hh.de/aut/aas/assetid - - - Instance - - string - www.company.com/ids/asset/8220_6010_8091_3593 - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 2F184031001 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - SecondaryKeyInstance - PARAMETER - - - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - Instance - - - - - - - - DateOfManufacture - PARAMETER - - - 0173-1#02-AAR972#002 - - - Instance - - string - 2019 - - - - - DeviceRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/devicerevision - - - Instance - - - - - - - - SoftwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/softwarerevision - - - Instance - - - - - - - - HardwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - Instance - - - - - - - - QrCode - PARAMETER - - - https://www.hsu-hh.de/aut/aas/qrcode - - - Instance - - image/jpeg - /aasx/Identification/QRCode_Tesys_Island_Starter.jpg - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Schneider Electric - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - FR - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Rue Joseph Monier - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 92506 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Rueil Malmaison - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Hauts de Seine - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.schneider-electric.com/en/ - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - - - - - false - false - - - - - CompanyLogo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/companylogo - - - Instance - - image/png - /aasx/Identification/logo_SE.png - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.schneider-electric.com/en/product-range-presentation/65746-tesys-island/?parent-category-id=3000&parent-subcategory-id=3080&filter=business-4-low-voltage-products-and-systems#tabs-top - - - - - - - - ManufacturerName - 0173-1#02-AAO677#002 - - - - - - - - Herstellername - Manufacturer Name - - Manufacturer Name - - - - - Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist - 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 - - - - - - - ManufacturerProductDesignation - 0173-1#02-AAW338#001 - - - - - - - - Manufacturer product designation - Herstellerproduktbezeichnung - - - ManufacturerTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - PhysicalAddress - https://www.hsu-hh.de/aut/aas/physicaladdress - - - - - - - - PhysicalAddress - Physische Adresse - - PhysicalAddress - - - - - Sammlung für reale physische Adresse - Collection for real physical address - - - - - - - CountryCode - 0173-1#02-AAO730#001 - - - - - - - - - - - - Landeskennung - Country code - - Country code - - - - - Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes - agreed upon symbol for unambiguous identification of a country - - - - - - - Street - 0173-1#02-AAO128#001 - - - - - - - - Strasse - Street - - Street - - - - - Name der Strasse und Hausnummer - Street name and house number - - - - - - - Zip - 0173-1#02-AAO129#002 - - - - - - - - Zip - Postleitzahl - - PostalCode - - - - - ZIP code of address - Postleitzahl der Anschrift - - - - - - - CityTown - 0173-1#02-AAO132#001 - - - - - - - - Ort - City/town - - City/town - - - - - Town or city of the company - Ortsangabe - - - - - - - StateCounty - 0173-1#02-AAO133#002 - - - - - - - - state/county - Bundesland - - StateCounty - - - - - Bundesland - state/county - - - - - - - ManufacturerProductFamily - 0173-1#02-AAU731#001 - - - - - - - - Manufacturer product family - Herstellerproduktfamilie - - TypClass - - - - - 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie - 2nd level of a 3 level manufacturer specific product hierarchy - - - - - - - SerialNumber - 0173-1#02-AAM556#002 - - - - - - - - Serial number - Seriennummer - - InstanceId - - - - - eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist - unique combination of numbers and letters used to identify the device once it has been manufactured - - - - - - - BatchNumber - 0173-1#02-AAQ196#001 - - - - - - - - Batch number - Chargen-Nummer - - ChargeId - - - - - Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge - Number assigned by the manufacturer of a material to identify the manufacturer's batch - - - - - - - ProductCountryOfOrigin - 0173-1#02-AAO841#001 - - - - - - - - Produkt Ursprungsland - Product country of origin - - CountryOfOrigin - - - - - Land in dem das Produkt hergestellt wurde (Hersteller Land) - Country in which the product is manufactured (manufacturer country) - - - - - - - YearOfConstruction - 0173-1#02-AAP906#001 - - - - - - - - Year of construction - Baujahr - - YearOfConstruction - - - - - Jahreszahl als Datumsangabe für die Fertigstellung des Objektes - Year as completion date of object - - - - - - - ProductMarking - https://www.hsu-hh.de/aut/aas/productmarking - - - - - - - - Produktkennzeichnung - Product Marking - - ProductMarking - - - - - Sammlungsdatei für Produktkennzeichnung - Collection file for product marking - - - - - - - CEQualificationPresent - 0173-1#02-BAF053#008 - - - - - - - - CE-Kennzeichnung vorhanden - CE- qualification present - - CEMarkingPresent - - - BOOLEAN - - whether CE- qualification is present - Angabe, ob CE-Kennzeichnung vorhanden ist - - - - - - - File - 0173-1#02-AAD005#008 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Enthaltene Doku. Datei - Embedded Doc. file - - File - - - - - Verweis/ BLOB auf enthaltene Dokumentations-Datei. - Reference/ BLOB to embedded documentation file. - - - - - - - DocumentationItem - 0173-1#02-AAD001#001 - - - - - - - - Dokumentationsgruppe - Documentation item - - DocumentationItem - - - - - Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. - Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. - - - - - - - DocumentType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - - - - - - Dokumententyp - Document Type - - DocumentType - - - - - Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) - TBD - - - - - - - VDI2770_DomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - - - - - - Domain-Nummer - DomainId - - DomainId - - - - - Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. - TBD - - - - - - - VDI2770_IdType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - - - - - - Nummerntyp - IdType - - IdType - - - - - Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. - TBD - - - - - - - DocumentId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - - - - - - DocumentId - Dokumenten-Nummer - - DocumentId - - - - - Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. - TBD - - - - - - - DocumentDomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - - - - - - DocumentDomainId - DocumentDomainId - - DocumentDomainId - - - - - Kennung oder Kennzeichen einer Domäne - TBD - - - - - - - VDI2770_Role - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - - - - - - Rolle - Role - - Role - - - - - Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) - TBD - - - - - - - VDI2770_OrganisationId - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - - - - - - Organisation ID - Organisation ID - - OrganisationId - - - - - eindeutige ID für die Organisation - TBD - - - - - - - VDI2770_OrganisationName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - - - - - - OrganisationName - OrganisationName - - OrganisationName - - - - - gebräuchliche Bezeichnung für die Organisation - TBD - - - - - - - VDI2770_OrganisationOfficialName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - - - - - - Offizieller Name der Organisation - Organisation Official Name - - OrganisationOfficialName - - - - - offizieller Name der Organisation - TBD - - - - - - - VDI2770_Description - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - - - - - - Beschreibung - Description - - Description - - - - - Beschreibung für die nächste übergeordnete Collection - TBD - - - - - - - DocumentPartId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - - - - - - Dokumenten-Teilnummer - DocumentPartId - - DocumentPartId - - - - - Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. - TBD - - - - - - - DocumentClassification_ClassId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - - - - Dokumentkategorie - Document category - - DocCategory - - - - - Dokumentkategorie nach VDI 2770:2018/10 - Document category after VDI 2770:2018/10 - - - - - - - VDI2770_ClassName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - - - - - - Klassenname - Class Name - - ClassName - - - - - Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. - TBD - - - - - - - VDI2770_ClassificationSystem - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - - - - - - Klassifizierungssystem - classification system - - ClassificationSystem - - - - - Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. - TBD - - - - - - - DocumentVersionId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - - - - - - Dokumenten-Versionsnummer - DocumentVersionId - - DocumentVersionId - - - - - Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. - TBD - - - - - - - DocumentVersion_LanguageCode - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - - - - - - Sprachenschlüssel - LanguageCode - - LanguageCode - - - - - Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 - TBD - - - - - - - VDI2770_Title - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - - - - - - Titel - Title - - VDI2770_Title - - - - - sprachabhängiger Titel des Dokuments - TBD - - - - - - - VDI2770_Summary - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - - - - - - Zusammenfassung - Summary - - Summary - - - - - sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts - TBD - - - - - - - VDI2770_Keywords - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - - - - - - Schlagwörter - Keywords - - Keywords - - - - - sprachabhängige, durch Komma getrennte Liste von Schlagwörtern - TBD - - - - - - - VDI2770_StatusValue - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - - - - - - Statuswert - StatusValue - - StatusValue - - - - - Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) - TBD - - - - - - - VDI2770_SetDate - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - - - - - - Erstellungsdatum - Set Date - - SetDate - - - - - Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). - TBD - - - - - - - VDI2770_Purpose - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - - - - - - Zweck - Purpose - - Purpose - - - - - Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. - TBD - - - - - - - VDI2770_BasedOnProcedure - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - - - - - - Prozedur - Procedure - - BasedOnProcedure - - - - - textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt - TBD - - - - - - - VDI2770_Comments - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - - - - - - Kommentar - Comments - - Comments - - - - - textuelle Bemerkungen und Anmerkungen zum Status - TBD - - - - - - - VDI2770_ReferencedObject_Type - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - - - - - - Typ - Type - - Type - - - - - Für Type des Objekts muss immer Product angegeben werden. - TBD - - - - - - - VDI2770_ReferencedObject_RefType - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - - - - - - RefType - RefType - - RefType - - - - - Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) - TBD - - - - - - - VDI2770_ReferencedObject_ObjectId - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - - - - - - ObjectId - ObjectId - - ObjectId - - - - - Angabe der Identifikationsnummer zum Objekt - TBD - - - - - - - VDI2770_FileId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - - - - - - ID der Datei - File ID - - FileId - - - - - eindeutige ID für die Datei - TBD - - - - - - - VDI2770_FileName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - - - - - - Dateiname - File name - - FileName - - - - - Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. - TBD - - - - - - - VDI2770_FileFormat - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - - - - - - Datei Format - File format - - FileFormat - - - - - Angabe eines Media Typs gemäß der Liste der IANA - TBD - - - - - - - OrganisationContactInfo - https://www.hsu-hh.de/aut/aas/contactinfo - - - - - - - - Contact Info - Kontakt Info - - OrganisationContactInfo - - - - - Sammlung für die allgemeinen Kontaktdaten - Collection for general contact data - - - - - - - NameOfSupplier - 0173-1#02-AAO735#003 - - - - - - - - - - - - name of supplier - Lieferantenname - - name of supplier - - - - - Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt - name of supplier which provides the customer with a product or a service - - - - - - - ContactInfo_Role - https://www.hsu-hh.de/aut/aas/role - - - - - - - - Rolle - Role - - Role - - - - - Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt - Information to specify the role which the organisation of ContactInfo plays - - - - - - - Email - https://www.hsu-hh.de/aut/aas/email - - - - - - - - Emailadresse - Email address - - Email - - - - - Emailadresse - Email address - - - - - - - URL - 0173-1#02-AAO694#001 - - - - - - - - Internetadresse - Internet address - - URL - - - - - stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html - Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html - - - - - - - PhoneNumber - 0173-1#02-AAO136#002 - - - - - - - - Telefonnummer - telephone number - - Phone - - - - - vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist - complete telephone number to be called to reach a business partner - - - - - - - Fax - https://www.hsu-hh.de/aut/aas/fax - - - - - - - - Fax - Fax - - Fax - - - - - Faxnummer - Fax number - - - - - - - 0173-1#02-AAO136#002 - - - - - GLNOfManufacturer - 0173-1#02-AAY812#001 - - - - - - - - GLN of manufacturer - GLN des Herstellers - - GLN of manufacturer - - - - - international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort - internationally unique identification number for the manufacturer of the device or the product and for the physical location - - - - - - - SupplierOfTheIdentifier - 0173-1#02-AAP796#004 - - - - - - - - Supplier of the identifier - Anbieter der Identifikationsnummer für Hersteller - - Supplier of the identifier - - - STRING_TRANSLATABLE - - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - - - - - - - MAN_PROD_NUM - - product article number of manufacturer - - 0173-1#02-AAO676#003 - - - - - - - - product article number of manufacturer - Herstellerartikelnummer - - MAN_PROD_NUM - - - STRING_TRANSLATABLE - - eindeutiger Bestellschlüssel des Herstellers - unique product identifier of the manufacturer - - - - - - - ManufacturerProductDescription - 0173-1#02-AAU734#001 - - - - - - - - Manufacturer product description - Herstellerproduktbeschreibung - - Manufacturer product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - GLNOfSupplier - 0173-1#02-AAY813#001 - - - - - - - - GLN of supplier - GLN des Lieferanten - - GLN of supplier - - - - - international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort - internationally unique identification number for the supplier of the device or the product and for the physical location - - - - - - - SupplierIdProvider - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - - - - - - SupplierIdProvider - Anbieter der Identifikationsnummer - - SupplierIdProvider - - - STRING_TRANSLATABLE - - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - - - - - - - SUP_PROD_NUM - 0173-1#02-AAO736#004 - - - - - - - - product article number of supplier - Lieferantenartikelnummer - - product article number of supplier - - - - - eindeutiger Bestellschlüssel des Lieferanten - unique product order identifier of the supplier - - - - - - - SupplierProductDesignation - 0173-1#02-AAM551#002 - - - - - - - - Supplier product designation - Lieferantenproduktbezeichnung - - SupplierTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - SupplierProductDescription - 0173-1#02-AAU730#001 - - - - - - - - Supplier product description - Lieferantenproduktbeschreibung - - Supplier product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - ClassificationSystem - 0173-1#02-AAO715#002 - - - - - - - - classification system - Klassifizierungssystem - - ClassificationSystem - - - - - Klassifizierungssystem - Classification System - - - - - - - SecondaryKeyTyp - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - - - - - - SecondaryKeyTyp - Typnummer des IT Systems - - SecondaryKeyTyp - - - - - Führende technische ID im IT System des Typs - SecondaryKeyTyp - - - - - - - TypThumbnail - www.company.com/ids/cd/6044_0150_1191_5121 - - - - - - - - TypThumbnail - Vorschaubild - - TypThumbnail - - - - - Darstellung des Produkttyps in kleinem Format - Small picture of the product type - - - - - - - AssetId - https://www.hsu-hh.de/aut/aas/assetid - - - - - - - - AssetId - Asset ID - - AssetId - - - - - Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. - Global unique ID of an asset, which can be read by both human and machine. - - - - - - - SecondaryKeyInstance - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - - - - - - SecondaryKeyInstance - Instanznummer des IT Systems - - SecondaryKeyInstance - - - - - Führende technische ID im IT System der Instanz - SecondaryKeyInstance - - - - - - - DateOfManufacture - 0173-1#02-AAR972#002 - - - - - - - - Date of manufacture - Herstellungsdatum - - Date of manufacture - - - DATE - - Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist - Date from which the production and / or development process is completed or from which a service is provided completely - - - - - - - DeviceRevision - https://www.hsu-hh.de/aut/aas/devicerevision - - - - - - - - DeviceRevision - DeviceRevision - - DeviceRevision - - - - - DeviceRevision - DeviceRevision - - - - - - - SoftwareRevision - https://www.hsu-hh.de/aut/aas/softwarerevision - - - - - - - - SoftwareRevision - SoftwareRevision - - SoftwareRevision - - - - - SoftwareRevision - SoftwareRevision - - - - - - - HardwareRevision - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - - - - - - HardwareRevision - HardwareRevision - - HardwareRevision - - - - - HardwareRevision - HardwareRevision - - - - - - - QrCode - https://www.hsu-hh.de/aut/aas/qrcode - - - - - - - - QrCode - QrCode - - QrCode - - - - - In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. - QrCode - - - - - - - CompanyLogo - https://www.hsu-hh.de/aut/aas/companylogo - - - - - - - - Firmenlogo - CompanyLogo - - CompanyLogo - - - - - Firmenlogo - CompanyLogo - - - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/11_SchneiderElectric.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/11_SchneiderElectric.aasx.xml deleted file mode 100644 index 8912f73c0..000000000 --- a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/11_SchneiderElectric.aasx.xml +++ /dev/null @@ -1,4570 +0,0 @@ - - - - - SE_Modicon_M262 - www.company.com/ids/aas/2520_6010_8091_1277 - - - www.company.com/ids/asset/8220_6010_8091_3593 - - - - - - www.company.com/ids/sm/4343_5072_7091_3242 - - - - - www.company.com/ids/sm/2543_5072_7091_2660 - - - - - www.company.com/ids/sm/6053_5072_7091_5102 - - - - - www.company.com/ids/sm/6563_5072_7091_4267 - - - - - - - - - SE_Modicon_M262 - www.company.com/ids/asset/8220_6010_8091_3593 - Instance - - - - - Nameplate - www.company.com/ids/sm/4343_5072_7091_3242 - - - https://www.hsu-hh.de/aut/aas/nameplate - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Schneider Electric - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - IIOT ready Logic and Motion Controller - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - FR - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Rue Joseph Monier - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 92506 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Rueil Malmaison - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Hauts de Seine - - - - false - false - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - string - Logic/Motion controller - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 8B192700462 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - ProductCountryOfOrigin - PARAMETER - - - 0173-1#02-AAO841#001 - - - Instance - - string - FR - - - - - YearOfConstruction - PARAMETER - - - 0173-1#02-AAP906#001 - - - Instance - - string - 2019 - - - - - Marking_CE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/marking_ce.png - - - - false - false - - - - - Marking_UL - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/UL.png - - - - false - false - - - - - Marking_WEEE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/Marking_WEEE.png - - - - false - false - - - - - - Document - www.company.com/ids/sm/2543_5072_7091_2660 - - - https://www.hsu-hh.de/aut/aas/document - - - Instance - - - - - DeclarationCEMarking - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Schneider Electric SE - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Schneider Electric Automation GmbH - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02.00 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - EU - Declaration of conformity - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - MOD2019002.00_DeclarationOfConformity_TM262_TMS_TM3XHSC_signed.pdf - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - MOD2019002.00_DeclarationOfConformity_TM262_TMS_TM3XHSC_signed.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/MOD2019002.00_DeclarationOfConformity_TM262_TMS_TM3XHSC_signed.pdf - - - - false - false - - - - - DeclarationULMarking - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Schneider Electric SE - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Schneider Electric Automation GmbH - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Notice of Completion and autorization to apply the UL mark - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - M262_20190513_Notice of Authorization.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/M262_20190513_Notice_of_Authorization.pdf - - - - false - false - - - - - InstructionSheet - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - QGH5583101 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Schneider Electric SE - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Schneider Electric Automation GmbH - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Instruction Sheet - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - IS_M262.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/IS_M262.pdf - - - - false - false - - - - - - Service - www.company.com/ids/sm/6053_5072_7091_5102 - - - https://www.hsu-hh.de/aut/aas/service - - - Instance - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Schneider Elcetric - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Schneider Platz - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 97816 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Marktheidenfeld - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.schneider-electric.com/en/work/support/ - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - - - - - false - false - - - - - - Identification - www.company.com/ids/sm/6563_5072_7091_4267 - - - https://www.hsu-hh.de/aut/aas/identification - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Schneider Electric - - - - - GLNOfManufacturer - PARAMETER - - - 0173-1#02-AAY812#001 - - - Instance - - string - TM262L20MESE8T - - - - - SupplierOfTheIdentifier - - - 0173-1#02-AAP796#004 - - - Instance - - - - - - - - MAN_PROD_NUM - - - 0173-1#02-AAO676#003 - - - Instance - - - - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - IIOT Ready Logic and Motion Controller - - - - - ManufacturerProductDescription - PARAMETER - - - 0173-1#02-AAU734#001 - - - Instance - - langString - Logic/Motion controller Modicon M262 IIoT-ready logic & motion controller for performance machines. Modicon M262 controllers embed Industrial Internet of Things (IIoT) protocols and encryption to provide direct cloud connectivity & digital services. - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Schneider Electric - - - - - GLNOfSupplier - PARAMETER - - - 0173-1#02-AAY813#001 - - - Instance - - string - TM262L20MESE8T - - - - - SupplierIdProvider - PARAMETER - - - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - Instance - - - - - - - - SUP_PROD_NUM - PARAMETER - - - 0173-1#02-AAO736#004 - - - Instance - - - - - - - - SupplierProductDesignation - - - 0173-1#02-AAM551#002 - - - Instance - - string - IIOT Ready Logic and Motion Controller - - - - - SupplierProductDescription - PARAMETER - - - 0173-1#02-AAU730#001 - - - Instance - - langString - Logic/Motion controller Modicon M262 IIoT-ready logic & motion controller for performance machines. Modicon M262 controllers embed Industrial Internet of Things (IIoT) protocols and encryption to provide direct cloud connectivity & digital services. - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - string - Logic/Motion controller - - - - - ClassificationSystem - PARAMETER - - - 0173-1#02-AAO715#002 - - - Instance - - string - - - - - - SecondaryKeyTyp - - - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - Instance - - - - - - - - TypThumbnail - PARAMETER - - - www.company.com/ids/cd/4401_1272_7091_3437 - - - Instance - - image/jpeg - /aasx/Identification/M262.PNG - - - - - AssetId - PARAMETER - - - https://www.hsu-hh.de/aut/aas/assetid - - - Instance - - string - www.company.com/ids/asset/8220_6010_8091_3593 - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 8B192700462 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - SecondaryKeyInstance - PARAMETER - - - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - Instance - - - - - - - - DateOfManufacture - PARAMETER - - - 0173-1#02-AAR972#002 - - - Instance - - - - - - - - DeviceRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/devicerevision - - - Instance - - - - - - - - SoftwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/softwarerevision - - - Instance - - - - - - - - HardwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - Instance - - - - - - - - QrCode - PARAMETER - - - https://www.hsu-hh.de/aut/aas/qrcode - - - Instance - - image/jpeg - /aasx/Identification/QRCode_M262.JPG - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Schneider Electric - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - FR - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Rue Joseph Monier - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 92506 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Rueil Malmaison - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Hauts de Seine - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.schneider-electric.com/en/ - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - - - - - false - false - - - - - CompanyLogo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/companylogo - - - Instance - - image/png - /aasx/Identification/logo_SE.png - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.schneider-electric.com/en/product-range-presentation/65771-logic-motion-controller-modicon-m262/?filter=business-1-industrial-automation-and-control#tabs-top - - - - - - - - ManufacturerName - 0173-1#02-AAO677#002 - - - - - - - - Herstellername - Manufacturer Name - - Manufacturer Name - - - - - Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist - 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 - - - - - - - ManufacturerProductDesignation - 0173-1#02-AAW338#001 - - - - - - - - Manufacturer product designation - Herstellerproduktbezeichnung - - - ManufacturerTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - PhysicalAddress - https://www.hsu-hh.de/aut/aas/physicaladdress - - - - - - - - PhysicalAddress - Physische Adresse - - PhysicalAddress - - - - - Sammlung für reale physische Adresse - Collection for real physical address - - - - - - - CountryCode - 0173-1#02-AAO730#001 - - - - - - - - - - - - Landeskennung - Country code - - Country code - - - - - Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes - agreed upon symbol for unambiguous identification of a country - - - - - - - Street - 0173-1#02-AAO128#001 - - - - - - - - Strasse - Street - - Street - - - - - Name der Strasse und Hausnummer - Street name and house number - - - - - - - Zip - 0173-1#02-AAO129#002 - - - - - - - - Zip - Postleitzahl - - PostalCode - - - - - ZIP code of address - Postleitzahl der Anschrift - - - - - - - CityTown - 0173-1#02-AAO132#001 - - - - - - - - Ort - City/town - - City/town - - - - - Town or city of the company - Ortsangabe - - - - - - - StateCounty - 0173-1#02-AAO133#002 - - - - - - - - state/county - Bundesland - - StateCounty - - - - - Bundesland - state/county - - - - - - - ManufacturerProductFamily - 0173-1#02-AAU731#001 - - - - - - - - Manufacturer product family - Herstellerproduktfamilie - - TypClass - - - - - 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie - 2nd level of a 3 level manufacturer specific product hierarchy - - - - - - - SerialNumber - 0173-1#02-AAM556#002 - - - - - - - - Serial number - Seriennummer - - InstanceId - - - - - eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist - unique combination of numbers and letters used to identify the device once it has been manufactured - - - - - - - BatchNumber - 0173-1#02-AAQ196#001 - - - - - - - - Batch number - Chargen-Nummer - - ChargeId - - - - - Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge - Number assigned by the manufacturer of a material to identify the manufacturer's batch - - - - - - - ProductCountryOfOrigin - 0173-1#02-AAO841#001 - - - - - - - - Produkt Ursprungsland - Product country of origin - - CountryOfOrigin - - - - - Land in dem das Produkt hergestellt wurde (Hersteller Land) - Country in which the product is manufactured (manufacturer country) - - - - - - - YearOfConstruction - 0173-1#02-AAP906#001 - - - - - - - - Year of construction - Baujahr - - YearOfConstruction - - - - - Jahreszahl als Datumsangabe für die Fertigstellung des Objektes - Year as completion date of object - - - - - - - ProductMarking - https://www.hsu-hh.de/aut/aas/productmarking - - - - - - - - Produktkennzeichnung - Product Marking - - ProductMarking - - - - - Sammlungsdatei für Produktkennzeichnung - Collection file for product marking - - - - - - - CEQualificationPresent - 0173-1#02-BAF053#008 - - - - - - - - CE-Kennzeichnung vorhanden - CE- qualification present - - CEMarkingPresent - - - BOOLEAN - - whether CE- qualification is present - Angabe, ob CE-Kennzeichnung vorhanden ist - - - - - - - File - 0173-1#02-AAD005#008 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Enthaltene Doku. Datei - Embedded Doc. file - - File - - - - - Verweis/ BLOB auf enthaltene Dokumentations-Datei. - Reference/ BLOB to embedded documentation file. - - - - - - - DocumentationItem - 0173-1#02-AAD001#001 - - - - - - - - Dokumentationsgruppe - Documentation item - - DocumentationItem - - - - - Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. - Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. - - - - - - - DocumentType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - - - - - - Dokumententyp - Document Type - - DocumentType - - - - - Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) - TBD - - - - - - - VDI2770_DomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - - - - - - Domain-Nummer - DomainId - - DomainId - - - - - Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. - TBD - - - - - - - VDI2770_IdType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - - - - - - Nummerntyp - IdType - - IdType - - - - - Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. - TBD - - - - - - - DocumentId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - - - - - - DocumentId - Dokumenten-Nummer - - DocumentId - - - - - Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. - TBD - - - - - - - DocumentDomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - - - - - - DocumentDomainId - DocumentDomainId - - DocumentDomainId - - - - - Kennung oder Kennzeichen einer Domäne - TBD - - - - - - - VDI2770_Role - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - - - - - - Rolle - Role - - Role - - - - - Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) - TBD - - - - - - - VDI2770_OrganisationId - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - - - - - - Organisation ID - Organisation ID - - OrganisationId - - - - - eindeutige ID für die Organisation - TBD - - - - - - - VDI2770_OrganisationName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - - - - - - OrganisationName - OrganisationName - - OrganisationName - - - - - gebräuchliche Bezeichnung für die Organisation - TBD - - - - - - - VDI2770_OrganisationOfficialName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - - - - - - Offizieller Name der Organisation - Organisation Official Name - - OrganisationOfficialName - - - - - offizieller Name der Organisation - TBD - - - - - - - VDI2770_Description - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - - - - - - Beschreibung - Description - - Description - - - - - Beschreibung für die nächste übergeordnete Collection - TBD - - - - - - - DocumentPartId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - - - - - - Dokumenten-Teilnummer - DocumentPartId - - DocumentPartId - - - - - Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. - TBD - - - - - - - DocumentClassification_ClassId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - - - - Dokumentkategorie - Document category - - DocCategory - - - - - Dokumentkategorie nach VDI 2770:2018/10 - Document category after VDI 2770:2018/10 - - - - - - - VDI2770_ClassName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - - - - - - Klassenname - Class Name - - ClassName - - - - - Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. - TBD - - - - - - - VDI2770_ClassificationSystem - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - - - - - - Klassifizierungssystem - classification system - - ClassificationSystem - - - - - Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. - TBD - - - - - - - DocumentVersionId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - - - - - - Dokumenten-Versionsnummer - DocumentVersionId - - DocumentVersionId - - - - - Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. - TBD - - - - - - - DocumentVersion_LanguageCode - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - - - - - - Sprachenschlüssel - LanguageCode - - LanguageCode - - - - - Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 - TBD - - - - - - - VDI2770_Title - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - - - - - - Titel - Title - - VDI2770_Title - - - - - sprachabhängiger Titel des Dokuments - TBD - - - - - - - VDI2770_Summary - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - - - - - - Zusammenfassung - Summary - - Summary - - - - - sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts - TBD - - - - - - - VDI2770_Keywords - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - - - - - - Schlagwörter - Keywords - - Keywords - - - - - sprachabhängige, durch Komma getrennte Liste von Schlagwörtern - TBD - - - - - - - VDI2770_StatusValue - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - - - - - - Statuswert - StatusValue - - StatusValue - - - - - Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) - TBD - - - - - - - VDI2770_SetDate - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - - - - - - Erstellungsdatum - Set Date - - SetDate - - - - - Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). - TBD - - - - - - - VDI2770_Purpose - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - - - - - - Zweck - Purpose - - Purpose - - - - - Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. - TBD - - - - - - - VDI2770_BasedOnProcedure - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - - - - - - Prozedur - Procedure - - BasedOnProcedure - - - - - textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt - TBD - - - - - - - VDI2770_Comments - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - - - - - - Kommentar - Comments - - Comments - - - - - textuelle Bemerkungen und Anmerkungen zum Status - TBD - - - - - - - VDI2770_ReferencedObject_Type - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - - - - - - Typ - Type - - Type - - - - - Für Type des Objekts muss immer Product angegeben werden. - TBD - - - - - - - VDI2770_ReferencedObject_RefType - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - - - - - - RefType - RefType - - RefType - - - - - Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) - TBD - - - - - - - VDI2770_ReferencedObject_ObjectId - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - - - - - - ObjectId - ObjectId - - ObjectId - - - - - Angabe der Identifikationsnummer zum Objekt - TBD - - - - - - - VDI2770_FileId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - - - - - - ID der Datei - File ID - - FileId - - - - - eindeutige ID für die Datei - TBD - - - - - - - VDI2770_FileName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - - - - - - Dateiname - File name - - FileName - - - - - Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. - TBD - - - - - - - VDI2770_FileFormat - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - - - - - - Datei Format - File format - - FileFormat - - - - - Angabe eines Media Typs gemäß der Liste der IANA - TBD - - - - - - - OrganisationContactInfo - https://www.hsu-hh.de/aut/aas/contactinfo - - - - - - - - Contact Info - Kontakt Info - - OrganisationContactInfo - - - - - Sammlung für die allgemeinen Kontaktdaten - Collection for general contact data - - - - - - - NameOfSupplier - 0173-1#02-AAO735#003 - - - - - - - - - - - - name of supplier - Lieferantenname - - name of supplier - - - - - Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt - name of supplier which provides the customer with a product or a service - - - - - - - ContactInfo_Role - https://www.hsu-hh.de/aut/aas/role - - - - - - - - Rolle - Role - - Role - - - - - Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt - Information to specify the role which the organisation of ContactInfo plays - - - - - - - Email - https://www.hsu-hh.de/aut/aas/email - - - - - - - - Emailadresse - Email address - - Email - - - - - Emailadresse - Email address - - - - - - - URL - 0173-1#02-AAO694#001 - - - - - - - - Internetadresse - Internet address - - URL - - - - - stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html - Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html - - - - - - - PhoneNumber - 0173-1#02-AAO136#002 - - - - - - - - Telefonnummer - telephone number - - Phone - - - - - vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist - complete telephone number to be called to reach a business partner - - - - - - - Fax - https://www.hsu-hh.de/aut/aas/fax - - - - - - - - Fax - Fax - - Fax - - - - - Faxnummer - Fax number - - - - - - - 0173-1#02-AAO136#002 - - - - - GLNOfManufacturer - 0173-1#02-AAY812#001 - - - - - - - - GLN of manufacturer - GLN des Herstellers - - GLN of manufacturer - - - - - international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort - internationally unique identification number for the manufacturer of the device or the product and for the physical location - - - - - - - SupplierOfTheIdentifier - 0173-1#02-AAP796#004 - - - - - - - - Supplier of the identifier - Anbieter der Identifikationsnummer für Hersteller - - Supplier of the identifier - - - STRING_TRANSLATABLE - - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - - - - - - - MAN_PROD_NUM - - product article number of manufacturer - - 0173-1#02-AAO676#003 - - - - - - - - product article number of manufacturer - Herstellerartikelnummer - - MAN_PROD_NUM - - - STRING_TRANSLATABLE - - eindeutiger Bestellschlüssel des Herstellers - unique product identifier of the manufacturer - - - - - - - ManufacturerProductDescription - 0173-1#02-AAU734#001 - - - - - - - - Manufacturer product description - Herstellerproduktbeschreibung - - Manufacturer product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - GLNOfSupplier - 0173-1#02-AAY813#001 - - - - - - - - GLN of supplier - GLN des Lieferanten - - GLN of supplier - - - - - international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort - internationally unique identification number for the supplier of the device or the product and for the physical location - - - - - - - SupplierIdProvider - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - - - - - - SupplierIdProvider - Anbieter der Identifikationsnummer - - SupplierIdProvider - - - STRING_TRANSLATABLE - - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - - - - - - - SUP_PROD_NUM - 0173-1#02-AAO736#004 - - - - - - - - product article number of supplier - Lieferantenartikelnummer - - product article number of supplier - - - - - eindeutiger Bestellschlüssel des Lieferanten - unique product order identifier of the supplier - - - - - - - SupplierProductDesignation - 0173-1#02-AAM551#002 - - - - - - - - Supplier product designation - Lieferantenproduktbezeichnung - - SupplierTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - SupplierProductDescription - 0173-1#02-AAU730#001 - - - - - - - - Supplier product description - Lieferantenproduktbeschreibung - - Supplier product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - ClassificationSystem - 0173-1#02-AAO715#002 - - - - - - - - classification system - Klassifizierungssystem - - ClassificationSystem - - - - - Klassifizierungssystem - Classification System - - - - - - - SecondaryKeyTyp - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - - - - - - SecondaryKeyTyp - Typnummer des IT Systems - - SecondaryKeyTyp - - - - - Führende technische ID im IT System des Typs - SecondaryKeyTyp - - - - - - - TypThumbnail - www.company.com/ids/cd/4401_1272_7091_3437 - - - - - - - - TypThumbnail - Vorschaubild - - TypThumbnail - - - - - Darstellung des Produkttyps in kleinem Format - Small picture of the product type - - - - - - - AssetId - https://www.hsu-hh.de/aut/aas/assetid - - - - - - - - AssetId - Asset ID - - AssetId - - - - - Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. - Global unique ID of an asset, which can be read by both human and machine. - - - - - - - SecondaryKeyInstance - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - - - - - - SecondaryKeyInstance - Instanznummer des IT Systems - - SecondaryKeyInstance - - - - - Führende technische ID im IT System der Instanz - SecondaryKeyInstance - - - - - - - DateOfManufacture - 0173-1#02-AAR972#002 - - - - - - - - Date of manufacture - Herstellungsdatum - - Date of manufacture - - - DATE - - Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist - Date from which the production and / or development process is completed or from which a service is provided completely - - - - - - - DeviceRevision - https://www.hsu-hh.de/aut/aas/devicerevision - - - - - - - - DeviceRevision - DeviceRevision - - DeviceRevision - - - - - DeviceRevision - DeviceRevision - - - - - - - SoftwareRevision - https://www.hsu-hh.de/aut/aas/softwarerevision - - - - - - - - SoftwareRevision - SoftwareRevision - - SoftwareRevision - - - - - SoftwareRevision - SoftwareRevision - - - - - - - HardwareRevision - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - - - - - - HardwareRevision - HardwareRevision - - HardwareRevision - - - - - HardwareRevision - HardwareRevision - - - - - - - QrCode - https://www.hsu-hh.de/aut/aas/qrcode - - - - - - - - QrCode - QrCode - - QrCode - - - - - In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. - QrCode - - - - - - - CompanyLogo - https://www.hsu-hh.de/aut/aas/companylogo - - - - - - - - Firmenlogo - CompanyLogo - - CompanyLogo - - - - - Firmenlogo - CompanyLogo - - - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/12_Pepperl+Fuchs.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/12_Pepperl+Fuchs.aasx.xml deleted file mode 100644 index b11a4a11a..000000000 --- a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/12_Pepperl+Fuchs.aasx.xml +++ /dev/null @@ -1,3973 +0,0 @@ - - - - - PeFu_267075_100078 - www.company.com/ids/aas/8403_3140_0191_8844 - - - www.company.com/ids/asset/1595_3140_0191_3961 - - - - - - www.company.com/ids/sm/4343_5072_7091_3242 - - - - - www.company.com/ids/sm/2543_5072_7091_2660 - - - - - www.company.com/ids/sm/6053_5072_7091_5102 - - - - - www.company.com/ids/sm/6563_5072_7091_4267 - - - - - - - - - 267075_100078 - CONSTANT - www.company.com/ids/asset/1595_3140_0191_3961 - Instance - - - - - Nameplate - www.company.com/ids/sm/4343_5072_7091_3242 - - - https://www.hsu-hh.de/aut/aas/nameplate - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Pepperl+Fuchs - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - Distance Sensor - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Lilienthalstr. 200 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 68307 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Mannheim - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Baden-Wuertemberg - - - - false - false - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 40000089327054 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - ProductCountryOfOrigin - PARAMETER - - - 0173-1#02-AAO841#001 - - - Instance - - string - DE - - - - - YearOfConstruction - PARAMETER - - - 0173-1#02-AAP906#001 - - - Instance - - string - 2018 - - - - - Marking_CE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/marking_ce.png - - - - false - false - - - - - - Document - www.company.com/ids/sm/2543_5072_7091_2660 - - - https://www.hsu-hh.de/aut/aas/document - - - Instance - - - - - DeclarationCEMarking - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Pepperl+Fuchs - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Pepperl+Fuchs - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - EU-Konformitätserklärung - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - EU-Konformitaetserklaerung.pdf.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/EU-Konformitaetserklaerung.pdf - - - - false - false - - - - - Certificat_DIN_EN_ISO_14001_2015 - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Pepperl+Fuchs - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Pepperl+Fuchs - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Data Sheet OMT100-R100-2EP-IO-V31 - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - 267075-100078_eng.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/267075-100078_eng.pdf - - - - false - false - - - - - - Service - www.company.com/ids/sm/6053_5072_7091_5102 - - - https://www.hsu-hh.de/aut/aas/service - - - Instance - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Pepperl+Fuchs - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Lilienthalstr. 200 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 68307 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Mannheim - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Baden-Würtemberg - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - info@pepperl-fuchs.com - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.pepperl-fuchs.com - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +496217760 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - - - - - - false - false - - - - - - Identification - www.company.com/ids/sm/6563_5072_7091_4267 - - - https://www.hsu-hh.de/aut/aas/identification - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Pepperl+Fuchs - - - - - GLNOfManufacturer - PARAMETER - - - 0173-1#02-AAY812#001 - - - Instance - - - - - - - - SupplierOfTheIdentifier - - - 0173-1#02-AAP796#004 - - - Instance - - - - - - - - MAN_PROD_NUM - - - 0173-1#02-AAO676#003 - - - Instance - - string - 267075-100078 - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - OMT100-R100-2EP-IO-V31 - - - - - ManufacturerProductDescription - PARAMETER - - - 0173-1#02-AAU734#001 - - - Instance - - string - Distance Sensor, Measurement to object, 100 mm detection range, red light, measured value via IO-Link, 2 x push-pull output, M8 plug - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Pepperl+Fuchs - - - - - GLNOfSupplier - PARAMETER - - - 0173-1#02-AAY813#001 - - - Instance - - - - - - - - SupplierIdProvider - PARAMETER - - - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - Instance - - - - - - - - SUP_PROD_NUM - PARAMETER - - - 0173-1#02-AAO736#004 - - - Instance - - string - 267075-100078 - - - - - SupplierProductDesignation - - - 0173-1#02-AAM551#002 - - - Instance - - string - OMT100-R100-2EP-IO-V31 - - - - - SupplierProductDescription - PARAMETER - - - 0173-1#02-AAU730#001 - - - Instance - - string - Distance Sensor - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - - - - - - ClassificationSystem - PARAMETER - - - 0173-1#02-AAO715#002 - - - Instance - - string - eclass - - - - - SecondaryKeyTyp - - - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - Instance - - - - - - - - TypThumbnail - PARAMETER - - - www.company.com/ids/cd/4401_1272_7091_3437 - - - Instance - - image/jpeg - /MAC0007059_rgb.jpg - - - - - AssetId - PARAMETER - - - https://www.hsu-hh.de/aut/aas/assetid - - - Instance - - string - www.company.com/ids/asset/1595_3140_0191_3961 - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 40000089327054 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - SecondaryKeyInstance - PARAMETER - - - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - Instance - - - - - - - - DateOfManufacture - PARAMETER - - - 0173-1#02-AAR972#002 - - - Instance - - - - - - - - DeviceRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/devicerevision - - - Instance - - - - - - - - SoftwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/softwarerevision - - - Instance - - - - - - - - HardwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - Instance - - - - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Pepperl+Fuchs - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Lilienthalstr. 200 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 68307 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Mannheim - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Baden-Würtemberg - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - info@pepperl-fuchs.com - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.pepperl-fuchs.com - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +496217760 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - - - - - - false - false - - - - - CompanyLogo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/companylogo - - - Instance - - image/png - /aasx/Identification/PF_Logo_RGB.jpg - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.pepperl-fuchs.com/usa/en/classid_53.htm?view=productdetails&prodid=66664 - - - - - - - - ManufacturerName - 0173-1#02-AAO677#002 - - - - - - - - Herstellername - Manufacturer Name - - Manufacturer Name - - - - - Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist - 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 - - - - - - - ManufacturerProductDesignation - 0173-1#02-AAW338#001 - - - - - - - - Manufacturer product designation - Herstellerproduktbezeichnung - - ManufacturerTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - PhysicalAddress - https://www.hsu-hh.de/aut/aas/physicaladdress - - - - - - - - PhysicalAddress - Physische Adresse - - PhysicalAddress - - - - - Sammlung für reale physische Adresse - Collection for real physical address - - - - - - - CountryCode - 0173-1#02-AAO730#001 - - - - - - - - - - - - Landeskennung - Country code - - Country code - - - - - Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes - agreed upon symbol for unambiguous identification of a country - - - - - - - Street - 0173-1#02-AAO128#001 - - - - - - - - Strasse - Street - - Street - - - - - Name der Strasse und Hausnummer - Street name and house number - - - - - - - Zip - 0173-1#02-AAO129#002 - - - - - - - - Zip - Postleitzahl - - PostalCode - - - - - ZIP code of address - Postleitzahl der Anschrift - - - - - - - CityTown - 0173-1#02-AAO132#001 - - - - - - - - Ort - City/town - - City/town - - - - - Town or city of the company - Ortsangabe - - - - - - - StateCounty - 0173-1#02-AAO133#002 - - - - - - - - state/county - Bundesland - - StateCounty - - - - - Bundesland - state/county - - - - - - - ManufacturerProductFamily - 0173-1#02-AAU731#001 - - - - - - - - Manufacturer product family - Herstellerproduktfamilie - - TypClass - - - - - 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie - 2nd level of a 3 level manufacturer specific product hierarchy - - - - - - - SerialNumber - 0173-1#02-AAM556#002 - - - - - - - - Serial number - Seriennummer - - InstanceId - - - - - eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist - unique combination of numbers and letters used to identify the device once it has been manufactured - - - - - - - BatchNumber - 0173-1#02-AAQ196#001 - - - - - - - - Batch number - Chargen-Nummer - - ChargeId - - - - - Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge - Number assigned by the manufacturer of a material to identify the manufacturer's batch - - - - - - - ProductCountryOfOrigin - 0173-1#02-AAO841#001 - - - - - - - - Produkt Ursprungsland - Product country of origin - - CountryOfOrigin - - - - - Land in dem das Produkt hergestellt wurde (Hersteller Land) - Country in which the product is manufactured (manufacturer country) - - - - - - - YearOfConstruction - 0173-1#02-AAP906#001 - - - - - - - - Year of construction - Baujahr - - YearOfConstruction - - - - - Jahreszahl als Datumsangabe für die Fertigstellung des Objektes - Year as completion date of object - - - - - - - ProductMarking - https://www.hsu-hh.de/aut/aas/productmarking - - - - - - - - Produktkennzeichnung - Product Marking - - ProductMarking - - - - - Sammlungsdatei für Produktkennzeichnung - Collection file for product marking - - - - - - - CEQualificationPresent - 0173-1#02-BAF053#008 - - - - - - - - CE-Kennzeichnung vorhanden - CE- qualification present - - CEMarkingPresent - - - BOOLEAN - - whether CE- qualification is present - Angabe, ob CE-Kennzeichnung vorhanden ist - - - - - - - File - 0173-1#02-AAD005#008 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Enthaltene Doku. Datei - Embedded Doc. file - - File - - - - - Verweis/ BLOB auf enthaltene Dokumentations-Datei. - Reference/ BLOB to embedded documentation file. - - - - - - - DocumentationItem - 0173-1#02-AAD001#001 - - - - - - - - Dokumentationsgruppe - Documentation item - - DocumentationItem - - - - - Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. - Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. - - - - - - - DocumentType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - - - - - - Dokumententyp - Document Type - - DocumentType - - - - - Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) - TBD - - - - - - - VDI2770_DomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - - - - - - Domain-Nummer - DomainId - - DomainId - - - - - Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. - TBD - - - - - - - VDI2770_IdType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - - - - - - Nummerntyp - IdType - - IdType - - - - - Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. - TBD - - - - - - - DocumentId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - - - - - - DocumentId - Dokumenten-Nummer - - DocumentId - - - - - Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. - TBD - - - - - - - DocumentDomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - - - - - - DocumentDomainId - DocumentDomainId - - DocumentDomainId - - - - - Kennung oder Kennzeichen einer Domäne - TBD - - - - - - - VDI2770_Role - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - - - - - - Rolle - Role - - Role - - - - - Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) - TBD - - - - - - - VDI2770_OrganisationId - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - - - - - - Organisation ID - Organisation ID - - OrganisationId - - - - - eindeutige ID für die Organisation - TBD - - - - - - - VDI2770_OrganisationName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - - - - - - OrganisationName - OrganisationName - - OrganisationName - - - - - gebräuchliche Bezeichnung für die Organisation - TBD - - - - - - - VDI2770_OrganisationOfficialName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - - - - - - Offizieller Name der Organisation - Organisation Official Name - - OrganisationOfficialName - - - - - offizieller Name der Organisation - TBD - - - - - - - VDI2770_Description - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - - - - - - Beschreibung - Description - - Description - - - - - Beschreibung für die nächste übergeordnete Collection - TBD - - - - - - - DocumentPartId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - - - - - - Dokumenten-Teilnummer - DocumentPartId - - DocumentPartId - - - - - Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. - TBD - - - - - - - DocumentClassification_ClassId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - - - - Dokumentkategorie - Document category - - DocCategory - - - - - Dokumentkategorie nach VDI 2770:2018/10 - Document category after VDI 2770:2018/10 - - - - - - - VDI2770_ClassName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - - - - - - Klassenname - Class Name - - ClassName - - - - - Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. - TBD - - - - - - - VDI2770_ClassificationSystem - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - - - - - - Klassifizierungssystem - classification system - - ClassificationSystem - - - - - Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. - TBD - - - - - - - DocumentVersionId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - - - - - - Dokumenten-Versionsnummer - DocumentVersionId - - DocumentVersionId - - - - - Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. - TBD - - - - - - - DocumentVersion_LanguageCode - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - - - - - - Sprachenschlüssel - LanguageCode - - LanguageCode - - - - - Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 - TBD - - - - - - - VDI2770_Title - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - - - - - - Titel - Title - - VDI2770_Title - - - - - sprachabhängiger Titel des Dokuments - TBD - - - - - - - VDI2770_Summary - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - - - - - - Zusammenfassung - Summary - - Summary - - - - - sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts - TBD - - - - - - - VDI2770_Keywords - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - - - - - - Schlagwörter - Keywords - - Keywords - - - - - sprachabhängige, durch Komma getrennte Liste von Schlagwörtern - TBD - - - - - - - VDI2770_StatusValue - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - - - - - - Statuswert - StatusValue - - StatusValue - - - - - Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) - TBD - - - - - - - VDI2770_SetDate - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - - - - - - Erstellungsdatum - Set Date - - SetDate - - - - - Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). - TBD - - - - - - - VDI2770_Purpose - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - - - - - - Zweck - Purpose - - Purpose - - - - - Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. - TBD - - - - - - - VDI2770_BasedOnProcedure - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - - - - - - Prozedur - Procedure - - BasedOnProcedure - - - - - textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt - TBD - - - - - - - VDI2770_Comments - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - - - - - - Kommentar - Comments - - Comments - - - - - textuelle Bemerkungen und Anmerkungen zum Status - TBD - - - - - - - VDI2770_ReferencedObject_Type - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - - - - - - Typ - Type - - Type - - - - - Für Type des Objekts muss immer Product angegeben werden. - TBD - - - - - - - VDI2770_ReferencedObject_RefType - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - - - - - - RefType - RefType - - RefType - - - - - Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) - TBD - - - - - - - VDI2770_ReferencedObject_ObjectId - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - - - - - - ObjectId - ObjectId - - ObjectId - - - - - Angabe der Identifikationsnummer zum Objekt - TBD - - - - - - - VDI2770_FileId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - - - - - - ID der Datei - File ID - - FileId - - - - - eindeutige ID für die Datei - TBD - - - - - - - VDI2770_FileName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - - - - - - Dateiname - File name - - FileName - - - - - Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. - TBD - - - - - - - VDI2770_FileFormat - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - - - - - - Datei Format - File format - - FileFormat - - - - - Angabe eines Media Typs gemäß der Liste der IANA - TBD - - - - - - - OrganisationContactInfo - https://www.hsu-hh.de/aut/aas/contactinfo - - - - - - - - Contact Info - Kontakt Info - - OrganisationContactInfo - - - - - Sammlung für die allgemeinen Kontaktdaten - Collection for general contact data - - - - - - - NameOfSupplier - 0173-1#02-AAO735#003 - - - - - - - - - - - - name of supplier - Lieferantenname - - name of supplier - - - - - Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt - name of supplier which provides the customer with a product or a service - - - - - - - ContactInfo_Role - https://www.hsu-hh.de/aut/aas/role - - - - - - - - Rolle - Role - - Role - - - - - Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt - Information to specify the role which the organisation of ContactInfo plays - - - - - - - Email - https://www.hsu-hh.de/aut/aas/email - - - - - - - - Emailadresse - Email address - - Email - - - - - Emailadresse - Email address - - - - - - - URL - 0173-1#02-AAO694#001 - - - - - - - - Internetadresse - Internet address - - URL - - - - - stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html - Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html - - - - - - - PhoneNumber - 0173-1#02-AAO136#002 - - - - - - - - Telefonnummer - telephone number - - Phone - - - - - vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist - complete telephone number to be called to reach a business partner - - - - - - - Fax - https://www.hsu-hh.de/aut/aas/fax - - - - - - - - Fax - Fax - - Fax - - - - - Faxnummer - Fax number - - - - - - - 0173-1#02-AAO136#002 - - - - - GLNOfManufacturer - 0173-1#02-AAY812#001 - - - - - - - - GLN of manufacturer - GLN des Herstellers - - GLN of manufacturer - - - - - international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort - internationally unique identification number for the manufacturer of the device or the product and for the physical location - - - - - - - SupplierOfTheIdentifier - 0173-1#02-AAP796#004 - - - - - - - - Supplier of the identifier - Anbieter der Identifikationsnummer für Hersteller - - Supplier of the identifier - - - STRING_TRANSLATABLE - - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - - - - - - - MAN_PROD_NUM - - product article number of manufacturer - - 0173-1#02-AAO676#003 - - - - - - - - product article number of manufacturer - Herstellerartikelnummer - - MAN_PROD_NUM - - - STRING_TRANSLATABLE - - eindeutiger Bestellschlüssel des Herstellers - unique product identifier of the manufacturer - - - - - - - ManufacturerProductDescription - 0173-1#02-AAU734#001 - - - - - - - - Manufacturer product description - Herstellerproduktbeschreibung - - Manufacturer product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - GLNOfSupplier - 0173-1#02-AAY813#001 - - - - - - - - GLN of supplier - GLN des Lieferanten - - GLN of supplier - - - - - international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort - internationally unique identification number for the supplier of the device or the product and for the physical location - - - - - - - SupplierIdProvider - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - - - - - - SupplierIdProvider - Anbieter der Identifikationsnummer - - SupplierIdProvider - - - STRING_TRANSLATABLE - - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - - - - - - - SUP_PROD_NUM - 0173-1#02-AAO736#004 - - - - - - - - product article number of supplier - Lieferantenartikelnummer - - product article number of supplier - - - - - eindeutiger Bestellschlüssel des Lieferanten - unique product order identifier of the supplier - - - - - - - SupplierProductDesignation - 0173-1#02-AAM551#002 - - - - - - - - Supplier product designation - Lieferantenproduktbezeichnung - - SupplierTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - SupplierProductDescription - 0173-1#02-AAU730#001 - - - - - - - - Supplier product description - Lieferantenproduktbeschreibung - - Supplier product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - ClassificationSystem - 0173-1#02-AAO715#002 - - - - - - - - classification system - Klassifizierungssystem - - ClassificationSystem - - - - - Klassifizierungssystem - Classification System - - - - - - - SecondaryKeyTyp - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - - - - - - SecondaryKeyTyp - Typnummer des IT Systems - - SecondaryKeyTyp - - - - - Führende technische ID im IT System des Typs - SecondaryKeyTyp - - - - - - - TypThumbnail - www.company.com/ids/cd/4401_1272_7091_3437 - - - - - - - - TypThumbnail - Vorschaubild - - TypThumbnail - - - - - Darstellung des Produkttyps in kleinem Format - Small picture of the product type - - - - - - - AssetId - https://www.hsu-hh.de/aut/aas/assetid - - - - - - - - AssetId - Asset ID - - AssetId - - - - - Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. - Global unique ID of an asset, which can be read by both human and machine. - - - - - - - SecondaryKeyInstance - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - - - - - - SecondaryKeyInstance - Instanznummer des IT Systems - - SecondaryKeyInstance - - - - - Führende technische ID im IT System der Instanz - SecondaryKeyInstance - - - - - - - DateOfManufacture - 0173-1#02-AAR972#002 - - - - - - - - Date of manufacture - Herstellungsdatum - - Date of manufacture - - - DATE - - Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist - Date from which the production and / or development process is completed or from which a service is provided completely - - - - - - - DeviceRevision - https://www.hsu-hh.de/aut/aas/devicerevision - - - - - - - - DeviceRevision - DeviceRevision - - DeviceRevision - - - - - DeviceRevision - DeviceRevision - - - - - - - SoftwareRevision - https://www.hsu-hh.de/aut/aas/softwarerevision - - - - - - - - SoftwareRevision - SoftwareRevision - - SoftwareRevision - - - - - SoftwareRevision - SoftwareRevision - - - - - - - HardwareRevision - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - - - - - - HardwareRevision - HardwareRevision - - HardwareRevision - - - - - HardwareRevision - HardwareRevision - - - - - - - QrCode - https://www.hsu-hh.de/aut/aas/qrcode - - - - - - - - QrCode - QrCode - - QrCode - - - - - In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. - QrCode - - - - - - - CompanyLogo - https://www.hsu-hh.de/aut/aas/companylogo - - - - - - - - Firmenlogo - CompanyLogo - - CompanyLogo - - - - - Firmenlogo - CompanyLogo - - - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/13_DKE.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/13_DKE.aasx.xml deleted file mode 100644 index 9c4ff996e..000000000 --- a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/13_DKE.aasx.xml +++ /dev/null @@ -1,4210 +0,0 @@ - - - - - dkeNamePlate - www.dke.de/digitales-typenschild - - - - - - - www.company.com/ids/sm/4343_5072_7091_3242 - - - - - www.company.com/ids/sm/6053_5072_7091_5102 - - - - - www.company.com/ids/sm/6563_5072_7091_4267 - - - - - www.company.com/ids/sm/5171_3150_1191_6645 - - - - - www.company.com/ids/sm/7543_3150_1191_1022 - - - - - - - - - DKE1234 - - DKE peppermint dragees - DEK Pfefferminzdragees - - www.company.com/ids/asset/3240_1162_7091_2878 - Instance - - - - - Nameplate - www.company.com/ids/sm/4343_5072_7091_3242 - - - https://www.hsu-hh.de/aut/aas/nameplate - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - DKE Deutsche Kommission Elektrotechnik Elektronik Informationstechnik in DIN und VDE - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - Pfefferminzdragees - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Stresemannallee 15 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 60596 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Frankfurt - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Hessen - - - - false - false - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 123456 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - ProductCountryOfOrigin - PARAMETER - - - 0173-1#02-AAO841#001 - - - Instance - - string - DE - - - - - YearOfConstruction - PARAMETER - - - 0173-1#02-AAP906#001 - - - Instance - - integer - 2019 - - - - - - Service - www.company.com/ids/sm/6053_5072_7091_5102 - - - https://www.hsu-hh.de/aut/aas/service - - - Instance - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - DKE Deutsche Kommission Elektrotechnik Elektronik Informationstechnik in DIN und VDE - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Distributor - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Stresemannallee 15 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 60596 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Frankfurt - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Hessen - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - dke@vde.com - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - string - https://www.dke.de/digitales-typenschild - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +49 69 6308-0 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - +49 69 6308-9863 - - - - false - false - - - - - - Identification - www.company.com/ids/sm/6563_5072_7091_4267 - - - https://www.hsu-hh.de/aut/aas/identification - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Deutsche Kommission Elektrotechnik Elektronik Informationstechnik in DIN und VDE - - - - - GLNOfManufacturer - PARAMETER - - - 0173-1#02-AAY812#001 - - - Instance - - string - DKE123456 - - - - - SupplierOfTheIdentifier - - - 0173-1#02-AAP796#004 - - - Instance - - - - - - - - MAN_PROD_NUM - - - 0173-1#02-AAO676#003 - - - Instance - - - - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - Pfefferminzdragees - - - - - ManufacturerProductDescription - PARAMETER - - - 0173-1#02-AAU734#001 - - - Instance - - langString - Pfefferminzdragees in Blechdose - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - DKE Deutsche Kommission Elektrotechnik Elektronik Informationstechnik in DIN und VDE - - - - - GLNOfSupplier - PARAMETER - - - 0173-1#02-AAY813#001 - - - Instance - - string - DKE123456 - - - - - SupplierIdProvider - PARAMETER - - - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - Instance - - - - - - - - SUP_PROD_NUM - PARAMETER - - - 0173-1#02-AAO736#004 - - - Instance - - - - - - - - SupplierProductDesignation - - - 0173-1#02-AAM551#002 - - - Instance - - string - Pfefferminzdragees - - - - - SupplierProductDescription - PARAMETER - - - 0173-1#02-AAU730#001 - - - Instance - - langString - Pfefferminzdragees in Blechdose - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - - - - - - ClassificationSystem - PARAMETER - - - 0173-1#02-AAO715#002 - - - Instance - - string - eclass - - - - - SecondaryKeyTyp - - - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - Instance - - - - - - - - TypThumbnail - PARAMETER - - - www.company.com/ids/cd/4401_1272_7091_3437 - - - Instance - - image/jpeg - /dke-dose.jpg - - - - - AssetId - PARAMETER - - - https://www.hsu-hh.de/aut/aas/assetid - - - Instance - - anyURI - www.dke.de/digitales-typenschild - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - DKE123456 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - SecondaryKeyInstance - PARAMETER - - - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - Instance - - - - - - - - DateOfManufacture - PARAMETER - - - 0173-1#02-AAR972#002 - - - Instance - - date - 2019 - - - - - DeviceRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/devicerevision - - - Instance - - - - - - - - SoftwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/softwarerevision - - - Instance - - - - - - - - HardwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - Instance - - - - - - - - QrCode - PARAMETER - - - https://www.hsu-hh.de/aut/aas/qrcode - - - Instance - - image/png - /aasx/dke-qr.png - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - DKE Deutsche Kommission Elektrotechnik Elektronik Informationstechnik in DIN und VDE - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Distributor - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - langString - Stresemannallee 15 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 60596 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Frankfurt - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Hessen - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - dke@vde.com - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.dke.de/digitales-typenschild - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +49 69 6308-0 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - +49 69 6308-9863 - - - - false - false - - - - - CompanyLogo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/companylogo - - - Instance - - image/jpeg - /aasx/dke-logo.jpg - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.dke.de/digitales-typenschild - - - - - LOT - CONSTANT - - Lot - Lot - - - - - - - - Instance - - string - 696.240 - - - - - best_before - - Mindesthaltbarkeit - best before - - - - - - - Instance - - date - 11/2020 - - - - - weight - CONSTANT - - Inhalt, g - content, g - - - - - - - Instance - - decimal - 18.0 - - - - - content - - Inhalt - CONTENT - - - - - - - - - - - - Instance - - string - Pfefferminzdragees - - - - - - nutrition_facts - PARAMETER - - Nährwertangaben - Nutrition Facts - - www.company.com/ids/sm/5171_3150_1191_6645 - - - - - - - https://www.hsu-hh.de/aut/aas/nutrition-facts - - - Instance - - - - - nutrition_value - CONSTANT - - Nährwert, kJ/100g - nutrition value, kJ/100g - - - - - - - - Instance - - decimal - 1604 - - - - - fat - - Fett, g - Fat, g - - - - - - - Instance - - decimal - 0.4 - - - - - saturated_fat - - gesättigte Fette, g - saturated fats, g - - - - - - - Instance - - decimal - 0.1 - - - - - carbohydrates - - Kohlenhydrate, g - Carbohydrates,g - - - - - - - Instance - - decimal - 93.2 - - - - - sugar - CONSTANT - - Zucker, g - Sugar, g - - - - - - - Instance - - decimal - 92.6 - - - - - protein - CONSTANT - - Eiweiß, g - Protein, g - - - - - - - - Instance - - long - 0.2 - - - - - salt - CONSTANT - - Salz, g - Salt, g - - - - - - - Instance - - string - < 0.005 - - - - - - ingredients - PARAMETER - - Inhaltsstoffe - Ingredients - - www.company.com/ids/sm/7543_3150_1191_1022 - - - https://www.hsu-hh.de/aut/aas/ingredients - - - Instance - - - - - igrendient_1 - - Inhaltsstoff 1 - Ingredient 1 - - - - - - - Instance - - string - sugar - - - - - ingredient_2 - - Inhaltsstoff 2 - Ingredient 2 - - - - - - - Instance - - string - dextrose - - - - - ingredient_3 - - Inhaltsstoff 3 - Ingredient 3 - - - - - - - Instance - - string - E470b - - - - - ingredient_4 - - Inhaltsstoff 4 - Ingredient 4 - - - - - - - Instance - - string - flavour - - - - - ingredient_5 - - Inhaltsstoff 5 - Ingredient 5 - - - - - - - Instance - - string - glucose - - - - - ingredient_6 - - Inhaltsstoff 6 - Ingredient 6 - - - - - - - Instance - - string - E171 - - - - - ingredient_7 - - Inhaltsstoff 7 - Ingredient 7 - - - - - - - Instance - - - carnauba wax - - - - - ingredient_8 - CONSTANT - - Inhaltsstoff 8 - Ingredient 8 - - - - - - - Instance - - string - gummi arabicum - - - - - - - - ManufacturerName - 0173-1#02-AAO677#002 - - - - - - - - Herstellername - Manufacturer Name - - Manufacturer Name - - - - - Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist - 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 - - - - - - - GLNOfManufacturer - 0173-1#02-AAY812#001 - - - - - - - - GLN of manufacturer - GLN des Herstellers - - GLN of manufacturer - - - - - international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort - internationally unique identification number for the manufacturer of the device or the product and for the physical location - - - - - - - SupplierOfTheIdentifier - 0173-1#02-AAP796#004 - - - - - - - - Supplier of the identifier - Anbieter der Identifikationsnummer für Hersteller - - Supplier of the identifier - - - STRING_TRANSLATABLE - - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - - - - - - - MAN_PROD_NUM - - product article number of manufacturer - - 0173-1#02-AAO676#003 - - - - - - - - product article number of manufacturer - Herstellerartikelnummer - - MAN_PROD_NUM - - - STRING_TRANSLATABLE - - eindeutiger Bestellschlüssel des Herstellers - unique product identifier of the manufacturer - - - - - - - ManufacturerProductDesignation - 0173-1#02-AAW338#001 - - - - - - - - Manufacturer product designation - Herstellerproduktbezeichnung - - ManufacturerTypName - - - STRING_TRANSLATABLE - - Pfefferminzdragees - peppermint dragees - - - - - - - ManufacturerProductDescription - 0173-1#02-AAU734#001 - - - - - - - - Manufacturer product description - Herstellerproduktbeschreibung - - Manufacturer product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - NameOfSupplier - 0173-1#02-AAO735#003 - - - - - - - - - - - - name of supplier - Lieferantenname - - name of supplier - - - - - Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt - name of supplier which provides the customer with a product or a service - - - - - - - GLNOfSupplier - 0173-1#02-AAY813#001 - - - - - - - - GLN of supplier - GLN des Lieferanten - - GLN of supplier - - - - - international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort - internationally unique identification number for the supplier of the device or the product and for the physical location - - - - - - - SupplierIdProvider - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - - - - - - SupplierIdProvider - Anbieter der Identifikationsnummer - - SupplierIdProvider - - - STRING_TRANSLATABLE - - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - - - - - - - SUP_PROD_NUM - 0173-1#02-AAO736#004 - - - - - - - - product article number of supplier - Lieferantenartikelnummer - - product article number of supplier - - - - - eindeutiger Bestellschlüssel des Lieferanten - unique product order identifier of the supplier - - - - - - - SupplierProductDesignation - 0173-1#02-AAM551#002 - - - - - - - - Supplier product designation - Lieferantenproduktbezeichnung - - SupplierTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - SupplierProductDescription - 0173-1#02-AAU730#001 - - - - - - - - Supplier product description - Lieferantenproduktbeschreibung - - Supplier product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - ManufacturerProductFamily - 0173-1#02-AAU731#001 - - - - - - - - Manufacturer product family - Herstellerproduktfamilie - - TypClass - - - - - 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie - 2nd level of a 3 level manufacturer specific product hierarchy - - - - - - - ClassificationSystem - 0173-1#02-AAO715#002 - - - - - - - - classification system - Klassifizierungssystem - - ClassificationSystem - - - - - Klassifizierungssystem - Classification System - - - - - - - SecondaryKeyTyp - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - - - - - - SecondaryKeyTyp - Typnummer des IT Systems - - SecondaryKeyTyp - - - - - Führende technische ID im IT System des Typs - SecondaryKeyTyp - - - - - - - TypThumbnail - www.company.com/ids/cd/4401_1272_7091_3437 - - - - - - - - TypThumbnail - Vorschaubild - - TypThumbnail - - - - - Darstellung des Produkttyps in kleinem Format - Small picture of the product type - - - - - - - AssetId - https://www.hsu-hh.de/aut/aas/assetid - - - - - - - - AssetId - Asset ID - - AssetId - - - - - Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. - Global unique ID of an asset, which can be read by both human and machine. - - - - - - - SerialNumber - 0173-1#02-AAM556#002 - - - - - - - - Serial number - Seriennummer - - InstanceId - - - - - eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist - unique combination of numbers and letters used to identify the device once it has been manufactured - - - - - - - BatchNumber - 0173-1#02-AAQ196#001 - - - - - - - - Batch number - Chargen-Nummer - - ChargeId - - - - - Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge - Number assigned by the manufacturer of a material to identify the manufacturer's batch - - - - - - - SecondaryKeyInstance - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - - - - - - SecondaryKeyInstance - Instanznummer des IT Systems - - SecondaryKeyInstance - - - - - Führende technische ID im IT System der Instanz - SecondaryKeyInstance - - - - - - - DateOfManufacture - 0173-1#02-AAR972#002 - - - - - - - - Date of manufacture - Herstellungsdatum - - Date of manufacture - - - DATE - - Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist - Date from which the production and / or development process is completed or from which a service is provided completely - - - - - - - DeviceRevision - https://www.hsu-hh.de/aut/aas/devicerevision - - - - - - - - DeviceRevision - DeviceRevision - - DeviceRevision - - - - - DeviceRevision - DeviceRevision - - - - - - - SoftwareRevision - https://www.hsu-hh.de/aut/aas/softwarerevision - - - - - - - - SoftwareRevision - SoftwareRevision - - SoftwareRevision - - - - - SoftwareRevision - SoftwareRevision - - - - - - - HardwareRevision - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - - - - - - HardwareRevision - HardwareRevision - - HardwareRevision - - - - - HardwareRevision - HardwareRevision - - - - - - - QrCode - https://www.hsu-hh.de/aut/aas/qrcode - - - - - - - - QrCode - QrCode - - QrCode - - - - - In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. - QrCode - - - - - - - OrganisationContactInfo - https://www.hsu-hh.de/aut/aas/contactinfo - - - - - - - - Contact Info - Kontakt Info - - OrganisationContactInfo - - - - - Sammlung für die allgemeinen Kontaktdaten - Collection for general contact data - - - - - - - PhysicalAddress - https://www.hsu-hh.de/aut/aas/physicaladdress - - - - - - - - PhysicalAddress - Physische Adresse - - PhysicalAddress - - - - - Sammlung für reale physische Adresse - Collection for real physical address - - - - - - - CountryCode - 0173-1#02-AAO730#001 - - - - - - - - - - - - Landeskennung - Country code - - Country code - - - - - Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes - agreed upon symbol for unambiguous identification of a country - - - - - - - Street - 0173-1#02-AAO128#001 - - - - - - - - Strasse - Street - - Street - - - - - Name der Strasse und Hausnummer - Street name and house number - - - - - - - Zip - 0173-1#02-AAO129#002 - - - - - - - - Zip - Postleitzahl - - PostalCode - - - - - ZIP code of address - Postleitzahl der Anschrift - - - - - - - CityTown - 0173-1#02-AAO132#001 - - - - - - - - Ort - City/town - - City/town - - - - - Town or city of the company - Ortsangabe - - - - - - - StateCounty - 0173-1#02-AAO133#002 - - - - - - - - state/county - Bundesland - - StateCounty - - - - - Bundesland - state/county - - - - - - - Email - https://www.hsu-hh.de/aut/aas/email - - - - - - - - Emailadresse - Email address - - Email - - - - - Emailadresse - Email address - - - - - - - TelephoneContact - https://www.hsu-hh.de/aut/aas/ContactInfo/TelephoneContact - - - - - - - - Telephone Contact - Telefonkontakt - - TelephoneContact - - - - - Sammlung für Kontaktdaten über Telefon - Collection for contact data via telephone - - - - - - - PhoneNumber - 0173-1#02-AAO136#002 - - - - - - - - Telefonnummer - telephone number - - Phone - - - - - vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist - complete telephone number to be called to reach a business partner - - - - - - - CompanyLogo - https://www.hsu-hh.de/aut/aas/companylogo - - - - - - - - Firmenlogo - CompanyLogo - - CompanyLogo - - - - - Firmenlogo - CompanyLogo - - - - - - - URL - 0173-1#02-AAO694#001 - - - - - - - - Internetadresse - Internet address - - URL - - - - - stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html - Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html - - - - - - - ProductCountryOfOrigin - 0173-1#02-AAO841#001 - - - - - - - - Produkt Ursprungsland - Product country of origin - - CountryOfOrigin - - - - - Land in dem das Produkt hergestellt wurde (Hersteller Land) - Country in which the product is manufactured (manufacturer country) - - - - - - - YearOfConstruction - 0173-1#02-AAP906#001 - - - - - - - - Year of construction - Baujahr - - YearOfConstruction - - - - - Jahreszahl als Datumsangabe für die Fertigstellung des Objektes - Year as completion date of object - - - - - - - File - 0173-1#02-AAD005#008 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Enthaltene Doku. Datei - Embedded Doc. file - - File - - - - - Verweis/ BLOB auf enthaltene Dokumentations-Datei. - Reference/ BLOB to embedded documentation file. - - - - - - - ProductMarking - https://www.hsu-hh.de/aut/aas/productmarking - - - - - - - - Produktkennzeichnung - Product Marking - - ProductMarking - - - - - Sammlungsdatei für Produktkennzeichnung - Collection file for product marking - - - - - - - CEQualificationPresent - 0173-1#02-BAF053#008 - - - - - - - - CE-Kennzeichnung vorhanden - CE- qualification present - - CEMarkingPresent - - - BOOLEAN - - whether CE- qualification is present - Angabe, ob CE-Kennzeichnung vorhanden ist - - - - - - - WEEELabelingPresent - 0173-1#02-AAR528#005 - - - - - - - - Kennzeichnung (WEEE) vorhanden - WEEE labeling present - - WEEELabelingPresent - - - BOOLEAN - - indication whether the product is equipped with a specified WEEE labeling - Angabe, ob das Produkt mit einer spezifizierten WEEE-Kennzeichnung ausgestattet ist - - - - - - - DocumentClassification_ClassId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - - - - Dokumentkategorie - Document category - - DocCategory - - - - - Dokumentkategorie nach VDI 2770:2018/10 - Document category after VDI 2770:2018/10 - - - - - - - DocumentId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - - - - - - DocumentId - Dokumenten-Nummer - - DocumentId - - - - - Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. - TBD - - - - - - - VDI2770_DomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - - - - - - Domain-Nummer - DomainId - - DomainId - - - - - Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. - TBD - - - - - - - VDI2770_IdType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - - - - - - Nummerntyp - IdType - - IdType - - - - - Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. - TBD - - - - - - - ValString - www.company.com/ids/cd/4490_8182_7091_6124 - - - - - - - - Wert - Value String - - ValString - - - - - Ausdruck für den Wert der übergeordneten Collection. - Value string for the collection value on the next superordinate level - - - - - - - DocumentationItem - 0173-1#02-AAD001#001 - - - - - - - - Dokumentationsgruppe - Documentation item - - DocumentationItem - - - - - Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. - Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. - - - - - - - DocumentIdDomain - www.company.com/ids/cd/6003_8182_7091_9350 - - - - - - - - DocumentIdDomain - DocumentIdDomain - - DocumentIdDomain - - - - - Angabe einer Liste von Domänen, in de-nen die DocumentIds des Dokuments eindeutig sind - TBD - - - - - - - DocumentDomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - - - - - - DocumentDomainId - DocumentDomainId - - DocumentDomainId - - - - - Kennung oder Kennzeichen einer Domäne - TBD - - - - - - - VDI2770_Party - www.company.com/ids/cd/3153_8182_7091_4327 - - - - - - - - Party - Party - - Party - - - - - Verweis auf eine Party (siehe VDI 2770 Anhang C1.17), die für diese Domäne verantwortlich ist - TBD - - - - - - - VDI2770_Role - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - - - - - - Rolle - Role - - Role - - - - - Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) - TBD - - - - - - - VDI2770_Organisation - www.company.com/ids/cd/9214_8182_7091_6391 - - - - - - - - Organisation - Organisation - - Organisation - - - - - Angabe einer Organisation - TBD - - - - - - - VDI2770_OrganisationId - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - - - - - - Organisation ID - Organisation ID - - OrganisationId - - - - - eindeutige ID für die Organisation - TBD - - - - - - - VDI2770_OrganisationName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - - - - - - OrganisationName - OrganisationName - - OrganisationName - - - - - gebräuchliche Bezeichnung für die Organisation - TBD - - - - - - - VDI2770_OrganisationOfficialName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - - - - - - Offizieller Name der Organisation - Organisation Official Name - - OrganisationOfficialName - - - - - offizieller Name der Organisation - TBD - - - - - - - DocumentPartId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - - - - - - Dokumenten-Teilnummer - DocumentPartId - - DocumentPartId - - - - - Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. - TBD - - - - - - - VDI2770_Description - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - - - - - - Beschreibung - Description - - Description - - - - - Beschreibung für die nächste übergeordnete Collection - TBD - - - - - - - VDI2770_ClassName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - - - - - - Klassenname - Class Name - - ClassName - - - - - Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. - TBD - - - - - - - DocumentVersion_LanguageCode - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - - - - - - Sprachenschlüssel - LanguageCode - - LanguageCode - - - - - Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 - TBD - - - - - - - VDI2770_ClassificationSystem - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - - - - - - Klassifizierungssystem - classification system - - ClassificationSystem - - - - - Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. - TBD - - - - - - - DocumentVersion - www.company.com/ids/cd/2580_0282_7091_6213 - - - - - - - - Dokumenten-Version - DocumentVersion - - DocumentVersion - - - - - Zu jedem Dokument muss eine Menge von mindestens einer Dokumentenversion existieren. Es können auch mehrere Dokumentenversionen ausgeliefert werden. - TBD - - - - - - - DocumentVersionId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - - - - - - Dokumenten-Versionsnummer - DocumentVersionId - - DocumentVersionId - - - - - Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. - TBD - - - - - - - VDI2770_Language - www.company.com/ids/cd/0231_0282_7091_5062 - - - - - - - - Sprache - Language - - Language - - - - - Liste der im Dokument verwendeten Sprachen - TBD - - - - - - - DocumentVersion_Description - www.company.com/ids/cd/9151_0282_7091_8032 - - - - - - - - Beschreibung zur DocumentVersion - DocumentVersion Description - - DocumentVersion_Description - - - - - Zusammenfassende Beschreibungen zur Dokumentenversion in ggf. unterschiedlichen Sprachen. - TBD - - - - - - - VDI2770_Title - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - - - - - - Titel - Title - - VDI2770_Title - - - - - sprachabhängiger Titel des Dokuments - TBD - - - - - - - VDI2770_Summary - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - - - - - - Zusammenfassung - Summary - - Summary - - - - - sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts - TBD - - - - - - - VDI2770_Keywords - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - - - - - - Schlagwörter - Keywords - - Keywords - - - - - sprachabhängige, durch Komma getrennte Liste von Schlagwörtern - TBD - - - - - - - VDI2770_LifeCycleStatus - www.company.com/ids/cd/0282_0282_7091_7878 - - - - - - - - Lebenszyklus Status - LifeCycleStatus - - LifeCycleStatus - - - - - Liste von Statusdefinitionen mit Bezug zum Dokumentenlebenszyklus inklusive der Angabe der Beteiligten und einem zugehörigen Zeitstempel - TBD - - - - - - - VDI2770_StatusValue - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - - - - - - Statuswert - StatusValue - - StatusValue - - - - - Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) - TBD - - - - - - - VDI2770_SetDate - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - - - - - - Erstellungsdatum - Set Date - - SetDate - - - - - Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). - TBD - - - - - - - VDI2770_Purpose - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - - - - - - Zweck - Purpose - - Purpose - - - - - Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. - TBD - - - - - - - VDI2770_BasedOnProcedure - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - - - - - - Prozedur - Procedure - - BasedOnProcedure - - - - - textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt - TBD - - - - - - - VDI2770_Comments - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - - - - - - Kommentar - Comments - - Comments - - - - - textuelle Bemerkungen und Anmerkungen zum Status - TBD - - - - - - - DocumentRelationship - www.company.com/ids/cd/1204_0282_7091_7896 - - - - - - - - Dokumenten-Beziehung - Document Relationship - - DocumentRelationship - - - - - Liste von Beziehungen zu anderen Dokumenten. Es ist möglich, auf einen Dokument, ein Dokument in einer spezifischen Dokumentenversion oder auch ein Teildokument zu verweisen. - TBD - - - - - - - DocumentRelationship_Type - www.company.com/ids/cd/5044_0282_7091_6924 - - - - - - - - Typ der Dokumenten-Beziehung - DocumentRelationship_Type - - DocumentRelationship_Type - - - - - Typisierung der Beziehung zwischen den beiden DocumentVersions. Folgende Beziehungsarten können verwendet werden: Affecting (hat Auswirkungen auf), ReferesTo (bezieht sich auf), BasedOn (basiert auf) - TBD - - - - - - - StoredDocumentRepresentation - www.company.com/ids/cd/3094_0282_7091_2090 - - - - - - - - StoredDocumentRepresentation - StoredDocumentRepresentation - - StoredDocumentRepresentation - - - - - Liste von digitalen Repräsentationen zur DocumentVersion - TBD - - - - - - - VDI2770_DigitalFile - www.company.com/ids/cd/2305_0282_7091_2077 - - - - - - - - Digitaler-File - DigitalFile - - DigitalFile - - - - - Datei, die die DocumentVersion (siehe VDI 2770:2018 Anhang C1.5) repräsentiert Neben der obligatorischen PDF/A-Datei können weitere Dateien angegeben werden. - TBD - - - - - - - VDI2770_FileId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - - - - - - ID der Datei - File ID - - FileId - - - - - eindeutige ID für die Datei - TBD - - - - - - - VDI2770_FileName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - - - - - - Dateiname - File name - - FileName - - - - - Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. - TBD - - - - - - - VDI2770_FileFormat - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - - - - - - Datei Format - File format - - FileFormat - - - - - Angabe eines Media Typs gemäß der Liste der IANA - TBD - - - - - - - DocumentType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - - - - - - Dokumententyp - Document Type - - DocumentType - - - - - Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) - TBD - - - - - - - VDI2770_ReferencedObject - www.company.com/ids/cd/2570_2282_7091_0055 - - - - - - - - ReferencedObject - ReferencedObject - - ReferencedObject - - - - - Liste von IDs für ein Objekt, auf das sich das Dokument bezieht - TBD - - - - - - - VDI2770_ReferencedObject_Type - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - - - - - - Typ - Type - - Type - - - - - Für Type des Objekts muss immer Product angegeben werden. - TBD - - - - - - - VDI2770_ReferencedObject_RefType - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - - - - - - RefType - RefType - - RefType - - - - - Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) - TBD - - - - - - - VDI2770_ReferencedObject_ObjectId - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - - - - - - ObjectId - ObjectId - - ObjectId - - - - - Angabe der Identifikationsnummer zum Objekt - TBD - - - - - - - ContactInfo_Role - https://www.hsu-hh.de/aut/aas/role - - - - - - - - Rolle - Role - - Role - - - - - Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt - Information to specify the role which the organisation of ContactInfo plays - - - - - - - Fax - https://www.hsu-hh.de/aut/aas/fax - - - - - - - - Fax - Fax - - Fax - - - - - Faxnummer - Fax number - - - - - - - 0173-1#02-AAO136#002 - - - - - DocGroup_01 - www.company.com/ids/cd/1420_0113_7091_0891 - - - - - - - - 01 Identifikation - 01 Identification - - DocGroup_01 - - - - - Der Gruppe „Identifikation“ werden alle Dokumente zugeordnet, die der Identifikation des Objekts dienen, zu dem die Herstellerdokumentation gehört. Sie enthält insbesondere Informationen, die die elektronische Datenverarbeitung unterstützen und die es dem Hersteller und dem Nutzer erlauben, das Objekt in ihren jeweiligen elektronischen Datenverarbeitungssystemen zu identifizieren. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocGroup_02 - www.company.com/ids/cd/4323_0113_7091_2591 - - - - - - - - 02 Technische Beschaffenheit - 02 Technical characteristics - - DocGroup_02 - - - - - Die Gruppe „Technische Beschaffenheit“ beinhaltet alle Dokumente, die die technischen Anforderungen, deren Erfüllung und die Bescheinigung der Eigenschaften eines Objekts betreffen. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocGroup_03 - www.company.com/ids/cd/5053_0113_7091_5741 - - - - - - - - 03 Tätigkeitsbezogene Dokumente - 03 Work-related documents - - DocGroup_03 - - - - - Die Gruppe „Tätigkeitsbezogene Dokumente“ beinhaltet alle Dokumente, die Anforderungen, Hinweise und Hilfestellungen für Tätigkeiten an und mit dem Objekt nach der Übergabe an den Nutzer betreffen. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocGroup_04 - www.company.com/ids/cd/5473_0113_7091_1588 - - - - - - - - 04 Vertragsunterlagen - 04 Contract documents - - DocGroup_04 - - - - - Der Gruppe „Vertragsunterlagen“ werden alle Dokumente zugeordnet, die im Zusammenhang mit der kaufmännischen Abwicklung eines Vertrages stehen, aber nicht selbst Gegenstand des Vertrags sind und lediglich zur Erfüllung des Vertrags dienen. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_01-01 - www.company.com/ids/cd/9593_0113_7091_2401 - - - - - - - - 01-01 Identifikation - 01-01 Identification - - DocCategory_01-01 - - - - - Der Kategorie „Identifikation“ werden alle Dokumente zugeordnet, die der Identifikation des Objekts dienen, zu dem die Herstellerdokumentation gehört. Sie enthält insbesondere Informationen, die die elektronische Datenverarbeitung unterstützen und die es dem Hersteller und dem Nutzer erlauben, das Objekt in ihren jeweiligen elektronischen Datenverarbeitungssystemen zu identifizieren. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_02-01 - www.company.com/ids/cd/5314_0113_7091_8640 - - - - - - - - 02-01 Techn. Spezifikation - 02-01 Technical specification - - DocCategory_02-01 - - - - - Der Kategorie „Technische Spezifikation“ werden alle Dokumente zugeordnet, die die Anforderungen an ein Objekt sowie dessen Eigenschaften beschreiben. Dazu gehören die Auslegungsdaten, Berechnungen (Verfahrenstechnik, Festigkeit usw.) sowie alle relevanten Eigenschaften des übergebenen Objekts. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_02-02 - www.company.com/ids/cd/5515_0113_7091_8581 - - - - - - - - 02-02 Zeichnungen, Pläne - 02-02 Drawings and diagrams - - DocCategory_02-02 - - - - - Der Kategorie „Zeichnungen, Pläne“ werden alle Dokumente zugeordnet, die Zeichnungscharakter haben, das heißt eine grafische Darstellung zur Übermittlung von Information nutzen. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_02-03 - www.company.com/ids/cd/0335_0113_7091_0312 - - - - - - - - 02-03 Bauteile - 02-03 Components - - DocCategory_02-03 - - - - - Der Kategorie „Bauteile“ werden alle Dokumente zugeordnet, die eine strukturierte Auflistung der Teile eines Objekts beinhalten. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_02-04 - www.company.com/ids/cd/2155_0113_7091_3955 - - - - - - - - 02-04 Zeugnisse, Zertifikate, Bescheinigungen - 02-04 Reports, Certificates, declarations - - DocCategory_02-04 - - - - - Der Kategorie „Zeugnisse, Zertifikate, Bescheinigungen“ werden alle Dokumente zugeordnet, die Urkundencharakter haben. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_03-01 - www.company.com/ids/cd/3565_0113_7091_2704 - - - - - - - - 03-01 Montage, Inbetriebnahme, Demontage - 03-01 Assembly, commissioning, disassembly - - DocCategory_03-01 - - - - - Der Kategorie „Montage, Demontage“ werden alle Dokumente zugeordnet, die Tätigkeiten und Maßnahmen beschreiben, die erforderlich sind, um ein Objekt: zu transportieren oder zu lagern, als Ganzes in ein übergeordnetes Objekt einzubauen, auszubauen oder an dieses anzuschließen, so weit vorzubereiten, dass es zur Inbetriebnahme bereitsteht, nach Abschluss der Nutzungsphase zu demontieren und zu entsorgen - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_03-02 - www.company.com/ids/cd/4290_1113_7091_7266 - - - - - - - - 03-02 Bedienung - 03-02 Operation - - DocCategory_03-02 - - - - - Der Kategorie „Bedienung“ werden Dokumente zur bestimmungsgemäßen Verwendung und sicheren Bedienung eines Objekts zugeordnet. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_03-03 - www.company.com/ids/cd/2211_1113_7091_3911 - - - - - - - - 03-03 Allgemeine Sicherheit - 03-03 Safety in general - - DocCategory_03-03 - - - - - Der Kategorie „Allgemeine Sicherheit“ werden Dokumente zugeordnet, die Sicherheitshinweise auf mögliche Gefährdungen bei der Verwendung des Objekts geben. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_03-04 - www.company.com/ids/cd/7521_1113_7091_4471 - - - - - - - - 03-04 Inspektion, Wartung, Prüfung - 03-04 Inspection, maintenance, test - - DocCategory_03-04 - - - - - Der Kategorie „Inspektion, Wartung, Prüfung“ werden alle Dokumente zugeordnet, die vom Hersteller vorgeschlagene wiederkehrende Maßnahmen zur Feststellung oder zum Erhalt des funktionsfähigen Zustands beschreiben. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_03-05 - www.company.com/ids/cd/5161_1113_7091_0458 - - - - - - - - 03-05 Instandsetzung - 03-05 Repair - - DocCategory_03-05 - - - - - Der Kategorie „Instandsetzung“ werden alle Dokumente zugeordnet, die Maßnahmen zur Wiederherstellung der Funktion eines Objekts betreffen. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_03-06 - www.company.com/ids/cd/2181_1113_7091_5948 - - - - - - - - 03-06 Ersatzteile - 03-06 Spare parts - - DocCategory_03-06 - - - - - Der Kategorie „Ersatzteile“ werden Dokumente zugeordnet, die Informationen zu Ersatzteilen und Hilfs- und Betriebsstoffen enthalten. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_04-01 - www.company.com/ids/cd/5391_1113_7091_8996 - - - - - - - - 04-01 Vertragsunterlagen - 04-01 Contract documents - - DocCategory_04-01 - - - - - Der Kategorie „Vertragsunterlagen“ werden alle Dokumente zugeordnet, die im Zusammenhang mit der kaufmännischen Abwicklung eines Vertrages stehen, aber nicht selbst Gegenstand des Vertrags sind und lediglich zur Erfüllung des Vertrags dienen. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/14_Siemens.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/14_Siemens.aasx.xml deleted file mode 100644 index 4f696a0d6..000000000 --- a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/14_Siemens.aasx.xml +++ /dev/null @@ -1,6015 +0,0 @@ - - - - - SITRANS_P320 - www.company.com/ids/aas/9460_8042_0191_4407 - - - http://siemens.com/pimobile?1P=7MF0300-1QU01-5BF2-Z&S=N1L22110101185 - - - - - - www.company.com/demo/sm/instance/F9CC779860FC1039 - - - - - www.company.com/demo/sm/instance/204F677FF7D40E79 - - - - - www.company.com/demo/sm/instance/1D77CEFC25CEC482 - - - - - www.company.com/demo/sm/instance/4F44B8B32822E483 - - - - - - - - - P320 - - SITRANS P320 für Relativdruck, HART (4 ... 20 mA) - SITRANS P320 for gauge pressure, HART (4 ... 20 mA) - - http://siemens.com/pimobile?1P=7MF0300-1QU01-5BF2-Z&S=N1L22110101185 - Instance - - - - - Nameplate - www.company.com/demo/sm/instance/F9CC779860FC1039 - - - https://www.hsu-hh.de/aut/aas/nameplate - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Siemens AG - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - SITRANS P320 für Relativdruck, HART (4 ... 20 mA) - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 76181 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Karlsruhe - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Baden-Württemberg - - - - false - false - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - Druckmessumformer - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - N1L22110101185 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - ProductCountryOfOrigin - PARAMETER - - - 0173-1#02-AAO841#001 - - - Instance - - string - DE - - - - - YearOfConstruction - PARAMETER - - - 0173-1#02-AAP906#001 - - - Instance - - string - 2019 - - - - - Marking_CE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - 0173-1#07-CAA016#001 - - - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/marking_ce.png - - - - false - false - - - - - - Identification - www.company.com/demo/sm/instance/4F44B8B32822E483 - - - https://www.hsu-hh.de/aut/aas/identification - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Siemens AG - - - - - GLNOfManufacturer - PARAMETER - - - 0173-1#02-AAY812#001 - - - Instance - - - 4016001000006 - - - - - SupplierOfTheIdentifier - - - 0173-1#02-AAP796#004 - - - Instance - - - - - - - - MAN_PROD_NUM - - - 0173-1#02-AAO676#003 - - - Instance - - - 7MF0300-1QU01-5BF2-Z B11+C20+D42+E20+Y01+Y17+Y21 - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - SITRANS P320 for gauge pressure, HART (4 ... 20 mA) - - - - - - - - ManufacturerProductDescription - PARAMETER - - - 0173-1#02-AAU734#001 - - - Instance - - string - Gauge Pressure Transmitter - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Siemens AG - - - - - GLNOfSupplier - PARAMETER - - - 0173-1#02-AAY813#001 - - - Instance - - - 4016001000006 - - - - - SupplierIdProvider - PARAMETER - - - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - Instance - - - - - - - - SUP_PROD_NUM - PARAMETER - - - 0173-1#02-AAO736#004 - - - Instance - - - 7MF0300-1QU01-5BF2-Z B11+C20+D42+E20+Y01+Y17+Y21 - - - - - SupplierProductDesignation - - - 0173-1#02-AAM551#002 - - - Instance - - string - SITRANS P320 for gauge pressure, HART (4 ... 20 mA) - - - - - SupplierProductDescription - PARAMETER - - - 0173-1#02-AAU730#001 - - - Instance - - string - Gauge Pressure Transmitter - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - - - - - - ClassificationSystem - PARAMETER - - - 0173-1#02-AAO715#002 - - - Instance - - string - eclass - - - - - SecondaryKeyTyp - - - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - Instance - - - - - - - - TypThumbnail - PARAMETER - - - www.company.com/ids/cd/4401_1272_7091_3437 - - - Instance - - image/jpeg - /P_FI01_XX_05457I.jpg - - - - - AssetId - PARAMETER - - - https://www.hsu-hh.de/aut/aas/assetid - - - Instance - - string - http://siemens.com/pimobile?1P=7MF0300-1QU01-5BF2-Z&S=N1L22110101185 - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - N1L22110101185 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - SecondaryKeyInstance - PARAMETER - - - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - Instance - - - - - - - - DateOfManufacture - PARAMETER - - - 0173-1#02-AAR972#002 - - - Instance - - date - 15.04.2019 - - - - - DeviceRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/devicerevision - - - Instance - - string - - - - - - SoftwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/softwarerevision - - - Instance - - - - - - - - HardwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - Instance - - - 12.34.56 - - - - - QrCode - PARAMETER - - - https://www.hsu-hh.de/aut/aas/qrcode - - - Instance - - image/jpeg - /aasx/Identification/qrcode_P320.png - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Siemens AG - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 76181 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Karlsruhe - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Baden-Württemberg - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.siemens.com/processinstrumentation - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - - - - - - false - false - - - - - CompanyLogo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/companylogo - - - Instance - - image/png - /aasx/Identification/sie-logo-layer-petrol-rgb.jpg - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - http://siemens.com/pimobile?1P=7MF0300-1QU01-5BF2-Z&S=N1L22110101185 - - - - - - Service - www.company.com/demo/sm/instance/1D77CEFC25CEC482 - - - https://www.hsu-hh.de/aut/aas/service - - - Instance - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Siemens AG - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 76181 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Karlsruhe - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Baden-Württemberg - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://support.industry.siemens.com/ - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - - - - - - false - false - - - - - - Document - www.company.com/demo/sm/instance/204F677FF7D40E79 - - - https://www.hsu-hh.de/aut/aas/document - - - Instance - - - - - DeclarationCEMarking - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Siemens AG - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Siemens AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - EU-Konformitätserklärung - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - EU Declaration of Conformity.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/cert_EU-DoC_SitP320_P420_A5E44320812A_002.pdf - - - - false - false - - - - - Certificat_DIN_EN_ISO_14001_2015 - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - BVS 18 ATEX E049X - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Siemens AG - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Siemens AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - EN - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - ATEX-EC-Type-Examination-Certificate - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - cert__SIP320_P420_Exi_Exd_de_en_BVS_18_ATEX_E049X.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/cert__SIP320_P420_Exi_Exd_de_en_BVS_18_ATEX_E049X.pdf - - - - false - false - - - - - Betriebsanleitung - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - A5E41285171-AB - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Siemens AG - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Siemens AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Betriebsanleitung - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - date - 01.09.2018 - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - A5E41285171-ABde_P320P420_HART_OI_de-DE.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/A5E41285171-ABde_P320P420_HART_OI_de-DE.pdf - - - - false - false - - - - - OperatingInstruction - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - A5E44852162-AB - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Siemens AG - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Siemens AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Operating Instructions - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - date - 01.09.2018 - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - A5E44852162-ABen_P320P420_HART_OI_en-US.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/A5E44852162-ABen_P320P420_HART_OI_en-US.pdf - - - - false - false - - - - - Kompaktbetriebsanleitung - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - A5E38874562-AB - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Siemens AG - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Siemens AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Kompaktbetriebsanleitung - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - date - 01.09.2018 - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - A5E38874562-ABde_P320P420_COI_de-DE.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/A5E38874562-ABde_P320P420_COI_de-DE.pdf - - - - false - false - - - - - CompactOperatingInstructions - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - A5E38874562-AB - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Siemens AG - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Siemens AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Compact Operating Instructions - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - date - 01.09.2018 - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - A5E38874562-ABen_P320P420_COI_en-US.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/A5E38874562-ABen_P320P420_COI_en-US.pdf - - - - false - false - - - - - - - - ManufacturerName - 0173-1#02-AAO677#002 - - - - - - - - Herstellername - Manufacturer Name - - Manufacturer Name - - - - - Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist - 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 - - - - - - - ManufacturerProductDesignation - 0173-1#02-AAW338#001 - - - - - - - - Manufacturer product designation - Herstellerproduktbezeichnung - - ManufacturerTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - PhysicalAddress - https://www.hsu-hh.de/aut/aas/physicaladdress - - - - - - - - PhysicalAddress - Physische Adresse - - PhysicalAddress - - - - - Sammlung für reale physische Adresse - Collection for real physical address - - - - - - - CountryCode - 0173-1#02-AAO730#001 - - - - - - - - - - - - Landeskennung - Country code - - Country code - - - - - Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes - agreed upon symbol for unambiguous identification of a country - - - - - - - Street - 0173-1#02-AAO128#001 - - - - - - - - Strasse - Street - - Street - - - - - Name der Strasse und Hausnummer - Street name and house number - - - - - - - Zip - 0173-1#02-AAO129#002 - - - - - - - - Zip - Postleitzahl - - PostalCode - - - - - ZIP code of address - Postleitzahl der Anschrift - - - - - - - CityTown - 0173-1#02-AAO132#001 - - - - - - - - Ort - City/town - - City/town - - - - - Town or city of the company - Ortsangabe - - - - - - - StateCounty - 0173-1#02-AAO133#002 - - - - - - - - state/county - Bundesland - - StateCounty - - - - - Bundesland - state/county - - - - - - - ManufacturerProductFamily - 0173-1#02-AAU731#001 - - - - - - - - Manufacturer product family - Herstellerproduktfamilie - - TypClass - - - - - 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie - 2nd level of a 3 level manufacturer specific product hierarchy - - - - - - - SerialNumber - 0173-1#02-AAM556#002 - - - - - - - - Serial number - Seriennummer - - InstanceId - - - - - eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist - unique combination of numbers and letters used to identify the device once it has been manufactured - - - - - - - BatchNumber - 0173-1#02-AAQ196#001 - - - - - - - - Batch number - Chargen-Nummer - - ChargeId - - - - - Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge - Number assigned by the manufacturer of a material to identify the manufacturer's batch - - - - - - - ProductCountryOfOrigin - 0173-1#02-AAO841#001 - - - - - - - - Produkt Ursprungsland - Product country of origin - - CountryOfOrigin - - - - - Land in dem das Produkt hergestellt wurde (Hersteller Land) - Country in which the product is manufactured (manufacturer country) - - - - - - - YearOfConstruction - 0173-1#02-AAP906#001 - - - - - - - - Year of construction - Baujahr - - YearOfConstruction - - - - - Jahreszahl als Datumsangabe für die Fertigstellung des Objektes - Year as completion date of object - - - - - - - ProductMarking - https://www.hsu-hh.de/aut/aas/productmarking - - - - - - - - Produktkennzeichnung - Product Marking - - ProductMarking - - - - - Sammlungsdatei für Produktkennzeichnung - Collection file for product marking - - - - - - - CEQualificationPresent - 0173-1#02-BAF053#008 - - - - - - - - CE-Kennzeichnung vorhanden - CE- qualification present - - CEMarkingPresent - - - BOOLEAN - - whether CE- qualification is present - Angabe, ob CE-Kennzeichnung vorhanden ist - - - - - - - File - 0173-1#02-AAD005#008 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Enthaltene Doku. Datei - Embedded Doc. file - - File - - - - - Verweis/ BLOB auf enthaltene Dokumentations-Datei. - Reference/ BLOB to embedded documentation file. - - - - - - - GLNOfManufacturer - 0173-1#02-AAY812#001 - - - - - - - - GLN of manufacturer - GLN des Herstellers - - GLN of manufacturer - - - - - international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort - internationally unique identification number for the manufacturer of the device or the product and for the physical location - - - - - - - SupplierOfTheIdentifier - 0173-1#02-AAP796#004 - - - - - - - - Supplier of the identifier - Anbieter der Identifikationsnummer für Hersteller - - Supplier of the identifier - - - STRING_TRANSLATABLE - - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - - - - - - - MAN_PROD_NUM - - product article number of manufacturer - - 0173-1#02-AAO676#003 - - - - - - - - product article number of manufacturer - Herstellerartikelnummer - - MAN_PROD_NUM - - - STRING_TRANSLATABLE - - eindeutiger Bestellschlüssel des Herstellers - unique product identifier of the manufacturer - - - - - - - ManufacturerProductDescription - 0173-1#02-AAU734#001 - - - - - - - - Manufacturer product description - Herstellerproduktbeschreibung - - Manufacturer product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - NameOfSupplier - 0173-1#02-AAO735#003 - - - - - - - - - - - - name of supplier - Lieferantenname - - name of supplier - - - - - Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt - name of supplier which provides the customer with a product or a service - - - - - - - GLNOfSupplier - 0173-1#02-AAY813#001 - - - - - - - - GLN of supplier - GLN des Lieferanten - - GLN of supplier - - - - - international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort - internationally unique identification number for the supplier of the device or the product and for the physical location - - - - - - - SupplierIdProvider - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - - - - - - SupplierIdProvider - Anbieter der Identifikationsnummer - - SupplierIdProvider - - - STRING_TRANSLATABLE - - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - - - - - - - SUP_PROD_NUM - 0173-1#02-AAO736#004 - - - - - - - - product article number of supplier - Lieferantenartikelnummer - - product article number of supplier - - - - - eindeutiger Bestellschlüssel des Lieferanten - unique product order identifier of the supplier - - - - - - - SupplierProductDesignation - 0173-1#02-AAM551#002 - - - - - - - - Supplier product designation - Lieferantenproduktbezeichnung - - SupplierTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - SupplierProductDescription - 0173-1#02-AAU730#001 - - - - - - - - Supplier product description - Lieferantenproduktbeschreibung - - Supplier product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - ClassificationSystem - 0173-1#02-AAO715#002 - - - - - - - - classification system - Klassifizierungssystem - - ClassificationSystem - - - - - Klassifizierungssystem - Classification System - - - - - - - SecondaryKeyTyp - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - - - - - - SecondaryKeyTyp - Typnummer des IT Systems - - SecondaryKeyTyp - - - - - Führende technische ID im IT System des Typs - SecondaryKeyTyp - - - - - - - TypThumbnail - www.company.com/ids/cd/4401_1272_7091_3437 - - - - - - - - TypThumbnail - Vorschaubild - - TypThumbnail - - - - - Darstellung des Produkttyps in kleinem Format - Small picture of the product type - - - - - - - AssetId - https://www.hsu-hh.de/aut/aas/assetid - - - - - - - - AssetId - Asset ID - - AssetId - - - - - Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. - Global unique ID of an asset, which can be read by both human and machine. - - - - - - - SecondaryKeyInstance - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - - - - - - SecondaryKeyInstance - Instanznummer des IT Systems - - SecondaryKeyInstance - - - - - Führende technische ID im IT System der Instanz - SecondaryKeyInstance - - - - - - - DateOfManufacture - 0173-1#02-AAR972#002 - - - - - - - - Date of manufacture - Herstellungsdatum - - Date of manufacture - - - DATE - - Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist - Date from which the production and / or development process is completed or from which a service is provided completely - - - - - - - DeviceRevision - https://www.hsu-hh.de/aut/aas/devicerevision - - - - - - - - DeviceRevision - DeviceRevision - - DeviceRevision - - - - - DeviceRevision - DeviceRevision - - - - - - - SoftwareRevision - https://www.hsu-hh.de/aut/aas/softwarerevision - - - - - - - - SoftwareRevision - SoftwareRevision - - SoftwareRevision - - - - - SoftwareRevision - SoftwareRevision - - - - - - - HardwareRevision - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - - - - - - HardwareRevision - HardwareRevision - - HardwareRevision - - - - - HardwareRevision - HardwareRevision - - - - - - - QrCode - https://www.hsu-hh.de/aut/aas/qrcode - - - - - - - - QrCode - QrCode - - QrCode - - - - - In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. - QrCode - - - - - - - OrganisationContactInfo - www.company.com/demo/cd/1DEEF3CC9CF46C80 - - - - - - - - Contact Info - Kontakt Info - - OrganisationContactInfo - - - - - Sammlung für die allgemeinen Kontaktdaten - Collection for general contact data - - - - - - - ContactInfo_Role - https://www.hsu-hh.de/aut/aas/role - - - - - - - - Rolle - Role - - Role - - - - - Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt - Information to specify the role which the organisation of ContactInfo plays - - - - - - - Email - https://www.hsu-hh.de/aut/aas/email - - - - - - - - Emailadresse - Email address - - Email - - - - - Emailadresse - Email address - - - - - - - URL - 0173-1#02-AAO694#001 - - - - - - - - Internetadresse - Internet address - - URL - - - - - stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html - Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html - - - - - - - PhoneNumber - 0173-1#02-AAO136#002 - - - - - - - - Telefonnummer - telephone number - - Phone - - - - - vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist - complete telephone number to be called to reach a business partner - - - - - - - Fax - https://www.hsu-hh.de/aut/aas/fax - - - - - - - - Fax - Fax - - Fax - - - - - Faxnummer - Fax number - - - - - - - 0173-1#02-AAO136#002 - - - - - CompanyLogo - www.company.com/ids/cd/3132_1142_0191_9159 - - - - - - - - Firmenlogo - CompanyLogo - - CompanyLogo - - - - - Firmenlogo - CompanyLogo - - - - - - - DocumentationItem - - 0173-1#02-AAD001#001 - - - - - - - - Dokumentationsgruppe - Documentation item - - DocumentationItem - - - - - Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. - Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. - - - - - - - DocumentType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - - - - - - Dokumententyp - Document Type - - DocumentType - - - - - Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) - TBD - - - - - - - VDI2770_DomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - - - - - - Domain-Nummer - DomainId - - DomainId - - - - - Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. - TBD - - - - - - - VDI2770_IdType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - - - - - - Nummerntyp - IdType - - IdType - - - - - Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. - TBD - - - - - - - DocumentId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - - - - - - DocumentId - Dokumenten-Nummer - - DocumentId - - - - - Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. - TBD - - - - - - - DocumentDomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - - - - - - DocumentDomainId - DocumentDomainId - - DocumentDomainId - - - - - Kennung oder Kennzeichen einer Domäne - TBD - - - - - - - VDI2770_Role - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - - - - - - Rolle - Role - - Role - - - - - Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) - TBD - - - - - - - VDI2770_OrganisationId - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - - - - - - Organisation ID - Organisation ID - - OrganisationId - - - - - eindeutige ID für die Organisation - TBD - - - - - - - VDI2770_OrganisationName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - - - - - - OrganisationName - OrganisationName - - OrganisationName - - - - - gebräuchliche Bezeichnung für die Organisation - TBD - - - - - - - VDI2770_OrganisationOfficialName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - - - - - - Offizieller Name der Organisation - Organisation Official Name - - OrganisationOfficialName - - - - - offizieller Name der Organisation - TBD - - - - - - - VDI2770_Description - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - - - - - - Beschreibung - Description - - Description - - - - - Beschreibung für die nächste übergeordnete Collection - TBD - - - - - - - DocumentPartId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - - - - - - Dokumenten-Teilnummer - DocumentPartId - - DocumentPartId - - - - - Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. - TBD - - - - - - - DocumentClassification_ClassId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - - - - Dokumentkategorie - Document category - - DocCategory - - - - - Dokumentkategorie nach VDI 2770:2018/10 - Document category after VDI 2770:2018/10 - - - - - - - VDI2770_ClassName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - - - - - - Klassenname - Class Name - - ClassName - - - - - Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. - TBD - - - - - - - VDI2770_ClassificationSystem - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - - - - - - Klassifizierungssystem - classification system - - ClassificationSystem - - - - - Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. - TBD - - - - - - - DocumentVersionId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - - - - - - Dokumenten-Versionsnummer - DocumentVersionId - - DocumentVersionId - - - - - Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. - TBD - - - - - - - DocumentVersion_LanguageCode - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - - - - - - Sprachenschlüssel - LanguageCode - - LanguageCode - - - - - Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 - TBD - - - - - - - VDI2770_Title - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - - - - - - Titel - Title - - VDI2770_Title - - - - - sprachabhängiger Titel des Dokuments - TBD - - - - - - - VDI2770_Summary - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - - - - - - Zusammenfassung - Summary - - Summary - - - - - sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts - TBD - - - - - - - VDI2770_Keywords - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - - - - - - Schlagwörter - Keywords - - Keywords - - - - - sprachabhängige, durch Komma getrennte Liste von Schlagwörtern - TBD - - - - - - - VDI2770_StatusValue - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - - - - - - Statuswert - StatusValue - - StatusValue - - - - - Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) - TBD - - - - - - - VDI2770_SetDate - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - - - - - - Erstellungsdatum - Set Date - - SetDate - - - - - Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). - TBD - - - - - - - VDI2770_Purpose - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - - - - - - Zweck - Purpose - - Purpose - - - - - Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. - TBD - - - - - - - VDI2770_BasedOnProcedure - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - - - - - - Prozedur - Procedure - - BasedOnProcedure - - - - - textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt - TBD - - - - - - - VDI2770_Comments - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - - - - - - Kommentar - Comments - - Comments - - - - - textuelle Bemerkungen und Anmerkungen zum Status - TBD - - - - - - - VDI2770_ReferencedObject_Type - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - - - - - - Typ - Type - - Type - - - - - Für Type des Objekts muss immer Product angegeben werden. - TBD - - - - - - - VDI2770_ReferencedObject_RefType - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - - - - - - RefType - RefType - - RefType - - - - - Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) - TBD - - - - - - - VDI2770_ReferencedObject_ObjectId - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - - - - - - ObjectId - ObjectId - - ObjectId - - - - - Angabe der Identifikationsnummer zum Objekt - TBD - - - - - - - VDI2770_FileId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - - - - - - ID der Datei - File ID - - FileId - - - - - eindeutige ID für die Datei - TBD - - - - - - - VDI2770_FileName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - - - - - - Dateiname - File name - - FileName - - - - - Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. - TBD - - - - - - - VDI2770_FileFormat - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - - - - - - Datei Format - File format - - FileFormat - - - - - Angabe eines Media Typs gemäß der Liste der IANA - TBD - - - - - - - Her - 0173-1#02-AAO055#001 - - - 1 - - - - - - - - - Herstellername - - Her - - - STRING - - ist die Bezeichnung des Produzenten - - - - - - - 0173-1#02-AAO055#001 - - - - - 0173-1#02-AAM552#002 - - - 1 - - - - - - - - - Herstellerartikelbezeichnung - - Her - - - STRING - - vom Hersteller (oder Vertrieb) festgelegter Markenname für ein Produkt, wobei Produkt synonym für Objekt, Gegenstand oder Dienstleistung steht - - - - - - - 0173-1#02-AAM552#002 - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/15_Siemens.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/15_Siemens.aasx.xml deleted file mode 100644 index 4afa75765..000000000 --- a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/15_Siemens.aasx.xml +++ /dev/null @@ -1,5044 +0,0 @@ - - - - - S7_CPU1515 - CONSTANT - www.company.com/demo/aas/1234554842136874684321 - - 1 - 0 - - - - www.siemens.com/ids/asset/MLFB=6ES7515-2FM00-0AB0&SN=C-E9S35353 - - - - - - www.company.com/demo/sm/instance/F9CC779860FC10391 - - - - - www.company.com/demo/sm/instance/4F44B8B32822E483 - - - - - www.company.com/demo/sm/instance/1D77CEFC25CEC482 - - - - - www.company.com/demo/sm/instance/204F677FF7D40E79 - - - - - - - - - S7_1515F_2PN - - - SIMATIC S7-1500F, CPU 1515F-2 PN, Zentralbaugruppe mit Arbeitsspeicher 750 KB für Programm und 3MByte für Daten, 1. Schnittstelle, PROFINET IRT mit 2 Port Switch, 2. Schnittstelle, Ethernet, 30 NS Bit-Performance, SIMATIC Memory Card notwendig - SIMATIC S7-1500F, CPU 1515F-2 PN, Central processing unit with work memory 750 KB for Program and 3 MB for data, 1st interface, PROFINET IRT with 2-port switch, 2nd interface, Ethernet, 30 ns bit performance, SIMATIC Memory Card required - - www.siemens.com/ids/asset/MLFB=6ES7515-2FM00-0AB0&SN=C-E9S35353 - Instance - - - - - Nameplate - www.company.com/demo/sm/instance/F9CC779860FC10391 - - - https://www.hsu-hh.de/aut/aas/nameplate - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Siemens AG - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - CPU 1515F-2 PN - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 90475 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Nuremberg - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Bayern - - - - false - false - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - Programmable logic control (SPS) - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - C-E9S35353 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - ProductCountryOfOrigin - PARAMETER - - - 0173-1#02-AAO841#001 - - - Instance - - string - DE - - - - - YearOfConstruction - PARAMETER - - - 0173-1#02-AAP906#001 - - - Instance - - string - 2014 - - - - - Marking_CE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/marking_ce.png - - - - false - false - - - - - Marking_UL - PARAMETER - - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - ULMarkingPresent - PARAMETER - - - 0173-1#02-AAW723#001 - - - Instance - - boolean - 1 - - - - - - - - File - PARAMETER - - - - - Instance - - - /aasx/Nameplate/marking_UL.jpg - - - - false - false - - - - - - Identification - www.company.com/demo/sm/instance/4F44B8B32822E483 - - - https://www.hsu-hh.de/aut/aas/identification - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Siemens AG - - - - - GLNOfManufacturer - PARAMETER - - - 0173-1#02-AAY812#001 - - - Instance - - string - 4047623000006 - - - - - SupplierOfTheIdentifier - - - 0173-1#02-AAP796#004 - - - Instance - - string - GS1 - - - - - MAN_PROD_NUM - - - 0173-1#02-AAO676#003 - - - Instance - - string - 6ES7515-2FM00-0AB0 - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - CPU 1515F-2 PN, 750KB Prog., 3MB Daten - - - - - ManufacturerProductDescription - PARAMETER - - - 0173-1#02-AAU734#001 - - - Instance - - string - SIMATIC S7-1500F, CPU 1515F-2 PN, Central processing unit with work memory 750 KB for Program and 3 MB for data, 1st interface, PROFINET IRT with 2-port switch, 2nd interface, Ethernet, 30 ns bit performance, - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Siemens AG - - - - - GLNOfSupplier - PARAMETER - - - 0173-1#02-AAY813#001 - - - Instance - - string - 4047623000006 - - - - - SupplierIdProvider - PARAMETER - - - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - Instance - - string - GS1 - - - - - SUP_PROD_NUM - PARAMETER - - - 0173-1#02-AAO736#004 - - - Instance - - string - 6ES7515-2FM00-0AB0 - - - - - SupplierProductDesignation - - - 0173-1#02-AAM551#002 - - - Instance - - string - CPU 1515F-2 PN, 750KB Prog., 3MB Daten - - - - - SupplierProductDescription - PARAMETER - - - 0173-1#02-AAU730#001 - - - Instance - - string - SIMATIC S7-1500F, CPU 1515F-2 PN, Central processing unit with work memory 750 KB for Program and 3 MB for data, 1st interface, PROFINET IRT with 2-port switch, 2nd interface, Ethernet, 30 ns bit performance, - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - string - Programmable logic control (SPS) - - - - - ClassificationSystem - PARAMETER - - - 0173-1#02-AAO715#002 - - - Instance - - string - eclass - - - - - SecondaryKeyTyp - - - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - Instance - - - - - - - - TypThumbnail - PARAMETER - - - www.company.com/ids/cd/4401_1272_7091_3437 - - - Instance - - image/jpeg - /P_ST70_XX_06800J.jpg - - - - - AssetId - PARAMETER - - - https://www.hsu-hh.de/aut/aas/assetid - - - Instance - - string - www.siemens.com/ids/asset/MLFB=6ES7515-2FM00-0AB0&SN=C-E9S35353 - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - C-E9S35353 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - SecondaryKeyInstance - PARAMETER - - - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - Instance - - - - - - - - DateOfManufacture - PARAMETER - - - 0173-1#02-AAR972#002 - - - Instance - - date - 2014 - - - - - DeviceRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/devicerevision - - - Instance - - string - 01 - - - - - SoftwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/softwarerevision - - - Instance - - string - V1.8.5 - - - - - HardwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - Instance - - string - 01 - - - - - QrCode - PARAMETER - - - https://www.hsu-hh.de/aut/aas/qrcode - - - Instance - - image/jpeg - /aasx/Identification/dmc.gif - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Siemens AG - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Gleiwitzer Str. 555 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 90475 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Nuremberg - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Bavaria - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - markus.kempf@siemens.com - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.siemens.com/automation - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - - - - - - false - false - - - - - CompanyLogo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/companylogo - - - Instance - - image/png - /aasx/Identification/sie-logo-layer-petrol-rgb.jpg - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://support.industry.siemens.com/cs/pd/86475?pdti=pi&dl=en&lc=en-WW - - - - - - Service - www.company.com/demo/sm/instance/1D77CEFC25CEC482 - - - https://www.hsu-hh.de/aut/aas/service - - - Instance - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Siemens AG - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Gleiwitzer Str. 555 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 90475 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Nuremburg - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - bavaria - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://support.industry.siemens.com/ - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - - - - - - false - false - - - - - - Document - www.company.com/demo/sm/instance/204F677FF7D40E79 - - - https://www.hsu-hh.de/aut/aas/document - - - Instance - - - - - DeclarationCEMarking - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Manufacturer - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Siemens AG - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Siemens AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - EU-Konformitätserklärung - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - 106_CE_S7_1500_general_A3_10_2019_d_e.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/106_CE_S7_1500_general_A3_10_2019_d_e.pdf - - - - false - false - - - - - DeclarationULMarking - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Manufacturer - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Siemens AG - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Siemens AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Certificate of compliance - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - S7-1500_Vol.9_Sec.1_E222109.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/S7-1500_Vol.9_Sec.1_E222109.pdf - - - - false - false - - - - - Produktinformation - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - A5E35635424-AG - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - string - Handbuch - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Manufacturer - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Siemens AG - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Siemens AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-03 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Allgemeine Sicherheit - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - DE, EN, FR, SP, IT, CH - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - SIMATIC S7-1200/S7-1500 F-CPUs Produktinformation - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - string - 11/18 - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - s71200_1500_f_cpus_product_information_x_de-DE.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/s71200_1500_f_cpus_product_information_x_de-DE.pdf - - - - false - false - - - - - Programming and Operating Manual - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - A5E02714440-AH - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Manufacturer - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Siemens AG - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Siemens AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - SIMATIC Industrial Software SIMATIC Safety - Configuring and Programming - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - date - 09.26.2018 - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - ProgFAILenUS_en-US.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/ProgFAILenUS_en-US.pdf - - - - false - false - - - - - - - - ManufacturerName - 0173-1#02-AAO677#002 - - - - - - - - Herstellername - Manufacturer Name - - Manufacturer Name - - - - - Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist - 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 - - - - - - - ManufacturerProductDesignation - 0173-1#02-AAW338#001 - - - - - - - - Manufacturer product designation - Herstellerproduktbezeichnung - - ManufacturerTypName - - - STRING_TRANSLATABLE - - SIMATIC S7-1500F, CPU 1515F-2 PN, Zentralbaugruppe mit Arbeitsspeicher 750 KB für Programm und 3MByte für Daten, 1. Schnittstelle, PROFINET IRT mit 2 Port Switch, 2. Schnittstelle, Ethernet, 30 NS Bit-Performance - SIMATIC S7-1500F, CPU 1515F-2 PN, Central processing unit with work memory 750 KB for Program and 3 MB for data, 1st interface, PROFINET IRT with 2-port switch, 2nd interface, Ethernet, 30 ns bit performance - - - - - - - PhysicalAddress - https://www.hsu-hh.de/aut/aas/physicaladdress - - - - - - - - PhysicalAddress - Physische Adresse - - PhysicalAddress - - - - - Sammlung für reale physische Adresse - Collection for real physical address - - - - - - - CountryCode - 0173-1#02-AAO730#001 - - - - - - - - - - - - Landeskennung - Country code - - Country code - - - - - Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes - agreed upon symbol for unambiguous identification of a country - - - - - - - Zip - 0173-1#02-AAO129#002 - - - - - - - - Zip - Postleitzahl der Anschrift - - PostalCode - - - - - ZIP code of address - Postleitzahl der Anschrift - - - - - - - CityTown - 0173-1#02-AAO132#001 - - - - - - - - Ort - City/town - - City/town - - - - - Town or city of the company - Ortsangabe - - - - - - - StateCounty - 0173-1#02-AAO133#002 - - - - - - - - state/county - Bundesland - - StateCounty - - - - - Bundesland - state/county - - - - - - - ManufacturerProductFamily - 0173-1#02-AAU731#001 - - - - - - - - Manufacturer product family - Herstellerproduktfamilie - - TypClass - - - - - 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie - 2nd level of a 3 level manufacturer specific product hierarchy - - - - - - - SerialNumber - 0173-1#02-AAM556#002 - - - - - - - - Serial number - Seriennummer - - InstanceId - - - - - eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist - unique combination of numbers and letters used to identify the device once it has been manufactured - - - - - - - BatchNumber - 0173-1#02-AAQ196#001 - - - - - - - - Batch number - Chargen-Nummer - - ChargeId - - - - - Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge - Number assigned by the manufacturer of a material to identify the manufacturer's batch - - - - - - - ProductCountryOfOrigin - 0173-1#02-AAO841#001 - - - - - - - - Produkt Ursprungsland - Product country of origin - - CountryOfOrigin - - - - - Land in dem das Produkt hergestellt wurde (Hersteller Land) - Country in which the product is manufactured (manufacturer country) - - - - - - - YearOfConstruction - 0173-1#02-AAP906#001 - - - - - - - - Year of construction - Baujahr - - YearOfConstruction - - - - - Jahreszahl als Datumsangabe für die Fertigstellung des Objektes - Year as completion date of object - - - - - - - ProductMarking - PARAMETER - https://www.hsu-hh.de/aut/aas/productmarking - - - - - - - - Produktkennzeichnung - Product Marking - - ProductMarking - - - - - Sammlungsdatei für Produktkennzeichnung - Collection file for product marking - - - - - - - CEQualificationPresent - 0173-1#02-BAF053#008 - - - - - - - - CE-Kennzeichnung vorhanden - CE- qualification present - - CEMarkingPresent - - - BOOLEAN - - whether CE- qualification is present - Angabe, ob CE-Kennzeichnung vorhanden ist - - - - - - - File - 0173-1#02-AAD005#008 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Enthaltene Doku. Datei - Embedded Doc. file - - File - - - - - Verweis/ BLOB auf enthaltene Dokumentations-Datei. - Reference/ BLOB to embedded documentation file. - - - - - - - GLNOfManufacturer - 0173-1#02-AAY812#001 - - - - - - - - GLN of manufacturer - GLN des Herstellers - - GLN of manufacturer - - - - - international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort - internationally unique identification number for the manufacturer of the device or the product and for the physical location - - - - - - - SupplierOfTheIdentifier - 0173-1#02-AAP796#004 - - - - - - - - Supplier of the identifier - Anbieter der Identifikationsnummer für Hersteller - - Supplier of the identifier - - - STRING_TRANSLATABLE - - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - - - - - - - MAN_PROD_NUM - - product article number of manufacturer - - 0173-1#02-AAO676#003 - - - - - - - - product article number of manufacturer - Herstellerartikelnummer - - MAN_PROD_NUM - - - STRING_TRANSLATABLE - - eindeutiger Bestellschlüssel des Herstellers - unique product identifier of the manufacturer - - - - - - - ManufacturerProductDescription - 0173-1#02-AAU734#001 - - - - - - - - Manufacturer product description - Herstellerproduktbeschreibung - - Manufacturer product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - NameOfSupplier - 0173-1#02-AAO735#003 - - - - - - - - - - - - name of supplier - Lieferantenname - - name of supplier - - - - - Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt - name of supplier which provides the customer with a product or a service - - - - - - - GLNOfSupplier - 0173-1#02-AAY813#001 - - - - - - - - GLN of supplier - GLN des Lieferanten - - GLN of supplier - - - - - international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort - internationally unique identification number for the supplier of the device or the product and for the physical location - - - - - - - SupplierIdProvider - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - - - - - - SupplierIdProvider - Anbieter der Identifikationsnummer - - SupplierIdProvider - - - STRING_TRANSLATABLE - - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - - - - - - - SUP_PROD_NUM - 0173-1#02-AAO736#004 - - - - - - - - product article number of supplier - Lieferantenartikelnummer - - product article number of supplier - - - - - eindeutiger Bestellschlüssel des Lieferanten - unique product order identifier of the supplier - - - - - - - SupplierProductDesignation - 0173-1#02-AAM551#002 - - - - - - - - Supplier product designation - Lieferantenproduktbezeichnung - - SupplierTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - SupplierProductDescription - 0173-1#02-AAU730#001 - - - - - - - - Supplier product description - Lieferantenproduktbeschreibung - - Supplier product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - ClassificationSystem - 0173-1#02-AAO715#002 - - - - - - - - classification system - Klassifizierungssystem - - ClassificationSystem - - - - - Klassifizierungssystem - Classification System - - - - - - - SecondaryKeyTyp - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - - - - - - SecondaryKeyTyp - Typnummer des IT Systems - - SecondaryKeyTyp - - - - - Führende technische ID im IT System des Typs - SecondaryKeyTyp - - - - - - - TypThumbnail - www.company.com/ids/cd/4401_1272_7091_3437 - - - - - - - - TypThumbnail - Vorschaubild - - TypThumbnail - - - - - Darstellung des Produkttyps in kleinem Format - Small picture of the product type - - - - - - - AssetId - https://www.hsu-hh.de/aut/aas/assetid - - - - - - - - AssetId - Asset ID - - AssetId - - - - - Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. - Global unique ID of an asset, which can be read by both human and machine. - - - - - - - SecondaryKeyInstance - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - - - - - - SecondaryKeyInstance - Instanznummer des IT Systems - - SecondaryKeyInstance - - - - - Führende technische ID im IT System der Instanz - SecondaryKeyInstance - - - - - - - DateOfManufacture - 0173-1#02-AAR972#002 - - - - - - - - Date of manufacture - Herstellungsdatum - - Date of manufacture - - - DATE - - Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist - Date from which the production and / or development process is completed or from which a service is provided completely - - - - - - - DeviceRevision - https://www.hsu-hh.de/aut/aas/devicerevision - - - - - - - - DeviceRevision - DeviceRevision - - DeviceRevision - - - - - DeviceRevision - DeviceRevision - - - - - - - SoftwareRevision - https://www.hsu-hh.de/aut/aas/softwarerevision - - - - - - - - SoftwareRevision - SoftwareRevision - - SoftwareRevision - - - - - SoftwareRevision - SoftwareRevision - - - - - - - HardwareRevision - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - - - - - - HardwareRevision - HardwareRevision - - HardwareRevision - - - - - HardwareRevision - HardwareRevision - - - - - - - QrCode - https://www.hsu-hh.de/aut/aas/qrcode - - - - - - - - QrCode - QrCode - - QrCode - - - - - In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. - QrCode - - - - - - - URL - 0173-1#02-AAO694#001 - - - - - - - - Internetadresse - Internet address - - URL - - - - - stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html - Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html - - - - - - - DocumentationItem - - 0173-1#02-AAD001#001 - - - - - - - - Dokumentationsgruppe - Documentation item - - DocumentationItem - - - - - Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. - Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. - - - - - - - DocumentType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - - - - - - Dokumententyp - Document Type - - DocumentType - - - - - Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) - TBD - - - - - - - VDI2770_DomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - - - - - - Domain-Nummer - DomainId - - DomainId - - - - - Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. - TBD - - - - - - - VDI2770_IdType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - - - - - - Nummerntyp - IdType - - IdType - - - - - Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. - TBD - - - - - - - DocumentId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - - - - - - DocumentId - Dokumenten-Nummer - - DocumentId - - - - - Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. - TBD - - - - - - - DocumentDomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - - - - - - DocumentDomainId - DocumentDomainId - - DocumentDomainId - - - - - Kennung oder Kennzeichen einer Domäne - TBD - - - - - - - VDI2770_Role - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - - - - - - Rolle - Role - - Role - - - - - Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) - TBD - - - - - - - VDI2770_OrganisationId - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - - - - - - Organisation ID - Organisation ID - - OrganisationId - - - - - eindeutige ID für die Organisation - TBD - - - - - - - VDI2770_OrganisationName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - - - - - - OrganisationName - OrganisationName - - OrganisationName - - - - - gebräuchliche Bezeichnung für die Organisation - TBD - - - - - - - VDI2770_OrganisationOfficialName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - - - - - - Offizieller Name der Organisation - Organisation Official Name - - OrganisationOfficialName - - - - - offizieller Name der Organisation - TBD - - - - - - - VDI2770_Description - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - - - - - - Beschreibung - Description - - Description - - - - - Beschreibung für die nächste übergeordnete Collection - TBD - - - - - - - DocumentPartId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - - - - - - Dokumenten-Teilnummer - DocumentPartId - - DocumentPartId - - - - - Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. - TBD - - - - - - - DocumentClassification_ClassId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - - - - Dokumentkategorie - Document category - - DocCategory - - - - - Dokumentkategorie nach VDI 2770:2018/10 - Document category after VDI 2770:2018/10 - - - - - - - VDI2770_ClassName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - - - - - - Klassenname - Class Name - - ClassName - - - - - Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. - TBD - - - - - - - VDI2770_ClassificationSystem - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - - - - - - Klassifizierungssystem - classification system - - ClassificationSystem - - - - - Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. - TBD - - - - - - - DocumentVersionId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - - - - - - Dokumenten-Versionsnummer - DocumentVersionId - - DocumentVersionId - - - - - Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. - TBD - - - - - - - DocumentVersion_LanguageCode - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - - - - - - Sprachenschlüssel - LanguageCode - - LanguageCode - - - - - Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 - TBD - - - - - - - VDI2770_Title - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - - - - - - Titel - Title - - VDI2770_Title - - - - - sprachabhängiger Titel des Dokuments - TBD - - - - - - - VDI2770_Summary - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - - - - - - Zusammenfassung - Summary - - Summary - - - - - sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts - TBD - - - - - - - VDI2770_Keywords - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - - - - - - Schlagwörter - Keywords - - Keywords - - - - - sprachabhängige, durch Komma getrennte Liste von Schlagwörtern - TBD - - - - - - - VDI2770_StatusValue - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - - - - - - Statuswert - StatusValue - - StatusValue - - - - - Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) - TBD - - - - - - - VDI2770_SetDate - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - - - - - - Erstellungsdatum - Set Date - - SetDate - - - - - Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). - TBD - - - - - - - VDI2770_Purpose - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - - - - - - Zweck - Purpose - - Purpose - - - - - Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. - TBD - - - - - - - VDI2770_BasedOnProcedure - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - - - - - - Prozedur - Procedure - - BasedOnProcedure - - - - - textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt - TBD - - - - - - - VDI2770_Comments - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - - - - - - Kommentar - Comments - - Comments - - - - - textuelle Bemerkungen und Anmerkungen zum Status - TBD - - - - - - - VDI2770_ReferencedObject_Type - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - - - - - - Typ - Type - - Type - - - - - Für Type des Objekts muss immer Product angegeben werden. - TBD - - - - - - - VDI2770_ReferencedObject_RefType - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - - - - - - RefType - RefType - - RefType - - - - - Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) - TBD - - - - - - - VDI2770_ReferencedObject_ObjectId - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - - - - - - ObjectId - ObjectId - - ObjectId - - - - - Angabe der Identifikationsnummer zum Objekt - TBD - - - - - - - VDI2770_FileId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - - - - - - ID der Datei - File ID - - FileId - - - - - eindeutige ID für die Datei - TBD - - - - - - - VDI2770_FileName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - - - - - - Dateiname - File name - - FileName - - - - - Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. - Filename - - - - - - - VDI2770_FileFormat - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - - - - - - Datei Format - File format - - FileFormat - - - - - Angabe eines Media Typs gemäß der Liste der IANA - TBD - - - - - - - ULMarkingPresent - 0173-1#02-AAW723#001 - - - 1 - - - - - - - - - UL-Listing vorhanden - UL listing present - - UlLisPre - - - BOOLEAN - - Indiz und Bestätigung für das Vorhandensein von erforderlichen, zweckentsprechenden Eigenschaften (z. B. in Form einer Plakette, einer (Konformitäts-)Bescheinigung, eines Zertifikats, eines Prüfprotokolls für Bauartprüfung, etc.) / Zulassung und Zertifizierung durch Underwriter's Laboratories (alphabetische Kennzeichnung von Herstellern und Lieferanten innerhalb bestimmter Produktgruppen), dass Produkte spezifischen UL-Vorschriften (UL-Style für Material und Produkteigenschaften, NEC-Type für Flammtest und Einsatzbereich) entsprechen - Indication and acknowledgment of the existence of necessary, appropriate characteristics (eg in the form of a plaque, a (conformity) certificate, a certificate, a test report for type examination, etc.) / Approval and certification by Underwriter's Laboratories (alphabetical identification of Manufacturers and suppliers within certain product groups) that products conform to specific UL regulations (UL style for material and product characteristics, NEC type for flame test and application) - - - - - - - 0173-1#02-AAW723#001 - - - - - Email - https://www.hsu-hh.de/aut/aas/email - - - - - - - - Emailadresse - Email address - - Email - - - - - Emailadresse - Email address - - - - - - - PhoneNumber - 0173-1#02-AAO136#002 - - - - - - - - Telefonnummer - telephone number - - Phone - - - - - vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist - complete telephone number to be called to reach a business partner - - - - - - - Fax - https://www.hsu-hh.de/aut/aas/fax - - - - - - - - Fax - Fax - - Fax - - - - - Faxnummer - Fax number - - - - - - - 0173-1#02-AAO136#002 - - - - - ContactInfo_Role - https://www.hsu-hh.de/aut/aas/role - - - - - - - - Rolle - Role - - Role - - - - - Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt - Information to specify the role which the organisation of ContactInfo plays - - - - - - - Street - 0173-1#02-AAO128#001 - - - - - - - - Strasse - Street - - Street - - - - - Name der Strasse und Hausnummer - Street name and house number - - - - - - - OrganisationContactInfo - https://www.hsu-hh.de/aut/aas/contactinfo - - - - - - - - Contact Info - Kontakt Info - - OrganisationContactInfo - - - - - Sammlung für die allgemeinen Kontaktdaten - Collection for general contact data - - - - - - - CompanyLogo - https://www.hsu-hh.de/aut/aas/companylogo - - - - - - - - Firmenlogo - CompanyLogo - - CompanyLogo - - - - - Firmenlogo - CompanyLogo - - - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/16_Lenze.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/16_Lenze.aasx.xml deleted file mode 100644 index 1b7e52fd8..000000000 --- a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/16_Lenze.aasx.xml +++ /dev/null @@ -1,4017 +0,0 @@ - - - - - Lenze_i950 - http://digital.lenze.com/aas/1/1/1616441908732837000002 - - - http://digital.lenze.com/asset/YVSBRHHZADF - - - - - - www.company.com/ids/sm/4343_5072_7091_3242 - - - - - www.company.com/ids/sm/2543_5072_7091_2660 - - - - - www.company.com/ids/sm/6053_5072_7091_5102 - - - - - www.company.com/ids/sm/6563_5072_7091_4267 - - - - - - - - - i950 - http://digital.lenze.com/asset/YVSBRHHZADF - Instance - - - - - Nameplate - www.company.com/ids/sm/4343_5072_7091_3242 - - - https://www.hsu-hh.de/aut/aas/nameplate - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Lenze Automation GmbH - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - i950 Inverter - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Hans-Lenze-Strasse 1 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 31855 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Aerzen - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Niedersachsen - - - - false - false - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 1616441908732837000002 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - ProductCountryOfOrigin - PARAMETER - - - 0173-1#02-AAO841#001 - - - Instance - - string - DE - - - - - YearOfConstruction - PARAMETER - - - 0173-1#02-AAP906#001 - - - Instance - - string - 2019 - - - - - Marking_CE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/marking_ce.png - - - - false - false - - - - - Marking_UL - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/UL_Mark.png - - - - false - false - - - - - - Document - www.company.com/ids/sm/2543_5072_7091_2660 - - - https://www.hsu-hh.de/aut/aas/document - - - Instance - - - - - DeclarationCEMarking - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Lenze - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Lenze Automation GmbH - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - EU-Konformitätserklärung - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - EU_Declaration_of_Conformity.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/EU_Declaration_of_Conformity.pdf - - - - false - false - - - - - DeclarationULMarking - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Lenze - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Lenze Automation GmbH - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - UL-Approbation - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - UL-Approbation_Servoumrichter_i950_xx.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/UL-Approbation_Servoumrichter_i950_xx.pdf - - - - false - false - - - - - - Service - www.company.com/ids/sm/6053_5072_7091_5102 - - - https://www.hsu-hh.de/aut/aas/service - - - Instance - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Lenze Service GmbH - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Breslauer Strasse 3 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 32699 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Extertal - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - NRW - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - service.de@lenze.com - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.lenze.com/de-de/service/ - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +49 515482-3000 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - - - - - - false - false - - - - - - Identification - www.company.com/ids/sm/6563_5072_7091_4267 - - - https://www.hsu-hh.de/aut/aas/identification - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Lenze Automation GmbH - - - - - GLNOfManufacturer - PARAMETER - - - 0173-1#02-AAY812#001 - - - Instance - - - - - - - - SupplierOfTheIdentifier - - - 0173-1#02-AAP796#004 - - - Instance - - - - - - - - MAN_PROD_NUM - - - 0173-1#02-AAO676#003 - - - Instance - - - - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - Servoumrichter i950 - - - - - ManufacturerProductDescription - PARAMETER - - - 0173-1#02-AAU734#001 - - - Instance - - string - Servoumrichter - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - - - - - - GLNOfSupplier - PARAMETER - - - 0173-1#02-AAY813#001 - - - Instance - - - - - - - - SupplierIdProvider - PARAMETER - - - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - Instance - - - - - - - - SUP_PROD_NUM - PARAMETER - - - 0173-1#02-AAO736#004 - - - Instance - - - - - - - - SupplierProductDesignation - - - 0173-1#02-AAM551#002 - - - Instance - - string - - - - - - SupplierProductDescription - PARAMETER - - - 0173-1#02-AAU730#001 - - - Instance - - string - - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - - - - - - ClassificationSystem - PARAMETER - - - 0173-1#02-AAO715#002 - - - Instance - - string - eclass - - - - - SecondaryKeyTyp - - - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - Instance - - - - - - - - TypThumbnail - PARAMETER - - - www.company.com/ids/cd/4401_1272_7091_3437 - - - Instance - - image/jpeg - /aasx/Identification/thumbnail.jpeg - - - - - AssetId - PARAMETER - - - https://www.hsu-hh.de/aut/aas/assetid - - - Instance - - string - http://digital.lenze.com/asset/YVSBRHHZADF - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 1616441908732837000002 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - SecondaryKeyInstance - PARAMETER - - - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - Instance - - - - - - - - DateOfManufacture - PARAMETER - - - 0173-1#02-AAR972#002 - - - Instance - - - - - - - - DeviceRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/devicerevision - - - Instance - - - - - - - - SoftwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/softwarerevision - - - Instance - - - - - - - - HardwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - Instance - - - - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Lenze Automation GmbH - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Hans-Lenze-Strasse 1 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 31855 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Aerzen - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Niedersachsen - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - service.de@lenze.com - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.lenze.com - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +49 515482-3000 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - - - - - - false - false - - - - - CompanyLogo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/companylogo - - - Instance - - image/png - /aasx/Identification/logo.png - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.lenze.com/de-de/produkte/umrichter/schaltschrankeinbau/servoumrichter-i950/ - - - - - - - - ManufacturerName - 0173-1#02-AAO677#002 - - - - - - - - Herstellername - Manufacturer Name - - Manufacturer Name - - - - - Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist - 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 - - - - - - - ManufacturerProductDesignation - 0173-1#02-AAW338#001 - - - - - - - - Manufacturer product designation - Herstellerproduktbezeichnung - - ManufacturerTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - PhysicalAddress - https://www.hsu-hh.de/aut/aas/physicaladdress - - - - - - - - PhysicalAddress - Physische Adresse - - PhysicalAddress - - - - - Sammlung für reale physische Adresse - Collection for real physical address - - - - - - - CountryCode - 0173-1#02-AAO730#001 - - - - - - - - - - - - Landeskennung - Country code - - Country code - - - - - Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes - agreed upon symbol for unambiguous identification of a country - - - - - - - Street - 0173-1#02-AAO128#001 - - - - - - - - Strasse - Street - - Street - - - - - Name der Strasse und Hausnummer - Street name and house number - - - - - - - Zip - 0173-1#02-AAO129#002 - - - - - - - - Zip - Postleitzahl - - PostalCode - - - - - ZIP code of address - Postleitzahl der Anschrift - - - - - - - CityTown - 0173-1#02-AAO132#001 - - - - - - - - Ort - City/town - - City/town - - - - - Town or city of the company - Ortsangabe - - - - - - - StateCounty - 0173-1#02-AAO133#002 - - - - - - - - state/county - Bundesland - - StateCounty - - - - - Bundesland - state/county - - - - - - - ManufacturerProductFamily - 0173-1#02-AAU731#001 - - - - - - - - Manufacturer product family - Herstellerproduktfamilie - - TypClass - - - - - 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie - 2nd level of a 3 level manufacturer specific product hierarchy - - - - - - - SerialNumber - 0173-1#02-AAM556#002 - - - - - - - - Serial number - Seriennummer - - InstanceId - - - - - eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist - unique combination of numbers and letters used to identify the device once it has been manufactured - - - - - - - BatchNumber - 0173-1#02-AAQ196#001 - - - - - - - - Batch number - Chargen-Nummer - - ChargeId - - - - - Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge - Number assigned by the manufacturer of a material to identify the manufacturer's batch - - - - - - - ProductCountryOfOrigin - 0173-1#02-AAO841#001 - - - - - - - - Produkt Ursprungsland - Product country of origin - - CountryOfOrigin - - - - - Land in dem das Produkt hergestellt wurde (Hersteller Land) - Country in which the product is manufactured (manufacturer country) - - - - - - - YearOfConstruction - 0173-1#02-AAP906#001 - - - - - - - - Year of construction - Baujahr - - YearOfConstruction - - - - - Jahreszahl als Datumsangabe für die Fertigstellung des Objektes - Year as completion date of object - - - - - - - ProductMarking - https://www.hsu-hh.de/aut/aas/productmarking - - - - - - - - Produktkennzeichnung - Product Marking - - ProductMarking - - - - - Sammlungsdatei für Produktkennzeichnung - Collection file for product marking - - - - - - - CEQualificationPresent - 0173-1#02-BAF053#008 - - - - - - - - CE-Kennzeichnung vorhanden - CE- qualification present - - CEMarkingPresent - - - BOOLEAN - - whether CE- qualification is present - Angabe, ob CE-Kennzeichnung vorhanden ist - - - - - - - File - 0173-1#02-AAD005#008 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Enthaltene Doku. Datei - Embedded Doc. file - - File - - - - - Verweis/ BLOB auf enthaltene Dokumentations-Datei. - Reference/ BLOB to embedded documentation file. - - - - - - - DocumentationItem - 0173-1#02-AAD001#001 - - - - - - - - Dokumentationsgruppe - Documentation item - - DocumentationItem - - - - - Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. - Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. - - - - - - - DocumentType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - - - - - - Dokumententyp - Document Type - - DocumentType - - - - - Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) - TBD - - - - - - - VDI2770_DomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - - - - - - Domain-Nummer - DomainId - - DomainId - - - - - Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. - TBD - - - - - - - VDI2770_IdType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - - - - - - Nummerntyp - IdType - - IdType - - - - - Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. - TBD - - - - - - - DocumentId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - - - - - - DocumentId - Dokumenten-Nummer - - DocumentId - - - - - Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. - TBD - - - - - - - DocumentDomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - - - - - - DocumentDomainId - DocumentDomainId - - DocumentDomainId - - - - - Kennung oder Kennzeichen einer Domäne - TBD - - - - - - - VDI2770_Role - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - - - - - - Rolle - Role - - Role - - - - - Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) - TBD - - - - - - - VDI2770_OrganisationId - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - - - - - - Organisation ID - Organisation ID - - OrganisationId - - - - - eindeutige ID für die Organisation - TBD - - - - - - - VDI2770_OrganisationName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - - - - - - OrganisationName - OrganisationName - - OrganisationName - - - - - gebräuchliche Bezeichnung für die Organisation - TBD - - - - - - - VDI2770_OrganisationOfficialName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - - - - - - Offizieller Name der Organisation - Organisation Official Name - - OrganisationOfficialName - - - - - offizieller Name der Organisation - TBD - - - - - - - VDI2770_Description - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - - - - - - Beschreibung - Description - - Description - - - - - Beschreibung für die nächste übergeordnete Collection - TBD - - - - - - - DocumentPartId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - - - - - - Dokumenten-Teilnummer - DocumentPartId - - DocumentPartId - - - - - Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. - TBD - - - - - - - DocumentClassification_ClassId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - - - - Dokumentkategorie - Document category - - DocCategory - - - - - Dokumentkategorie nach VDI 2770:2018/10 - Document category after VDI 2770:2018/10 - - - - - - - VDI2770_ClassName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - - - - - - Klassenname - Class Name - - ClassName - - - - - Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. - TBD - - - - - - - VDI2770_ClassificationSystem - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - - - - - - Klassifizierungssystem - classification system - - ClassificationSystem - - - - - Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. - TBD - - - - - - - DocumentVersionId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - - - - - - Dokumenten-Versionsnummer - DocumentVersionId - - DocumentVersionId - - - - - Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. - TBD - - - - - - - DocumentVersion_LanguageCode - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - - - - - - Sprachenschlüssel - LanguageCode - - LanguageCode - - - - - Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 - TBD - - - - - - - VDI2770_Title - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - - - - - - Titel - Title - - VDI2770_Title - - - - - sprachabhängiger Titel des Dokuments - TBD - - - - - - - VDI2770_Summary - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - - - - - - Zusammenfassung - Summary - - Summary - - - - - sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts - TBD - - - - - - - VDI2770_Keywords - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - - - - - - Schlagwörter - Keywords - - Keywords - - - - - sprachabhängige, durch Komma getrennte Liste von Schlagwörtern - TBD - - - - - - - VDI2770_StatusValue - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - - - - - - Statuswert - StatusValue - - StatusValue - - - - - Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) - TBD - - - - - - - VDI2770_SetDate - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - - - - - - Erstellungsdatum - Set Date - - SetDate - - - - - Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). - TBD - - - - - - - VDI2770_Purpose - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - - - - - - Zweck - Purpose - - Purpose - - - - - Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. - TBD - - - - - - - VDI2770_BasedOnProcedure - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - - - - - - Prozedur - Procedure - - BasedOnProcedure - - - - - textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt - TBD - - - - - - - VDI2770_Comments - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - - - - - - Kommentar - Comments - - Comments - - - - - textuelle Bemerkungen und Anmerkungen zum Status - TBD - - - - - - - VDI2770_ReferencedObject_Type - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - - - - - - Typ - Type - - Type - - - - - Für Type des Objekts muss immer Product angegeben werden. - TBD - - - - - - - VDI2770_ReferencedObject_RefType - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - - - - - - RefType - RefType - - RefType - - - - - Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) - TBD - - - - - - - VDI2770_ReferencedObject_ObjectId - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - - - - - - ObjectId - ObjectId - - ObjectId - - - - - Angabe der Identifikationsnummer zum Objekt - TBD - - - - - - - VDI2770_FileId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - - - - - - ID der Datei - File ID - - FileId - - - - - eindeutige ID für die Datei - TBD - - - - - - - VDI2770_FileName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - - - - - - Dateiname - File name - - FileName - - - - - Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. - TBD - - - - - - - VDI2770_FileFormat - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - - - - - - Datei Format - File format - - FileFormat - - - - - Angabe eines Media Typs gemäß der Liste der IANA - TBD - - - - - - - OrganisationContactInfo - https://www.hsu-hh.de/aut/aas/contactinfo - - - - - - - - Contact Info - Kontakt Info - - OrganisationContactInfo - - - - - Sammlung für die allgemeinen Kontaktdaten - Collection for general contact data - - - - - - - NameOfSupplier - 0173-1#02-AAO735#003 - - - - - - - - - - - - name of supplier - Lieferantenname - - name of supplier - - - - - Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt - name of supplier which provides the customer with a product or a service - - - - - - - ContactInfo_Role - https://www.hsu-hh.de/aut/aas/role - - - - - - - - Rolle - Role - - Role - - - - - Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt - Information to specify the role which the organisation of ContactInfo plays - - - - - - - Email - https://www.hsu-hh.de/aut/aas/email - - - - - - - - Emailadresse - Email address - - Email - - - - - Emailadresse - Email address - - - - - - - URL - 0173-1#02-AAO694#001 - - - - - - - - Internetadresse - Internet address - - URL - - - - - stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html - Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html - - - - - - - PhoneNumber - 0173-1#02-AAO136#002 - - - - - - - - Telefonnummer - telephone number - - Phone - - - - - vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist - complete telephone number to be called to reach a business partner - - - - - - - Fax - https://www.hsu-hh.de/aut/aas/fax - - - - - - - - Fax - Fax - - Fax - - - - - Faxnummer - Fax number - - - - - - - 0173-1#02-AAO136#002 - - - - - GLNOfManufacturer - 0173-1#02-AAY812#001 - - - - - - - - GLN of manufacturer - GLN des Herstellers - - GLN of manufacturer - - - - - international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort - internationally unique identification number for the manufacturer of the device or the product and for the physical location - - - - - - - SupplierOfTheIdentifier - 0173-1#02-AAP796#004 - - - - - - - - Supplier of the identifier - Anbieter der Identifikationsnummer für Hersteller - - Supplier of the identifier - - - STRING_TRANSLATABLE - - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - - - - - - - MAN_PROD_NUM - - product article number of manufacturer - - 0173-1#02-AAO676#003 - - - - - - - - product article number of manufacturer - Herstellerartikelnummer - - MAN_PROD_NUM - - - STRING_TRANSLATABLE - - eindeutiger Bestellschlüssel des Herstellers - unique product identifier of the manufacturer - - - - - - - ManufacturerProductDescription - 0173-1#02-AAU734#001 - - - - - - - - Manufacturer product description - Herstellerproduktbeschreibung - - Manufacturer product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - GLNOfSupplier - 0173-1#02-AAY813#001 - - - - - - - - GLN of supplier - GLN des Lieferanten - - GLN of supplier - - - - - international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort - internationally unique identification number for the supplier of the device or the product and for the physical location - - - - - - - SupplierIdProvider - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - - - - - - SupplierIdProvider - Anbieter der Identifikationsnummer - - SupplierIdProvider - - - STRING_TRANSLATABLE - - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - - - - - - - SUP_PROD_NUM - 0173-1#02-AAO736#004 - - - - - - - - product article number of supplier - Lieferantenartikelnummer - - product article number of supplier - - - - - eindeutiger Bestellschlüssel des Lieferanten - unique product order identifier of the supplier - - - - - - - SupplierProductDesignation - 0173-1#02-AAM551#002 - - - - - - - - Supplier product designation - Lieferantenproduktbezeichnung - - SupplierTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - SupplierProductDescription - 0173-1#02-AAU730#001 - - - - - - - - Supplier product description - Lieferantenproduktbeschreibung - - Supplier product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - ClassificationSystem - 0173-1#02-AAO715#002 - - - - - - - - classification system - Klassifizierungssystem - - ClassificationSystem - - - - - Klassifizierungssystem - Classification System - - - - - - - SecondaryKeyTyp - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - - - - - - SecondaryKeyTyp - Typnummer des IT Systems - - SecondaryKeyTyp - - - - - Führende technische ID im IT System des Typs - SecondaryKeyTyp - - - - - - - TypThumbnail - www.company.com/ids/cd/4401_1272_7091_3437 - - - - - - - - TypThumbnail - Vorschaubild - - TypThumbnail - - - - - Darstellung des Produkttyps in kleinem Format - Small picture of the product type - - - - - - - AssetId - https://www.hsu-hh.de/aut/aas/assetid - - - - - - - - AssetId - Asset ID - - AssetId - - - - - Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. - Global unique ID of an asset, which can be read by both human and machine. - - - - - - - SecondaryKeyInstance - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - - - - - - SecondaryKeyInstance - Instanznummer des IT Systems - - SecondaryKeyInstance - - - - - Führende technische ID im IT System der Instanz - SecondaryKeyInstance - - - - - - - DateOfManufacture - 0173-1#02-AAR972#002 - - - - - - - - Date of manufacture - Herstellungsdatum - - Date of manufacture - - - DATE - - Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist - Date from which the production and / or development process is completed or from which a service is provided completely - - - - - - - DeviceRevision - https://www.hsu-hh.de/aut/aas/devicerevision - - - - - - - - DeviceRevision - DeviceRevision - - DeviceRevision - - - - - DeviceRevision - DeviceRevision - - - - - - - SoftwareRevision - https://www.hsu-hh.de/aut/aas/softwarerevision - - - - - - - - SoftwareRevision - SoftwareRevision - - SoftwareRevision - - - - - SoftwareRevision - SoftwareRevision - - - - - - - HardwareRevision - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - - - - - - HardwareRevision - HardwareRevision - - HardwareRevision - - - - - HardwareRevision - HardwareRevision - - - - - - - QrCode - https://www.hsu-hh.de/aut/aas/qrcode - - - - - - - - QrCode - QrCode - - QrCode - - - - - In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. - QrCode - - - - - - - CompanyLogo - https://www.hsu-hh.de/aut/aas/companylogo - - - - - - - - Firmenlogo - CompanyLogo - - CompanyLogo - - - - - Firmenlogo - CompanyLogo - - - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/17_ABB.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/17_ABB.aasx.xml deleted file mode 100644 index cba1293c8..000000000 --- a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/17_ABB.aasx.xml +++ /dev/null @@ -1,4777 +0,0 @@ - - - - - ABB_TTF_300 - www.abb.com/8055_9070_1191_2593 - - - www.abb.com/8055_9070_1191_2593 - - - - - https://productid.abb.com/9AAC129110?sn=3K650000548505 - - - - - - www.abb.com/ids/4834_5472_7091_3242 - - - - - www.company.com/ids/sm/2543_5072_7091_2660 - - - - - www.company.com/ids/sm/6053_5072_7091_5102 - - - - - www.company.com/ids/sm/6563_5072_7091_4267 - - - - - www.abb.com/ids/6113_5160_1191_8063 - - - - - www.abb.com/ids/0212_0171_1391_2237 - - - - - www.abb.com/ids/3213_0170_1192_3931 - - - - - - - - - instanceAsset - https://productid.abb.com/9AAC129110?sn=3K650000548505 - Instance - - - www.abb.com/sm/1433_0170_1191_4089 - - - - - - - Nameplate - www.abb.com/ids/4834_5472_7091_3242 - - - https://www.hsu-hh.de/aut/aas/nameplate - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - ABB Automation Products GmbH - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - TTF 300 - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Stierstadterstrasse 5 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 60488 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Frankfurt - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Hessen - - - - false - false - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - Temperature transmitter - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 3K650000548505 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - ProductCountryOfOrigin - PARAMETER - - - 0173-1#02-AAO841#001 - - - Instance - - string - DE - - - - - YearOfConstruction - PARAMETER - - - 0173-1#02-AAP906#001 - - - Instance - - integer - 2019 - - - - - Marking_CE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/marking_ce.png - - - - false - false - - - - - - Document - www.company.com/ids/sm/2543_5072_7091_2660 - - - https://www.hsu-hh.de/aut/aas/document - - - Instance - - - - - DeclarationCEMarking - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - CE_TTX300_TTX200_ATEX_2016X - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - ABB - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - ABB Automation Products GmbH - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - EU-Konformitätserklärung - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - CE_TTX300_TTX200_ATEX_2016X-DE.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/CE_TTX300_TTX200_ATEX_2016X-DE.pdf - - - - false - false - - - - - ManualDE - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - OI/TTF300 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - ABB - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - ABB Automation Products GmbH - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Operation (EN) Bedienung (DE) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - G - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Betriebsanleitung - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - OI_TTF300_DE_G01.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/OI_TTF300_DE_G01.pdf - - - - false - false - - - - - ManualEN - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - OI/TTF300 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - ABB - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - ABB Automation Products GmbH - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Operation (EN) Bedienung (DE) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - G - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Manual - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - OI_TTF300_EN_G01.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/OI_TTF300_EN_G01.pdf - - - - false - false - - - - - - Service - www.company.com/ids/sm/6053_5072_7091_5102 - - - https://www.hsu-hh.de/aut/aas/service - - - Instance - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - ABB AG - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Schillerstr. 72 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 32423 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Minden - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Nordrhein-Westfalen - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - contact.center@de.abb.com - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - string - https://new.abb.com/service - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +496213813333 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - - - - - false - false - - - - - - Identification - www.company.com/ids/sm/6563_5072_7091_4267 - - - https://www.hsu-hh.de/aut/aas/identification - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - ABB Automation Products GmbH - - - - - GLNOfManufacturer - PARAMETER - - - 0173-1#02-AAY812#001 - - - Instance - - string - - - - - - SupplierOfTheIdentifier - - - 0173-1#02-AAP796#004 - - - Instance - - - - - - - - MAN_PROD_NUM - - - 0173-1#02-AAO676#003 - - - Instance - - - - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - Field mounted temperature transmitters - - - - - ManufacturerProductDescription - PARAMETER - - - 0173-1#02-AAU734#001 - - - Instance - - langString - For enhanced (e.g. redundancy) field mounting application with 4 to 20 mA HART, PROFIBUS and FOUNDATION Fieldbus communication. With and without LCD display including device configurability. Also available with Ex-approvals and SIL declaration of conformity. - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - ABB Automation Products GmbH - - - - - GLNOfSupplier - PARAMETER - - - 0173-1#02-AAY813#001 - - - Instance - - string - - - - - - SupplierIdProvider - PARAMETER - - - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - Instance - - - - - - - - SUP_PROD_NUM - PARAMETER - - - 0173-1#02-AAO736#004 - - - Instance - - - TTF300.Y0C4F - - - - - SupplierProductDesignation - - - 0173-1#02-AAM551#002 - - - Instance - - string - Field mounted temperature transmitters - - - - - SupplierProductDescription - PARAMETER - - - 0173-1#02-AAU730#001 - - - Instance - - langString - For enhanced (e.g. redundancy) field mounting application with 4 to 20 mA HART, PROFIBUS and FOUNDATION Fieldbus communication. With and without LCD display including device configurability. Also available with Ex-approvals and SIL declaration of conformity. - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - string - Temperature transmitter - - - - - ClassificationSystem - PARAMETER - - - 0173-1#02-AAO715#002 - - - Instance - - string - eclass - - - - - SecondaryKeyTyp - - - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - Instance - - - - - - - - TypThumbnail - PARAMETER - - - https://www.hsu-hh.de/aut/aas/thumbnail - - - Instance - - image/jpeg - /thumbnail.jpg - - - - - AssetId - PARAMETER - - - https://www.hsu-hh.de/aut/aas/assetid - - - Instance - - anyURI - www.company.com/ids/asset/8220_6010_8091_3593 - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 3K650000548505 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - SecondaryKeyInstance - PARAMETER - - - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - Instance - - - - - - - - DateOfManufacture - PARAMETER - - - 0173-1#02-AAR972#002 - - - Instance - - date - 2018-12-20 - - - - - DeviceRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/devicerevision - - - Instance - - - - - - - - SoftwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/softwarerevision - - - Instance - - - 01.01.05 - - - - - HardwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - Instance - - - 01.00.02 - - - - - QrCode - PARAMETER - - - https://www.hsu-hh.de/aut/aas/qrcode - - - Instance - - image/jpeg - /aasx/QR_9AAC129110_3K650000548505.png - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - ABB Automation Products GmbH - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - langString - Wallstadter Straße 59 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 68526 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Ladenburg - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Baden-Württemberg - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - contact.center@de.abb.com - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.abb.com - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +49 621 381 3333 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - - - - - false - false - - - - - CompanyLogo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/companylogo - - - Instance - - image/png - /aasx/ABB_Logo_320.png - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://productid.abb.com/9AAC129110?sn=3K650000548505 - - - - - - AssetIdentification - www.abb.com/ids/6113_5160_1191_8063 - - - https://www.hsu-hh.de/aut/aas/assetidentification - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - ABB Automation Products GmbH - - - - - Brand - CONSTANT - - - 0173-1#02-AAO742#002 - - - Instance - - string - TTF300 - - - - - SUP_PROD_NUM - PARAMETER - - - 0173-1#02-AAO736#004 - - - Instance - - - TTF300.Y0C4F - - - - - EclassClassification - CONSTANT - - - - https://www.eclasscontent.com/index.php?action=det&id=27200208 - - - Instance - - - 27-20-02-08 - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 3K650000548505 - - - - - InstallationID - - - - https://www.abb.com/servIS/installationID - - - Instance - - - 9AAK619994K8957 - - - - - DeliveryDate - - - - https://www.abb.com/servIS/deliveryDate - - - Instance - - - 2018-12-20 - - - - - - CertificatesAndDeclarations - - www.abb.com/ids/0212_0171_1391_2237 - - - https://www.hsu-hh.de/aut/aas/certificatesanddeclarations - - - Instance - - - - - AdditionalLinkAddress - - - 0173-1#02-AAE670#003 - - - Instance - - anyURI - https://share.library.abb.com/api/v4?cid=9AAC129110&dk=Certificate - - - - - - TechnicalData - - www.abb.com/ids/3213_0170_1192_3931 - - - https://www.hsu-hh.de/aut/aas/technicaldata - - - Instance - - - - - Weight - - - - 0173-1#02-AAB713#005 - - - Instance - - - 1.2 - - - - - - - - ManufacturerName - 0173-1#02-AAO677#002 - - - - - - - - Herstellername - Manufacturer Name - - Manufacturer Name - - - - - Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist - 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 - - - - - - - ManufacturerProductDesignation - 0173-1#02-AAW338#001 - - - - - - - - Manufacturer product designation - Herstellerproduktbezeichnung - - ManufacturerTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - PhysicalAddress - https://www.hsu-hh.de/aut/aas/physicaladdress - - - - - - - - PhysicalAddress - Physische Adresse - - PhysicalAddress - - - - - Sammlung für reale physische Adresse - Collection for real physical address - - - - - - - CountryCode - 0173-1#02-AAO730#001 - - - - - - - - - - - - Landeskennung - Country code - - Country code - - - - - Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes - agreed upon symbol for unambiguous identification of a country - - - - - - - Street - 0173-1#02-AAO128#001 - - - - - - - - Strasse - Street - - Street - - - - - Name der Strasse und Hausnummer - Street name and house number - - - - - - - Zip - 0173-1#02-AAO129#002 - - - - - - - - Zip - Postleitzahl der Anschrift - - PostalCode - - - - - ZIP code of address - Postleitzahl der Anschrift - - - - - - - CityTown - 0173-1#02-AAO132#001 - - - - - - - - Ort - City/town - - City/town - - - - - Town or city of the company - Ortsangabe - - - - - - - StateCounty - 0173-1#02-AAO133#002 - - - - - - - - state/county - Bundesland - - StateCounty - - - - - Bundesland - state/county - - - - - - - ManufacturerProductFamily - 0173-1#02-AAU731#001 - - - - - - - - Manufacturer product family - Herstellerproduktfamilie - - TypClass - - - - - 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie - 2nd level of a 3 level manufacturer specific product hierarchy - - - - - - - SerialNumber - 0173-1#02-AAM556#002 - - - - - - - - Serial number - Seriennummer - - InstanceId - - - - - eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist - unique combination of numbers and letters used to identify the device once it has been manufactured - - - - - - - BatchNumber - 0173-1#02-AAQ196#001 - - - - - - - - Batch number - Chargen-Nummer - - ChargeId - - - - - Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge - Number assigned by the manufacturer of a material to identify the manufacturer's batch - - - - - - - ProductCountryOfOrigin - 0173-1#02-AAO841#001 - - - - - - - - Produkt Ursprungsland - Product country of origin - - CountryOfOrigin - - - - - Land in dem das Produkt hergestellt wurde (Hersteller Land) - Country in which the product is manufactured (manufacturer country) - - - - - - - YearOfConstruction - 0173-1#02-AAP906#001 - - - - - - - - Year of construction - Baujahr - - YearOfConstruction - - - - - Jahreszahl als Datumsangabe für die Fertigstellung des Objektes - Year as completion date of object - - - - - - - ProductMarking - https://www.hsu-hh.de/aut/aas/productmarking - - - - - - - - Produktkennzeichnung - Product Marking - - ProductMarking - - - - - Sammlungsdatei für Produktkennzeichnung - Collection file for product marking - - - - - - - CEQualificationPresent - 0173-1#02-BAF053#008 - - - - - - - - CE-Kennzeichnung vorhanden - CE- qualification present - - CEMarkingPresent - - - BOOLEAN - - whether CE- qualification is present - Angabe, ob CE-Kennzeichnung vorhanden ist - - - - - - - File - 0173-1#02-AAD005#008 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Enthaltene Doku. Datei - Embedded Doc. file - - File - - - - - Verweis/ BLOB auf enthaltene Dokumentations-Datei. - Reference/ BLOB to embedded documentation file. - - - - - - - DocumentationItem - 0173-1#02-AAD001#001 - - - - - - - - Dokumentationsgruppe - Documentation item - - DocumentationItem - - - - - Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. - Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. - - - - - - - DocumentType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - - - - - - Dokumententyp - Document Type - - DocumentType - - - - - Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) - TBD - - - - - - - VDI2770_DomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - - - - - - Domain-Nummer - DomainId - - DomainId - - - - - Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. - TBD - - - - - - - VDI2770_IdType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - - - - - - Nummerntyp - IdType - - IdType - - - - - Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. - TBD - - - - - - - DocumentId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - - - - - - DocumentId - Dokumenten-Nummer - - DocumentId - - - - - Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. - TBD - - - - - - - DocumentDomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - - - - - - DocumentDomainId - DocumentDomainId - - DocumentDomainId - - - - - Kennung oder Kennzeichen einer Domäne - TBD - - - - - - - VDI2770_Role - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - - - - - - Rolle - Role - - Role - - - - - Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) - TBD - - - - - - - VDI2770_OrganisationId - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - - - - - - Organisation ID - Organisation ID - - OrganisationId - - - - - eindeutige ID für die Organisation - TBD - - - - - - - VDI2770_OrganisationName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - - - - - - OrganisationName - OrganisationName - - OrganisationName - - - - - gebräuchliche Bezeichnung für die Organisation - TBD - - - - - - - VDI2770_OrganisationOfficialName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - - - - - - Offizieller Name der Organisation - Organisation Official Name - - OrganisationOfficialName - - - - - offizieller Name der Organisation - TBD - - - - - - - VDI2770_Description - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - - - - - - Beschreibung - Description - - Description - - - - - Beschreibung für die nächste übergeordnete Collection - TBD - - - - - - - DocumentPartId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - - - - - - Dokumenten-Teilnummer - DocumentPartId - - DocumentPartId - - - - - Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. - TBD - - - - - - - DocumentClassification_ClassId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - - - - Dokumentkategorie - Document category - - DocCategory - - - - - Dokumentkategorie nach VDI 2770:2018/10 - Document category after VDI 2770:2018/10 - - - - - - - VDI2770_ClassName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - - - - - - Klassenname - Class Name - - ClassName - - - - - Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. - TBD - - - - - - - VDI2770_ClassificationSystem - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - - - - - - Klassifizierungssystem - classification system - - ClassificationSystem - - - - - Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. - TBD - - - - - - - DocumentVersionId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - - - - - - Dokumenten-Versionsnummer - DocumentVersionId - - DocumentVersionId - - - - - Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. - TBD - - - - - - - DocumentVersion_LanguageCode - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - - - - - - Sprachenschlüssel - LanguageCode - - LanguageCode - - - - - Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 - TBD - - - - - - - VDI2770_Title - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - - - - - - Titel - Title - - VDI2770_Title - - - - - sprachabhängiger Titel des Dokuments - TBD - - - - - - - VDI2770_Summary - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - - - - - - Zusammenfassung - Summary - - Summary - - - - - sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts - TBD - - - - - - - VDI2770_Keywords - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - - - - - - Schlagwörter - Keywords - - Keywords - - - - - sprachabhängige, durch Komma getrennte Liste von Schlagwörtern - TBD - - - - - - - VDI2770_StatusValue - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - - - - - - Statuswert - StatusValue - - StatusValue - - - - - Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) - TBD - - - - - - - VDI2770_SetDate - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - - - - - - Erstellungsdatum - Set Date - - SetDate - - - - - Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). - TBD - - - - - - - VDI2770_Purpose - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - - - - - - Zweck - Purpose - - Purpose - - - - - Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. - TBD - - - - - - - VDI2770_BasedOnProcedure - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - - - - - - Prozedur - Procedure - - BasedOnProcedure - - - - - textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt - TBD - - - - - - - VDI2770_Comments - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - - - - - - Kommentar - Comments - - Comments - - - - - textuelle Bemerkungen und Anmerkungen zum Status - TBD - - - - - - - VDI2770_ReferencedObject_Type - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - - - - - - Typ - Type - - Type - - - - - Für Type des Objekts muss immer Product angegeben werden. - TBD - - - - - - - VDI2770_ReferencedObject_RefType - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - - - - - - RefType - RefType - - RefType - - - - - Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) - TBD - - - - - - - VDI2770_ReferencedObject_ObjectId - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - - - - - - ObjectId - ObjectId - - ObjectId - - - - - Angabe der Identifikationsnummer zum Objekt - TBD - - - - - - - VDI2770_FileId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - - - - - - ID der Datei - File ID - - FileId - - - - - eindeutige ID für die Datei - TBD - - - - - - - VDI2770_FileName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - - - - - - Dateiname - File name - - FileName - - - - - Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. - TBD - - - - - - - VDI2770_FileFormat - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - - - - - - Datei Format - File format - - FileFormat - - - - - Angabe eines Media Typs gemäß der Liste der IANA - TBD - - - - - - - OrganisationContactInfo - https://www.hsu-hh.de/aut/aas/contactinfo - - - - - - - - Contact Info - Kontakt Info - - OrganisationContactInfo - - - - - Sammlung für die allgemeinen Kontaktdaten - Collection for general contact data - - - - - - - NameOfSupplier - 0173-1#02-AAO735#003 - - - - - - - - - - - - name of supplier - Lieferantenname - - name of supplier - - - - - Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt - name of supplier which provides the customer with a product or a service - - - - - - - ContactInfo_Role - https://www.hsu-hh.de/aut/aas/role - - - - - - - - Rolle - Role - - Role - - - - - Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt - Information to specify the role which the organisation of ContactInfo plays - - - - - - - Email - https://www.hsu-hh.de/aut/aas/email - - - - - - - - Emailadresse - Email address - - Email - - - - - Emailadresse - Email address - - - - - - - URL - 0173-1#02-AAO694#001 - - - - - - - - Internetadresse - Internet address - - URL - - - - - stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html - Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html - - - - - - - PhoneNumber - 0173-1#02-AAO136#002 - - - - - - - - Telefonnummer - telephone number - - Phone - - - - - vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist - complete telephone number to be called to reach a business partner - - - - - - - Fax - https://www.hsu-hh.de/aut/aas/fax - - - - - - - - Fax - Fax - - Fax - - - - - Faxnummer - Fax number - - - - - - - 0173-1#02-AAO136#002 - - - - - GLNOfManufacturer - 0173-1#02-AAY812#001 - - - - - - - - GLN of manufacturer - GLN des Herstellers - - GLN of manufacturer - - - - - international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort - internationally unique identification number for the manufacturer of the device or the product and for the physical location - - - - - - - SupplierOfTheIdentifier - 0173-1#02-AAP796#004 - - - - - - - - Supplier of the identifier - Anbieter der Identifikationsnummer für Hersteller - - Supplier of the identifier - - - STRING_TRANSLATABLE - - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - - - - - - - MAN_PROD_NUM - - product article number of manufacturer - - 0173-1#02-AAO676#003 - - - - - - - - product article number of manufacturer - Herstellerartikelnummer - - MAN_PROD_NUM - - - STRING_TRANSLATABLE - - eindeutiger Bestellschlüssel des Herstellers - unique product identifier of the manufacturer - - - - - - - ManufacturerProductDescription - 0173-1#02-AAU734#001 - - - - - - - - Manufacturer product description - Herstellerproduktbeschreibung - - Manufacturer product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - GLNOfSupplier - 0173-1#02-AAY813#001 - - - - - - - - GLN of supplier - GLN des Lieferanten - - GLN of supplier - - - - - international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort - internationally unique identification number for the supplier of the device or the product and for the physical location - - - - - - - SupplierIdProvider - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - - - - - - SupplierIdProvider - Anbieter der Identifikationsnummer - - SupplierIdProvider - - - STRING_TRANSLATABLE - - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - - - - - - - SUP_PROD_NUM - 0173-1#02-AAO736#004 - - - - - - - - product article number of supplier - Lieferantenartikelnummer - - product article number of supplier - - - - - eindeutiger Bestellschlüssel des Lieferanten - unique product order identifier of the supplier - - - - - - - SupplierProductDesignation - 0173-1#02-AAM551#002 - - - - - - - - Supplier product designation - Lieferantenproduktbezeichnung - - SupplierTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - SupplierProductDescription - 0173-1#02-AAU730#001 - - - - - - - - Supplier product description - Lieferantenproduktbeschreibung - - Supplier product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - ClassificationSystem - 0173-1#02-AAO715#002 - - - - - - - - classification system - Klassifizierungssystem - - ClassificationSystem - - - - - Klassifizierungssystem - Classification System - - - - - - - SecondaryKeyTyp - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - - - - - - SecondaryKeyTyp - Typnummer des IT Systems - - SecondaryKeyTyp - - - - - Führende technische ID im IT System des Typs - SecondaryKeyTyp - - - - - - - TypThumbnail - https://www.hsu-hh.de/aut/aas/thumbnail - - - - - - - - TypThumbnail - Vorschaubild - - TypThumbnail - - - - - Darstellung des Produkttyps in kleinem Format - Small picture of the product type - - - - - - - AssetId - https://www.hsu-hh.de/aut/aas/assetid - - - - - - - - AssetId - Asset ID - - AssetId - - - - - Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. - Global unique ID of an asset, which can be read by both human and machine. - - - - - - - SecondaryKeyInstance - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - - - - - - SecondaryKeyInstance - Instanznummer des IT Systems - - SecondaryKeyInstance - - - - - Führende technische ID im IT System der Instanz - SecondaryKeyInstance - - - - - - - DateOfManufacture - 0173-1#02-AAR972#002 - - - - - - - - Date of manufacture - Herstellungsdatum - - Date of manufacture - - - DATE - - Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist - Date from which the production and / or development process is completed or from which a service is provided completely - - - - - - - DeviceRevision - https://www.hsu-hh.de/aut/aas/devicerevision - - - - - - - - DeviceRevision - DeviceRevision - - DeviceRevision - - - - - DeviceRevision - DeviceRevision - - - - - - - SoftwareRevision - https://www.hsu-hh.de/aut/aas/softwarerevision - - - - - - - - SoftwareRevision - SoftwareRevision - - SoftwareRevision - - - - - SoftwareRevision - SoftwareRevision - - - - - - - HardwareRevision - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - - - - - - HardwareRevision - HardwareRevision - - HardwareRevision - - - - - HardwareRevision - HardwareRevision - - - - - - - CompanyLogo - https://www.hsu-hh.de/aut/aas/companylogo - - - - - - - - Firmenlogo - CompanyLogo - - CompanyLogo - - - - - Firmenlogo - CompanyLogo - - - - - - - QrCode - https://www.hsu-hh.de/aut/aas/qrcode - - - - - - - - QrCode - QrCode - - QrCode - - - - - In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. - QrCode - - - - - - - Brand - 0173-1#02-AAO742#002 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Brand - Makre - - BRAND - - - - - - - - - - EclassClasification - CONSTANT - https://www.eclasscontent.com/index.php?action=det&id=27200208 - - - - - - - - - - - - - Temperaturmessung elektrisch komplett - Temperature measuring electr. complete - - - - - - - AdditionalLinkAddress - 0173-1#02-AAE670#003 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - zusätzlicher Online-Verweis - additional link address - - - - - STRING_TRANSLATABLE - - site address where you can view information about the product or to communicate - Angabe einer Web-Adresse, die zusätzliche Informationen zum Produkt oder Kontaktdaten enthält - - - - - - - Weight - 0173-1#02-AAB713#005 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Weight - Gewicht - - Weight - kg - - REAL_MEASURE - - Masse des Wägegutes ohne Verpackung und ohne Transportgerät - Mass of weight without packaging and transport unit - - - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/18_Hitachi_HX_DigTyp40.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/18_Hitachi_HX_DigTyp40.aasx.xml deleted file mode 100644 index 39324b5b9..000000000 --- a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/18_Hitachi_HX_DigTyp40.aasx.xml +++ /dev/null @@ -1,6872 +0,0 @@ - - - - - 000000001 - https://admin-shell.hitachi-industrial.eu/aas/1/1/000000001 - - - https://admin-shell.hitachi-industrial.eu/asset/000000001 - - - - - - www.company.com/ids/sm/4343_5072_7091_3242 - - - - - www.company.com/ids/sm/2543_5072_7091_2660 - - - - - www.company.com/ids/sm/6053_5072_7091_5102 - - - - - www.company.com/ids/sm/6563_5072_7091_4267 - - - - - https://automation.hitachi-industrial.eu/_Resources/Static/Packages/Moon.HitachiEurope/Downloads/automation/[2]%20Software/[5]%20Configuration%20Files/[1]%20Device%20Descriptions/Device%20files.zip - - - - - - - - - Hitachi_000000001 - - Hitachi HX PLC - Hitachi HX SPS - - https://admin-shell.hitachi-industrial.eu/asset/000000001 - Instance - - - - - Nameplate - www.company.com/ids/sm/4343_5072_7091_3242 - - - https://www.hsu-hh.de/aut/aas/nameplate - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Hitachi Industrial Equipment Systems Co.,Ltd. - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - HX-CP1H16 - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - JP - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - AKS Bldg, 3 Kanda Neribei-cho - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 101-0022 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Chiyoda-ku, Tokyo - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Tokyo - - - - false - false - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - PAC IoT Controller HX Series - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - HX-CP1H16 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - string - N/A - - - - - ProductCountryOfOrigin - PARAMETER - - - 0173-1#02-AAO841#001 - - - Instance - - string - JP - - - - - YearOfConstruction - PARAMETER - - - 0173-1#02-AAP906#001 - - - Instance - - integer - 2018 - - - - - Marking_CE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - 0173-1#07-CAA016#001 - - - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/marking_ce.png - - - - false - false - - - - - Marking_CRUUS - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CRUUSLabelingPresent - PARAMETER - - - 0173-1#02-AAR528#005 - - - Instance - - boolean - 1 - - - 0173-1#07-CAA016#001 - - - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/marking_cruus.jpg - - - - false - false - - - - - - Document - www.company.com/ids/sm/2543_5072_7091_2660 - - - https://www.hsu-hh.de/aut/aas/document - - - Instance - - - - - DeclarationCEMarking - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Hitachi - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Hitachi Industrial Equipment Systems Co.,Ltd. - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - HX CE declaration - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - CE_DLR_EH-150_REV17.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/CE_DLR_EH-150_REV17.pdf - - - - false - false - - - - - DeclarationRoHS - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Hitachi - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Hitachi Industrial Equipment Systems Co.,Ltd. - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - RoHS 2011/65/EU Declaration of conformity - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - CE_DLR_EH-150_REV17.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/CE_DLR_EH-150_REV17.pdf - - - - false - false - - - - - EN_Manual_Hitachi_HX_Hardware - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - NJI-637(X) - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Hitachi - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Hitachi Industrial Equipment Systems Co.,Ltd. - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - 2016.11 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - HX Series Application Manual (Hardware) - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - This application manual informs about the hardware of HX series which is a high-performance PAC system suitable for IoT. The contents relevant to programming has been separated as an application manual (software) and a command reference manual. - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - NJI-637A(X)_HX-CPU_Hardware_Rev_01.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/NJI-637A(X)_HX-CPU_Hardware_Rev_01.pdf - - - - false - false - - - - - EN_Manual_Hitachi_HX_Software - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - NJI-638(X) - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Hitachi - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Hitachi Industrial Equipment Systems Co.,Ltd. - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - 2016.12 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - HX Series Application Manual (Software) - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - This application manual informs about the software of HX series which is a high-performance PAC system suitable for IoT. The contents relevant to installation has been separated as an hardware manual. - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - NJI-638X_HX-CPU_Software.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/NJI-638X_HX-CPU_Software.pdf - - - - false - false - - - - - DE_CODESYS_V3_Installation_und_Erste_Schritte - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - 0000000 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - 3S-Smart Software Solutions GmbH - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - 3S-Smart Software Solutions GmbH - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - 20XX - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - CODESYS V3, Installation und Erste Schritte - Anwenderdokumentation - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - CODESYS_Installation_und_Erste_Schritte_20V11.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/CODESYS_Installation_und_Erste_Schritte_V11.pdf - - - - false - false - - - - - EN_Datasheet_IoT_PAC_Controller_HX_Series - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Hitachi - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Hitachi Europe GmbH - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - The new Hitachi HX series PAC Controller combines powerful features and efficiency to meet the demands of a global supply chain in manufacturing industries. In addition, HX series is already prepared for the next generation requirements in automation thanks to its IoT capabilities. Manufacturing & service innovations can be achieved with integrated functions and seamless connectivity from field machine level to cloud services. - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - 1.10 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Datasheet: IoT PAC Controller HX Series - Next generation industrial controller. - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - 2017.03 - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - HX%20Datasheet.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/HX_Datasheet.pdf - - - - false - false - - - - - - Service - www.company.com/ids/sm/6053_5072_7091_5102 - - - https://www.hsu-hh.de/aut/aas/service - - - Instance - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Hitachi Europe GmbH - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Sales organization - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Niederkasseler Lohweg 191 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 40547 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Düsseldorf - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - North Rhine-Westphalia - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - automation.industrial@hitachi-eu.com - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - string - https://automation.hitachi-industrial.eu/ - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +49-211-5283-0 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - +49-211-2049-049 - - - - false - false - - - - - - Identification - www.company.com/ids/sm/6563_5072_7091_4267 - - - https://www.hsu-hh.de/aut/aas/identification - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Hitachi Industrial Equipment Systems Co.,Ltd. - - - - - GLNOfManufacturer - PARAMETER - - - 0173-1#02-AAY812#001 - - - Instance - - string - N/A - - - - - SupplierOfTheIdentifier - - - 0173-1#02-AAP796#004 - - - Instance - - - N/A - - - - - MAN_PROD_NUM - - - 0173-1#02-AAO676#003 - - - Type - - - 1696-0702 - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - HX-CP1H16 - - - - - ManufacturerProductDescription - PARAMETER - - - 0173-1#02-AAU734#001 - - - Instance - - langString - PLC Based PAC System for IoT Applications - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Hitachi Europe GmbH - - - - - GLNOfSupplier - PARAMETER - - - 0173-1#02-AAY813#001 - - - Instance - - string - N/A - - - - - SupplierIdProvider - PARAMETER - - - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - Instance - - - 316033943 - - - - - SUP_PROD_NUM - PARAMETER - - - 0173-1#02-AAO736#004 - - - Type - - - 1696-0702 - - - - - SupplierProductDesignation - - - 0173-1#02-AAM551#002 - - - Instance - - string - HX-CP1H16 - - - - - SupplierProductDescription - PARAMETER - - - 0173-1#02-AAU730#001 - - - Instance - - langString - Programmable automation controller (PAC) System for IoT Applications - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - string - PAC IoT Controller HX Series - - - - - ClassificationSystem - PARAMETER - - - 0173-1#02-AAO715#002 - - - Instance - - string - eclass - - - - - SecondaryKeyTyp - - - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - Instance - - - - - - - - TypThumbnail - PARAMETER - - - https://www.hsu-hh.de/aut/aas/thumbnail - - - Instance - - image/png - /HX_200432.png - - - - - AssetId - PARAMETER - - - https://www.hsu-hh.de/aut/aas/assetid - - - Instance - - anyURI - https://automation.hitachi-industrial.eu/demo/asset/0000_0000_0000_0000_0000 - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 1696-0702 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - N/A - - - - - SecondaryKeyInstance - PARAMETER - - - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - Instance - - - - - - - - DateOfManufacture - PARAMETER - - - 0173-1#02-AAR972#002 - - - Instance - - date - N/A - - - - - DeviceRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/devicerevision - - - Instance - - - N/A - - - - - SoftwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/softwarerevision - - - Instance - - - 3.5.13.40 - - - - - HardwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - Instance - - - N/A - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Hitachi Europe GmbH - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - langString - Niederkasseler Lohweg 191 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 40547 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Düsseldorf - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - North Rhine-Westphalia - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - automation.industrial@hitachi-eu.com - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://automation.hitachi-industrial.eu/ - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +49-211-5283-0 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - +49-211-2049-049 - - - - false - false - - - - - CompanyLogo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/companylogo - - - Instance - - image/png - /aasx/assetIdentification/Hitachi_logo.png - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://automation.hitachi-industrial.eu/demo/0000_0000_0000_0000_0000 - - - - - - DeviceDescriptionFiles - https://automation.hitachi-industrial.eu/_Resources/Static/Packages/Moon.HitachiEurope/Downloads/automation/[2]%20Software/[5]%20Configuration%20Files/[1]%20Device%20Descriptions/Device%20files.zip - - - https://automation.hitachi-industrial.eu/en/products/software/configuration-files/device-descriptions - - - Instance - - - - - CodeSysDD - - - http://admin-shell.io/sample/conceptdescriptions/437857438753457473 - - - Instance - - application/general - /aasx/Document/Device_files.zip - - - - - - - - ManufacturerName - 0173-1#02-AAO677#002 - - - - - - - - Herstellername - Manufacturer Name - - Manufacturer Name - - - - - Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist - 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 - - - - - - - GLNOfManufacturer - 0173-1#02-AAY812#001 - - - - - - - - GLN of manufacturer - GLN des Herstellers - - GLN of manufacturer - - - - - international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort - internationally unique identification number for the manufacturer of the device or the product and for the physical location - - - - - - - SupplierOfTheIdentifier - 0173-1#02-AAP796#004 - - - - - - - - Supplier of the identifier - Anbieter der Identifikationsnummer für Hersteller - - Supplier of the identifier - - - STRING_TRANSLATABLE - - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - - - - - - - MAN_PROD_NUM - - product article number of manufacturer - - 0173-1#02-AAO676#003 - - - - - - - - product article number of manufacturer - Herstellerartikelnummer - - MAN_PROD_NUM - - - STRING_TRANSLATABLE - - eindeutiger Bestellschlüssel des Herstellers - unique product identifier of the manufacturer - - - - - - - ManufacturerProductDesignation - 0173-1#02-AAW338#001 - - - - - - - - Manufacturer product designation - Herstellerproduktbezeichnung - - ManufacturerTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - ManufacturerProductDescription - 0173-1#02-AAU734#001 - - - - - - - - Manufacturer product description - Herstellerproduktbeschreibung - - Manufacturer product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - NameOfSupplier - 0173-1#02-AAO735#003 - - - - - - - - - - - - name of supplier - Lieferantenname - - name of supplier - - - - - Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt - name of supplier which provides the customer with a product or a service - - - - - - - GLNOfSupplier - 0173-1#02-AAY813#001 - - - - - - - - GLN of supplier - GLN des Lieferanten - - GLN of supplier - - - - - international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort - internationally unique identification number for the supplier of the device or the product and for the physical location - - - - - - - SupplierIdProvider - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - - - - - - SupplierIdProvider - Anbieter der Identifikationsnummer - - SupplierIdProvider - - - STRING_TRANSLATABLE - - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - - - - - - - SUP_PROD_NUM - 0173-1#02-AAO736#004 - - - - - - - - product article number of supplier - Lieferantenartikelnummer - - product article number of supplier - - - - - eindeutiger Bestellschlüssel des Lieferanten - unique product order identifier of the supplier - - - - - - - SupplierProductDesignation - 0173-1#02-AAM551#002 - - - - - - - - Supplier product designation - Lieferantenproduktbezeichnung - - SupplierTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - SupplierProductDescription - 0173-1#02-AAU730#001 - - - - - - - - Supplier product description - Lieferantenproduktbeschreibung - - Supplier product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - ManufacturerProductFamily - 0173-1#02-AAU731#001 - - - - - - - - Manufacturer product family - Herstellerproduktfamilie - - TypClass - - - - - 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie - 2nd level of a 3 level manufacturer specific product hierarchy - - - - - - - ClassificationSystem - 0173-1#02-AAO715#002 - - - - - - - - classification system - Klassifizierungssystem - - ClassificationSystem - - - - - Klassifizierungssystem - Classification System - - - - - - - SecondaryKeyTyp - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - - - - - - SecondaryKeyTyp - Typnummer des IT Systems - - SecondaryKeyTyp - - - - - Führende technische ID im IT System des Typs - SecondaryKeyTyp - - - - - - - TypThumbnail - https://www.hsu-hh.de/aut/aas/thumbnail - - - - - - - - TypThumbnail - Vorschaubild - - TypThumbnail - - - - - Darstellung des Produkttyps in kleinem Format - Small picture of the product type - - - - - - - AssetId - https://www.hsu-hh.de/aut/aas/assetid - - - - - - - - AssetId - Asset ID - - AssetId - - - - - Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. - Global unique ID of an asset, which can be read by both human and machine. - - - - - - - SerialNumber - 0173-1#02-AAM556#002 - - - - - - - - Serial number - Seriennummer - - InstanceId - - - - - eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist - unique combination of numbers and letters used to identify the device once it has been manufactured - - - - - - - BatchNumber - 0173-1#02-AAQ196#001 - - - - - - - - Batch number - Chargen-Nummer - - ChargeId - - - - - Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge - Number assigned by the manufacturer of a material to identify the manufacturer's batch - - - - - - - SecondaryKeyInstance - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - - - - - - SecondaryKeyInstance - Instanznummer des IT Systems - - SecondaryKeyInstance - - - - - Führende technische ID im IT System der Instanz - SecondaryKeyInstance - - - - - - - DateOfManufacture - 0173-1#02-AAR972#002 - - - - - - - - Date of manufacture - Herstellungsdatum - - Date of manufacture - - - DATE - - Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist - Date from which the production and / or development process is completed or from which a service is provided completely - - - - - - - DeviceRevision - https://www.hsu-hh.de/aut/aas/devicerevision - - - - - - - - DeviceRevision - DeviceRevision - - DeviceRevision - - - - - DeviceRevision - DeviceRevision - - - - - - - SoftwareRevision - https://www.hsu-hh.de/aut/aas/softwarerevision - - - - - - - - SoftwareRevision - SoftwareRevision - - SoftwareRevision - - - - - SoftwareRevision - SoftwareRevision - - - - - - - HardwareRevision - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - - - - - - HardwareRevision - HardwareRevision - - HardwareRevision - - - - - HardwareRevision - HardwareRevision - - - - - - - QrCode - https://www.hsu-hh.de/aut/aas/qrcode - - - - - - - - QrCode - QrCode - - QrCode - - - - - In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. - QrCode - - - - - - - OrganisationContactInfo - https://www.hsu-hh.de/aut/aas/contactinfo - - - - - - - - Contact Info - Kontakt Info - - OrganisationContactInfo - - - - - Sammlung für die allgemeinen Kontaktdaten - Collection for general contact data - - - - - - - PhysicalAddress - https://www.hsu-hh.de/aut/aas/physicaladdress - - - - - - - - PhysicalAddress - Physische Adresse - - PhysicalAddress - - - - - Sammlung für reale physische Adresse - Collection for real physical address - - - - - - - CountryCode - 0173-1#02-AAO730#001 - - - - - - - - - - - - Landeskennung - Country code - - Country code - - - - - Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes - agreed upon symbol for unambiguous identification of a country - - - - - - - Street - 0173-1#02-AAO128#001 - - - - - - - - Strasse - Street - - Street - - - - - Name der Strasse und Hausnummer - Street name and house number - - - - - - - Zip - 0173-1#02-AAO129#002 - - - - - - - - Zip - Postleitzahl - - PostalCode - - - - - ZIP code of address - Postleitzahl der Anschrift - - - - - - - CityTown - 0173-1#02-AAO132#001 - - - - - - - - Ort - City/town - - City/town - - - - - Town or city of the company - Ortsangabe - - - - - - - StateCounty - 0173-1#02-AAO133#002 - - - - - - - - state/county - Bundesland - - StateCounty - - - - - Bundesland - state/county - - - - - - - Email - https://www.hsu-hh.de/aut/aas/email - - - - - - - - Emailadresse - Email address - - Email - - - - - Emailadresse - Email address - - - - - - - TelephoneContact - https://www.hsu-hh.de/aut/aas/ContactInfo/TelephoneContact - - - - - - - - Telephone Contact - Telefonkontakt - - TelephoneContact - - - - - Sammlung für Kontaktdaten über Telefon - Collection for contact data via telephone - - - - - - - PhoneNumber - 0173-1#02-AAO136#002 - - - - - - - - Telefonnummer - telephone number - - Phone - - - - - vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist - complete telephone number to be called to reach a business partner - - - - - - - CompanyLogo - https://www.hsu-hh.de/aut/aas/companylogo - - - - - - - - Firmenlogo - CompanyLogo - - CompanyLogo - - - - - Firmenlogo - CompanyLogo - - - - - - - URL - 0173-1#02-AAO694#001 - - - - - - - - Internetadresse - Internet address - - URL - - - - - stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html - Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html - - - - - - - ProductCountryOfOrigin - 0173-1#02-AAO841#001 - - - - - - - - Produkt Ursprungsland - Product country of origin - - CountryOfOrigin - - - - - Land in dem das Produkt hergestellt wurde (Hersteller Land) - Country in which the product is manufactured (manufacturer country) - - - - - - - YearOfConstruction - 0173-1#02-AAP906#001 - - - - - - - - Year of construction - Baujahr - - YearOfConstruction - - - - - Jahreszahl als Datumsangabe für die Fertigstellung des Objektes - Year as completion date of object - - - - - - - File - 0173-1#02-AAD005#008 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Enthaltene Doku. Datei - Embedded Doc. file - - File - - - - - Verweis/ BLOB auf enthaltene Dokumentations-Datei. - Reference/ BLOB to embedded documentation file. - - - - - - - ProductMarking - https://www.hsu-hh.de/aut/aas/productmarking - - - - - - - - Produktkennzeichnung - Product Marking - - ProductMarking - - - - - Sammlungsdatei für Produktkennzeichnung - Collection file for product marking - - - - - - - CEQualificationPresent - 0173-1#02-BAF053#008 - - - - - - - - CE-Kennzeichnung vorhanden - CE- qualification present - - CEMarkingPresent - - - BOOLEAN - - whether CE- qualification is present - Angabe, ob CE-Kennzeichnung vorhanden ist - - - - - - - CRUUSLabelingPresent - 0173-1#02-AAR528#005 - - - - - - - - Kennzeichnung (RCM) vorhanden - RCM labeling present - - CRUUSLabelingPresent - - - BOOLEAN - - indication whether the product is equipped with a specified RCM labeling - Angabe, ob das Produkt mit einer spezifizierten RCM-Kennzeichnung ausgestattet ist - - - - - - - DocumentClassification_ClassId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - - - - Dokumentkategorie - Document category - - DocCategory - - - - - Dokumentkategorie nach VDI 2770:2018/10 - Document category after VDI 2770:2018/10 - - - - - - - DocumentId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - - - - - - DocumentId - Dokumenten-Nummer - - DocumentId - - - - - Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. - TBD - - - - - - - VDI2770_DomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - - - - - - Domain-Nummer - DomainId - - DomainId - - - - - Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. - TBD - - - - - - - VDI2770_IdType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - - - - - - Nummerntyp - IdType - - IdType - - - - - Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. - TBD - - - - - - - ValString - www.company.com/ids/cd/4490_8182_7091_6124 - - - - - - - - Wert - Value String - - ValString - - - - - Ausdruck für den Wert der übergeordneten Collection. - Value string for the collection value on the next superordinate level - - - - - - - DocumentationItem - 0173-1#02-AAD001#001 - - - - - - - - Dokumentationsgruppe - Documentation item - - DocumentationItem - - - - - Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. - Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. - - - - - - - DocumentIdDomain - www.company.com/ids/cd/6003_8182_7091_9350 - - - - - - - - DocumentIdDomain - DocumentIdDomain - - DocumentIdDomain - - - - - Angabe einer Liste von Domänen, in de-nen die DocumentIds des Dokuments eindeutig sind - TBD - - - - - - - DocumentDomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - - - - - - DocumentDomainId - DocumentDomainId - - DocumentDomainId - - - - - Kennung oder Kennzeichen einer Domäne - TBD - - - - - - - VDI2770_Party - www.company.com/ids/cd/3153_8182_7091_4327 - - - - - - - - Party - Party - - Party - - - - - Verweis auf eine Party (siehe VDI 2770 Anhang C1.17), die für diese Domäne verantwortlich ist - TBD - - - - - - - VDI2770_Role - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - - - - - - Rolle - Role - - Role - - - - - Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) - TBD - - - - - - - VDI2770_Organisation - www.company.com/ids/cd/9214_8182_7091_6391 - - - - - - - - Organisation - Organisation - - Organisation - - - - - Angabe einer Organisation - TBD - - - - - - - VDI2770_OrganisationId - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - - - - - - Organisation ID - Organisation ID - - OrganisationId - - - - - eindeutige ID für die Organisation - TBD - - - - - - - VDI2770_OrganisationName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - - - - - - OrganisationName - OrganisationName - - OrganisationName - - - - - gebräuchliche Bezeichnung für die Organisation - TBD - - - - - - - VDI2770_OrganisationOfficialName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - - - - - - Offizieller Name der Organisation - Organisation Official Name - - OrganisationOfficialName - - - - - offizieller Name der Organisation - TBD - - - - - - - DocumentPartId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - - - - - - Dokumenten-Teilnummer - DocumentPartId - - DocumentPartId - - - - - Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. - TBD - - - - - - - VDI2770_Description - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - - - - - - Beschreibung - Description - - Description - - - - - Beschreibung für die nächste übergeordnete Collection - TBD - - - - - - - VDI2770_ClassName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - - - - - - Klassenname - Class Name - - ClassName - - - - - Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. - TBD - - - - - - - DocumentVersion_LanguageCode - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - - - - - - Sprachenschlüssel - LanguageCode - - LanguageCode - - - - - Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 - TBD - - - - - - - VDI2770_ClassificationSystem - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - - - - - - Klassifizierungssystem - classification system - - ClassificationSystem - - - - - Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. - TBD - - - - - - - DocumentVersion - www.company.com/ids/cd/2580_0282_7091_6213 - - - - - - - - Dokumenten-Version - DocumentVersion - - DocumentVersion - - - - - Zu jedem Dokument muss eine Menge von mindestens einer Dokumentenversion existieren. Es können auch mehrere Dokumentenversionen ausgeliefert werden. - TBD - - - - - - - DocumentVersionId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - - - - - - Dokumenten-Versionsnummer - DocumentVersionId - - DocumentVersionId - - - - - Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. - TBD - - - - - - - VDI2770_Language - www.company.com/ids/cd/0231_0282_7091_5062 - - - - - - - - Sprache - Language - - Language - - - - - Liste der im Dokument verwendeten Sprachen - TBD - - - - - - - DocumentVersion_Description - www.company.com/ids/cd/9151_0282_7091_8032 - - - - - - - - Beschreibung zur DocumentVersion - DocumentVersion Description - - DocumentVersion_Description - - - - - Zusammenfassende Beschreibungen zur Dokumentenversion in ggf. unterschiedlichen Sprachen. - TBD - - - - - - - VDI2770_Title - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - - - - - - Titel - Title - - VDI2770_Title - - - - - sprachabhängiger Titel des Dokuments - TBD - - - - - - - VDI2770_Summary - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - - - - - - Zusammenfassung - Summary - - Summary - - - - - sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts - TBD - - - - - - - VDI2770_Keywords - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - - - - - - Schlagwörter - Keywords - - Keywords - - - - - sprachabhängige, durch Komma getrennte Liste von Schlagwörtern - TBD - - - - - - - VDI2770_LifeCycleStatus - www.company.com/ids/cd/0282_0282_7091_7878 - - - - - - - - Lebenszyklus Status - LifeCycleStatus - - LifeCycleStatus - - - - - Liste von Statusdefinitionen mit Bezug zum Dokumentenlebenszyklus inklusive der Angabe der Beteiligten und einem zugehörigen Zeitstempel - TBD - - - - - - - VDI2770_StatusValue - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - - - - - - Statuswert - StatusValue - - StatusValue - - - - - Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) - TBD - - - - - - - VDI2770_SetDate - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - - - - - - Erstellungsdatum - Set Date - - SetDate - - - - - Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). - TBD - - - - - - - VDI2770_Purpose - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - - - - - - Zweck - Purpose - - Purpose - - - - - Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. - TBD - - - - - - - VDI2770_BasedOnProcedure - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - - - - - - Prozedur - Procedure - - BasedOnProcedure - - - - - textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt - TBD - - - - - - - VDI2770_Comments - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - - - - - - Kommentar - Comments - - Comments - - - - - textuelle Bemerkungen und Anmerkungen zum Status - TBD - - - - - - - DocumentRelationship - www.company.com/ids/cd/1204_0282_7091_7896 - - - - - - - - Dokumenten-Beziehung - Document Relationship - - DocumentRelationship - - - - - Liste von Beziehungen zu anderen Dokumenten. Es ist möglich, auf einen Dokument, ein Dokument in einer spezifischen Dokumentenversion oder auch ein Teildokument zu verweisen. - TBD - - - - - - - DocumentRelationship_Type - www.company.com/ids/cd/5044_0282_7091_6924 - - - - - - - - Typ der Dokumenten-Beziehung - DocumentRelationship_Type - - DocumentRelationship_Type - - - - - Typisierung der Beziehung zwischen den beiden DocumentVersions. Folgende Beziehungsarten können verwendet werden: Affecting (hat Auswirkungen auf), ReferesTo (bezieht sich auf), BasedOn (basiert auf) - TBD - - - - - - - StoredDocumentRepresentation - www.company.com/ids/cd/3094_0282_7091_2090 - - - - - - - - StoredDocumentRepresentation - StoredDocumentRepresentation - - StoredDocumentRepresentation - - - - - Liste von digitalen Repräsentationen zur DocumentVersion - TBD - - - - - - - VDI2770_DigitalFile - www.company.com/ids/cd/2305_0282_7091_2077 - - - - - - - - Digitaler-File - DigitalFile - - DigitalFile - - - - - Datei, die die DocumentVersion (siehe VDI 2770:2018 Anhang C1.5) repräsentiert Neben der obligatorischen PDF/A-Datei können weitere Dateien angegeben werden. - TBD - - - - - - - VDI2770_FileId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - - - - - - ID der Datei - File ID - - FileId - - - - - eindeutige ID für die Datei - TBD - - - - - - - VDI2770_FileName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - - - - - - Dateiname - File name - - FileName - - - - - Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. - TBD - - - - - - - VDI2770_FileFormat - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - - - - - - Datei Format - File format - - FileFormat - - - - - Angabe eines Media Typs gemäß der Liste der IANA - TBD - - - - - - - DocumentType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - - - - - - Dokumententyp - Document Type - - DocumentType - - - - - Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) - TBD - - - - - - - VDI2770_ReferencedObject - www.company.com/ids/cd/2570_2282_7091_0055 - - - - - - - - ReferencedObject - ReferencedObject - - ReferencedObject - - - - - Liste von IDs für ein Objekt, auf das sich das Dokument bezieht - TBD - - - - - - - VDI2770_ReferencedObject_Type - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - - - - - - Typ - Type - - Type - - - - - Für Type des Objekts muss immer Product angegeben werden. - TBD - - - - - - - VDI2770_ReferencedObject_RefType - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - - - - - - RefType - RefType - - RefType - - - - - Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) - TBD - - - - - - - VDI2770_ReferencedObject_ObjectId - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - - - - - - ObjectId - ObjectId - - ObjectId - - - - - Angabe der Identifikationsnummer zum Objekt - TBD - - - - - - - ContactInfo_Role - https://www.hsu-hh.de/aut/aas/role - - - - - - - - Rolle - Role - - Role - - - - - Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt - Information to specify the role which the organisation of ContactInfo plays - - - - - - - Fax - https://www.hsu-hh.de/aut/aas/fax - - - - - - - - Fax - Fax - - Fax - - - - - Faxnummer - Fax number - - - - - - - 0173-1#02-AAO136#002 - - - - - DocGroup_01 - www.company.com/ids/cd/1420_0113_7091_0891 - - - - - - - - 01 Identifikation - 01 Identification - - DocGroup_01 - - - - - Der Gruppe „Identifikation“ werden alle Dokumente zugeordnet, die der Identifikation des Objekts dienen, zu dem die Herstellerdokumentation gehört. Sie enthält insbesondere Informationen, die die elektronische Datenverarbeitung unterstützen und die es dem Hersteller und dem Nutzer erlauben, das Objekt in ihren jeweiligen elektronischen Datenverarbeitungssystemen zu identifizieren. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocGroup_02 - www.company.com/ids/cd/4323_0113_7091_2591 - - - - - - - - 02 Technische Beschaffenheit - 02 Technical characteristics - - DocGroup_02 - - - - - Die Gruppe „Technische Beschaffenheit“ beinhaltet alle Dokumente, die die technischen Anforderungen, deren Erfüllung und die Bescheinigung der Eigenschaften eines Objekts betreffen. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocGroup_03 - www.company.com/ids/cd/5053_0113_7091_5741 - - - - - - - - 03 Tätigkeitsbezogene Dokumente - 03 Work-related documents - - DocGroup_03 - - - - - Die Gruppe „Tätigkeitsbezogene Dokumente“ beinhaltet alle Dokumente, die Anforderungen, Hinweise und Hilfestellungen für Tätigkeiten an und mit dem Objekt nach der Übergabe an den Nutzer betreffen. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocGroup_04 - www.company.com/ids/cd/5473_0113_7091_1588 - - - - - - - - 04 Vertragsunterlagen - 04 Contract documents - - DocGroup_04 - - - - - Der Gruppe „Vertragsunterlagen“ werden alle Dokumente zugeordnet, die im Zusammenhang mit der kaufmännischen Abwicklung eines Vertrages stehen, aber nicht selbst Gegenstand des Vertrags sind und lediglich zur Erfüllung des Vertrags dienen. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_01-01 - www.company.com/ids/cd/9593_0113_7091_2401 - - - - - - - - 01-01 Identifikation - 01-01 Identification - - DocCategory_01-01 - - - - - Der Kategorie „Identifikation“ werden alle Dokumente zugeordnet, die der Identifikation des Objekts dienen, zu dem die Herstellerdokumentation gehört. Sie enthält insbesondere Informationen, die die elektronische Datenverarbeitung unterstützen und die es dem Hersteller und dem Nutzer erlauben, das Objekt in ihren jeweiligen elektronischen Datenverarbeitungssystemen zu identifizieren. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_02-01 - www.company.com/ids/cd/5314_0113_7091_8640 - - - - - - - - 02-01 Techn. Spezifikation - 02-01 Technical specification - - DocCategory_02-01 - - - - - Der Kategorie „Technische Spezifikation“ werden alle Dokumente zugeordnet, die die Anforderungen an ein Objekt sowie dessen Eigenschaften beschreiben. Dazu gehören die Auslegungsdaten, Berechnungen (Verfahrenstechnik, Festigkeit usw.) sowie alle relevanten Eigenschaften des übergebenen Objekts. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_02-02 - www.company.com/ids/cd/5515_0113_7091_8581 - - - - - - - - 02-02 Zeichnungen, Pläne - 02-02 Drawings and diagrams - - DocCategory_02-02 - - - - - Der Kategorie „Zeichnungen, Pläne“ werden alle Dokumente zugeordnet, die Zeichnungscharakter haben, das heißt eine grafische Darstellung zur Übermittlung von Information nutzen. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_02-03 - www.company.com/ids/cd/0335_0113_7091_0312 - - - - - - - - 02-03 Bauteile - 02-03 Components - - DocCategory_02-03 - - - - - Der Kategorie „Bauteile“ werden alle Dokumente zugeordnet, die eine strukturierte Auflistung der Teile eines Objekts beinhalten. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_02-04 - www.company.com/ids/cd/2155_0113_7091_3955 - - - - - - - - 02-04 Zeugnisse, Zertifikate, Bescheinigungen - 02-04 Reports, Certificates, declarations - - DocCategory_02-04 - - - - - Der Kategorie „Zeugnisse, Zertifikate, Bescheinigungen“ werden alle Dokumente zugeordnet, die Urkundencharakter haben. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_03-01 - www.company.com/ids/cd/3565_0113_7091_2704 - - - - - - - - 03-01 Montage, Inbetriebnahme, Demontage - 03-01 Assembly, commissioning, disassembly - - DocCategory_03-01 - - - - - Der Kategorie „Montage, Demontage“ werden alle Dokumente zugeordnet, die Tätigkeiten und Maßnahmen beschreiben, die erforderlich sind, um ein Objekt: zu transportieren oder zu lagern, als Ganzes in ein übergeordnetes Objekt einzubauen, auszubauen oder an dieses anzuschließen, so weit vorzubereiten, dass es zur Inbetriebnahme bereitsteht, nach Abschluss der Nutzungsphase zu demontieren und zu entsorgen - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_03-02 - www.company.com/ids/cd/4290_1113_7091_7266 - - - - - - - - 03-02 Bedienung - 03-02 Operation - - DocCategory_03-02 - - - - - Der Kategorie „Bedienung“ werden Dokumente zur bestimmungsgemäßen Verwendung und sicheren Bedienung eines Objekts zugeordnet. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_03-03 - www.company.com/ids/cd/2211_1113_7091_3911 - - - - - - - - 03-03 Allgemeine Sicherheit - 03-03 Safety in general - - DocCategory_03-03 - - - - - Der Kategorie „Allgemeine Sicherheit“ werden Dokumente zugeordnet, die Sicherheitshinweise auf mögliche Gefährdungen bei der Verwendung des Objekts geben. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_03-04 - www.company.com/ids/cd/7521_1113_7091_4471 - - - - - - - - 03-04 Inspektion, Wartung, Prüfung - 03-04 Inspection, maintenance, test - - DocCategory_03-04 - - - - - Der Kategorie „Inspektion, Wartung, Prüfung“ werden alle Dokumente zugeordnet, die vom Hersteller vorgeschlagene wiederkehrende Maßnahmen zur Feststellung oder zum Erhalt des funktionsfähigen Zustands beschreiben. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_03-05 - www.company.com/ids/cd/5161_1113_7091_0458 - - - - - - - - 03-05 Instandsetzung - 03-05 Repair - - DocCategory_03-05 - - - - - Der Kategorie „Instandsetzung“ werden alle Dokumente zugeordnet, die Maßnahmen zur Wiederherstellung der Funktion eines Objekts betreffen. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_03-06 - www.company.com/ids/cd/2181_1113_7091_5948 - - - - - - - - 03-06 Ersatzteile - 03-06 Spare parts - - DocCategory_03-06 - - - - - Der Kategorie „Ersatzteile“ werden Dokumente zugeordnet, die Informationen zu Ersatzteilen und Hilfs- und Betriebsstoffen enthalten. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_04-01 - www.company.com/ids/cd/5391_1113_7091_8996 - - - - - - - - 04-01 Vertragsunterlagen - 04-01 Contract documents - - DocCategory_04-01 - - - - - Der Kategorie „Vertragsunterlagen“ werden alle Dokumente zugeordnet, die im Zusammenhang mit der kaufmännischen Abwicklung eines Vertrages stehen, aber nicht selbst Gegenstand des Vertrags sind und lediglich zur Erfüllung des Vertrags dienen. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestValidateXml.cs b/src/AasxCsharpLibrary.Tests/TestValidateXml.cs deleted file mode 100644 index dc4b2f64f..000000000 --- a/src/AasxCsharpLibrary.Tests/TestValidateXml.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Environment = System.Environment; -using InvalidOperationException = System.InvalidOperationException; -using Path = System.IO.Path; - -namespace AdminShellNS.Tests -{ - public class TestOnFiles - { - [Test] - public void TestSuccess() - { - string successDir = Path.Combine( - TestContext.CurrentContext.TestDirectory, - "TestResources\\AasxCsharpLibrary.Tests\\XmlValidation\\expectedOk"); - - if (!System.IO.Directory.Exists(successDir)) - { - throw new InvalidOperationException( - $"The directory containing the valid AAS XML files does not exist or is not a directory: " + - successDir); - } - - var paths = System.IO.Directory.GetFiles(successDir) - .Where(p => System.IO.Path.GetExtension(p) == ".xml") - .ToList(); - - if (paths.Count == 0) - { - throw new InvalidOperationException( - $"No *.xml files were found in the directory expected to contain the valid XML files: " + - successDir); - } - - var validator = AasSchemaValidation.NewXmlValidator(); - - foreach (string path in paths) - { - using var fileStream = System.IO.File.OpenRead(path); - var records = new AasValidationRecordList(); - validator.Validate(records, fileStream); - if (records.Count != 0) - { - var parts = new List - { - $"Failed to validate XML file {path}:" - }; - parts.AddRange(records.Select((r) => r.Message)); - throw new AssertionException(string.Join(Environment.NewLine, parts)); - } - } - } - } -} diff --git a/src/AasxCsharpLibrary/AasxCompatibilityModels/V10/AdminShellV10.cs b/src/AasxCsharpLibrary/AasxCompatibilityModels/V10/AdminShellV10.cs deleted file mode 100644 index 91c73d650..000000000 --- a/src/AasxCsharpLibrary/AasxCompatibilityModels/V10/AdminShellV10.cs +++ /dev/null @@ -1,4649 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.IO; -using System.IO.Packaging; -using System.Text.RegularExpressions; -using System.Xml; -using System.Xml.Serialization; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; - -// ReSharper disable All .. as this is legacy code! - -#if !DoNotUseAasxCompatibilityModels - -namespace AasxCompatibilityModels -{ - #region Utils - // - // Utils - // - - public class AdminShellUtilV10 - { - public static string EvalToNonNullString(string fmt, object o, string elseString = "") - { - if (o == null) - return elseString; - return string.Format(fmt, o); - } - - public static string EvalToNonEmptyString(string fmt, string o, string elseString = "") - { - if (o == "") - return elseString; - return string.Format(fmt, o); - } - - public static string FilterFriendlyName(string src) - { - if (src == null) - return null; - return Regex.Replace(src, @"[^a-zA-Z0-9\-_]", "_"); - } - - public static bool HasWhitespace(string src) - { - if (src == null) - throw new ArgumentNullException(nameof(src)); - for (var i = 0; i < src.Length; i++) - foreach (var c in src) - if (char.IsWhiteSpace(c)) - return true; - return false; - } - - public static bool ComplyIdShort(string src) - { - if (src == null) - throw new ArgumentNullException(nameof(src)); - var res = true; - foreach (var c in src) - if (!Char.IsLetterOrDigit(c) && c != '_') - res = false; - if (src.Length > 0 && !Char.IsLetter(src[0])) - res = false; - return res; - } - - public static string ShortLocation(Exception ex) - { - if (ex == null || ex.StackTrace == null) - return ""; - string[] lines = ex.StackTrace.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None); - if (lines.Length < 1) - return ""; - // search for " in " - // as the most actual stacktrace might be a built-in function, this might not work and therefore - // go down in the stack - int currLine = 0; - while (true) - { - // nothing found at all - if (currLine >= lines.Length) - return ""; - // access current line - var p = lines[currLine].IndexOf(" in ", StringComparison.Ordinal); - if (p < 0) - { - // advance to next oldest line - currLine++; - continue; - } - // search last "\" or "/", to get only filename portion and position - p = lines[currLine].LastIndexOfAny(new[] { '\\', '/' }); - if (p < 0) - { - // advance to next oldest line - currLine++; - continue; - } - // return this - return lines[currLine].Substring(p); - } - } - - } - - #endregion - - - #region AdminShell_V1_0 - - /// - /// Version of Details of Administration Shell Part 1 V1.0 published Nov/Dec/Jan 2018/19 - /// - public class AdminShellV10 - { - - public class Identification - { - - // members - - [XmlAttribute] - public string idType = ""; - [XmlText] - public string id = ""; - - // constructors - - public Identification() { } - - public Identification(string idType, string id) - { - this.idType = idType; - this.id = id; - } - - public Identification(Identification src) - { - this.idType = src.idType; - this.id = src.id; - } - - // Creator with validation - - public static Identification CreateNew(string idType, string id) - { - if (idType == null || id == null) - return null; - var found = false; - foreach (var x in Key.IdentifierTypeNames) - found = found || idType.ToLower().Trim() == x.ToLower().Trim(); - if (!found) - return null; - return new Identification(idType, id); - } - - // further - - public bool IsEqual(Identification other) - { - return (this.idType.Trim().ToLower() == other.idType.Trim().ToLower() - && this.id.Trim().ToLower() == other.id.Trim().ToLower()); - } - - public override string ToString() - { - return $"[{this.idType}] {this.id}"; - } - } - - public class Administration - { - - // members - - public string version = ""; - public string revision = ""; - - // constructors - - public Administration() { } - - public Administration(Administration src) - { - this.version = src.version; - this.revision = src.revision; - } - - public Administration(string version, string revision) - { - this.version = version; - this.revision = revision; - } - - public override string ToString() - { - return $"R={this.version}, V={this.revision}"; - } - } - - public class Key - { - [XmlAttribute] - public string type = ""; - [XmlAttribute] - public bool local = false; - - [XmlAttribute] - [JsonIgnore] - public string idType = ""; - [XmlIgnore] - [JsonProperty(PropertyName = "idType")] - public string JsonIdType - { - get { return (idType == "idShort") ? "IdShort" : idType; } - set { if (value == "IdShort") idType = "idShort"; else idType = value; } - } - - [XmlText] - public string value = ""; - - [XmlIgnore] - [JsonProperty(PropertyName = "index")] - public int index = 0; - - public Key() - { - } - - public Key(Key src) - { - this.type = src.type; - this.local = src.local; - this.idType = src.idType; - this.value = src.value; - } - - public Key(string type, bool local, string idType, string value) - { - this.type = type; - this.local = local; - this.idType = idType; - this.value = value; - } - - public static Key CreateNew(string type, bool local, string idType, string value) - { - var k = new Key(); - k.type = type; - k.local = local; - k.idType = idType; - k.value = value; - return (k); - } - - public static Key GetFromRef(Reference r) - { - if (r == null || r.Count != 1) - return null; - return r[0]; - } - - public override string ToString() - { - var local = (this.local) ? "Local" : "not Local"; - return $"[{this.type}, {local}, {this.idType}, {this.value}]"; - } - - public static string KeyListToString(List keys) - { - if (keys == null || keys.Count < 1) - return ""; - // normally, exactly one key - if (keys.Count == 1) - return keys[0].ToString(); - // multiple! - var s = "[ "; - foreach (var k in keys) - { - if (s.Length > 0) - s += ", "; - s += k.ToString(); - } - return s + " ]"; - } - - public static string[] KeyElements = new string[] { - "GlobalReference", - "AccessPermissionRule", - "Asset", - "AssetAdministrationShell", - "ConceptDescription", - "Submodel", - "SubmodelRef", // not completely right, but used by Package Explorer - "Blob", - "ConceptDictionary", - "DataElement", - "File", - "Event", - "Operation", - "OperationVariable", - "Property", - "ReferenceElement", - "RelationshipElement", - "SubmodelElement", - "SubmodelElementCollection", - "View" }; - - public static string[] ReferableElements = new string[] { - "AccessPermissionRule", - "Asset", - "AssetAdministrationShell", - "ConceptDescription", - "Submodel", - "Blob", - "ConceptDictionary", - "DataElement", - "File", - "Event", - "Operation", - "OperationVariable", - "Property", - "ReferenceElement", - "RelationshipElement", - "SubmodelElement", - "SubmodelElementCollection", - "View" - }; - - public static string[] SubmodelElements = new string[] { - "DataElement", - "File", - "Event", - "Operation", - "Property", - "ReferenceElement", - "RelationshipElement", - "SubmodelElementCollection"}; - - public static string[] IdentifiableElements = new string[] { - "Asset", - "AssetAdministrationShell", - "ConceptDescription", - "Submodel" }; - - // use this in list to designate all of the above elements - public static string AllElements = "All"; - - // use this in list to designate the GlobalReference - public static string GlobalReference = "GlobalReference"; - public static string ConceptDescription = "ConceptDescription"; - public static string SubmodelRef = "SubmodelRef"; - public static string Submodel = "Submodel"; - public static string Asset = "Asset"; - public static string AAS = "AssetAdministrationShell"; - - public static string[] IdentifierTypeNames = new string[] { "IdShort", "Custom", "IRDI", "URI" }; - - public enum IdentifierType { IdShort = 0, Custom, IRDI, URI }; - - public static string GetIdentifierTypeName(IdentifierType t) - { - return IdentifierTypeNames[(int)t]; - } - - // some helpers - - public static bool IsInKeyElements(string ke) - { - var res = false; - foreach (var s in KeyElements) - if (s.Trim().ToLower() == ke.Trim().ToLower()) - res = true; - return res; - } - - } - - // the whole class shall not be serialized by having it private - public class KeyList - { - // members - - [XmlIgnore] // anyway, as it is privat - private List key = new List(); - - // getters / setters - - [XmlIgnore] - public List Keys { get { return key; } } - [XmlIgnore] - public bool IsEmpty { get { return key == null || key.Count < 1; } } - [XmlIgnore] - public int Count { get { if (key == null) return 0; return key.Count; } } - [XmlIgnore] - public Key this[int index] { get { return key[index]; } } - - // constructors / creators - - public void Add(Key k) - { - key.Add(k); - } - - public static KeyList CreateNew(Key k) - { - var kl = new KeyList(); - kl.Add(k); - return kl; - } - - public static KeyList CreateNew(string type, bool local, string idType, string value) - { - var kl = new KeyList(); - kl.Add(Key.CreateNew(type, local, idType, value)); - return kl; - } - - // other - - public void NumberIndices() - { - if (this.Keys == null) - return; - for (int i = 0; i < this.Keys.Count; i++) - this.Keys[i].index = i; - } - } - - [XmlType(TypeName = "reference")] - public class Reference - { - - // members - - [XmlIgnore] // anyway, as it is privat - [JsonIgnore] - private KeyList keys = new KeyList(); - - // getters / setters - - [XmlArray("keys")] - [XmlArrayItem("key")] - [JsonIgnore] - public List Keys { get { return keys?.Keys; } } - [XmlIgnore] - [JsonProperty(PropertyName = "keys")] - public List JsonKeys - { - get - { - keys?.NumberIndices(); - return keys.Keys; - } - } - - [XmlIgnore] - [JsonIgnore] - public bool IsEmpty { get { return keys == null || keys.Count < 1; } } - [XmlIgnore] - [JsonIgnore] - public int Count { get { if (keys == null) return 0; return keys.Count; } } - [XmlIgnore] - [JsonIgnore] - public Key this[int index] { get { return keys[index]; } } - - // constructors / creators - - public Reference() - { - } - - public Reference(Key k) - { - if (k != null) - keys.Keys.Add(k); - } - - public Reference(Reference src) - { - if (src != null) - foreach (var k in src.Keys) - keys.Add(new Key(k)); - } - - public Reference(SemanticId src) - { - if (src != null) - foreach (var k in src.Keys) - keys.Add(new Key(k)); - } - - public static Reference CreateNew(Key k) - { - if (k == null) - return null; - var r = new Reference(); - r.keys.Keys.Add(k); - return r; - } - - public static Reference CreateNew(List k) - { - if (k == null) - return null; - var r = new Reference(); - r.keys.Keys.AddRange(k); - return r; - } - - public static Reference CreateNew(string type, bool local, string idType, string value) - { - if (type == null || idType == null || value == null) - return null; - var r = new Reference(); - r.keys.Keys.Add(Key.CreateNew(type, local, idType, value)); - return r; - } - - public static Reference CreateIrdiReference(string irdi) - { - if (irdi == null) - return null; - var r = new Reference(); - r.keys.Keys.Add(new Key(Key.GlobalReference, false, "IRDI", irdi)); - return r; - } - - // further - - public bool IsExactlyOneKey(string type, bool local, string idType, string id) - { - if (keys == null || keys.Keys == null || keys.Count != 1) - return false; - var k = keys.Keys[0]; - return k.type == type && k.local == local && k.idType == idType && k.value == id; - } - - public bool MatchesTo(Identification other) - { - return (this.keys != null && this.keys.Count == 1 - && this.keys[0].idType.Trim().ToLower() == other.idType.Trim().ToLower() - && this.keys[0].value.Trim().ToLower() == other.id.Trim().ToLower()); - } - - public bool MatchesTo(Reference other) - { - if (this.keys == null || other == null || other.keys == null || other.Count != this.Count) - return false; - - var same = true; - for (int i = 0; i < this.Count; i++) - same = same - && this.keys[i].type.Trim().ToLower() == other.keys[i].type.Trim().ToLower() - && this.keys[i].local == other.keys[i].local - && this.keys[i].idType.Trim().ToLower() == other.keys[i].idType.Trim().ToLower() - && this.keys[i].value.Trim().ToLower() == other.keys[i].value.Trim().ToLower(); - - return same; - } - - public override string ToString() - { - var res = ""; - if (keys != null && keys.Keys != null) - foreach (var k in keys.Keys) - res += k.ToString() + ","; - return res.TrimEnd(','); - } - - public string ListOfValues(string delim) - { - string res = ""; - if (this.Keys != null) - foreach (var x in this.Keys) - { - if (x == null) - continue; - if (res != "") res += delim; - res += x.value; - } - return res; - } - - public virtual string GetElementName() - { - return "Reference"; - } - } - - [XmlType(TypeName = "derivedFrom")] - public class AssetAdministrationShellRef : Reference - { - // constructors - - public AssetAdministrationShellRef() : base() { } - - public AssetAdministrationShellRef(Key k) : base(k) { } - - public AssetAdministrationShellRef(Reference src) : base(src) { } - - // further methods - - public override string GetElementName() - { - return "AssetAdministrationShellRef"; - } - } - - [XmlType(TypeName = "assetRef")] - public class AssetRef : Reference - { - // constructors - - public AssetRef() : base() { } - - public AssetRef(AssetRef src) : base(src) { } - - // translation - - public static AssetRef CreateNew(Reference r) - { - return (AssetRef)new Reference(r); - } - - // further methods - - public override string GetElementName() - { - return "AssetRef"; - } - } - - [XmlType(TypeName = "submodelRef")] - public class SubmodelRef : Reference - { - // constructors - - public SubmodelRef() : base() { } - - public SubmodelRef(SubmodelRef src) : base(src) { } - - public static new SubmodelRef CreateNew(string type, bool local, string idType, string value) - { - var r = new SubmodelRef(); - r.Keys.Add(Key.CreateNew(type, local, idType, value)); - return r; - } - - public static SubmodelRef CreateNew(Reference src) - { - if (src == null || src.Keys == null) - return null; - var r = new SubmodelRef(); - r.Keys.AddRange(src.Keys); - return r; - } - - // further methods - - public override string GetElementName() - { - return "SubmodelRef"; - } - } - - [XmlType(TypeName = "conceptDescriptionRef")] - public class ConceptDescriptionRef : Reference - { - // constructors - - public ConceptDescriptionRef() : base() { } - - public ConceptDescriptionRef(ConceptDescriptionRef src) : base(src) { } - - // further methods - - public new static ConceptDescriptionRef CreateNew(string type, bool local, string idType, string value) - { - var r = new ConceptDescriptionRef(); - r.Keys.Add(Key.CreateNew(type, local, idType, value)); - return r; - } - - public override string GetElementName() - { - return "ConceptDescriptionRef"; - } - } - - [XmlType(TypeName = "dataSpecificationRef")] - public class DataSpecificationRef : Reference - { - // constructors - - public DataSpecificationRef() : base() { } - - public DataSpecificationRef(DataSpecificationRef src) : base(src) { } - - // further methods - - public static DataSpecificationRef CreateNew(Reference src) - { - if (src == null || src.Keys == null) - return null; - var res = new DataSpecificationRef(); - foreach (var k in src.Keys) - res.Keys.Add(new Key(k)); - return res; - } - - public override string GetElementName() - { - return "DataSpecificationRef"; - } - } - - [XmlType(TypeName = "conceptDescriptions")] - public class ConceptDescriptionRefs - { - [XmlElement(ElementName = "conceptDescriptionRef")] - public List conceptDescriptions = new List(); - - // constructors - - public ConceptDescriptionRefs() { } - - public ConceptDescriptionRefs(ConceptDescriptionRefs src) - { - if (src.conceptDescriptions != null) - foreach (var cdr in src.conceptDescriptions) - this.conceptDescriptions.Add(new ConceptDescriptionRef(cdr)); - } - } - - [XmlType(TypeName = "containedElementRef")] - public class ContainedElementRef : Reference - { - // constructors - - public ContainedElementRef() { } - public ContainedElementRef(ContainedElementRef src) : base(src) { } - - public static ContainedElementRef CreateNew(Reference src) - { - if (src == null || src.Keys == null) - return null; - var r = new ContainedElementRef(); - r.Keys.AddRange(src.Keys); - return r; - } - - // further methods - - public override string GetElementName() - { - return "ContainedElementRef"; - } - } - - [XmlType(TypeName = "hasDataSpecification")] - public class HasDataSpecification - { - [XmlElement(ElementName = "reference")] // make "reference" go away by magic?! - public List reference = new List(); - - public HasDataSpecification() { } - - public HasDataSpecification(HasDataSpecification src) - { - foreach (var r in src.reference) - reference.Add(new Reference(r)); - } - } - - [XmlType(TypeName = "ContainedElements")] - public class ContainedElements - { - - // members - - [XmlElement(ElementName = "containedElementRef")] // make "reference" go away by magic?! - public List reference = new List(); - - // getter / setter - - public bool IsEmpty { get { return reference == null || reference.Count < 1; } } - public int Count { get { if (reference == null) return 0; return reference.Count; } } - public ContainedElementRef this[int index] { get { return reference[index]; } } - - // Creators - - public ContainedElements() { } - - public ContainedElements(ContainedElements src) - { - if (src.reference != null) - foreach (var r in src.reference) - this.reference.Add(new ContainedElementRef(r)); - } - - public static ContainedElements CreateOrSetInner(ContainedElements outer, ContainedElementRef[] inner) - { - var res = outer; - if (res == null) - res = new ContainedElements(); - if (inner == null) - { - res.reference = null; - return res; - } - res.reference = new List(inner); - return res; - } - - } - - [XmlType(TypeName = "langString", Namespace = "http://www.admin-shell.io/1/0")] - public class LangStr - { - - // members - - [XmlAttribute(Namespace = "http://www.admin-shell.io/1/0")] - [JsonProperty(PropertyName = "language")] - public string lang = ""; - [XmlText] - [JsonProperty(PropertyName = "text")] - public string str = ""; - - // constructors - - public LangStr() { } - - public LangStr(LangStr src) - { - this.lang = src.lang; - this.str = src.str; - } - - public static LangStr CreateNew(string lang, string str) - { - var l = new LangStr(); - l.lang = lang; - l.str = str; - return (l); - } - - public static List CreateManyFromStringArray(string[] s) - { - var r = new List(); - var i = 0; - while ((i + 1) < s.Length) - { - r.Add(LangStr.CreateNew(s[i], s[i + 1])); - i += 2; - } - return r; - } - } - - public class Description - { - - // members - - [XmlElement(ElementName = "langString")] - public List langString = new List(); - - // constructors - - public Description() { } - - public Description(Description src) - { - if (src != null) - foreach (var ls in src.langString) - langString.Add(new LangStr(ls)); - } - } - - public class Kind - { - [XmlText] - public string kind = "Instance"; - - // getters / setters - - [XmlIgnore] - [JsonIgnore] - public bool IsInstance { get { return kind == null || kind.Trim().ToLower() == "instance"; } } - - [XmlIgnore] - [JsonIgnore] - public bool IsType { get { return kind != null && kind.Trim().ToLower() == "type"; } } - - // constructors / creators - - public Kind() { } - - public Kind(Kind src) - { - kind = src.kind; - } - - public Kind(string kind) - { - this.kind = kind; - } - - public static Kind CreateFrom(Kind k) - { - var res = new Kind(); - res.kind = k.kind; - return res; - } - - public static Kind CreateAsType() - { - var res = new Kind(); - res.kind = "Type"; - return res; - } - - public static Kind CreateAsInstance() - { - var res = new Kind(); - res.kind = "Instance"; - return res; - } - } - - public class SemanticId - { - - // members - - [XmlIgnore] - [JsonIgnore] - private KeyList keys = new KeyList(); - - // getters / setters - - [XmlArray("keys")] - [XmlArrayItem("key")] - [JsonIgnore] - public List Keys { get { return keys?.Keys; } } - [XmlIgnore] - [JsonProperty(PropertyName = "keys")] - public List JsonKeys - { - get - { - keys?.NumberIndices(); - return keys.Keys; - } - } - - [XmlIgnore] - [JsonIgnore] - public bool IsEmpty { get { return keys == null || keys.IsEmpty; } } - [XmlIgnore] - [JsonIgnore] - public int Count { get { if (keys == null) return 0; return keys.Count; } } - [XmlIgnore] - [JsonIgnore] - public Key this[int index] { get { return keys[index]; } } - - public override string ToString() - { - return Key.KeyListToString(keys.Keys); - } - - // constructors / creators - - public SemanticId() - { - } - - public SemanticId(SemanticId src) - { - if (src != null) - foreach (var k in src.Keys) - keys.Add(k); - } - - public static SemanticId CreateFromKey(Key key) - { - if (key == null) - return null; - var res = new SemanticId(); - res.Keys.Add(key); - return res; - } - - public static SemanticId CreateFromKeys(List keys) - { - if (keys == null) - return null; - var res = new SemanticId(); - res.Keys.AddRange(keys); - return res; - } - - // matching - - public bool Matches(string type, bool local, string idType, string value) - { - if (this.Count == 1 - && this.keys[0].type.ToLower().Trim() == type.ToLower().Trim() - && this.keys[0].local == local - && this.keys[0].idType.ToLower().Trim() == idType.ToLower().Trim() - && this.keys[0].value.ToLower().Trim() == value.ToLower().Trim()) - return true; - return false; - } - } - - public class Referable - { - - // members - - public string idShort = null; - public string category = null; - - [XmlElement(ElementName = "description")] - [JsonIgnore] - public Description description = null; - [XmlIgnore] - [JsonProperty(PropertyName = "descriptions")] - public List JsonDescription - { - get - { - if (description == null) - return null; - return description.langString; - } - set - { - if (description == null) - description = new Description(); - description.langString = value; - } - } - - [XmlIgnore] - [JsonIgnore] - public Referable parent = null; - - public static string[] ReferableCategoryNames = new string[] { "CONSTANT", "PARAMETER", "VARIABLE" }; - - // constructors - - public Referable() { } - - public Referable(Referable src) - { - this.idShort = src.idShort; - this.category = src.category; - if (src.description != null) - this.description = new Description(src.description); - } - - public void AddDescription(string lang, string str) - { - if (description == null) - description = new Description(); - description.langString.Add(LangStr.CreateNew(lang, str)); - } - - public virtual string GetElementName() - { - return "GlobalReference"; // not correct, but this method wasn't overridden correctly - } - - public string GetFriendlyName() - { - return AdminShellUtilV10.FilterFriendlyName(this.idShort); - } - - public void CollectReferencesByParent(List refs) - { - // check, if this is identifiable - if (this is Identifiable) - { - var idf = this as Identifiable; - var k = Key.CreateNew( - idf.GetElementName(), true, idf.identification.idType, idf.identification.id); - refs.Insert(0, k); - } - else - { - var k = Key.CreateNew(this.GetElementName(), true, "idShort", this.idShort); - refs.Insert(0, k); - // recurse upwards! - if (parent != null && parent is Referable) - (this.parent).CollectReferencesByParent(refs); - } - } - - public string CollectIdShortByParent() - { - // recurse first - var head = ""; - if (!(this is Identifiable) && this.parent != null && this.parent is Referable) - // can go up - head = this.parent.CollectIdShortByParent() + "/"; - // add own - var myid = ""; - if (this.idShort != null && this.idShort.Trim() != "") - myid = this.idShort.Trim(); - // together - return head + myid; - } - } - - public class Identifiable : Referable - { - - // members - - public Identification identification = new Identification(); - public Administration administration = null; - - // constructors - - public Identifiable() : base() { } - - public Identifiable(Identifiable src) - : base(src) - { - if (src.identification != null) - this.identification = new Identification(src.identification); - if (src.administration != null) - this.administration = new Administration(src.administration); - } - - public void SetIdentification(string idType, string id, string idShort = null) - { - identification.idType = idType; - identification.id = id; - if (idShort != null) - this.idShort = idShort; - } - - public void SetAdminstration(string version, string revision) - { - if (administration == null) - administration = new Administration(); - administration.version = version; - administration.revision = revision; - } - - public new string GetFriendlyName() - { - if (identification != null && identification.id != "") - return AdminShellUtilV10.FilterFriendlyName(this.identification.id); - return AdminShellUtilV10.FilterFriendlyName(this.idShort); - } - - } - - public class JsonModelTypeWrapper - { - public string name = ""; - - public JsonModelTypeWrapper(string name = "") { this.name = name; } - } - - public class AdministrationShell : Identifiable - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // from hasDataSpecification: - [XmlElement(ElementName = "hasDataSpecification")] - public HasDataSpecification hasDataSpecification = null; - - // from this very class - public AssetAdministrationShellRef derivedFrom = null; - - [JsonProperty(PropertyName = "asset")] - public AssetRef assetRef = new AssetRef(); - - [JsonProperty(PropertyName = "submodels")] - public List submodelRefs = new List(); - - [JsonIgnore] - public Views views = null; - [XmlIgnore] - [JsonProperty(PropertyName = "views")] - public View[] JsonViews - { - get { return views?.views.ToArray(); } - set { views = Views.CreateOrSetInnerViews(views, value); } - } - - [JsonProperty(PropertyName = "conceptDictionaries")] - public List conceptDictionaries = null; - - // constructurs - - public AdministrationShell() { } - - public AdministrationShell(AdministrationShell src) - : base(src) - { - if (src.hasDataSpecification != null) - this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - - if (src.derivedFrom != null) - this.derivedFrom = new AssetAdministrationShellRef(src.derivedFrom); - - if (src.assetRef != null) - this.assetRef = new AssetRef(src.assetRef); - - if (src.submodelRefs != null) - foreach (var smr in src.submodelRefs) - this.submodelRefs.Add(new SubmodelRef(smr)); - - if (src.views != null) - this.views = new Views(src.views); - - if (src.conceptDictionaries != null) - { - this.conceptDictionaries = new List(); - foreach (var cdd in src.conceptDictionaries) - this.conceptDictionaries.Add(new ConceptDictionary(cdd)); - } - } - - public static AdministrationShell CreateNew( - string idType, string id, string version = null, string revision = null) - { - var s = new AdministrationShell(); - s.identification.idType = idType; - s.identification.id = id; - if (version != null) - s.SetAdminstration(version, revision); - return (s); - } - - // add - - public void AddView(View v) - { - if (views == null) - views = new Views(); - views.views.Add(v); - } - - public void AddConceptDictionary(ConceptDictionary d) - { - if (conceptDictionaries == null) - conceptDictionaries = new List(); - conceptDictionaries.Add(d); - } - - public void AddDataSpecification(Key k) - { - if (hasDataSpecification == null) - hasDataSpecification = new HasDataSpecification(); - var r = new Reference(); - r.Keys.Add(k); - hasDataSpecification.reference.Add(r); - } - - public override string GetElementName() - { - return "AssetAdministrationShell"; - } - - public Tuple ToCaptionInfo() - { - var caption = AdminShellUtilV10.EvalToNonNullString("\"{0}\" ", idShort, "\"AAS\""); - if (administration != null) - caption += "V" + administration.version + "." + administration.revision; - - var info = ""; - if (identification != null) - info = $"[{identification.idType}, {identification.id}]"; - return Tuple.Create(caption, info); - } - - public override string ToString() - { - var ci = ToCaptionInfo(); - return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); - } - - public SubmodelRef FindSubmodelRef(Identification refid) - { - if (this.submodelRefs == null) - return null; - foreach (var r in this.submodelRefs) - if (r.MatchesTo(refid)) - return r; - return null; - } - - public bool HasSubmodelRef(SubmodelRef newref) - { - // check, if existing - if (this.submodelRefs == null) - return false; - var found = false; - foreach (var r in this.submodelRefs) - if (r.MatchesTo(newref)) - found = true; - - return found; - } - - public void AddSubmodelRef(SubmodelRef newref) - { - if (this.submodelRefs == null) - this.submodelRefs = new List(); - this.submodelRefs.Add(newref); - } - } - - public class Asset : Identifiable - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // from hasDataSpecification: - [XmlElement(ElementName = "hasDataSpecification")] - public HasDataSpecification hasDataSpecification = null; - // from HasKind - [XmlElement(ElementName = "kind")] - [JsonIgnore] - public Kind kind = new Kind(); - [XmlIgnore] - [JsonProperty(PropertyName = "kind")] - public string JsonKind - { - get - { - if (kind == null) - return null; - return kind.kind; - } - set - { - if (kind == null) - kind = new Kind(); - kind.kind = value; - } - } - // from this very class - [XmlElement(ElementName = "assetIdentificationModelRef")] - public SubmodelRef assetIdentificationModelRef = null; - - // constructors - - public Asset() { } - - public Asset(Asset src) - : base(src) - { - if (src.hasDataSpecification != null) - this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - if (src.kind != null) - this.kind = new Kind(src.kind); - if (src.assetIdentificationModelRef != null) - this.assetIdentificationModelRef = new SubmodelRef(src.assetIdentificationModelRef); - } - - // Getter & setters - - public AssetRef GetReference() - { - var r = new AssetRef(); - r.Keys.Add( - Key.CreateNew(this.GetElementName(), true, this.identification.idType, this.identification.id)); - return r; - } - - public override string GetElementName() - { - return "Asset"; - } - - public Tuple ToCaptionInfo() - { - var caption = AdminShellUtilV10.EvalToNonNullString("\"{0}\" ", idShort, ""); - if (administration != null) - caption += "V" + administration.version + "." + administration.revision; - - var info = ""; - if (identification != null) - info = $"[{identification.idType}, {identification.id}]"; - return Tuple.Create(caption, info); - } - - public override string ToString() - { - var ci = ToCaptionInfo(); - return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); - } - - } - - public class View : Referable - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // members - - // from hasSemanticId: - [XmlElement(ElementName = "semanticId")] - public SemanticId semanticId = null; - // from hasDataSpecification - [XmlElement(ElementName = "hasDataSpecification")] - public HasDataSpecification hasDataSpecification = null; - - // from this very class - [JsonIgnore] - public ContainedElements containedElements = null; - [XmlIgnore] - [JsonProperty(PropertyName = "containedElements")] - public ContainedElementRef[] JsonContainedElements - { - get { return containedElements?.reference.ToArray(); } - set { containedElements = ContainedElements.CreateOrSetInner(containedElements, value); } - } - - // getter / setter - - [XmlIgnore] - [JsonIgnore] - public bool IsEmpty { get { return containedElements == null || containedElements.Count < 1; } } - [XmlIgnore] - [JsonIgnore] - public int Count { get { if (containedElements == null) return 0; return containedElements.Count; } } - - public ContainedElementRef this[int index] - { - get - { - if ( -containedElements == null) return null; return containedElements[index]; - } - } - - // constructors / creators - - public View() { } - - public View(View src) - : base(src) - { - if (src.semanticId != null) - this.semanticId = new SemanticId(src.semanticId); - if (src.hasDataSpecification != null) - this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - if (src.containedElements != null) - this.containedElements = new ContainedElements(src.containedElements); - } - - public static View CreateNew(string idShort) - { - var v = new View(); - v.idShort = idShort; - return (v); - } - - public void AddDataSpecification(Key k) - { - if (hasDataSpecification == null) - hasDataSpecification = new HasDataSpecification(); - var r = new Reference(); - r.Keys.Add(k); - hasDataSpecification.reference.Add(r); - } - - public void AddContainedElement(Key k) - { - if (containedElements == null) - containedElements = new ContainedElements(); - var r = new ContainedElementRef(); - r.Keys.Add(k); - containedElements.reference.Add(r); - } - - public void AddContainedElement(List keys) - { - if (containedElements == null) - containedElements = new ContainedElements(); - var r = new ContainedElementRef(); - foreach (var k in keys) - r.Keys.Add(k); - containedElements.reference.Add(r); - } - - public void AddContainedElement(Reference r) - { - if (containedElements == null) - containedElements = new ContainedElements(); - containedElements.reference.Add(ContainedElementRef.CreateNew(r)); - } - - public void AddContainedElement(List rlist) - { - if (containedElements == null) - containedElements = new ContainedElements(); - foreach (var r in rlist) - containedElements.reference.Add(ContainedElementRef.CreateNew(r)); - } - - public override string GetElementName() - { - return "View"; - } - - public Tuple ToCaptionInfo() - { - var caption = AdminShellUtilV10.EvalToNonNullString("\"{0}\" ", idShort, ""); - var info = ""; - if (this.semanticId != null) - info = Key.KeyListToString(this.semanticId.Keys); - if (this.containedElements != null && this.containedElements.reference != null) - info = - (info + " ").Trim() + String.Format("({0} elements)", this.containedElements.reference.Count); - return Tuple.Create(caption, info); - } - - public override string ToString() - { - var ci = ToCaptionInfo(); - return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); - } - } - - public class Views - { - [XmlElement(ElementName = "view")] - [JsonIgnore] - public List views = new List(); - - // constructors - - public Views() { } - - public Views(Views src) - { - if (src != null && src.views != null) - foreach (var v in src.views) - this.views.Add(new View(v)); - } - - public static Views CreateOrSetInnerViews(Views outer, View[] inner) - { - var res = outer; - if (res == null) - res = new Views(); - if (inner == null) - { - res.views = null; - return res; - } - res.views = new List(inner); - return res; - } - } - - public class LangStringIEC61360 - { - - // members - - [XmlElement(ElementName = "langString", Namespace = "http://www.admin-shell.io/aas/1/0")] - public List langString = new List(); - - // getters / setters - - [XmlIgnore] - [JsonIgnore] - public bool IsEmpty { get { return langString == null || langString.Count < 1; } } - [XmlIgnore] - [JsonIgnore] - public int Count { get { if (langString == null) return 0; return langString.Count; } } - [XmlIgnore] - [JsonIgnore] - public LangStr this[int index] { get { return langString[index]; } } - - // constructors - - public LangStringIEC61360() { } - - public LangStringIEC61360(LangStringIEC61360 src) - { - if (src.langString != null) - foreach (var ls in src.langString) - this.langString.Add(new LangStr(ls)); - } - - // converter - - public static LangStringIEC61360 CreateFrom(List src) - { - var res = new LangStringIEC61360(); - if (src != null) - foreach (var ls in src) - res.langString.Add(new LangStr(ls)); - return res; - } - - } - - public class UnitId - { - - // members - - [XmlIgnore] - [JsonIgnore] - public KeyList keys = new KeyList(); - - // getter / setters - - [XmlArray("keys")] - [XmlArrayItem("key")] - [JsonIgnore] - public List Keys { get { return keys?.Keys; } } - [XmlIgnore] - [JsonProperty(PropertyName = "keys")] - public List JsonKeys - { - get - { - keys?.NumberIndices(); - return keys.Keys; - } - } - - [XmlIgnore] - [JsonIgnore] - public bool IsEmpty { get { return keys == null || keys.IsEmpty; } } - [XmlIgnore] - [JsonIgnore] - public int Count { get { if (keys == null) return 0; return keys.Count; } } - [XmlIgnore] - [JsonIgnore] - public Key this[int index] { get { return keys.Keys[index]; } } - - // constructors / creators - - public UnitId() { } - - public UnitId(UnitId src) - { - if (src.keys != null) - foreach (var k in src.Keys) - this.keys.Add(new Key(k)); - } - - public static UnitId CreateNew(string type, bool local, string idType, string value) - { - var u = new UnitId(); - u.keys.Keys.Add(Key.CreateNew(type, local, idType, value)); - return u; - } - - public static UnitId CreateNew(Reference src) - { - var res = new UnitId(); - if (src != null && src.Keys != null) - foreach (var k in src.Keys) - res.keys.Add(k); - return res; - } - } - - [XmlRoot(Namespace = "http://www.admin-shell.io/IEC61360/1/0")] - public class DataSpecificationIEC61360 - { - // static member - [XmlIgnore] - [JsonIgnore] - public static string[] DataTypeNames = { - "STRING", - "STRING_TRANSLATABLE", - "REAL_MEASURE", - "REAL_COUNT", - "REAL_CURRENCY", - "INTEGER_MEASURE", - "INTEGER_COUNT", - "INTEGER_CURRENCY", - "BOOLEAN", - "URL", - "RATIONAL", - "RATIONAL_MEASURE", - "TIME", - "TIMESTAMP", - "DATE" }; - - // members - public LangStringIEC61360 preferredName = new LangStringIEC61360(); - public string shortName = ""; - public string unit = ""; - public UnitId unitId = null; - public string valueFormat = null; - public List sourceOfDefinition = new List(); - public string symbol = null; - public string dataType = ""; - public LangStringIEC61360 definition = new LangStringIEC61360(); - - // getter / setters - - // constructors - - public DataSpecificationIEC61360() { } - - public DataSpecificationIEC61360(DataSpecificationIEC61360 src) - { - if (src.preferredName != null) - this.preferredName = new LangStringIEC61360(src.preferredName); - this.shortName = src.shortName; - this.unit = src.unit; - if (src.unitId != null) - this.unitId = new UnitId(src.unitId); - this.valueFormat = src.valueFormat; - if (src.sourceOfDefinition != null) - foreach (var sod in src.sourceOfDefinition) - this.sourceOfDefinition.Add(sod); - this.symbol = src.symbol; - this.dataType = src.dataType; - if (src.definition != null) - this.definition = new LangStringIEC61360(src.definition); - } - - public static DataSpecificationIEC61360 CreateNew( - string[] preferredName = null, - string shortName = "", - string unit = "", - UnitId unitId = null, - string valueFormat = null, - string[] sourceOfDefinition = null, - string symbol = null, - string dataType = "", - string[] definition = null - ) - { - var d = new DataSpecificationIEC61360(); - if (preferredName != null) - d.preferredName.langString = LangStr.CreateManyFromStringArray(preferredName); - d.shortName = shortName; - d.unit = unit; - d.unitId = unitId; - d.valueFormat = valueFormat; - if (sourceOfDefinition != null) - d.sourceOfDefinition = LangStr.CreateManyFromStringArray(sourceOfDefinition); - d.symbol = symbol; - d.dataType = dataType; - if (definition != null) - d.definition.langString = LangStr.CreateManyFromStringArray(definition); - return (d); - } - } - - public class DataSpecificationISO99999 - { - } - - public class DataSpecificationContent - { - - // members - - public DataSpecificationIEC61360 dataSpecificationIEC61360 = new DataSpecificationIEC61360(); - public DataSpecificationISO99999 dataSpecificationISO99999 = null; - - // constructors - - public DataSpecificationContent() { } - - public DataSpecificationContent(DataSpecificationContent src) - { - if (src.dataSpecificationIEC61360 != null) - this.dataSpecificationIEC61360 = new DataSpecificationIEC61360(src.dataSpecificationIEC61360); - } - } - - public class EmbeddedDataSpecification - { - // members - - public DataSpecificationRef hasDataSpecification = new DataSpecificationRef(); - public DataSpecificationContent dataSpecificationContent = new DataSpecificationContent(); - - // constructors - - public EmbeddedDataSpecification() { } - - public EmbeddedDataSpecification(EmbeddedDataSpecification src) - { - if (src.hasDataSpecification != null) - this.hasDataSpecification = new DataSpecificationRef(src.hasDataSpecification); - if (src.dataSpecificationContent != null) - this.dataSpecificationContent = new DataSpecificationContent(src.dataSpecificationContent); - } - } - - public class ConceptDescription : Identifiable, System.IDisposable - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // members - - // do this in order to be IDisposable, that is: suitable for (using) - void System.IDisposable.Dispose() { } - public void GetData() { } - // from HasDataSpecification - // TODO (Michael Hoffmeister, 1970-01-01): in V1.0, shall be a list of embeddedDataSpecification - [XmlElement(ElementName = "embeddedDataSpecification")] - [JsonIgnore] - public EmbeddedDataSpecification embeddedDataSpecification = new EmbeddedDataSpecification(); - [XmlIgnore] - [JsonProperty(PropertyName = "embeddedDataSpecifications")] - public EmbeddedDataSpecification[] JsonEmbeddedDataSpecifications - { - get - { - if (embeddedDataSpecification == null) - return null; - return new EmbeddedDataSpecification[] { embeddedDataSpecification }; - } - set - { - if (value == null) - embeddedDataSpecification = null; - else - embeddedDataSpecification = value[0]; - } - } - - // this class - [XmlIgnore] - private List isCaseOf = null; - - // getter / setter - - [XmlElement(ElementName = "isCaseOf")] - [JsonProperty(PropertyName = "isCaseOf")] - public List IsCaseOf - { - get { return isCaseOf; } - set { isCaseOf = value; } - } - - // constructors / creators - - public ConceptDescription() : base() { } - - public ConceptDescription(ConceptDescription src) - : base(src) - { - if (src.embeddedDataSpecification != null) - this.embeddedDataSpecification = new EmbeddedDataSpecification(src.embeddedDataSpecification); - if (src.isCaseOf != null) - foreach (var ico in src.isCaseOf) - { - if (this.isCaseOf == null) - this.isCaseOf = new List(); - this.isCaseOf.Add(new Reference(ico)); - } - } - - public static ConceptDescription CreateNew( - string idType, string id, string version = null, string revision = null) - { - var cd = new ConceptDescription(); - cd.identification.idType = idType; - cd.identification.id = id; - if (version != null) - { - if (cd.administration == null) - cd.administration = new Administration(); - cd.administration.version = version; - cd.administration.revision = revision; - } - return (cd); - } - - public ConceptDescriptionRef GetReference() - { - var r = new ConceptDescriptionRef(); - r.Keys.Add( - Key.CreateNew(this.GetElementName(), true, this.identification.idType, this.identification.id)); - return r; - } - - public Key GetGlobalDataSpecRef() - { - if (embeddedDataSpecification.hasDataSpecification.Count != 1) - return null; - return (embeddedDataSpecification.hasDataSpecification[0]); - } - - public void SetIEC61360Spec( - string[] preferredNames = null, - string shortName = "", - string unit = "", - UnitId unitId = null, - string valueFormat = null, - string[] sourceOfDefinition = null, - string symbol = null, - string dataType = "", - string[] definition = null - ) - { - this.embeddedDataSpecification = new EmbeddedDataSpecification(); - this.embeddedDataSpecification.hasDataSpecification.Keys.Add( - Key.CreateNew("GlobalReference", false, "URI", - "www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360")); - this.embeddedDataSpecification.dataSpecificationContent.dataSpecificationIEC61360 = - AdminShellV10.DataSpecificationIEC61360.CreateNew( - preferredNames, shortName, unit, unitId, valueFormat, sourceOfDefinition, symbol, dataType, - definition); - this.AddIsCaseOf( - Reference.CreateNew(new Key( - "ConceptDescription", false, this.identification.idType, this.identification.id))); - } - - public DataSpecificationIEC61360 GetIEC61360() - { - if (embeddedDataSpecification != null && - embeddedDataSpecification.dataSpecificationContent != null && - embeddedDataSpecification.dataSpecificationContent.dataSpecificationIEC61360 != null) - return embeddedDataSpecification.dataSpecificationContent.dataSpecificationIEC61360; - return null; - } - - public string GetShortName() - { - if (embeddedDataSpecification != null && - embeddedDataSpecification.dataSpecificationContent != null && - embeddedDataSpecification.dataSpecificationContent.dataSpecificationIEC61360 != null) - return embeddedDataSpecification.dataSpecificationContent.dataSpecificationIEC61360.shortName; - return ""; - } - - public override string GetElementName() - { - return "ConceptDescription"; - } - - public Tuple ToCaptionInfo() - { - var caption = ""; - if (this.idShort != null && this.idShort.Trim() != "") - caption = $"\"{this.idShort.Trim()}\""; - if (this.identification != null) - caption = (caption + " " + this.identification).Trim(); - - var info = ""; - if (embeddedDataSpecification != null && - embeddedDataSpecification.dataSpecificationContent != null && - embeddedDataSpecification.dataSpecificationContent.dataSpecificationIEC61360 != null) - info += embeddedDataSpecification.dataSpecificationContent.dataSpecificationIEC61360.shortName; - - return Tuple.Create(caption, info); - } - - public override string ToString() - { - var ci = ToCaptionInfo(); - return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); - } - - public void AddIsCaseOf(Reference ico) - { - if (isCaseOf == null) - isCaseOf = new List(); - isCaseOf.Add(ico); - } - - public static IDisposable CreateNew() - { - throw new NotImplementedException(); - } - } - - public class ConceptDictionary : Referable - { - [XmlElement(ElementName = "conceptDescriptions")] - public ConceptDescriptionRefs conceptDescriptionsRefs = null; - - // constructors - - public ConceptDictionary() { } - - public ConceptDictionary(ConceptDictionary src) - { - if (src.conceptDescriptionsRefs != null) - this.conceptDescriptionsRefs = new ConceptDescriptionRefs(src.conceptDescriptionsRefs); - } - - public static ConceptDictionary CreateNew(string idShort = null) - { - var d = new ConceptDictionary(); - if (idShort != null) - d.idShort = idShort; - return (d); - } - - // add - - public void AddReference(Reference r) - { - var cdr = (ConceptDescriptionRef)(ConceptDescriptionRef.CreateNew(r.Keys)); - if (conceptDescriptionsRefs == null) - conceptDescriptionsRefs = new ConceptDescriptionRefs(); - conceptDescriptionsRefs.conceptDescriptions.Add(cdr); - } - - public override string GetElementName() - { - return "ConceptDictionary"; - } - } - - [XmlRoot(ElementName = "aasenv", Namespace = "http://www.admin-shell.io/aas/1/0")] - public class AdministrationShellEnv - { - [XmlAttribute(Namespace = System.Xml.Schema.XmlSchema.InstanceNamespace)] - public string schemaLocation = - "http://www.admin-shell.io/aas/1/0 AAS.xsd http://www.admin-shell.io/IEC61360/1/0 IEC61360.xsd"; - - /// [XmlElement(ElementName="assetAdministrationShells")] - [XmlIgnore] // will be ignored, anyway - private List administrationShells = new List(); - [XmlIgnore] // will be ignored, anyway - private List assets = new List(); - [XmlIgnore] // will be ignored, anyway - private List submodels = new List(); - [XmlIgnore] // will be ignored, anyway - private List conceptDescriptions = new List(); - - // getter / setters - - [XmlArray("assetAdministrationShells")] - [XmlArrayItem("assetAdministrationShell")] - [JsonProperty(PropertyName = "assetAdministrationShells")] - public List AdministrationShells - { - get { return administrationShells; } - set { administrationShells = value; } - } - - [XmlArray("assets")] - [XmlArrayItem("asset")] - [JsonProperty(PropertyName = "assets")] - public List Assets - { - get { return assets; } - set { assets = value; } - } - - [XmlArray("submodels")] - [XmlArrayItem("submodel")] - [JsonProperty(PropertyName = "submodels")] - public List Submodels - { - get { return submodels; } - set { submodels = value; } - } - - [XmlArray("conceptDescriptions")] - [XmlArrayItem("conceptDescription")] - [JsonProperty(PropertyName = "conceptDescriptions")] - public List ConceptDescriptions - { - get { return conceptDescriptions; } - set { conceptDescriptions = value; } - } - - // finders - - public AdministrationShell FindAAS(Identification id) - { - if (id == null) - return null; - foreach (var aas in this.AdministrationShells) - if (aas.identification != null && aas.identification.IsEqual(id)) - return aas; - return null; - } - - public AdministrationShell FindAAS(string idShort) - { - if (idShort == null) - return null; - foreach (var aas in this.AdministrationShells) - if (aas.idShort != null && aas.idShort.Trim().ToLower() == idShort.Trim().ToLower()) - return aas; - return null; - } - - public AdministrationShell FindAASwithSubmodel(Identification smid) - { - if (smid == null) - return null; - foreach (var aas in this.AdministrationShells) - if (aas.submodelRefs != null) - foreach (var smref in aas.submodelRefs) - if (smref.MatchesTo(smid)) - return aas; - return null; - } - - public Asset FindAsset(Identification id) - { - if (id == null) - return null; - foreach (var asset in this.Assets) - if (asset.identification != null && asset.identification.IsEqual(id)) - return asset; - return null; - } - - public Asset FindAsset(AssetRef aref) - { - // trivial - if (aref == null) - return null; - // can only refs with 1 key - if (aref.Count != 1) - return null; - // and we're picky - var key = aref[0]; - if (!key.local || key.type.ToLower().Trim() != "asset") - return null; - // brute force - foreach (var a in assets) - if (a.identification.idType.ToLower().Trim() == key.idType.ToLower().Trim() - && a.identification.id.ToLower().Trim() == key.value.ToLower().Trim()) - return a; - // uups - return null; - } - - public Submodel FindSubmodel(Identification id) - { - if (id == null) - return null; - foreach (var sm in this.Submodels) - if (sm.identification != null && sm.identification.IsEqual(id)) - return sm; - return null; - } - - public Submodel FindSubmodel(SubmodelRef smref) - { - // trivial - if (smref == null) - return null; - // can only refs with 1 key - if (smref.Count != 1) - return null; - // and we're picky - var key = smref.Keys[0]; - if (!key.local || key.type.ToLower().Trim() != "submodel") - return null; - // brute force - foreach (var sm in this.Submodels) - if (sm.identification.idType.ToLower().Trim() == key.idType.ToLower().Trim() - && sm.identification.id.ToLower().Trim() == key.value.ToLower().Trim()) - return sm; - // uups - return null; - } - - public Referable FindReferableByReference(Reference rf, int keyIndex = 0) - { - // first index needs to exist .. - if (rf == null || keyIndex >= rf.Count) - return null; - - // which type? - var firstType = rf[keyIndex].type.Trim().ToLower(); - var firstIdentification = new Identification(rf[keyIndex].idType, rf[keyIndex].value); - - if (firstType == Key.AAS.Trim().ToLower()) - return this.FindAAS(firstIdentification); - - if (firstType == Key.Asset.Trim().ToLower()) - return this.FindAsset(firstIdentification); - - if (firstType == Key.ConceptDescription.Trim().ToLower()) - return this.FindConceptDescription(firstIdentification); - - if (firstType == Key.Submodel.Trim().ToLower()) - { - // ok, search Submodel - var sm = this.FindSubmodel(new Identification(rf[keyIndex].idType, rf[keyIndex].value)); - if (sm == null) - return null; - - // at our end? - if (keyIndex >= rf.Count - 1) - return sm; - - // go inside - return SubmodelElementWrapper.FindReferableByReference(sm.submodelElements, rf, keyIndex + 1); - } - - // nothing in this Environment - return null; - } - - - public ConceptDescription FindConceptDescription(ConceptDescriptionRef cdr) - { - if (cdr == null) - return null; - return FindConceptDescription(cdr.Keys); - } - - public ConceptDescription FindConceptDescription(Identification id) - { - var cdr = ConceptDescriptionRef.CreateNew("Conceptdescription", true, id.idType, id.id); - return FindConceptDescription(cdr); - } - - public ConceptDescription FindConceptDescription(List keys) - { - // trivial - if (keys == null) - return null; - // can only refs with 1 key - if (keys.Count != 1) - return null; - // and we're picky - var key = keys[0]; - if (!key.local || key.type.ToLower().Trim() != "conceptdescription") - return null; - // brute force - foreach (var cd in conceptDescriptions) - if (cd.identification.idType.ToLower().Trim() == key.idType.ToLower().Trim() - && cd.identification.id.ToLower().Trim() == key.value.ToLower().Trim()) - return cd; - // uups - return null; - } - - public ConceptDescription FindConceptDescription(Key key) - { - if (key == null) - return null; - var l = new List(); - l.Add(key); - return (FindConceptDescription(l)); - } - - // creators - - private void CopyConceptDescriptionsFrom( - AdministrationShellEnv srcEnv, SubmodelElement src, bool shallowCopy = false) - { - // access - if (srcEnv == null || src == null || src.semanticId == null) - return; - // check for this SubmodelElement in Source - var cdSrc = srcEnv.FindConceptDescription(src.semanticId.Keys); - if (cdSrc == null) - return; - // check for this SubmodelElement in Destnation (this!) - var cdDest = this.FindConceptDescription(src.semanticId.Keys); - if (cdDest != null) - return; - // copy new - this.ConceptDescriptions.Add(new ConceptDescription(cdSrc)); - // recurse? - if (!shallowCopy && src is SubmodelElementCollection) - foreach (var m in (src as SubmodelElementCollection).value) - CopyConceptDescriptionsFrom(srcEnv, m.submodelElement, shallowCopy); - - } - - public SubmodelElementWrapper CopySubmodelElementAndCD( - AdministrationShellEnv srcEnv, SubmodelElement srcElem, bool copyCD = false, bool shallowCopy = false) - { - // access - if (srcEnv == null || srcElem == null) - return null; - - // 1st result pretty easy (calling function will add this to the appropriate Submodel) - var res = new SubmodelElementWrapper(srcElem); - - // copy the CDs.. - if (copyCD) - CopyConceptDescriptionsFrom(srcEnv, srcElem, shallowCopy); - - // give back - return res; - } - - public SubmodelRef CopySubmodelRefAndCD( - AdministrationShellEnv srcEnv, SubmodelRef srcSubRef, bool copySubmodel = false, bool copyCD = false, - bool shallowCopy = false) - { - // access - if (srcEnv == null || srcSubRef == null) - return null; - - // need to have the source Submodel - var srcSub = srcEnv.FindSubmodel(srcSubRef); - if (srcSub == null) - return null; - - // 1st result pretty easy (calling function will add this to the appropriate AAS) - var dstSubRef = new SubmodelRef(srcSubRef); - - // get the destination and shall src != dst - var dstSub = this.FindSubmodel(dstSubRef); - if (srcSub == dstSub) - return null; - - // maybe we need the Submodel in our environment, as well - if (dstSub == null && copySubmodel) - { - dstSub = new Submodel(srcSub, shallowCopy); - this.Submodels.Add(dstSub); - } - else - { - // there is already an submodel, just add members - if (!shallowCopy && srcSub.submodelElements != null) - { - if (dstSub.submodelElements == null) - dstSub.submodelElements = new List(); - foreach (var smw in srcSub.submodelElements) - dstSub.submodelElements.Add(new SubmodelElementWrapper(smw.submodelElement, shallowCopy)); - } - } - - // copy the CDs.. - if (copyCD && srcSub.submodelElements != null) - foreach (var smw in srcSub.submodelElements) - CopyConceptDescriptionsFrom(srcEnv, smw.submodelElement, shallowCopy); - - // give back - return dstSubRef; - } - - // serializations - - public void SerializeXmlToStream(StreamWriter s) - { - var serializer = new XmlSerializer(typeof(AdminShellV10.AdministrationShellEnv)); - var nss = new XmlSerializerNamespaces(); - nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace); - nss.Add("aas", "http://www.admin-shell.io/aas/1/0"); - nss.Add("IEC61360", "http://www.admin-shell.io/IEC61360/1/0"); - serializer.Serialize(s, this, nss); - } - - public JsonWriter SerialiazeJsonToStream(StreamWriter sw, bool leaveJsonWriterOpen = false) - { - sw.AutoFlush = true; - - JsonSerializer serializer = new JsonSerializer(); - serializer.NullValueHandling = NullValueHandling.Ignore; - serializer.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; - serializer.Formatting = Newtonsoft.Json.Formatting.Indented; - - JsonWriter writer = new JsonTextWriter(sw); - serializer.Serialize(writer, this); - if (leaveJsonWriterOpen) - return writer; - writer.Close(); - return null; - } - - public AdministrationShellEnv DeserializeFromXmlStream(TextReader reader) - { - XmlSerializer serializer = new XmlSerializer( - typeof(AdminShellV10.AdministrationShellEnv), "http://www.admin-shell.io/aas/1/0"); - var res = serializer.Deserialize(reader) as AdminShellV10.AdministrationShellEnv; - return res; - } - - public AdministrationShellEnv DeserializeFromJsonStream(TextReader reader) - { - JsonSerializer serializer = new JsonSerializer(); - serializer.Converters.Add(new AdminShellV10.JsonAasxConverter("modelType", "name")); - var res = (AdministrationShellEnv)serializer.Deserialize(reader, typeof(AdministrationShellEnv)); - return res; - } - - // special functions - - private static void CreateFromExistingEnvRecurseForCDs( - AdministrationShellEnv src, List wrappers, - ref List filterForCD) - { - if (wrappers == null || filterForCD == null) - return; - - foreach (var w in wrappers) - { - // include in filter .. - if (w.submodelElement.semanticId != null) - { - var cd = src.FindConceptDescription(w.submodelElement.semanticId.Keys); - if (cd != null) - filterForCD.Add(cd); - } - - // recurse? - if (w.submodelElement is SubmodelElementCollection) - CreateFromExistingEnvRecurseForCDs( - src, (w.submodelElement as SubmodelElementCollection).value, ref filterForCD); - - if (w.submodelElement is Operation) - for (int i = 0; i < 2; i++) - { - var w2s = Operation.GetWrappers((w.submodelElement as Operation)[i]); - CreateFromExistingEnvRecurseForCDs(src, w2s, ref filterForCD); - } - - } - } - - public static AdministrationShellEnv CreateFromExistingEnv(AdministrationShellEnv src, - List filterForAas = null, - List filterForAsset = null, - List filterForSubmodel = null, - List filterForCD = null) - { - // prepare defaults - if (filterForAas == null) - filterForAas = new List(); - if (filterForAsset == null) - filterForAsset = new List(); - if (filterForSubmodel == null) - filterForSubmodel = new List(); - if (filterForCD == null) - filterForCD = new List(); - - // make new - var res = new AdministrationShellEnv(); - - // take over AAS - foreach (var aas in src.administrationShells) - if (filterForAas.Contains(aas)) - { - // take over - res.administrationShells.Add(new AdministrationShell(aas)); - - // consequences - if (aas.assetRef != null) - { - var asset = src.FindAsset(aas.assetRef); - if (asset != null) - filterForAsset.Add(asset); - } - - if (aas.submodelRefs != null) - foreach (var smr in aas.submodelRefs) - { - var sm = src.FindSubmodel(smr); - if (sm != null) - filterForSubmodel.Add(sm); - } - - if (aas.conceptDictionaries != null) - foreach (var cdd in aas.conceptDictionaries) - if (cdd.conceptDescriptionsRefs != null && - cdd.conceptDescriptionsRefs.conceptDescriptions != null) - foreach (var cdr in cdd.conceptDescriptionsRefs.conceptDescriptions) - { - var cd = src.FindConceptDescription(cdr); - if (cd != null) - filterForCD.Add(cd); - } - } - - // take over Assets - foreach (var asset in src.assets) - if (filterForAsset.Contains(asset)) - { - // take over - res.assets.Add(new Asset(asset)); - } - - // take over Submodels - foreach (var sm in src.Submodels) - if (filterForSubmodel.Contains(sm)) - { - // take over - res.submodels.Add(new Submodel(sm)); - - // recursion in order to find used CDs - CreateFromExistingEnvRecurseForCDs(src, sm.submodelElements, ref filterForCD); - } - - // ConceptDescriptions - foreach (var cd in src.ConceptDescriptions) - if (filterForCD.Contains(cd)) - { - // take over - res.conceptDescriptions.Add(new ConceptDescription(cd)); - } - - // ok - return res; - } - } - - // - // Submodel + Submodel elements - // - - public interface IGetReference - { - Reference GetReference(); - } - - public class Qualifier - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // member - - // from hasSemantics: - [XmlElement(ElementName = "semanticId")] - // TODO (Michael Hoffmeister, 1970-01-01): Qualifiers not working! - // 190410: test-wise enable them again, everyhing works fine .. - public SemanticId semanticId = null; - - // this class - public string qualifierType = null; - public string qualifierValue = null; - public Reference qualifierValueId = null; - - // constructors - - public Qualifier() { } - - public Qualifier(Qualifier src) - { - if (src.semanticId != null) - this.semanticId = new SemanticId(src.semanticId); - this.qualifierType = src.qualifierType; - this.qualifierValue = src.qualifierValue; - if (src.qualifierValueId != null) - this.qualifierValueId = new Reference(src.qualifierValueId); - } - - public string GetElementName() - { - return "Qualifier"; - } - } - - public class SubmodelElement : Referable, System.IDisposable, IGetReference - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // members - - // do this in order to be IDisposable, that is: suitable for (using) - void System.IDisposable.Dispose() { } - public void GetData() { } - // from hasDataSpecification: - [XmlElement(ElementName = "hasDataSpecification")] - public HasDataSpecification hasDataSpecification = null; - // from hasSemantics: - [XmlElement(ElementName = "semanticId")] - public SemanticId semanticId = null; - // from hasKind: - [XmlElement(ElementName = "kind")] - [JsonIgnore] - public Kind kind = null; - [XmlIgnore] - [JsonProperty(PropertyName = "kind")] - public string JsonKind - { - get - { - if (kind == null) - return null; - return kind.kind; - } - set - { - if (kind == null) - kind = new Kind(); - kind.kind = value; - } - } - // from Qualifiable: - [XmlArray("qualifier")] - [XmlArrayItem("qualifier")] - [JsonProperty(PropertyName = "constraints")] - public List qualifiers = null; - - // getter / setter - - // constructors / creators - - public SubmodelElement() - : base() { } - - public SubmodelElement(SubmodelElement src) - : base(src) - { - if (src.hasDataSpecification != null) - hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - if (src.semanticId != null) - semanticId = new SemanticId(src.semanticId); - if (src.kind != null) - kind = new Kind(src.kind); - if (src.qualifiers != null) - { - if (qualifiers == null) - qualifiers = new List(); - foreach (var q in src.qualifiers) - qualifiers.Add(new Qualifier(q)); - } - } - - public void CreateNewLogic(string idShort = null, string category = null, Key semanticIdKey = null) - { - if (idShort != null) - this.idShort = idShort; - if (category != null) - this.category = category; - if (semanticIdKey != null) - { - if (this.semanticId == null) - this.semanticId = new SemanticId(); - this.semanticId.Keys.Add(semanticIdKey); - } - } - - public void AddQualifier( - string qualifierType = null, string qualifierValue = null, KeyList semanticKeys = null, - Reference qualifierValueId = null) - { - if (this.qualifiers == null) - this.qualifiers = new List(); - var q = new Qualifier(); - q.qualifierType = qualifierType; - q.qualifierValue = qualifierValue; - q.qualifierValueId = qualifierValueId; - if (semanticKeys != null) - q.semanticId = SemanticId.CreateFromKeys(semanticKeys.Keys); - this.qualifiers.Add(q); - } - - public Qualifier HasQualifierOfType(string qualifierType) - { - if (this.qualifiers == null || qualifierType == null) - return null; - foreach (var q in this.qualifiers) - if (q.qualifierType.Trim().ToLower() == qualifierType.Trim().ToLower()) - return q; - return null; - } - - public override string GetElementName() - { - return "SubmodelElement"; - } - - public Reference GetReference() - { - Reference r = new Reference(); - // this is the tail of our referencing chain .. - r.Keys.Add(Key.CreateNew(GetElementName(), true, "idShort", this.idShort)); - // try to climb up .. - var current = this.parent; - while (current != null) - { - if (current is Identifiable) - { - // add big information set - r.Keys.Insert(0, Key.CreateNew( - current.GetElementName(), - true, - (current as Identifiable).identification.idType, - (current as Identifiable).identification.id)); - } - else - { - // reference via idShort - r.Keys.Insert(0, Key.CreateNew( - current.GetElementName(), - true, - "idShort", this.idShort)); - } - current = current.parent; - } - return r; - } - - public Tuple ToCaptionInfo() - { - var caption = AdminShellUtilV10.EvalToNonNullString("\"{0}\" ", idShort, ""); - var info = ""; - if (semanticId != null) - info = AdminShellUtilV10.EvalToNonEmptyString("\u21e8 {0}", semanticId.ToString(), ""); - return Tuple.Create(caption, info); - } - - public override string ToString() - { - var ci = ToCaptionInfo(); - return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); - } - - - } - - [XmlType(TypeName = "submodelElement")] - public class SubmodelElementWrapper - { - - // members - - [XmlElement(ElementName = "property", Type = typeof(Property))] - [XmlElement(ElementName = "file", Type = typeof(File))] - [XmlElement(ElementName = "blob", Type = typeof(Blob))] - [XmlElement(ElementName = "referenceElement", Type = typeof(ReferenceElement))] - [XmlElement(ElementName = "relationshipElement", Type = typeof(RelationshipElement))] - [XmlElement(ElementName = "submodelElementCollection", Type = typeof(SubmodelElementCollection))] - [XmlElement(ElementName = "operation", Type = typeof(Operation))] - public SubmodelElement submodelElement; - - // element names - public static string[] AdequateElementNames = { - "SubmodelElementCollection", "Property", "File", "Blob", "ReferenceElement", - "RelationshipElement", "Operation", "OperationVariable" }; - - // constructors - - public SubmodelElementWrapper() { } - - // for cloning - public SubmodelElementWrapper(SubmodelElement src, bool shallowCopy = false) - { - if (src is Property) - this.submodelElement = new Property(src as Property); - if (src is File) - this.submodelElement = new File(src as File); - if (src is Blob) - this.submodelElement = new Blob(src as Blob); - if (src is ReferenceElement) - this.submodelElement = new ReferenceElement(src as ReferenceElement); - if (src is RelationshipElement) - this.submodelElement = new RelationshipElement(src as RelationshipElement); - if (src is SubmodelElementCollection) - this.submodelElement = new SubmodelElementCollection( - src as SubmodelElementCollection, shallowCopy: shallowCopy); - if (src is Operation) - this.submodelElement = new Operation(src as Operation); - } - - /// - /// Introduced for JSON serialization, can create SubModelElements based on a string name - /// - /// string name (standard PascalCased) - /// SubmodelElement - public static SubmodelElement CreateAdequateType(string elementName) - { - if (elementName == "Property") - return new Property(); - if (elementName == "File") - return new File(); - if (elementName == "Blob") - return new Blob(); - if (elementName == "ReferenceElement") - return new ReferenceElement(); - if (elementName == "RelationshipElement") - return new RelationshipElement(); - if (elementName == "SubmodelElementCollection") - return new SubmodelElementCollection(); - if (elementName == "Operation") - return new Operation(); - if (elementName == "OperationVariable") - return new OperationVariable(); - return null; - } - - /// - /// Can create SubmodelElements based on a numerical index - /// - /// Index 0..7 (6+7 are Operation..!) - /// SubmodelElement - public static SubmodelElement CreateAdequateType(int index) - { - AdminShellV10.SubmodelElement sme = null; - switch (index) - { - case 0: - sme = new AdminShellV10.Property(); - break; - case 1: - sme = new AdminShellV10.File(); - break; - case 2: - sme = new AdminShellV10.Blob(); - break; - case 3: - sme = new AdminShellV10.ReferenceElement(); - break; - case 4: - sme = new AdminShellV10.SubmodelElementCollection(); - break; - case 5: - sme = new AdminShellV10.RelationshipElement(); - break; - case 6: - sme = new AdminShellV10.Operation(); - break; - case 7: - sme = new AdminShellV10.OperationVariable(); - break; - } - return sme; - } - - public string GetFourDigitCode() - { - if (submodelElement == null) - return ("Null"); - if (submodelElement is AdminShellV10.Property) return ("Prop"); - if (submodelElement is AdminShellV10.File) return ("File"); - if (submodelElement is AdminShellV10.Blob) return ("Blob"); - if (submodelElement is AdminShellV10.ReferenceElement) return ("Ref"); - if (submodelElement is AdminShellV10.RelationshipElement) return ("Rel"); - if (submodelElement is AdminShellV10.SubmodelElementCollection) return ("Coll"); - if (submodelElement is AdminShellV10.Operation) return ("Opr"); - return ("Elem"); - } - - public static List ListOfWrappersToListOfElems(List wrappers) - { - var res = new List(); - if (wrappers == null) - return res; - foreach (var w in wrappers) - if (w.submodelElement != null) - res.Add(w.submodelElement); - return res; - } - - public static SubmodelElementWrapper CreateFor(SubmodelElement sme) - { - var res = new SubmodelElementWrapper(); - res.submodelElement = sme; - return res; - } - - public static Referable FindReferableByReference( - List wrappers, Reference rf, int keyIndex) - { - // first index needs to exist .. - if (wrappers == null || rf == null || keyIndex >= rf.Count) - return null; - - // as SubmodelElements are not Identifiables, the actual key shall be IdSHort - if (rf[keyIndex].idType.Trim().ToLower() != - Key.GetIdentifierTypeName(Key.IdentifierType.IdShort).Trim().ToLower()) - return null; - - // over all wrappers - if (wrappers != null) - foreach (var smw in wrappers) - if (smw.submodelElement != null && - smw.submodelElement.idShort.Trim().ToLower() == rf[keyIndex].value.Trim().ToLower()) - { - // match on this level. Did we find a leaf element? - if ((keyIndex + 1) >= rf.Count) - return smw.submodelElement; - - // ok, not a leaf, must be a recursion - // int SMEC - if (smw.submodelElement is SubmodelElementCollection) - return FindReferableByReference( - (smw.submodelElement as SubmodelElementCollection).value, rf, keyIndex + 1); - - // TODO (Michael Hoffmeister, 1970-01-01): Operation - - // else: - return null; - } - - // no? - return null; - } - } - - public class Submodel : Identifiable, System.IDisposable, IGetReference - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // members - - // do this in order to be IDisposable, that is: suitable for (using) - void System.IDisposable.Dispose() { } - public void GetData() { } - // from hasDataSpecification: - [XmlElement(ElementName = "hasDataSpecification")] - public HasDataSpecification hasDataSpecification = null; - // from hasSemanticId: - [XmlElement(ElementName = "semanticId")] - public SemanticId semanticId = new SemanticId(); - // from Kindable - [XmlElement(ElementName = "kind")] - [JsonIgnore] - public Kind kind = new Kind(); - [XmlIgnore] - [JsonProperty(PropertyName = "kind")] - public string JsonKind - { - get - { - if (kind == null) - return null; - return kind.kind; - } - set - { - if (kind == null) - kind = new Kind(); - kind.kind = value; - } - } - // from Qualifiable: - [XmlArray("qualifier")] - [XmlArrayItem("qualifier")] - public List qualifiers = null; - - // from this very class - [JsonIgnore] - public List submodelElements = null; - [XmlIgnore] - [JsonProperty(PropertyName = "submodelElements")] - public SubmodelElement[] JsonSubmodelElements - { - get - { - var res = new List(); - if (submodelElements != null) - foreach (var smew in submodelElements) - res.Add(smew.submodelElement); - return res.ToArray(); - } - set - { - if (value != null) - { - this.submodelElements = new List(); - foreach (var x in value) - { - var smew = new SubmodelElementWrapper(); - smew.submodelElement = x; - this.submodelElements.Add(smew); - } - } - } - } - - // getter / setter - - // constructors / creators - - public Submodel() : base() { } - - public Submodel(Submodel src, bool shallowCopy = false) - : base(src) - { - if (src.hasDataSpecification != null) - this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - if (src.semanticId != null) - this.semanticId = new SemanticId(src.semanticId); - if (src.kind != null) - this.kind = new Kind(src.kind); - if (!shallowCopy && src.submodelElements != null) - { - if (this.submodelElements == null) - this.submodelElements = new List(); - foreach (var smw in src.submodelElements) - this.submodelElements.Add(new SubmodelElementWrapper(smw.submodelElement, shallowCopy)); - } - } - - public static Submodel CreateNew(string idType, string id, string version = null, string revision = null) - { - var s = new Submodel(); - s.identification.idType = idType; - s.identification.id = id; - if (version != null) - { - if (s.administration == null) - s.administration = new Administration(); - s.administration.version = version; - s.administration.revision = revision; - } - return (s); - } - - public override string GetElementName() - { - return "Submodel"; - } - - public Reference GetReference() - { - SubmodelRef l = new SubmodelRef(); - l.Keys.Add( - Key.CreateNew(this.GetElementName(), true, this.identification.idType, this.identification.id)); - return l; - } - - public void Add(SubmodelElement se) - { - if (submodelElements == null) - submodelElements = new List(); - var sew = new SubmodelElementWrapper(); - se.parent = this; // track parent here! - sew.submodelElement = se; - submodelElements.Add(sew); - } - - public void AddDataSpecification(Key k) - { - if (hasDataSpecification == null) - hasDataSpecification = new HasDataSpecification(); - var r = new Reference(); - r.Keys.Add(k); - hasDataSpecification.reference.Add(r); - } - - public SubmodelElementWrapper FindSubmodelElementWrapper(string idShort) - { - if (this.submodelElements == null) - return null; - foreach (var smw in this.submodelElements) - if (smw.submodelElement != null) - if (smw.submodelElement.idShort.Trim().ToLower() == idShort.Trim().ToLower()) - return smw; - return null; - } - - public Tuple ToCaptionInfo() - { - var caption = AdminShellUtilV10.EvalToNonNullString("\"{0}\" ", idShort, ""); - if (administration != null) - caption += "V" + administration.version + "." + administration.revision; - var info = ""; - if (identification != null) - info = $"[{identification.idType}, {identification.id}]"; - return Tuple.Create(caption, info); - } - - public override string ToString() - { - var ci = ToCaptionInfo(); - return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); - } - - // Recursing - - private void RecurseOnSubmodelElementsRecurse( - List wrappers, object state, List parents, - Action, SubmodelElement> lambda) - { - // trivial - if (wrappers == null || parents == null || lambda == null) - return; - - // over all elements - foreach (var smw in wrappers) - { - var current = smw.submodelElement; - if (current == null) - continue; - - // call lambda for this element - lambda(state, parents, current); - - // add to parents - parents.Add(current); - - // dive into? - if (current is SubmodelElementCollection) - { - var smc = current as SubmodelElementCollection; - RecurseOnSubmodelElementsRecurse(smc.value, state, parents, lambda); - } - - if (current is Operation) - { - var op = current as Operation; - for (int i = 0; i < 2; i++) - RecurseOnSubmodelElementsRecurse(Operation.GetWrappers(op[i]), state, parents, lambda); - } - - // remove from parents - parents.RemoveAt(parents.Count - 1); - } - } - - public void RecurseOnSubmodelElements( - object state, Action, SubmodelElement> lambda) - { - RecurseOnSubmodelElementsRecurse(this.submodelElements, state, new List(), lambda); - } - - // Parents stuff - - private static void SetParentsForSME(Referable parent, SubmodelElement se) - { - se.parent = parent; - var smc = se as SubmodelElementCollection; - if (smc != null) - foreach (var sme in smc.value) - SetParentsForSME(se, sme.submodelElement); - } - - public void SetAllParents() - { - if (this.submodelElements != null) - foreach (var sme in this.submodelElements) - SetParentsForSME(this, sme.submodelElement); - } - - } - - // - // Derived from SubmodelElements - // - - public class DataElement : SubmodelElement - { - - public DataElement() { } - - public DataElement(DataElement src) - : base(src) - { } - - public override string GetElementName() - { - return "DataElement"; - } - } - - public class JsonValueTypeCast - { - - public class JsonDataObjectType - { - [JsonProperty(PropertyName = "name")] - public string name = ""; - } - - [JsonProperty(PropertyName = "dataObjectType")] - public JsonDataObjectType dataObjectType = new JsonDataObjectType(); - - public JsonValueTypeCast(string name) - { - this.dataObjectType.name = name; - } - } - - public class Property : DataElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - - [JsonIgnore] - public string valueType = ""; - [XmlIgnore] - [JsonProperty(PropertyName = "valueType")] - public JsonValueTypeCast JsonValueType - { - get { return new JsonValueTypeCast(this.valueType); } - set { this.valueType = value?.dataObjectType?.name; } - } - - - public string value = ""; - public Reference valueId = null; - - // constructors - - public Property() { } - - public Property(Property src) - : base(src) - { - this.valueType = src.valueType; - this.value = src.value; - if (src.valueId != null) - src.valueId = new Reference(src.valueId); - } - - public static Property CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new Property(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - public void Set(string valueType = "", string value = "") - { - this.valueType = valueType; - this.value = value; - } - - public void Set(string type, bool local, string idType, string value) - { - this.valueId = Reference.CreateNew(Key.CreateNew(type, local, idType, value)); - } - - public override string GetElementName() - { - return "Property"; - } - } - - public class Blob : DataElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - - public string mimeType = ""; - public string value = ""; - - // constructors - - public Blob() { } - - public Blob(Blob src) - : base(src) - { - this.mimeType = src.mimeType; - this.value = src.value; - } - - public static Blob CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new Blob(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - public void Set(string mimeType = "", string value = "") - { - this.mimeType = mimeType; - this.value = value; - } - - public override string GetElementName() - { - return "Blob"; - } - - } - - public class File : DataElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - - public string mimeType = ""; - public string value = ""; - - // constructors - - public File() { } - - public File(File src) - : base(src) - { - this.mimeType = src.mimeType; - this.value = src.value; - } - - public static File CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new File(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - public void Set(string mimeType = "", string value = "") - { - this.mimeType = mimeType; - this.value = value; - } - - public override string GetElementName() - { - return "File"; - } - - public static string[] GetPopularMimeTypes() - { - return - new string[] { - System.Net.Mime.MediaTypeNames.Text.Plain, - System.Net.Mime.MediaTypeNames.Text.Xml, - System.Net.Mime.MediaTypeNames.Text.Html, - "application/json", - "application/rdf+xml", - System.Net.Mime.MediaTypeNames.Application.Pdf, - System.Net.Mime.MediaTypeNames.Image.Jpeg, - "image/png", - System.Net.Mime.MediaTypeNames.Image.Gif, - "application/iges", - "application/step" - }; - } - } - - public class ReferenceElement : DataElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - - public Reference value = new Reference(); - - // constructors - - public ReferenceElement() { } - - public ReferenceElement(ReferenceElement src) - : base(src) - { - if (src.value != null) - this.value = new Reference(src.value); - } - - public static ReferenceElement CreateNew( - string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new ReferenceElement(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - public void Set(Reference value = null) - { - this.value = value; - } - - public override string GetElementName() - { - return "ReferenceElement"; - } - - } - - public class RelationshipElement : DataElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - - public Reference first = new Reference(); - public Reference second = new Reference(); - - // constructors - - public RelationshipElement() { } - - public RelationshipElement(RelationshipElement src) - : base(src) - { - if (src.first != null) - this.first = new Reference(src.first); - if (src.second != null) - this.second = new Reference(src.second); - } - - public static RelationshipElement CreateNew( - string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new RelationshipElement(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - public void Set(Reference first = null, Reference second = null) - { - this.first = first; - this.second = second; - } - - public override string GetElementName() - { - return "RelationshipElement"; - } - } - - public class SubmodelElementCollection : SubmodelElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - [JsonIgnore] - public List value = new List(); - - [XmlIgnore] - [JsonProperty(PropertyName = "value")] - public SubmodelElement[] JsonValue - { - get - { - var res = new List(); - if (value != null) - foreach (var smew in value) - res.Add(smew.submodelElement); - return res.ToArray(); - } - set - { - if (value != null) - { - this.value = new List(); - foreach (var x in value) - { - var smew = new SubmodelElementWrapper(); - smew.submodelElement = x; - this.value.Add(smew); - } - } - } - } - - // further members - public bool ordered = false; - public bool allowDuplicates = false; - - // constructors - - public SubmodelElementCollection() { } - - public SubmodelElementCollection(SubmodelElementCollection src, bool shallowCopy = false) - : base(src) - { - this.ordered = src.ordered; - this.allowDuplicates = src.allowDuplicates; - if (!shallowCopy) - foreach (var smw in src.value) - value.Add(new SubmodelElementWrapper(smw.submodelElement)); - } - - public static SubmodelElementCollection CreateNew( - string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new SubmodelElementCollection(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - public void Set(bool allowDuplicates = false, bool ordered = false) - { - this.allowDuplicates = allowDuplicates; - this.ordered = ordered; - } - - public void Add(SubmodelElement se) - { - if (value == null) - value = new List(); - var sew = new SubmodelElementWrapper(); - se.parent = this; // track parent here! - sew.submodelElement = se; - value.Add(sew); - } - - public SubmodelElementWrapper FindSubmodelElementWrapper(string idShort) - { - if (this.value == null) - return null; - foreach (var smw in this.value) - if (smw.submodelElement != null) - if (smw.submodelElement.idShort.Trim().ToLower() == idShort.Trim().ToLower()) - return smw; - return null; - } - - public override string GetElementName() - { - return "SubmodelElementCollection"; - } - } - - public class OperationVariable : SubmodelElement - { - public enum Direction { In, Out }; - - // Note: for OperationVariable, the values of the SubmodelElement itself ARE NOT TO BE USED! - // only the SME attributes of "value" are counting - - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - public SubmodelElementWrapper value = null; - - // constructors - - public OperationVariable() - { - this.kind = new Kind("Type"); - } - - public OperationVariable(OperationVariable src, bool shallowCopy = false) - : base(src) - { - this.value = new SubmodelElementWrapper(src.value.submodelElement, shallowCopy); - } - - public OperationVariable(SubmodelElement elem) - : base() - { - this.value = new SubmodelElementWrapper(elem); - } - - public override string GetElementName() - { - return "OperationVariable"; - } - } - - public class Operation : SubmodelElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - [JsonIgnore] - [XmlElement(ElementName = "in")] - public List valueIn = new List(); - - [JsonIgnore] - [XmlElement(ElementName = "out")] - public List valueOut = new List(); - - [XmlIgnore] - // MICHA 190504: enabled JSON operation variables! - [JsonProperty(PropertyName = "in")] - public OperationVariable[] JsonValueIn - { - get { return valueIn?.ToArray(); } - set { valueIn = (value != null) ? new List(value) : null; } - } - - [XmlIgnore] - [JsonProperty(PropertyName = "out")] - // MICHA 190504: enabled JSON operation variables! - public OperationVariable[] JsonValueOut - { - get { return valueOut?.ToArray(); } - set { valueOut = (value != null) ? new List(value) : null; } - } - - public List this[OperationVariable.Direction dir] - { - get - { - return (dir == OperationVariable.Direction.In) ? valueIn : valueOut; - } - set - { - if (dir == OperationVariable.Direction.In) - valueIn = value; - else - valueOut = value; - } - } - - public List this[int dir] - { - get - { - return (dir == 0) ? valueIn : valueOut; - } - set - { - if (dir == 0) - valueIn = value; - else - valueOut = value; - } - } - - public static List GetWrappers(List ovl) - { - var res = new List(); - foreach (var ov in ovl) - if (ov.value != null) - res.Add(ov.value); - return res; - } - - // constructors - - public Operation() { } - - public Operation(Operation src) - : base(src) - { - for (int i = 0; i < 2; i++) - if (src[i] != null) - { - if (this[i] == null) - this[i] = new List(); - foreach (var ov in src[i]) - this[i].Add(ov); - } - } - - - public override string GetElementName() - { - return "Operation"; - } - } - - // - // Handling of packages - // - - /// - /// This converter is used for reading JSON files; it claims to be responsible for - /// "SubmodelElements" (the base class) - /// and decides, which sub-class of the base class shall be populated. - /// The decision, shich special sub-class to create is done in a factory - /// AdminShell.SubmodelElementWrapper.CreateAdequateType(), - /// in order to have all sub-class specific decisions in one place (SubmodelElementWrapper) - /// Remark: There is a NuGet package JsonSubTypes, which could have done the job, except the fact of having - /// "modelType" being a class property with a contained property "name". - /// - public class JsonAasxConverter : JsonConverter - { - private string UpperClassProperty = "modelType"; - private string LowerClassProperty = "name"; - - public JsonAasxConverter() : base() - { - } - - public JsonAasxConverter(string UpperClassProperty, string LowerClassProperty) : base() - { - this.UpperClassProperty = UpperClassProperty; - this.LowerClassProperty = LowerClassProperty; - } - - public override bool CanConvert(Type objectType) - { - if (typeof(AdminShellV10.SubmodelElement).IsAssignableFrom(objectType)) - return true; - return false; - } - - public override bool CanWrite - { - get { return false; } - } - - public override object ReadJson(JsonReader reader, - Type objectType, - object existingValue, - JsonSerializer serializer) - { - // Load JObject from stream - JObject jObject = JObject.Load(reader); - - // Create target object based on JObject - object target = new AdminShellV10.SubmodelElement(); - - if (jObject.ContainsKey(UpperClassProperty)) - { - var j2 = jObject[UpperClassProperty]; - foreach (var c in j2.Children()) - { - var cprop = c as Newtonsoft.Json.Linq.JProperty; - if (cprop == null) - continue; - if (cprop.Name == LowerClassProperty && - cprop.Value != null && - cprop.Value.Type.ToString() == "String") - { - var cpval = cprop.Value.ToObject(); - if (cpval == null) - continue; - var o = AdminShellV10.SubmodelElementWrapper.CreateAdequateType(cpval); - if (o != null) - target = o; - } - } - } - - // Populate the object properties - serializer.Populate(jObject.CreateReader(), target); - - return target; - } - - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) - { - throw new NotImplementedException(); - } - } - - /// - /// This class lets an outer functionality keep track on the supplementary files, which are in or - /// are pending to be added or deleted to an Package. - /// - public class PackageSupplementaryFile : Referable - { - public enum LocationType { InPackage, AddPending, DeletePending } - - public enum SpecialHandlingType { None, EmbedAsThumbnail } - - public Uri uri = null; - public string sourcePath = null; - public LocationType location = LocationType.InPackage; - public SpecialHandlingType specialHandling = SpecialHandlingType.None; - - public PackageSupplementaryFile( - Uri uri, string sourcePath = null, LocationType location = LocationType.InPackage, - SpecialHandlingType specialHandling = SpecialHandlingType.None) - { - this.uri = uri; - this.sourcePath = sourcePath; - this.location = location; - this.specialHandling = specialHandling; - } - - // class derives from Referable in order to provide GetElementName - public override string GetElementName() - { - return "File"; - } - - } - - /// - /// This class encapsulates an AdminShellEnvironment and supplementary files into an AASX Package. - /// Specifically has the capability to load, update and store .XML, .JSON and .AASX packages. - /// - public class PackageEnv - { - private string fn = "New Package"; - private AdministrationShellEnv aasenv = new AdministrationShellEnv(); - private Package openPackage = null; - private List pendingFilesToAdd = new List(); - private List pendingFilesToDelete = new List(); - - public PackageEnv() - { - } - - public PackageEnv(AdministrationShellEnv env) - { - if (env != null) - this.aasenv = env; - } - - public PackageEnv(string fn) - { - Load(fn); - } - - public bool IsOpen - { - get - { - return openPackage != null; - } - } - - public string Filename - { - get - { - return fn; - } - } - - public AdminShellV10.AdministrationShellEnv AasEnv - { - get - { - return aasenv; - } - } - - public bool Load(string fn) - { - this.fn = fn; - if (this.openPackage != null) - this.openPackage.Close(); - this.openPackage = null; - - if (fn.ToLower().EndsWith(".xml")) - { - // load only XML - try - { - // TODO (Michael Hoffmeister, 1970-01-01): use aasenv serialzers here! - XmlSerializer serializer = new XmlSerializer( - typeof(AdminShellV10.AdministrationShellEnv), "http://www.admin-shell.io/aas/1/0"); - TextReader reader = new StreamReader(fn); - this.aasenv = serializer.Deserialize(reader) as AdminShellV10.AdministrationShellEnv; - if (this.aasenv == null) - throw (new Exception("Type error for XML file!")); - reader.Close(); - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While reading AAS {0} at {1} gave: {2}", fn, - AdminShellUtilV10.ShortLocation(ex), ex.Message))); - } - return true; - } - - if (fn.ToLower().EndsWith(".json")) - { - // load only JSON - try - { - using (StreamReader file = System.IO.File.OpenText(fn)) - { - // TODO (Michael Hoffmeister, 1970-01-01): use aasenv serialzers here! - JsonSerializer serializer = new JsonSerializer(); - serializer.Converters.Add(new AdminShellV10.JsonAasxConverter("modelType", "name")); - this.aasenv = (AdministrationShellEnv)serializer.Deserialize( - file, typeof(AdministrationShellEnv)); - } - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While reading AAS {0} at {1} gave: {2}", - fn, AdminShellUtilV10.ShortLocation(ex), ex.Message))); - } - return true; - } - - if (fn.ToLower().EndsWith(".aasx")) - { - // load package AASX - try - { - var package = Package.Open(fn, FileMode.Open); - - // get the origin from the package - PackagePart originPart = null; - var xs = package.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aasx-origin"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/") - { - originPart = package.GetPart(x.TargetUri); - break; - } - if (originPart == null) - throw (new Exception(string.Format("Unable to find AASX origin. Aborting!"))); - - // get the specs from the package - PackagePart specPart = null; - xs = originPart.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aas-spec"); - foreach (var x in xs) - { - specPart = package.GetPart(x.TargetUri); - break; - } - if (specPart == null) - throw (new Exception(string.Format("Unable to find AASX spec(s). Aborting!"))); - - // open spec part to read - try - { - if (specPart.Uri.ToString().ToLower().Trim().EndsWith("json")) - { - using (var s = specPart.GetStream(FileMode.Open)) - { - using (StreamReader file = new StreamReader(s)) - { - JsonSerializer serializer = new JsonSerializer(); - serializer.Converters.Add( - new AdminShellV10.JsonAasxConverter("modelType", "name")); - this.aasenv = (AdministrationShellEnv)serializer.Deserialize( - file, typeof(AdministrationShellEnv)); - } - } - } - else - { - using (var s = specPart.GetStream(FileMode.Open)) - { - // own catch loop to be more specific - XmlSerializer serializer = new XmlSerializer( - typeof(AdminShellV10.AdministrationShellEnv), - "http://www.admin-shell.io/aas/1/0"); - this.aasenv = serializer.Deserialize(s) as AdminShellV10.AdministrationShellEnv; - this.openPackage = package; - if (this.aasenv == null) - throw (new Exception("Type error for XML file!")); - s.Close(); - } - } - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While reading AAS {0} spec at {1} gave: {2}", - fn, AdminShellUtilV10.ShortLocation(ex), ex.Message))); - } - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While reading AASX {0} at {1} gave: {2}", fn, - AdminShellUtilV10.ShortLocation(ex), ex.Message))); - } - return true; - } - - // Don't know to handle - throw (new Exception(string.Format($"Not able to handle {fn}."))); - } - - public bool LoadFromAasEnvString(string content) - { - try - { - using (var file = new StringReader(content)) - { - // TODO (Michael Hoffmeister, 1970-01-01): use aasenv serialzers here! - JsonSerializer serializer = new JsonSerializer(); - serializer.Converters.Add(new AdminShellV10.JsonAasxConverter("modelType", "name")); - this.aasenv = (AdministrationShellEnv)serializer.Deserialize( - file, typeof(AdministrationShellEnv)); - } - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While reading AASENV string {0} gave: {1}", - AdminShellUtilV10.ShortLocation(ex), ex.Message))); - } - return true; - } - - public enum PreferredFormat { None, Xml, Json }; - - public bool SaveAs(string fn, bool writeFreshly = false, PreferredFormat prefFmt = PreferredFormat.None) - { - - if (fn.ToLower().EndsWith(".xml")) - { - // save only XML - this.fn = fn; - try - { - using (var s = new StreamWriter(this.fn)) - { - // TODO (Michael Hoffmeister, 1970-01-01): use aasenv serialzers here! - var serializer = new XmlSerializer(typeof(AdminShellV10.AdministrationShellEnv)); - var nss = new XmlSerializerNamespaces(); - nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace); - nss.Add("aas", "http://www.admin-shell.io/aas/1/0"); - nss.Add("IEC61360", "http://www.admin-shell.io/IEC61360/1/0"); - serializer.Serialize(s, this.aasenv, nss); - } - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While writing AAS {0} at {1} gave: {2}", - fn, AdminShellUtilV10.ShortLocation(ex), ex.Message))); - } - return true; - } - - if (fn.ToLower().EndsWith(".json")) - { - // save only JSON - // this funcitonality is a initial test - this.fn = fn; - try - { - using (var sw = new StreamWriter(fn)) - { - // TODO (Michael Hoffmeister, 1970-01-01): use aasenv serialzers here! - - sw.AutoFlush = true; - - JsonSerializer serializer = new JsonSerializer(); - serializer.NullValueHandling = NullValueHandling.Ignore; - serializer.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; - serializer.Formatting = Newtonsoft.Json.Formatting.Indented; - using (JsonWriter writer = new JsonTextWriter(sw)) - { - serializer.Serialize(writer, this.aasenv); - } - } - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While writing AAS {0} at {1} gave: {2}", - fn, AdminShellUtilV10.ShortLocation(ex), ex.Message))); - } - return true; - } - - if (fn.ToLower().EndsWith(".aasx")) - { - // save package AASX - try - { - // we want existing contents to be preserved, but no possiblity to change file name - // therefore: copy file to new name, re-open! - // fn could be changed, therefore close "old" package first - if (this.openPackage != null) - { - try - { - this.openPackage.Close(); - if (!writeFreshly) - System.IO.File.Copy(this.fn, fn); - } - catch { } - this.openPackage = null; - } - - // approach is to utilize the existing package, if possible. If not, create from scratch - var package = Package.Open(fn, (writeFreshly) ? FileMode.Create : FileMode.OpenOrCreate); - this.fn = fn; - - // get the origin from the package - PackagePart originPart = null; - var xs = package.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aasx-origin"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/") - { - originPart = package.GetPart(x.TargetUri); - break; - } - if (originPart == null) - { - // create, as not existing - originPart = package.CreatePart( - new Uri( - "/aasx/aasx-origin", UriKind.RelativeOrAbsolute), - System.Net.Mime.MediaTypeNames.Text.Plain, CompressionOption.Maximum); - using (var s = originPart.GetStream(FileMode.Create)) - { - var bytes = System.Text.Encoding.ASCII.GetBytes("Intentionally empty."); - s.Write(bytes, 0, bytes.Length); - } - package.CreateRelationship( - originPart.Uri, TargetMode.Internal, - "http://www.admin-shell.io/aasx/relationships/aasx-origin"); - } - - // get the specs from the package - PackagePart specPart = null; - PackageRelationship specRel = null; - xs = originPart.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aas-spec"); - foreach (var x in xs) - { - specRel = x; - specPart = package.GetPart(x.TargetUri); - break; - } - - // check, if we have to change the spec part - if (specPart != null && specRel != null) - { - var name = System.IO.Path.GetFileNameWithoutExtension( - specPart.Uri.ToString()).ToLower().Trim(); - var ext = System.IO.Path.GetExtension(specPart.Uri.ToString()).ToLower().Trim(); - if ((ext == ".json" && prefFmt == PreferredFormat.Xml) - || (ext == ".xml" && prefFmt == PreferredFormat.Json) - || (name.StartsWith("aasenv-with-no-id"))) - { - // try kill specpart - try - { - originPart.DeleteRelationship(specRel.Id); - package.DeletePart(specPart.Uri); - } - catch { } - finally { specPart = null; specRel = null; } - } - } - - if (specPart == null) - { - // create, as not existing - var frn = "aasenv-with-no-id"; - if (this.aasenv.AdministrationShells.Count > 0) - frn = this.aasenv.AdministrationShells[0].GetFriendlyName() ?? frn; - var aas_spec_fn = "/aasx/#/#.aas"; - if (prefFmt == PreferredFormat.Json) - aas_spec_fn += ".json"; - else - aas_spec_fn += ".xml"; - aas_spec_fn = aas_spec_fn.Replace("#", "" + frn); - specPart = package.CreatePart( - new Uri( - aas_spec_fn, UriKind.RelativeOrAbsolute), System.Net.Mime.MediaTypeNames.Text.Xml, - CompressionOption.Maximum); - originPart.CreateRelationship( - specPart.Uri, TargetMode.Internal, - "http://www.admin-shell.io/aasx/relationships/aas-spec"); - } - - // now, specPart shall be != null! - if (specPart.Uri.ToString().ToLower().Trim().EndsWith("json")) - { - using (var s = specPart.GetStream(FileMode.Create)) - { - JsonSerializer serializer = new JsonSerializer(); - serializer.NullValueHandling = NullValueHandling.Ignore; - serializer.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; - serializer.Formatting = Newtonsoft.Json.Formatting.Indented; - using (var sw = new StreamWriter(s)) - { - using (JsonWriter writer = new JsonTextWriter(sw)) - { - serializer.Serialize(writer, this.aasenv); - } - } - } - } - else - { - using (var s = specPart.GetStream(FileMode.Create)) - { - var serializer = new XmlSerializer(typeof(AdminShellV10.AdministrationShellEnv)); - var nss = new XmlSerializerNamespaces(); - nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace); - nss.Add("aas", "http://www.admin-shell.io/aas/1/0"); - nss.Add("IEC61360", "http://www.admin-shell.io/IEC61360/1/0"); - serializer.Serialize(s, this.aasenv, nss); - } - } - - // there might be pending files to be deleted (first delete, then add, in case of identical - // files in both categories) - foreach (var psfDel in pendingFilesToDelete) - { - // try find an existing part for that file .. - var found = false; - - // normal files - xs = specPart.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aas-suppl"); - foreach (var x in xs) - if (x.TargetUri == psfDel.uri) - { - // try to delete - specPart.DeleteRelationship(x.Id); - package.DeletePart(psfDel.uri); - found = true; - break; - } - - // thumbnails - xs = package.GetRelationshipsByType( - "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); - foreach (var x in xs) - if (x.TargetUri == psfDel.uri) - { - // try to delete - package.DeleteRelationship(x.Id); - package.DeletePart(psfDel.uri); - found = true; - break; - } - - if (!found) - throw (new Exception( - $"Not able to delete pending file {psfDel.uri} in saving package {fn}")); - } - - // after this, there are no more pending for delete files - pendingFilesToDelete.Clear(); - - // write pending supplementary files - foreach (var psfAdd in pendingFilesToAdd) - { - // make sure .. - if (psfAdd.sourcePath == null || - psfAdd.location != PackageSupplementaryFile.LocationType.AddPending) - continue; - - // normal file? - if (psfAdd.specialHandling == PackageSupplementaryFile.SpecialHandlingType.None) - { - - // try find an existing part for that file .. - PackagePart filePart = null; - xs = specPart.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aas-suppl"); - foreach (var x in xs) - if (x.TargetUri == psfAdd.uri) - { - filePart = package.GetPart(x.TargetUri); - break; - } - - if (filePart == null) - { - // create new part and link - filePart = package.CreatePart( - psfAdd.uri, AdminShellV10.PackageEnv.GuessMimeType(psfAdd.sourcePath), - CompressionOption.Maximum); - specPart.CreateRelationship( - filePart.Uri, TargetMode.Internal, - "http://www.admin-shell.io/aasx/relationships/aas-suppl"); - } - - // now should be able to write - using (var s = filePart.GetStream(FileMode.Create)) - { - var bytes = System.IO.File.ReadAllBytes(psfAdd.sourcePath); - s.Write(bytes, 0, bytes.Length); - } - } - - // thumbnail file? - if (psfAdd.specialHandling == - PackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail) - { - // try find an existing part for that file .. - PackagePart filePart = null; - xs = package.GetRelationshipsByType( - "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/" && x.TargetUri == psfAdd.uri) - { - filePart = package.GetPart(x.TargetUri); - break; - } - - if (filePart == null) - { - // create new part and link - filePart = package.CreatePart( - psfAdd.uri, AdminShellV10.PackageEnv.GuessMimeType(psfAdd.sourcePath), - CompressionOption.Maximum); - package.CreateRelationship( - filePart.Uri, TargetMode.Internal, - "http://schemas.openxmlformats.org/package/2006/" + - "relationships/metadata/thumbnail"); - } - - // now should be able to write - using (var s = filePart.GetStream(FileMode.Create)) - { - var bytes = System.IO.File.ReadAllBytes(psfAdd.sourcePath); - s.Write(bytes, 0, bytes.Length); - } - } - } - - // after this, there are no more pending for add files - pendingFilesToAdd.Clear(); - - // flush, but leave open - package.Flush(); - this.openPackage = package; - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While write AASX {0} at {1} gave: {2}", - fn, AdminShellUtilV10.ShortLocation(ex), ex.Message))); - } - return true; - } - - // Don't know to handle - throw (new Exception(string.Format($"Not able to handle {fn}."))); - } - - private int BackupIndex = 0; - - public void BackupInDir(string backupDir, int maxFiles) - { - // access - if (backupDir == null || maxFiles < 1) - return; - - // we do it not caring on any errors - try - { - // get index in form - if (BackupIndex == 0) - { - // do not always start at 0!! - var rnd = new Random(); - BackupIndex = rnd.Next(maxFiles); - } - var ndx = BackupIndex % maxFiles; - BackupIndex += 1; - - // build a filename - var fn = Path.Combine(backupDir, $"backup{ndx:000}.xml"); - - // raw save - using (var s = new StreamWriter(fn)) - { - var serializer = new XmlSerializer(typeof(AdminShellV10.AdministrationShellEnv)); - var nss = new XmlSerializerNamespaces(); - nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace); - nss.Add("aas", "http://www.admin-shell.io/aas/1/0"); - nss.Add("IEC61360", "http://www.admin-shell.io/IEC61360/1/0"); - serializer.Serialize(s, this.aasenv, nss); - } - } - catch { } - } - - public Stream GetLocalStreamFromPackage(string uriString) - { - // access - if (this.openPackage == null) - throw (new Exception(string.Format($"AASX Package {this.fn} not opened. Aborting!"))); - var part = this.openPackage.GetPart(new Uri(uriString, UriKind.RelativeOrAbsolute)); - if (part == null) - throw (new Exception( - string.Format( - $"Cannot access URI {uriString} in {this.fn} not opened. Aborting!"))); - return part.GetStream(FileMode.Open); - } - - public long GetStreamSizeFromPackage(string uriString) - { - long res = 0; - try - { - if (this.openPackage == null) - return 0; - var part = this.openPackage.GetPart(new Uri(uriString, UriKind.RelativeOrAbsolute)); - if (part == null) - return 0; - using (var s = part.GetStream(FileMode.Open)) - { - res = s.Length; - } - } - catch { return 0; } - return res; - } - - public Stream GetLocalThumbnailStream(ref Uri thumbUri) - { - // access - if (this.openPackage == null) - throw (new Exception(string.Format($"AASX Package {this.fn} not opened. Aborting!"))); - // get the thumbnail over the relationship - PackagePart thumbPart = null; - var xs = this.openPackage.GetRelationshipsByType( - "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/") - { - thumbPart = this.openPackage.GetPart(x.TargetUri); - thumbUri = x.TargetUri; - break; - } - if (thumbPart == null) - throw (new Exception(string.Format("Unable to find AASX thumbnail. Aborting!"))); - return thumbPart.GetStream(FileMode.Open); - } - - public Stream GetLocalThumbnailStream() - { - Uri dummy = null; - return GetLocalThumbnailStream(ref dummy); - } - - public List GetListOfSupplementaryFiles() - { - // new result - var result = new List(); - - // access - if (this.openPackage != null) - { - - // get the thumbnail(s) from the package - var xs = this.openPackage.GetRelationshipsByType( - "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/") - { - result.Add(new PackageSupplementaryFile( - x.TargetUri, - location: PackageSupplementaryFile.LocationType.InPackage, - specialHandling: PackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail)); - } - - // get the origin from the package - PackagePart originPart = null; - xs = this.openPackage.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aasx-origin"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/") - { - originPart = this.openPackage.GetPart(x.TargetUri); - break; - } - - if (originPart != null) - { - // get the specs from the origin - PackagePart specPart = null; - xs = originPart.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aas-spec"); - foreach (var x in xs) - { - specPart = this.openPackage.GetPart(x.TargetUri); - break; - } - - if (specPart != null) - { - // get the supplementaries from the package, derived from spec - xs = specPart.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aas-suppl"); - foreach (var x in xs) - { - result.Add( - new PackageSupplementaryFile( - x.TargetUri, location: PackageSupplementaryFile.LocationType.InPackage)); - } - } - } - } - - // add or modify the files to delete - foreach (var psfDel in pendingFilesToDelete) - { - // already in - var found = result.Find(x => { return x.uri == psfDel.uri; }); - if (found != null) - found.location = PackageSupplementaryFile.LocationType.DeletePending; - else - { - psfDel.location = PackageSupplementaryFile.LocationType.DeletePending; - result.Add(psfDel); - } - } - - // add the files to store as well - foreach (var psfAdd in pendingFilesToAdd) - { - // already in (should not happen ?!) - var found = result.Find(x => { return x.uri == psfAdd.uri; }); - if (found != null) - found.location = PackageSupplementaryFile.LocationType.AddPending; - else - { - psfAdd.location = PackageSupplementaryFile.LocationType.AddPending; - result.Add(psfAdd); - } - } - - // done - return result; - } - - public static string GuessMimeType(string fn) - { - var file_ext = System.IO.Path.GetExtension(fn).ToLower().Trim(); - var content_type = System.Net.Mime.MediaTypeNames.Text.Plain; - if (file_ext == ".pdf") content_type = System.Net.Mime.MediaTypeNames.Application.Pdf; - if (file_ext == ".xml") content_type = System.Net.Mime.MediaTypeNames.Text.Xml; - if (file_ext == ".txt") content_type = System.Net.Mime.MediaTypeNames.Text.Plain; - if (file_ext == ".igs") content_type = "application/iges"; - if (file_ext == ".iges") content_type = "application/iges"; - if (file_ext == ".stp") content_type = "application/step"; - if (file_ext == ".step") content_type = "application/step"; - if (file_ext == ".jpg") content_type = System.Net.Mime.MediaTypeNames.Image.Jpeg; - if (file_ext == ".jpeg") content_type = System.Net.Mime.MediaTypeNames.Image.Jpeg; - if (file_ext == ".png") content_type = "image/png"; - if (file_ext == ".gif") content_type = System.Net.Mime.MediaTypeNames.Image.Gif; - return content_type; - } - - public void AddSupplementaryFileToStore( - string sourcePath, string targetDir, string targetFn, bool embedAsThumb) - { - // beautify parameters - sourcePath = sourcePath.Trim(); - targetDir = targetDir.Trim(); - if (!targetDir.EndsWith("/")) - targetDir += "/"; - targetDir = targetDir.Replace(@"\", "/"); - targetFn = targetFn.Trim(); - if (sourcePath == "" || targetDir == "" || targetFn == "") - throw (new Exception(string.Format("Trying add supplementary file with empty name or path!"))); - - var file_fn = "" + targetDir.Trim() + targetFn.Trim(); - - // add record - pendingFilesToAdd.Add( - new PackageSupplementaryFile( - new Uri(file_fn, UriKind.RelativeOrAbsolute), - sourcePath, - location: PackageSupplementaryFile.LocationType.AddPending, - specialHandling: ( - embedAsThumb - ? PackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail - : PackageSupplementaryFile.SpecialHandlingType.None) - )); - } - - public void DeleteSupplementaryFile(PackageSupplementaryFile psf) - { - if (psf == null) - throw (new Exception(string.Format("No supplementary file given!"))); - - if (psf.location == PackageSupplementaryFile.LocationType.AddPending) - { - // is still pending in add list -> remove - pendingFilesToAdd.RemoveAll((x) => { return x.uri == psf.uri; }); - } - - if (psf.location == PackageSupplementaryFile.LocationType.InPackage) - { - // add to pending delete list - pendingFilesToDelete.Add(psf); - } - } - - public void Close() - { - if (this.openPackage != null) - this.openPackage.Close(); - this.openPackage = null; - this.fn = ""; - this.aasenv = null; - } - } - - } - - #endregion -} - -#endif diff --git a/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShell.cs b/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShell.cs deleted file mode 100644 index 045199144..000000000 --- a/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShell.cs +++ /dev/null @@ -1,8895 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Text.RegularExpressions; -using System.Xml; -using System.Xml.Serialization; -using AdminShell_V20; -using Newtonsoft.Json; - -//namespace AdminShellNS -//namespace AdminShell_V20 -namespace AasxCompatibilityModels -{ - /// - /// This empty class derives always from the current version of the Administration Shell class hierarchy. - /// - public class AdminShell : AdminShellV20 { } - - #region AdminShell_V2_0 - - /// - /// Version of Details of Administration Shell Part 1 V1.0 published Nov/Dec/Jan 2018/19 - /// - public class AdminShellV20 - { - public class Identification - { - - // members - - [XmlAttribute] - [CountForHash] - public string idType = ""; - - [XmlText] - [CountForHash] - public string id = ""; - - // some constants - - public static string IRDI = "IRDI"; - public static string IRI = "IRI"; - public static string IdShort = "IdShort"; - - // constructors - - public Identification() { } - - public Identification(Identification src) - { - this.idType = src.idType; - this.id = src.id; - } - -#if !DoNotUseAasxCompatibilityModels - public Identification(AasxCompatibilityModels.AdminShellV10.Identification src) - { - this.idType = src.idType; - if (this.idType.Trim().ToLower() == "uri") - this.idType = Identification.IRI; - this.id = src.id; - } -#endif - - public Identification(string idType, string id) - { - this.idType = idType; - this.id = id; - } - - public Identification(Key key) - { - this.idType = key.idType; - this.id = key.value; - } - - // Creator with validation - - public static Identification CreateNew(string idType, string id) - { - if (idType == null || id == null) - return null; - var found = false; - foreach (var x in Key.IdentifierTypeNames) - found = found || idType.ToLower().Trim() == x.ToLower().Trim(); - if (!found) - return null; - return new Identification(idType, id); - } - - // further - - public bool IsEqual(Identification other) - { - return (this.idType.Trim().ToLower() == other.idType.Trim().ToLower() - && this.id.Trim().ToLower() == other.id.Trim().ToLower()); - } - - public bool IsIRI() - { - return idType?.Trim().ToUpper() == "URI" - || idType?.Trim().ToUpper() == IRI; - } - - public bool IsIRDI() - { - return idType?.Trim().ToUpper() == IRDI; - } - - public override string ToString() - { - return $"[{this.idType}] {this.id}"; - } - } - - public class Administration - { - - // members - - [MetaModelName("Administration.version")] - [TextSearchable] - [CountForHash] - public string version = ""; - - [MetaModelName("Administration.revision")] - [TextSearchable] - [CountForHash] - public string revision = ""; - - // constructors - - public Administration() { } - - public Administration(Administration src) - { - this.version = src.version; - this.revision = src.revision; - } - -#if !DoNotUseAasxCompatibilityModels - public Administration(AasxCompatibilityModels.AdminShellV10.Administration src) - { - this.version = src.version; - this.revision = src.revision; - } -#endif - - public Administration(string version, string revision) - { - this.version = version; - this.revision = revision; - } - - public override string ToString() - { - return $"R={this.version}, V={this.revision}"; - } - } - - public class Key - { - // Constants - - public enum MatchMode { Strict, Relaxed, Identification }; - - // Members - - [MetaModelName("Key.type")] - [TextSearchable] - [XmlAttribute] - [CountForHash] - public string type = ""; - - [XmlAttribute] - [CountForHash] - public bool local = false; - - [MetaModelName("Key.idType")] - [TextSearchable] - [XmlAttribute] - [JsonIgnore] - [CountForHash] - public string idType = ""; - - [XmlIgnore] - [JsonProperty(PropertyName = "idType")] - public string JsonIdType - { - // adapt idShort <-> IdShort - get => (idType == "idShort") ? "IdShort" : idType; - set => idType = (value == "idShort") ? "IdShort" : value; - } - - [MetaModelName("Key.value")] - [TextSearchable] - [XmlText] - [CountForHash] - public string value = ""; - - [XmlIgnore] - [JsonProperty(PropertyName = "index")] - [CountForHash] - public int index = 0; - - public Key() - { - } - - public Key(Key src) - { - this.type = src.type; - this.local = src.local; - this.idType = src.idType; - this.value = src.value; - } - -#if !DoNotUseAasxCompatibilityModels - public Key(AasxCompatibilityModels.AdminShellV10.Key src) - { - this.type = src.type; - this.local = src.local; - this.idType = src.idType; - if (this.idType.Trim().ToLower() == "uri") - this.idType = Identification.IRI; - if (this.idType.Trim().ToLower() == "idshort") - this.idType = Identification.IdShort; - this.value = src.value; - } -#endif - - public Key(string type, bool local, string idType, string value) - { - this.type = type; - this.local = local; - this.idType = idType; - this.value = value; - } - - public static Key CreateNew(string type, bool local, string idType, string value) - { - var k = new Key() - { - type = type, - local = local, - idType = idType, - value = value - }; - return (k); - } - - public static Key GetFromRef(Reference r) - { - if (r == null || r.Count != 1) - return null; - return r[0]; - } - - public Identification ToId() - { - return new Identification(this); - } - - public string ToString(int format = 0) - { - if (format == 1) - { - return String.Format( - "({0})({1})[{2}]{3}", this.type, this.local ? "local" : "no-local", this.idType, this.value); - } - if (format == 2) - { - return String.Format("[{0}]{1}", this.idType, this.value); - } - - // (old) default - var tlc = (this.local) ? "Local" : "not Local"; - return $"[{this.type}, {tlc}, {this.idType}, {this.value}]"; - } - - public static Key Parse(string cell, string typeIfNotSet = null, - bool allowFmtAll = false, bool allowFmt0 = false, - bool allowFmt1 = false, bool allowFmt2 = false) - { - // access and defaults? - if (cell == null || cell.Trim().Length < 1) - return null; - if (typeIfNotSet == null) - typeIfNotSet = Key.GlobalReference; - - // format == 1 - if (allowFmtAll || allowFmt1) - { - var m = Regex.Match(cell, @"\((\w+)\)\((\S+)\)\[(\w+)\]( ?)(.*)$"); - if (m.Success) - { - return new AdminShell.Key( - m.Groups[1].ToString(), m.Groups[2].ToString() == "local", - m.Groups[3].ToString(), m.Groups[5].ToString()); - } - } - - // format == 2 - if (allowFmtAll || allowFmt2) - { - var m = Regex.Match(cell, @"\[(\w+)\]( ?)(.*)$"); - if (m.Success) - { - return new AdminShell.Key( - typeIfNotSet, true, - m.Groups[1].ToString(), m.Groups[3].ToString()); - } - } - - // format == 0 - if (allowFmtAll || allowFmt0) - { - var m = Regex.Match(cell, @"\[(\w+),( ?)([^,]+),( ?)\[(\w+)\],( ?)(.*)\]"); - if (m.Success) - { - return new AdminShell.Key( - m.Groups[1].ToString(), !m.Groups[3].ToString().Contains("not"), - m.Groups[5].ToString(), m.Groups[7].ToString()); - } - } - - // no - return null; - } - - public static string KeyListToString(List keys) - { - if (keys == null || keys.Count < 1) - return ""; - // normally, exactly one key - if (keys.Count == 1) - return keys[0].ToString(); - // multiple! - var s = "[ "; - foreach (var k in keys) - { - if (s.Length > 0) - s += ", "; - s += k.ToString(); - } - return s + " ]"; - } - - public static string[] KeyElements = new string[] { - "GlobalReference", - "FragmentReference", - "AccessPermissionRule", - "Asset", - "AssetAdministrationShell", - "ConceptDescription", - "Submodel", - "SubmodelRef", // not completely right, but used by Package Explorer - "Blob", - "ConceptDictionary", - "DataElement", - "File", - "Operation", - "OperationVariable", - "BasicEvent", - "Entity", - "Property", - "MultiLanguageProperty", - "Range", - "ReferenceElement", - "RelationshipElement", - "AnnotatedRelationshipElement", - "Capability", - "SubmodelElement", - "SubmodelElementCollection", - "View" }; - - public static string[] ReferableElements = new string[] { - "AccessPermissionRule", - "Asset", - "AssetAdministrationShell", - "ConceptDescription", - "Submodel", - "Blob", - "ConceptDictionary", - "DataElement", - "File", - "Operation", - "OperationVariable", - "Entity", - "BasicEvent", - "Property", - "MultiLanguageProperty", - "Range", - "ReferenceElement", - "RelationshipElement", - "AnnotatedRelationshipElement", - "Capability", - "SubmodelElement", - "SubmodelElementCollection", - "View" }; - - public static string[] SubmodelElements = new string[] { - "DataElement", - "File", - "Event", - "Operation", - "Property", - "MultiLanguageProperty", - "Range", - "ReferenceElement", - "RelationshipElement", - "AnnotatedRelationshipElement", - "Capability", - "BasicEvent", - "Entity", - "SubmodelElementCollection"}; - - public static string[] IdentifiableElements = new string[] { - "Asset", - "AssetAdministrationShell", - "ConceptDescription", - "Submodel" }; - - // use this in list to designate all of the above elements - public static string AllElements = "All"; - - // use this in list to designate the GlobalReference - // Resharper disable MemberHidesStaticFromOuterClass - public static string GlobalReference = "GlobalReference"; - public static string FragmentReference = "FragmentReference"; - public static string ConceptDescription = "ConceptDescription"; - public static string SubmodelRef = "SubmodelRef"; - public static string Submodel = "Submodel"; - public static string SubmodelElement = "SubmodelElement"; - public static string Asset = "Asset"; - public static string AAS = "AssetAdministrationShell"; - public static string Entity = "Entity"; - public static string View = "View"; - // Resharper enable MemberHidesStaticFromOuterClass - - public static string[] IdentifierTypeNames = new string[] { - Identification.IdShort, "FragmentId", "Custom", Identification.IRDI, Identification.IRI }; - - public enum IdentifierType { IdShort = 0, FragmentId, Custom, IRDI, IRI }; - - public static string GetIdentifierTypeName(IdentifierType t) - { - return IdentifierTypeNames[(int)t]; - } - - public static string IdShort = "IdShort"; - public static string FragmentId = "FragmentId"; - public static string Custom = "Custom"; - - // some helpers - - public static bool IsInKeyElements(string ke) - { - var res = false; - foreach (var s in KeyElements) - if (s.Trim().ToLower() == ke.Trim().ToLower()) - res = true; - return res; - } - - public bool IsIdType(string[] value) - { - if (value == null || idType == null || idType.Trim() == "") - return false; - return value.Contains(idType.Trim()); - } - - public bool IsIdType(string value) - { - if (value == null || idType == null || idType.Trim() == "") - return false; - return value.Trim().Equals(idType.Trim()); - } - - public bool IsType(string value) - { - if (value == null || type == null || type.Trim() == "") - return false; - return value.Trim().ToLower().Equals(type.Trim().ToLower()); - } - - public bool IsAbsolute() - { - return IsType(Key.GlobalReference) - || IsType(Key.AAS) - || IsType(Key.Asset) - || IsType(Key.Submodel); - } - - public bool Matches( - string type, bool local, string idType, string id, MatchMode matchMode = MatchMode.Strict) - { - if (matchMode == MatchMode.Strict) - return this.type == type && this.local == local && this.idType == idType && this.value == id; - - if (matchMode == MatchMode.Relaxed) - return (this.type == type || this.type == Key.GlobalReference || type == Key.GlobalReference) - && this.idType == idType && this.value == id; - - if (matchMode == MatchMode.Identification) - return this.idType == idType && this.value == id; - - return false; - } - - public bool Matches(Identification id) - { - if (id == null) - return false; - return this.Matches(Key.GlobalReference, false, id.idType, id.id, MatchMode.Identification); - } - - public bool Matches(Key key, MatchMode matchMode = MatchMode.Strict) - { - if (key == null) - return false; - return this.Matches(key.type, key.local, key.idType, key.value, matchMode); - } - - // validation - - public static AasValidationAction Validate(AasValidationRecordList results, Key k, Referable container) - { - // access - if (results == null || container == null) - return AasValidationAction.No; - - var res = AasValidationAction.No; - - // check - if (k == null) - { - // violation case - results.Add(new AasValidationRecord( - AasValidationSeverity.SpecViolation, container, - "Key: is null", - () => - { - res = AasValidationAction.ToBeDeleted; - })); - } - else - { - // check IdType - var idf = AdminShellUtilV20.CheckIfInConstantStringArray(IdentifierTypeNames, k.idType); - if (idf == AdminShellUtilV20.ConstantFoundEnum.No) - // violation case - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, container, - "Key: idType is not in allowed enumeration values", - () => - { - k.idType = Custom; - })); - if (idf == AdminShellUtilV20.ConstantFoundEnum.AnyCase) - // violation case - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, container, - "Key: idType in wrong casing", - () => - { - k.idType = AdminShellUtilV20.CorrectCasingForConstantStringArray( - IdentifierTypeNames, k.idType); - })); - - // check type - var tf = AdminShellUtilV20.CheckIfInConstantStringArray(KeyElements, k.type); - if (tf == AdminShellUtilV20.ConstantFoundEnum.No) - // violation case - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, container, - "Key: type is not in allowed enumeration values", - () => - { - k.type = GlobalReference; - })); - if (tf == AdminShellUtilV20.ConstantFoundEnum.AnyCase) - // violation case - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, container, - "Key: type in wrong casing", - () => - { - k.idType = AdminShellUtilV20.CorrectCasingForConstantStringArray( - KeyElements, k.type); - })); - } - - // may give result "to be deleted" - return res; - } - } - - public class KeyList : List - { - // getters / setters - - [XmlIgnore] - public bool IsEmpty { get { return this.Count < 1; } } - - // constructors / creators - - public KeyList() { } - - public KeyList(KeyList src) - { - if (src != null) - foreach (var k in src) - this.Add(new Key(k)); - } - - public static KeyList CreateNew(Key k) - { - var kl = new KeyList { k }; - return kl; - } - - public static KeyList CreateNew(string type, bool local, string idType, string value) - { - var kl = new KeyList() { - Key.CreateNew(type, local, idType, value) - }; - return kl; - } - - public static KeyList CreateNew(string type, bool local, string idType, string[] valueItems) - { - // access - if (valueItems == null) - return null; - - // prepare - var kl = new AdminShell.KeyList(); - foreach (var x in valueItems) - kl.Add(new AdminShell.Key(type, local, idType, "" + x)); - return kl; - } - - // matches - - public bool Matches(KeyList other, Key.MatchMode matchMode = Key.MatchMode.Strict) - { - if (other == null || other.Count != this.Count) - return false; - - var same = true; - for (int i = 0; i < this.Count; i++) - same = same && this[i].Matches(other[i], matchMode); - - return same; - } - - // other - - public void NumberIndices() - { - for (int i = 0; i < this.Count; i++) - this[i].index = i; - } - - public string ToString(int format = 0, string delimiter = ",") - { - var res = string.Join(delimiter, this.Select((k) => k.ToString(format))); - return res; - } - - public static KeyList Parse(string input) - { - // access - if (input == null) - return null; - - // split - var parts = input.Split(',', ';'); - var kl = new KeyList(); - - foreach (var p in parts) - { - var k = Key.Parse(p); - if (k != null) - kl.Add(k); - } - - return kl; - } - - public string MostSignificantInfo() - { - if (this.Count < 1) - return "-"; - var i = this.Count - 1; - var res = this[i].value; - if (this[i].IsIdType(new[] { Key.FragmentId }) && i > 0) - res += this[i - 1].value; - return res; - } - - // validation - - public static void Validate(AasValidationRecordList results, KeyList kl, - Referable container) - { - // access - if (results == null || kl == null || container == null) - return; - - // iterate thru - var idx = 0; - while (idx < kl.Count) - { - var act = Key.Validate(results, kl[idx], container); - if (act == AasValidationAction.ToBeDeleted) - { - kl.RemoveAt(idx); - continue; - } - idx++; - } - } - - public bool StartsWith(KeyList head, bool emptyIsTrue = false, - Key.MatchMode matchMode = Key.MatchMode.Strict) - { - // access - if (head == null) - return false; - if (head.Count == 0) - return emptyIsTrue; - - // simply test element-wise - for (int i = 0; i < head.Count; i++) - { - // does head have more elements than this list? - if (i >= this.Count) - return false; - - if (!head[i].Matches(this[i], matchMode)) - return false; - } - - // ok! - return true; - } - - // arithmetics - - public static KeyList operator +(KeyList a, Key b) - { - var res = new KeyList(a); - if (b != null) - res.Add(b); - return res; - } - - public static KeyList operator +(KeyList a, KeyList b) - { - var res = new KeyList(a); - if (b != null) - res.AddRange(b); - return res; - } - - public KeyList SubList(int startPos, int count = int.MaxValue) - { - var res = new KeyList(); - if (startPos >= this.Count) - return res; - int nr = 0; - for (int i = startPos; i < this.Count && nr < count; i++) - { - nr++; - res.Add(this[i]); - } - return res; - } - - public KeyList ReplaceLastKey(KeyList newKeys) - { - var res = new KeyList(this); - if (res.Count < 1 || newKeys == null || newKeys.Count < 1) - return res; - - res.Remove(res.Last()); - res = res + newKeys; - - return res; - } - - // other - - /// - /// Take only idShort, ignore all other key-types and create a '/'-separated list - /// - /// Empty string or list of idShorts - public string BuildIdShortPath(int startPos = 0, int count = int.MaxValue) - { - if (startPos >= this.Count) - return ""; - int nr = 0; - var res = ""; - for (int i = startPos; i < this.Count && nr < count; i++) - { - nr++; - if (this[i].idType.Trim().ToLower() == Key.IdShort.Trim().ToLower()) - { - if (res != "") - res += "/"; - res += this[i].value; - } - } - return res; - } - } - - public class AasElementSelfDescription - { - public string ElementName = ""; - public string ElementAbbreviation = ""; - public SubmodelElementWrapper.AdequateElementEnum ElementEnum = - SubmodelElementWrapper.AdequateElementEnum.Unknown; - - public AasElementSelfDescription() { } - - public AasElementSelfDescription( - string ElementName, string ElementAbbreviation, - SubmodelElementWrapper.AdequateElementEnum elementEnum - = SubmodelElementWrapper.AdequateElementEnum.Unknown) - { - this.ElementName = ElementName; - this.ElementAbbreviation = ElementAbbreviation; - this.ElementEnum = elementEnum; - } - } - - /// - /// Extends understanding of Referable to further elements, which can be related to - /// - public interface IAasElement - { - AasElementSelfDescription GetSelfDescription(); - string GetElementName(); - } - - [XmlType(TypeName = "reference")] - public class Reference : IAasElement - { - - // members - - [XmlIgnore] // anyway, as it is private - [JsonIgnore] - private KeyList keys = new KeyList(); - - // getters / setters - - [XmlArray("keys")] - [XmlArrayItem("key")] - [JsonIgnore] - public KeyList Keys { get { return keys; } } - [XmlIgnore] - [JsonProperty(PropertyName = "keys")] - public KeyList JsonKeys - { - get - { - keys?.NumberIndices(); - return keys; - } - } - - [XmlIgnore] - [JsonIgnore] - public bool IsEmpty { get { return keys == null || keys.Count < 1; } } - [XmlIgnore] - [JsonIgnore] - public int Count { get { if (keys == null) return 0; return keys.Count; } } - [XmlIgnore] - [JsonIgnore] - public Key this[int index] { get { return keys[index]; } } - - [XmlIgnore] - [JsonIgnore] - public Key First { get { return this.Count < 1 ? null : this.keys[0]; } } - - [XmlIgnore] - [JsonIgnore] - public Key Last { get { return this.Count < 1 ? null : this.keys[this.keys.Count - 1]; } } - - // constructors / creators - - public Reference() - { - } - - public Reference(Key k) - { - if (k != null) - keys.Add(k); - } - - public Reference(Reference src) - { - if (src != null) - foreach (var k in src.Keys) - keys.Add(new Key(k)); - } - -#if !DoNotUseAasxCompatibilityModels - public Reference(AasxCompatibilityModels.AdminShellV10.Reference src) - { - if (src != null) - foreach (var k in src.Keys) - keys.Add(new Key(k)); - } -#endif - - public Reference(SemanticId src) - { - if (src != null) - foreach (var k in src.Keys) - keys.Add(new Key(k)); - } - -#if !DoNotUseAasxCompatibilityModels - public Reference(AasxCompatibilityModels.AdminShellV10.SemanticId src) - { - if (src != null) - foreach (var k in src.Keys) - keys.Add(new Key(k)); - } -#endif - public static Reference CreateNew(Key k) - { - if (k == null) - return null; - var r = new Reference(); - r.keys.Add(k); - return r; - } - - public static Reference CreateNew(List k) - { - if (k == null) - return null; - var r = new Reference(); - r.keys.AddRange(k); - return r; - } - - public static Reference CreateNew(string type, bool local, string idType, string value) - { - if (type == null || idType == null || value == null) - return null; - var r = new Reference(); - r.keys.Add(Key.CreateNew(type, local, idType, value)); - return r; - } - - public static Reference CreateIrdiReference(string irdi) - { - if (irdi == null) - return null; - var r = new Reference(); - r.keys.Add(new Key(Key.GlobalReference, false, Identification.IRDI, irdi)); - return r; - } - - // additions - - public static Reference operator +(Reference a, Key b) - { - var res = new Reference(a); - res.Keys?.Add(b); - return res; - } - - public static Reference operator +(Reference a, Reference b) - { - var res = new Reference(a); - res.Keys?.AddRange(b?.Keys); - return res; - } - - // further - - public Key GetAsExactlyOneKey() - { - if (keys == null || keys.Count != 1) - return null; - var k = keys[0]; - return new Key(k.type, k.local, k.idType, k.value); - } - - public bool MatchesExactlyOneKey( - string type, bool local, string idType, string id, Key.MatchMode matchMode = Key.MatchMode.Strict) - { - if (keys == null || keys.Count != 1) - return false; - var k = keys[0]; - return k.Matches(type, local, idType, id, matchMode); - } - - public bool MatchesExactlyOneKey(Key key, Key.MatchMode matchMode = Key.MatchMode.Strict) - { - if (key == null) - return false; - return this.MatchesExactlyOneKey(key.type, key.local, key.idType, key.value, matchMode); - } - - public bool Matches( - string type, bool local, string idType, string id, Key.MatchMode matchMode = Key.MatchMode.Strict) - { - if (this.Count == 1) - { - var k = keys[0]; - return k.Matches(type, local, idType, id, matchMode); - } - return false; - } - - public bool Matches(Key key, Key.MatchMode matchMode = Key.MatchMode.Strict) - { - if (this.Count == 1) - { - var k = keys[0]; - return k.Matches(key, matchMode); - } - return false; - } - - public bool Matches(Identification other) - { - if (other == null) - return false; - if (this.Count == 1) - { - var k = keys[0]; - return k.Matches(Key.GlobalReference, false, other.idType, other.id, Key.MatchMode.Identification); - } - return false; - } - - public bool Matches(Reference other, Key.MatchMode matchMode = Key.MatchMode.Strict) - { - if (this.keys == null || other == null || other.keys == null || other.Count != this.Count) - return false; - - var same = true; - for (int i = 0; i < this.Count; i++) - same = same && this.keys[i].Matches(other.keys[i], matchMode); - - return same; - } - - public bool Matches(SemanticId other, Key.MatchMode matchMode = Key.MatchMode.Strict) - { - return Matches(new Reference(other), matchMode); - } - - public bool Matches(ConceptDescription cd, Key.MatchMode matchMode = Key.MatchMode.Strict) - { - return Matches(cd?.GetReference(), matchMode); - } - - public string ToString(int format = 0, string delimiter = ",") - { - return keys?.ToString(format, delimiter); - } - - public static Reference Parse(string input) - { - return CreateNew(KeyList.Parse(input)); - } - - public string ListOfValues(string delim) - { - string res = ""; - if (this.Keys != null) - foreach (var x in this.Keys) - { - if (x == null) - continue; - if (res != "") res += delim; - res += x.value; - } - return res; - } - - // self description - - public virtual AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("Reference", "Rfc"); - } - - public virtual string GetElementName() - { - return this.GetSelfDescription()?.ElementName; - } - } - - [XmlType(TypeName = "derivedFrom")] - public class AssetAdministrationShellRef : Reference - { - // constructors - - public AssetAdministrationShellRef() : base() { } - - public AssetAdministrationShellRef(Key k) : base(k) { } - - public AssetAdministrationShellRef(Reference src) : base(src) { } - -#if !DoNotUseAasxCompatibilityModels - public AssetAdministrationShellRef(AasxCompatibilityModels.AdminShellV10.Reference src) : base(src) { } -#endif - - // further methods - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("AssetAdministrationShellRef", "AasRef"); - } - } - - [XmlType(TypeName = "assetRef")] - public class AssetRef : Reference - { - // constructors - - public AssetRef() : base() { } - - public AssetRef(AssetRef src) : base(src) { } - -#if !DoNotUseAasxCompatibilityModels - public AssetRef(AasxCompatibilityModels.AdminShellV10.AssetRef src) : base(src) { } -#endif - - public AssetRef(Reference r) - : base(r) - { - } - - // further methods - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("AssetRef", "AssetRef"); - } - } - - [XmlType(TypeName = "submodelRef")] - public class SubmodelRef : Reference - { - // constructors - - public SubmodelRef() : base() { } - - public SubmodelRef(SubmodelRef src) : base(src) { } - - public SubmodelRef(Reference src) : base(src) { } - -#if !DoNotUseAasxCompatibilityModels - public SubmodelRef(AasxCompatibilityModels.AdminShellV10.SubmodelRef src) : base(src) { } -#endif - - public new static SubmodelRef CreateNew(string type, bool local, string idType, string value) - { - var r = new SubmodelRef(); - r.Keys.Add(Key.CreateNew(type, local, idType, value)); - return r; - } - - public static SubmodelRef CreateNew(Reference src) - { - if (src == null || src.Keys == null) - return null; - var r = new SubmodelRef(); - r.Keys.AddRange(src.Keys); - return r; - } - - // further methods - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("SubmodelRef", "SMRef"); - } - } - - [XmlType(TypeName = "conceptDescriptionRef")] - public class ConceptDescriptionRef : Reference - { - // constructors - - public ConceptDescriptionRef() : base() { } - - public ConceptDescriptionRef(ConceptDescriptionRef src) : base(src) { } - -#if !DoNotUseAasxCompatibilityModels - public ConceptDescriptionRef( - AasxCompatibilityModels.AdminShellV10.ConceptDescriptionRef src) : base(src) { } -#endif - - // further methods - - public new static ConceptDescriptionRef CreateNew(string type, bool local, string idType, string value) - { - var r = new ConceptDescriptionRef(); - r.Keys.Add(Key.CreateNew(type, local, idType, value)); - return r; - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("ConceptDescriptionRef", "CDRef"); - } - - } - - [XmlType(TypeName = "dataSpecificationRef")] - public class DataSpecificationRef : Reference - { - // constructors - - public DataSpecificationRef() : base() { } - - public DataSpecificationRef(DataSpecificationRef src) : base(src) { } - - public DataSpecificationRef(Reference src) : base(src) { } - -#if !DoNotUseAasxCompatibilityModels - public DataSpecificationRef(AasxCompatibilityModels.AdminShellV10.DataSpecificationRef src) : base(src) { } - - public DataSpecificationRef(AasxCompatibilityModels.AdminShellV10.Reference src) : base(src) { } -#endif - - // further methods - - public static DataSpecificationRef CreateNew(Reference src) - { - if (src == null || src.Keys == null) - return null; - var res = new DataSpecificationRef(); - foreach (var k in src.Keys) - res.Keys.Add(new Key(k)); - return res; - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("DataSpecificationRef", "DSRef"); - } - - } - - [XmlType(TypeName = "conceptDescriptions")] - public class ConceptDescriptionRefs - { - [XmlElement(ElementName = "conceptDescriptionRef")] - public List conceptDescriptions = new List(); - - // constructors - - public ConceptDescriptionRefs() { } - - public ConceptDescriptionRefs(ConceptDescriptionRefs src) - { - if (src.conceptDescriptions != null) - foreach (var cdr in src.conceptDescriptions) - this.conceptDescriptions.Add(new ConceptDescriptionRef(cdr)); - } - -#if !DoNotUseAasxCompatibilityModels - public ConceptDescriptionRefs(AasxCompatibilityModels.AdminShellV10.ConceptDescriptionRefs src) - { - if (src.conceptDescriptions != null) - foreach (var cdr in src.conceptDescriptions) - this.conceptDescriptions.Add(new ConceptDescriptionRef(cdr)); - } -#endif - } - - [XmlType(TypeName = "containedElementRef")] - public class ContainedElementRef : Reference - { - // constructors - - public ContainedElementRef() { } - - public ContainedElementRef(ContainedElementRef src) : base(src) { } - -#if !DoNotUseAasxCompatibilityModels - public ContainedElementRef(AasxCompatibilityModels.AdminShellV10.ContainedElementRef src) : base(src) { } -#endif - - public static ContainedElementRef CreateNew(Reference src) - { - if (src == null || src.Keys == null) - return null; - var r = new ContainedElementRef(); - r.Keys.AddRange(src.Keys); - return r; - } - - // further methods - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("ContainedElementRef", "CERef"); - } - - } - -#if __not_valid_anymore - [XmlType(TypeName = "hasDataSpecification")] - public class HasDataSpecification - { - [XmlElement(ElementName = "reference")] // make "reference" go away by magic?! - public List reference = new List(); - - public HasDataSpecification() { } - - public HasDataSpecification(HasDataSpecification src) - { - foreach (var r in src.reference) - reference.Add(new Reference(r)); - } - -#if !DoNotUseAasxCompatibilityModels - public HasDataSpecification(AasxCompatibilityModels.AdminShellV10.HasDataSpecification src) - { - foreach (var r in src.reference) - reference.Add(new Reference(r)); - } -#endif - } -#else - // Note: In versions prior to V2.0.1, the SDK has "HasDataSpecification" containing only a Reference. - // Iv 2.0.1, theoretically each entity with HasDataSpecification could also conatin a - // EmbeddedDataSpecification. - - [XmlType(TypeName = "hasDataSpecification")] - public class HasDataSpecification : List - { - public HasDataSpecification() { } - - public HasDataSpecification(HasDataSpecification src) - { - foreach (var r in src) - this.Add(new EmbeddedDataSpecification(r)); - } - - public HasDataSpecification(IEnumerable src) - { - foreach (var r in src) - this.Add(new EmbeddedDataSpecification(r)); - } - -#if !DoNotUseAasxCompatibilityModels - public HasDataSpecification(AasxCompatibilityModels.AdminShellV10.HasDataSpecification src) - { - foreach (var r in src.reference) - this.Add(new EmbeddedDataSpecification(r)); - } -#endif - - // make some explicit and easy to use getter, setters - - [XmlIgnore] - [JsonIgnore] - public EmbeddedDataSpecification IEC61360 - { - get - { - foreach (var eds in this) - if (eds?.dataSpecificationContent?.dataSpecificationIEC61360 != null - || eds?.dataSpecification?.MatchesExactlyOneKey( - DataSpecificationIEC61360.GetKey(), Key.MatchMode.Identification) == true) - return eds; - return null; - } - set - { - // search existing first? - var eds = this.IEC61360; - if (eds != null) - { - // replace this - /* TODO (MIHO, 2020-08-30): this does not prevent the corner case, that we could have - * multiple dataSpecificationIEC61360 in this list, which would be an error */ - this.Remove(eds); - this.Add(value); - return; - } - - // no? .. add! - this.Add(value); - } - } - - [XmlIgnore] - [JsonIgnore] - public DataSpecificationIEC61360 IEC61360Content - { - get - { - return this.IEC61360?.dataSpecificationContent?.dataSpecificationIEC61360; - } - set - { - // search existing first? - var eds = this.IEC61360; - if (eds != null) - { - // replace this - eds.dataSpecificationContent.dataSpecificationIEC61360 = value; - return; - } - // no? .. add! - var edsnew = new EmbeddedDataSpecification(); - edsnew.dataSpecificationContent.dataSpecificationIEC61360 = value; - this.Add(edsnew); - } - } - - } -#endif - - [XmlType(TypeName = "ContainedElements")] - public class ContainedElements - { - - // members - - [XmlElement(ElementName = "containedElementRef")] // make "reference" go away by magic?! - public List reference = new List(); - - // getter / setter - - public bool IsEmpty { get { return reference == null || reference.Count < 1; } } - public int Count { get { if (reference == null) return 0; return reference.Count; } } - public ContainedElementRef this[int index] { get { return reference[index]; } } - - // Creators - - public ContainedElements() { } - - public ContainedElements(ContainedElements src) - { - if (src.reference != null) - foreach (var r in src.reference) - this.reference.Add(new ContainedElementRef(r)); - } - -#if !DoNotUseAasxCompatibilityModels - public ContainedElements(AasxCompatibilityModels.AdminShellV10.ContainedElements src) - { - if (src.reference != null) - foreach (var r in src.reference) - this.reference.Add(new ContainedElementRef(r)); - } -#endif - - public static ContainedElements CreateOrSetInner(ContainedElements outer, ContainedElementRef[] inner) - { - var res = outer; - if (res == null) - res = new ContainedElements(); - if (inner == null) - { - res.reference = null; - return res; - } - res.reference = new List(inner); - return res; - } - - } - - [XmlType(TypeName = "langString", Namespace = "http://www.admin-shell.io/2/0")] - public class LangStr - { - // constants - public static string LANG_DEFAULT = "en"; - - // members - - [MetaModelName("LangStr.lang")] - [TextSearchable] - [XmlAttribute(Namespace = "http://www.admin-shell.io/2/0")] - [JsonProperty(PropertyName = "language")] - [CountForHash] - public string lang = ""; - - [MetaModelName("LangStr.str")] - [TextSearchable] - [XmlText] - [JsonProperty(PropertyName = "text")] - [CountForHash] - public string str = ""; - - // constructors - - public LangStr() { } - - public LangStr(LangStr src) - { - this.lang = src.lang; - this.str = src.str; - } - -#if !DoNotUseAasxCompatibilityModels - public LangStr(AasxCompatibilityModels.AdminShellV10.LangStr src) - { - this.lang = src.lang; - this.str = src.str; - } -#endif - - public LangStr(string lang, string str) - { - this.lang = lang; - this.str = str; - } - - public static ListOfLangStr CreateManyFromStringArray(string[] s) - { - var r = new ListOfLangStr(); - var i = 0; - while ((i + 1) < s.Length) - { - r.Add(new LangStr(s[i], s[i + 1])); - i += 2; - } - return r; - } - - public override string ToString() - { - return $"{str}@{lang}"; - } - } - - public class ListOfLangStr : List - { - public ListOfLangStr() { } - - public ListOfLangStr(LangStr ls) - { - if (ls != null) - this.Add(ls); - } - - public ListOfLangStr(ListOfLangStr src) - { - if (src != null) - foreach (var ls in src) - this.Add(ls); - } - - public string this[string lang] - { - get - { - return GetDefaultStr(lang); - } - set - { - foreach (var ls in this) - if (ls.lang.Trim().ToLower() == lang?.Trim().ToLower()) - { - ls.str = value; - return; - } - this.Add(new LangStr(lang, value)); - } - } - - public string GetDefaultStr(string defaultLang = null) - { - // start - if (defaultLang == null) - defaultLang = LangStr.LANG_DEFAULT; - defaultLang = defaultLang.Trim().ToLower(); - string res = null; - - // search - foreach (var ls in this) - if (ls.lang.Trim().ToLower() == defaultLang) - res = ls.str; - if (res == null && this.Count > 0) - res = this[0].str; - - // found? - return res; - } - - public string GetExactStrForLang(string lang) - { - // start - if (lang == null) - return null; - string res = null; - - // exact search - foreach (var ls in this) - if (ls.lang.Trim().ToLower() == lang) - res = ls.str; - - // found? - return res; - } - - public bool ContainsLang(string lang) - { - return GetExactStrForLang(lang) != null; - } - - public bool AllLangSameString() - { - if (this.Count < 2) - return true; - - for (int i = 1; i < this.Count; i++) - if (this[0]?.str != null && this[0]?.str?.Trim() != this[i]?.str?.Trim()) - return false; - - return true; - } - - public override string ToString() - { - return string.Join(", ", this.Select((ls) => ls.ToString())); - } - - public static ListOfLangStr Parse(string cell) - { - // access - if (cell == null) - return null; - - // iterative approach - var res = new ListOfLangStr(); - while (true) - { - // trivial case and finite end - if (!cell.Contains("@")) - { - if (cell.Trim() != "") - res.Add(new LangStr(LangStr.LANG_DEFAULT, cell)); - break; - } - - // OK, pick the next couple - var m = Regex.Match(cell, @"(.*?)@(\w+)", RegexOptions.Singleline); - if (!m.Success) - { - // take emergency exit? - res.Add(new LangStr("??", cell)); - break; - } - - // use the match and shorten cell .. - res.Add(new LangStr(m.Groups[2].ToString(), m.Groups[1].ToString().Trim())); - cell = cell.Substring(m.Index + m.Length); - } - - return res; - } - } - - public class Description - { - - // members - - [XmlElement(ElementName = "langString")] - public ListOfLangStr langString = new ListOfLangStr(); - - // constructors - - public Description() { } - - public Description(Description src) - { - if (src != null && src.langString != null) - foreach (var ls in src.langString) - langString.Add(new LangStr(ls)); - } - - public Description(LangStringSet src) - { - if (src != null && src.langString != null) - foreach (var ls in src.langString) - langString.Add(new LangStr(ls)); - } - -#if !DoNotUseAasxCompatibilityModels - public Description(AasxCompatibilityModels.AdminShellV10.Description src) - { - if (src != null) - foreach (var ls in src.langString) - langString.Add(new LangStr(ls)); - } -#endif - - // single string representation - public string GetDefaultStr(string defaultLang = null) - { - return this.langString?.GetDefaultStr(defaultLang); - } - - } - - public class AssetKind - { - // constants - public static string Type = "Type"; - public static string Instance = "Instance"; - - [MetaModelName("AssetKind.kind")] - [TextSearchable] - [XmlText] - [CountForHash] - public string kind = "Instance"; - - // getters / setters - - [XmlIgnore] - [JsonIgnore] - public bool IsInstance { get { return kind == null || kind.Trim().ToLower() == "instance"; } } - - [XmlIgnore] - [JsonIgnore] - public bool IsType { get { return kind != null && kind.Trim().ToLower() == "type"; } } - - // constructors / creators - - public AssetKind() { } - - public AssetKind(AssetKind src) - { - kind = src.kind; - } - -#if !DoNotUseAasxCompatibilityModels - public AssetKind(AasxCompatibilityModels.AdminShellV10.Kind src) - { - kind = src.kind; - } -#endif - - public AssetKind(string kind) - { - this.kind = kind; - } - - public static AssetKind CreateAsType() - { - var res = new AssetKind() { kind = AssetKind.Type }; - return res; - } - - public static AssetKind CreateAsInstance() - { - var res = new AssetKind() { kind = AssetKind.Instance }; - return res; - } - } - - public class ModelingKind - { - // constants - public static string Template = "Template"; - public static string Instance = "Instance"; - - [MetaModelName("ModelingKind.kind")] - [TextSearchable] - [XmlText] - [CountForHash] - public string kind = Instance; - - // getters / setters - - [XmlIgnore] - [JsonIgnore] - public bool IsInstance { get { return kind == null || kind.Trim().ToLower() == Instance.ToLower(); } } - - [XmlIgnore] - [JsonIgnore] - public bool IsTemplate { get { return kind != null && kind.Trim().ToLower() == Template.ToLower(); } } - - // constructors / creators - - public ModelingKind() { } - - public ModelingKind(ModelingKind src) - { - kind = src.kind; - } - -#if !DoNotUseAasxCompatibilityModels - public ModelingKind(AasxCompatibilityModels.AdminShellV10.Kind src) - { - kind = src.kind; - } -#endif - - public ModelingKind(string kind) - { - this.kind = kind; - } - - public static ModelingKind CreateAsTemplate() - { - var res = new ModelingKind() { kind = Template }; - return res; - } - - public static ModelingKind CreateAsInstance() - { - var res = new ModelingKind() { kind = Instance }; - return res; - } - - // validation - - public static void Validate(AasValidationRecordList results, ModelingKind mk, Referable container) - { - // access - if (results == null || container == null) - return; - - // check - if (mk == null || mk.kind == null) - { - // warning - results.Add(new AasValidationRecord( - AasValidationSeverity.Warning, container, - "ModelingKind: is null", - () => - { - })); - } - else - { - var k = mk.kind.Trim(); - var kl = k.ToLower(); - if (kl != Template.ToLower() && kl != Instance.ToLower()) - { - // violation case - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, container, - $"ModelingKind: enumeration value neither {Template} nor {Instance}", - () => - { - mk.kind = Instance; - })); - } - else if (k != Template && k != Instance) - { - // warning - results.Add(new AasValidationRecord( - AasValidationSeverity.Warning, container, - "ModelingKind: enumeration value in wrong casing", - () => - { - if (kl == Template.ToLower()) - mk.kind = Template; - else - mk.kind = Instance; - })); - } - } - } - } - - public class SemanticId : Reference - { - - // constructors / creators - - public SemanticId() - : base() - { - } - - public SemanticId(SemanticId src) - : base(src) - { - } - - public SemanticId(Reference src) : base(src) { } - -#if !DoNotUseAasxCompatibilityModels - public SemanticId(AasxCompatibilityModels.AdminShellV10.SemanticId src) - : base(src) - { - } -#endif - public SemanticId(Key key) : base(key) { } - - public static SemanticId CreateFromKey(Key key) - { - if (key == null) - return null; - var res = new SemanticId(); - res.Keys.Add(key); - return res; - } - - public static SemanticId CreateFromKeys(List keys) - { - if (keys == null) - return null; - var res = new SemanticId(); - res.Keys.AddRange(keys); - return res; - } - - public new static SemanticId Parse(string input) - { - return (SemanticId)CreateNew(KeyList.Parse(input)); - } - } - - /// - /// This class allows to describe further data (in derived classes) when enumerating Children. - /// - public class EnumerationPlacmentBase - { - } - - public interface IEnumerateChildren - { - IEnumerable EnumerateChildren(); - EnumerationPlacmentBase GetChildrenPlacement(SubmodelElement child); - object AddChild(SubmodelElementWrapper smw, EnumerationPlacmentBase placement = null); - } - - public interface IValidateEntity - { - void Validate(AasValidationRecordList results); - } - - /// - /// This attribute indicates, that it should e.g. serialized in JSON. - /// - [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = true)] - public class CountForHash : System.Attribute - { - } - - /// - /// This attribute indicates, that evaluation shall not count following field or not dive into references. - /// - [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = true)] - public class SkipForHash : System.Attribute - { - } - - /// - /// This attribute indicates, that the field / property is searchable - /// - [System.AttributeUsage(System.AttributeTargets.Field | System.AttributeTargets.Property, AllowMultiple = true)] - public class MetaModelName : System.Attribute - { - public string name; - public MetaModelName(string name) - { - this.name = name; - } - } - - /// - /// This attribute indicates, that the field / property shall be skipped for reflection - /// in order to avoid cycles - /// - [System.AttributeUsage(System.AttributeTargets.Field | System.AttributeTargets.Property, AllowMultiple = true)] - public class SkipForReflection : System.Attribute - { - } - - /// - /// This attribute indicates, that the field / property shall be skipped for searching, because it is not - /// directly displayed in Package Explorer - /// - [System.AttributeUsage(System.AttributeTargets.Field | System.AttributeTargets.Property, AllowMultiple = true)] - public class SkipForSearch : System.Attribute - { - } - - /// - /// This attribute indicates, that the field / property is searchable - /// - [System.AttributeUsage(System.AttributeTargets.Field | System.AttributeTargets.Property, AllowMultiple = true)] - public class TextSearchable : System.Attribute - { - } - - /// - /// Result of FindReferable in Environment - /// - public class ReferableRootInfo - { - public AdministrationShell AAS = null; - public Asset Asset = null; - public Submodel Submodel = null; - - public int NrOfRootKeys = 0; - - public bool IsValid - { - get - { - return NrOfRootKeys > 0 && (AAS != null || Submodel != null || Asset != null); - } - } - } - - /// - /// Marks an object, preferaby a payload item, which might be featured by the diary collection - /// - public interface IAasDiaryEntry - { - } - - public class DiaryDataDef - { - public enum TimeStampKind { Create, Update } - - [XmlIgnore] - [JsonIgnore] - private DateTime[] _timeStamp = new DateTime[2]; - - [XmlIgnore] - [JsonIgnore] - public DateTime[] TimeStamp { get { return _timeStamp; } } - - /// - /// List of entries, timewise one after each other (entries are timestamped). - /// Note: Default is Entries = null, as handling of many many AAS elements does not - /// create additional overhead of creating empty lists. An empty list shall be avoided. - /// - public List Entries = null; - - public static void AddAndSetTimestamps(Referable element, IAasDiaryEntry de, bool isCreate = false) - { - // trivial - if (element == null || de == null || element.DiaryData == null) - return; - - // add entry - if (element.DiaryData.Entries == null) - element.DiaryData.Entries = new List(); - element.DiaryData.Entries.Add(de); - - // figure out which timestamp - var tsk = TimeStampKind.Update; - if (isCreate) - { - tsk = TimeStampKind.Create; - } - - // set this timestamp (and for the parents, as well) - IDiaryData el = element; - while (el?.DiaryData != null) - { - // itself - el.DiaryData.TimeStamp[(int)tsk] = DateTime.UtcNow; - - // go up - el = (el as Referable)?.parent as IDiaryData; - } - } - } - - public interface IDiaryData - { - DiaryDataDef DiaryData { get; } - } - - public class ListOfReferable : List - { - // conversion to other list - - public KeyList ToKeyList() - { - var res = new KeyList(); - foreach (var rf in this) - res.Add(rf.ToKey()); - return res; - } - - public Reference GetReference() - { - return Reference.CreateNew(ToKeyList()); - } - } - - public interface IRecurseOnReferables - { - void RecurseOnReferables( - object state, Func lambda, - bool includeThis = false); - } - - public class Referable : IValidateEntity, IAasElement, IDiaryData, IGetReference, IRecurseOnReferables - { - // diary - - [XmlIgnore] - [JsonIgnore] - [SkipForHash] - [SkipForReflection] - private DiaryDataDef _diaryData = new DiaryDataDef(); - - [XmlIgnore] - [JsonIgnore] - [SkipForReflection] - public DiaryDataDef DiaryData { get { return _diaryData; } } - - // members - - [MetaModelName("Referable.IdShort")] - [TextSearchable] - [CountForHash] - public string idShort = ""; - - [MetaModelName("Referable.category")] - [TextSearchable] - [CountForHash] - public string category = null; - - [XmlElement(ElementName = "description")] - [JsonIgnore] - [CountForHash] - public Description description = null; - - [XmlIgnore] - [JsonProperty(PropertyName = "descriptions")] - public ListOfLangStr JsonDescription - { - get - { - return description?.langString; - } - set - { - if (value == null) - { - description = null; - return; - } - - if (description == null) - description = new Description(); - description.langString = value; - } - } - - [XmlIgnore] - [JsonIgnore] - [SkipForHash] // important to skip, as recursion elsewise will go in cycles! - [SkipForReflection] // important to skip, as recursion elsewise will go in cycles! - public IAasElement parent = null; - - public static string CONSTANT = "CONSTANT"; - public static string Category_PARAMETER = "PARAMETER"; - public static string VARIABLE = "VARIABLE"; - - public static string[] ReferableCategoryNames = new string[] { CONSTANT, Category_PARAMETER, VARIABLE }; - - // constructors - - public Referable() { } - - public Referable(string idShort) - { - this.idShort = idShort; - } - - public Referable(Referable src) - { - if (src == null) - return; - this.idShort = src.idShort; - this.category = src.category; - if (src.description != null) - this.description = new Description(src.description); - } - -#if !DoNotUseAasxCompatibilityModels - public Referable(AasxCompatibilityModels.AdminShellV10.Referable src) - { - if (src == null) - return; - this.idShort = src.idShort; - if (this.idShort == null) - // change in V2.0 -> mandatory - this.idShort = ""; - this.category = src.category; - if (src.description != null) - this.description = new Description(src.description); - } -#endif - - /// - /// Introduced for JSON serialization, can create Referables based on a string name - /// - /// string name (standard PascalCased) - public static Referable CreateAdequateType(string elementName) - { - if (elementName == Key.AAS) - return new AdministrationShell(); - if (elementName == Key.Asset) - return new Asset(); - if (elementName == Key.ConceptDescription) - return new ConceptDescription(); - if (elementName == Key.Submodel) - return new Submodel(); - if (elementName == Key.View) - return new View(); - return SubmodelElementWrapper.CreateAdequateType(elementName); - } - - public void AddDescription(string lang, string str) - { - if (description == null) - description = new Description(); - description.langString.Add(new LangStr(lang, str)); - } - - public virtual AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("Referable", "Ref"); - } - - public virtual string GetElementName() - { - return this.GetSelfDescription()?.ElementName; - } - - public string GetFriendlyName() - { - return AdminShellUtilV20.FilterFriendlyName(this.idShort); - } - - public virtual Reference GetReference(bool includeParents = true) - { - return new Reference( - new AdminShell.Key( - this.GetElementName(), false, Key.IdShort, "" + this.idShort)); - } - - public void CollectReferencesByParent(List refs) - { - // access - if (refs == null) - return; - - // check, if this is identifiable - if (this is Identifiable) - { - var idf = this as Identifiable; - if (idf != null) - { - var k = Key.CreateNew( - idf.GetElementName(), true, idf.identification?.idType, idf.identification?.id); - refs.Insert(0, k); - } - } - else - { - var k = Key.CreateNew(this.GetElementName(), true, "IdShort", this.idShort); - refs.Insert(0, k); - // recurse upwards! - if (this.parent is Referable prf) - prf.CollectReferencesByParent(refs); - } - } - - public string CollectIdShortByParent() - { - // recurse first - var head = ""; - if (!(this is Identifiable) && this.parent is Referable prf) - // can go up - head = prf.CollectIdShortByParent() + "/"; - // add own - var myid = ""; - if (this.idShort != null && this.idShort.Trim() != "") - myid = this.idShort.Trim(); - // together - return head + myid; - } - - // string functions - - public string ToIdShortString() - { - if (this.idShort == null || this.idShort.Trim().Length < 1) - return (""); - return this.idShort.Trim(); - } - - public override string ToString() - { - return "" + this.idShort; - } - - public virtual Key ToKey() - { - return new Key(GetElementName(), true, Key.IdShort, idShort); - } - - // hash functionality - - public class ObjectFieldInfo - { - public object o; - public FieldInfo fi; - public ObjectFieldInfo() { } - public ObjectFieldInfo(object o, FieldInfo fi) - { - this.o = o; - this.fi = fi; - } - } - - public List RecursivelyFindFields(object o, Type countAttribute, Type skipAttribute) - { - // access - var res = new List(); - if (o == null || countAttribute == null) - return res; - - // find fields for this object - var t = o.GetType(); - var l = t.GetFields(BindingFlags.Instance | BindingFlags.Public); - foreach (var f in l) - { - // Skip this field?? - if (skipAttribute != null && f.GetCustomAttribute(skipAttribute) != null) - continue; - - // add directly? - if (f.GetCustomAttribute(countAttribute) != null) - res.Add(new ObjectFieldInfo(o, f)); - - // object - if (f.FieldType.IsClass) - { - var oo = f.GetValue(o); - var r = RecursivelyFindFields(oo, countAttribute, skipAttribute); - res.AddRange(r); - } - - // try cast in IList to check further - var elems = f.GetValue(o) as IList; - if (elems != null) - foreach (var e in elems) - { - var r = RecursivelyFindFields(e, countAttribute, skipAttribute); - res.AddRange(r); - } - - } - // OK - return res; - } - - public byte[] ComputeByteArray() - { - // use memory stream for effcient behaviour - var mems = new MemoryStream(); - - // TEST - var xxx = RecursivelyFindFields(this, typeof(CountForHash), typeof(SkipForHash)); - - foreach (var ofi in xxx) - { - var a = ofi.fi.GetCustomAttribute(); - if (a != null) - { - // found an accountable field, get bytes - var o = ofi.fi.GetValue(ofi.o); - byte[] bs = null; - - // optimize for probabilities - - if (o is string) - bs = System.Text.Encoding.UTF8.GetBytes((string)o); - else if (o is char[]) - bs = System.Text.Encoding.UTF8.GetBytes((char[])o); - else if (o is double) - bs = BitConverter.GetBytes((double)o); - else if (o is float) - bs = BitConverter.GetBytes((float)o); - else if (o is char) - bs = BitConverter.GetBytes((char)o); - else if (o is byte) - bs = BitConverter.GetBytes((byte)o); - else if (o is int) - bs = BitConverter.GetBytes((int)o); - else if (o is long) - bs = BitConverter.GetBytes((long)o); - else if (o is short) - bs = BitConverter.GetBytes((short)o); - else if (o is uint) - bs = BitConverter.GetBytes((uint)o); - else if (o is ulong) - bs = BitConverter.GetBytes((ulong)o); - else if (o is ushort) - bs = BitConverter.GetBytes((ushort)o); - - if (bs != null) - mems.Write(bs, 0, bs.Length); - } - } - - return mems.ToArray(); - } - - private static System.Security.Cryptography.SHA256 HashProvider = - System.Security.Cryptography.SHA256.Create(); - - public string ComputeHashcode() - { - var dataBytes = this.ComputeByteArray(); - var hashBytes = Referable.HashProvider.ComputeHash(dataBytes); - - StringBuilder sb = new StringBuilder(); - foreach (var hb in hashBytes) - sb.Append(hb.ToString("X2")); - return sb.ToString(); - } - - // sorting - - public class ComparerIdShort : IComparer - { - public int Compare(Referable a, Referable b) - { - return String.Compare(a?.idShort, b?.idShort, - CultureInfo.InvariantCulture, CompareOptions.IgnoreCase); - } - } - - public class ComparerIndexed : IComparer - { - public int NullIndex = int.MaxValue; - public Dictionary Index = new Dictionary(); - - public int Compare(Referable a, Referable b) - { - var ca = Index.ContainsKey(a); - var cb = Index.ContainsKey(b); - - if (!ca && !cb) - return 0; - // make CDs without usage to appear at end of list - if (!ca) - return +1; - if (!cb) - return -1; - - var ia = Index[a]; - var ib = Index[b]; - - if (ia == ib) - return 0; - if (ia < ib) - return -1; - return +1; - } - } - - // validation - - public virtual void Validate(AasValidationRecordList results) - { - // access - if (results == null) - return; - - // check - if (this.idShort == null || this.idShort.Trim() == "") - results.Add(new AasValidationRecord( - AasValidationSeverity.SpecViolation, this, - "Referable: missing idShort", - () => - { - this.idShort = "TO_FIX"; - })); - - if (this.description != null && (this.description.langString == null - || this.description.langString.Count < 1)) - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, this, - "Referable: existing description with missing langString", - () => - { - this.description = null; - })); - } - - // hierarchy & recursion (by derived elements) - - public virtual void RecurseOnReferables( - object state, Func lambda, - bool includeThis = false) - { - if (includeThis) - lambda(state, null, this); - } - - public Identifiable FindParentFirstIdentifiable() - { - Referable curr = this; - while (curr != null) - { - if (curr is Identifiable curri) - return curri; - curr = curr.parent as Referable; - } - return null; - } - } - - public class Identifiable : Referable, IGetReference - { - - // members - - public Identification identification = new Identification(); - public Administration administration = null; - - // constructors - - public Identifiable() : base() { } - - public Identifiable(string idShort) : base(idShort) { } - - public Identifiable(Identifiable src) - : base(src) - { - if (src == null) - return; - if (src.identification != null) - this.identification = new Identification(src.identification); - if (src.administration != null) - this.administration = new Administration(src.administration); - } - -#if !DoNotUseAasxCompatibilityModels - public Identifiable(AasxCompatibilityModels.AdminShellV10.Identifiable src) - : base(src) - { - if (src.identification != null) - this.identification = new Identification(src.identification); - if (src.administration != null) - this.administration = new Administration(src.administration); - } -#endif - - public void SetIdentification(string idType, string id, string idShort = null) - { - identification.idType = idType; - identification.id = id; - if (idShort != null) - this.idShort = idShort; - } - - public void SetAdminstration(string version, string revision) - { - if (administration == null) - administration = new Administration(); - administration.version = version; - administration.revision = revision; - } - - public new string GetFriendlyName() - { - if (identification != null && identification.id != "") - return AdminShellUtilV20.FilterFriendlyName(this.identification.id); - return AdminShellUtilV20.FilterFriendlyName(this.idShort); - } - - public override string ToString() - { - return ("" + identification?.ToString() + " " + administration?.ToString()).Trim(); - } - - public override Key ToKey() - { - return new Key(GetElementName(), true, "" + identification?.idType, "" + identification?.id); - } - - // self description - - public override Reference GetReference(bool includeParents = true) - { - var r = new Reference(); - r.Keys.Add( - Key.CreateNew( - this.GetElementName(), true, this.identification.idType, this.identification.id)); - return r; - } - - // sorting - - public class ComparerIdentification : IComparer - { - public int Compare(Identifiable a, Identifiable b) - { - if (a?.identification == null && b?.identification == null) - return 0; - if (a?.identification == null) - return +1; - if (b?.identification == null) - return -1; - - var vc = String.Compare(a.identification.idType, b.identification.idType, - CultureInfo.InvariantCulture, CompareOptions.IgnoreCase); - if (vc != 0) - return vc; - - return String.Compare(a.identification.id, b.identification.id, - CultureInfo.InvariantCulture, CompareOptions.IgnoreCase | CompareOptions.IgnoreNonSpace); - } - } - - } - - public class JsonModelTypeWrapper - { - public string name = ""; - - public JsonModelTypeWrapper(string name = "") { this.name = name; } - } - - public interface IFindAllReferences - { - IEnumerable FindAllReferences(); - } - - public interface IGetSemanticId - { - SemanticId GetSemanticId(); - } - - public class AdministrationShell : Identifiable, IFindAllReferences - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // from hasDataSpecification: - [XmlElement(ElementName = "hasDataSpecification")] - public HasDataSpecification hasDataSpecification = null; - - // from this very class - public AssetAdministrationShellRef derivedFrom = null; - - [JsonProperty(PropertyName = "asset")] - public AssetRef assetRef = new AssetRef(); - - [JsonProperty(PropertyName = "submodels")] - [SkipForSearch] - public List submodelRefs = new List(); - - [JsonIgnore] - public Views views = null; - [XmlIgnore] - [JsonProperty(PropertyName = "views")] - public View[] JsonViews - { - get { return views?.views.ToArray(); } - set { views = Views.CreateOrSetInnerViews(views, value); } - } - - [JsonProperty(PropertyName = "conceptDictionaries")] - public List conceptDictionaries = null; - - // constructors - - public AdministrationShell() { } - - public AdministrationShell(string idShort) : base(idShort) { } - - public AdministrationShell(AdministrationShell src) - : base(src) - { - if (src != null) - { - if (src.hasDataSpecification != null) - this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - - if (src.derivedFrom != null) - this.derivedFrom = new AssetAdministrationShellRef(src.derivedFrom); - - if (src.assetRef != null) - this.assetRef = new AssetRef(src.assetRef); - - if (src.submodelRefs != null) - foreach (var smr in src.submodelRefs) - this.submodelRefs.Add(new SubmodelRef(smr)); - - if (src.views != null) - this.views = new Views(src.views); - - if (src.conceptDictionaries != null) - { - this.conceptDictionaries = new List(); - foreach (var cdd in src.conceptDictionaries) - this.conceptDictionaries.Add(new ConceptDictionary(cdd)); - } - } - } - -#if !DoNotUseAasxCompatibilityModels - public AdministrationShell(AasxCompatibilityModels.AdminShellV10.AdministrationShell src) - : base(src) - { - if (src.hasDataSpecification != null) - this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - - if (src.derivedFrom != null) - this.derivedFrom = new AssetAdministrationShellRef(src.derivedFrom); - - if (src.assetRef != null) - this.assetRef = new AssetRef(src.assetRef); - - if (src.submodelRefs != null) - foreach (var smr in src.submodelRefs) - this.submodelRefs.Add(new SubmodelRef(smr)); - - if (src.views != null) - this.views = new Views(src.views); - - if (src.conceptDictionaries != null) - { - this.conceptDictionaries = new List(); - foreach (var cdd in src.conceptDictionaries) - this.conceptDictionaries.Add(new ConceptDictionary(cdd)); - } - } -#endif - - public static AdministrationShell CreateNew( - string idShort, string idType, string id, string version = null, string revision = null) - { - var s = new AdministrationShell(); - s.idShort = idShort; - if (version != null) - s.SetAdminstration(version, revision); - s.identification.idType = idType; - s.identification.id = id; - return (s); - } - - // add - - public void AddView(View v) - { - if (views == null) - views = new Views(); - views.views.Add(v); - } - - public void AddConceptDictionary(ConceptDictionary d) - { - if (conceptDictionaries == null) - conceptDictionaries = new List(); - conceptDictionaries.Add(d); - } - - public void AddDataSpecification(Key k) - { - if (hasDataSpecification == null) - hasDataSpecification = new HasDataSpecification(); - var r = new Reference(); - r.Keys.Add(k); - hasDataSpecification.Add(new EmbeddedDataSpecification(r)); - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("AssetAdministrationShell", "AAS"); - } - - public Tuple ToCaptionInfo() - { - var caption = AdminShellUtilV20.EvalToNonNullString("\"{0}\" ", idShort, "\"AAS\""); - if (administration != null) - caption += "V" + administration.version + "." + administration.revision; - - var info = ""; - if (identification != null) - info = $"[{identification.idType}, {identification.id}]"; - return Tuple.Create(caption, info); - } - - public override string ToString() - { - var ci = ToCaptionInfo(); - return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); - } - - public SubmodelRef FindSubmodelRef(Identification refid) - { - if (this.submodelRefs == null) - return null; - foreach (var r in this.submodelRefs) - if (r.Matches(refid)) - return r; - return null; - } - - public bool HasSubmodelRef(SubmodelRef newref) - { - // check, if existing - if (this.submodelRefs == null) - return false; - var found = false; - foreach (var r in this.submodelRefs) - if (r.Matches(newref)) - found = true; - - return found; - } - - public void AddSubmodelRef(SubmodelRef newref) - { - if (this.submodelRefs == null) - this.submodelRefs = new List(); - this.submodelRefs.Add(newref); - } - - public IEnumerable FindAllReferences() - { - // Asset - if (this.assetRef != null) - yield return new LocatedReference(this, this.assetRef); - - // Submodel references - if (this.submodelRefs != null) - foreach (var r in this.submodelRefs) - yield return new LocatedReference(this, r); - - // Views - if (this.views?.views != null) - foreach (var vw in this.views.views) - if (vw?.containedElements?.reference != null) - foreach (var r in vw.containedElements.reference) - yield return new LocatedReference(this, r); - } - } - - public class ListOfAdministrationShells : List, IAasElement - { - // self decscription - - public AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("AssetAdministrationShells", "AASs"); - } - - public string GetElementName() - { - return this.GetSelfDescription()?.ElementName; - } - } - - public class Asset : Identifiable - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // from hasDataSpecification: - [XmlElement(ElementName = "hasDataSpecification")] - public HasDataSpecification hasDataSpecification = null; - - // from this very class - [XmlElement(ElementName = "assetIdentificationModelRef")] - public SubmodelRef assetIdentificationModelRef = null; - - [XmlElement(ElementName = "billOfMaterialRef")] - public SubmodelRef billOfMaterialRef = null; - - // from HasKind - [XmlElement(ElementName = "kind")] - [JsonIgnore] - public AssetKind kind = new AssetKind(); - [XmlIgnore] - [JsonProperty(PropertyName = "kind")] - public string JsonKind - { - get - { - if (kind == null) - return null; - return kind.kind; - } - set - { - if (kind == null) - kind = new AssetKind(); - kind.kind = value; - } - } - - // constructors - - public Asset() { } - - public Asset(string idShort) : base(idShort) { } - - public Asset(Asset src) - : base(src) - { - if (src != null) - { - if (src.hasDataSpecification != null) - this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - if (src.kind != null) - this.kind = new AssetKind(src.kind); - if (src.assetIdentificationModelRef != null) - this.assetIdentificationModelRef = new SubmodelRef(src.assetIdentificationModelRef); - } - } - -#if !DoNotUseAasxCompatibilityModels - public Asset(AasxCompatibilityModels.AdminShellV10.Asset src) - : base(src) - { - if (src != null) - { - if (src.hasDataSpecification != null) - this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - if (src.kind != null) - this.kind = new AssetKind(src.kind); - if (src.assetIdentificationModelRef != null) - this.assetIdentificationModelRef = new SubmodelRef(src.assetIdentificationModelRef); - } - } -#endif - - // Getter & setters - - public AssetRef GetAssetReference() - { - var r = new AssetRef(); - r.Keys.Add( - Key.CreateNew( - this.GetElementName(), true, this.identification.idType, this.identification.id)); - return r; - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("Asset", "Asset"); - } - - public Tuple ToCaptionInfo() - { - var caption = AdminShellUtilV20.EvalToNonNullString("\"{0}\" ", idShort, ""); - if (administration != null) - caption += "V" + administration.version + "." + administration.revision; - - var info = ""; - if (identification != null) - info = $"[{identification.idType}, {identification.id}]"; - return Tuple.Create(caption, info); - } - - public override string ToString() - { - var ci = ToCaptionInfo(); - return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); - } - - public IEnumerable FindAllReferences() - { - if (this.assetIdentificationModelRef != null) - yield return this.assetIdentificationModelRef; - if (this.billOfMaterialRef != null) - yield return this.billOfMaterialRef; - } - } - - public class ListOfAssets : List, IAasElement - { - // self decscription - - public AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("Assets", "Assets"); - } - - public string GetElementName() - { - return this.GetSelfDescription()?.ElementName; - } - - } - - public class View : Referable - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // members - - // from hasSemanticId: - [XmlElement(ElementName = "semanticId")] - public SemanticId semanticId = null; - - // from hasDataSpecification - [XmlElement(ElementName = "hasDataSpecification")] - public HasDataSpecification hasDataSpecification = null; - - // from this very class - [JsonIgnore] - [SkipForSearch] - public ContainedElements containedElements = null; - [XmlIgnore] - [SkipForSearch] - [JsonProperty(PropertyName = "containedElements")] - public ContainedElementRef[] JsonContainedElements - { - get { return containedElements?.reference.ToArray(); } - set { containedElements = ContainedElements.CreateOrSetInner(containedElements, value); } - } - - // getter / setter - - [XmlIgnore] - [JsonIgnore] - public bool IsEmpty { get { return containedElements == null || containedElements.Count < 1; } } - [XmlIgnore] - [JsonIgnore] - public int Count { get { if (containedElements == null) return 0; return containedElements.Count; } } - - public ContainedElementRef this[int index] - { - get { if (containedElements == null) return null; return containedElements[index]; } - } - - // constructors / creators - - public View() { } - - public View(View src) - : base(src) - { - if (src.semanticId != null) - this.semanticId = new SemanticId(src.semanticId); - if (src.hasDataSpecification != null) - this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - if (src.containedElements != null) - this.containedElements = new ContainedElements(src.containedElements); - } - -#if !DoNotUseAasxCompatibilityModels - public View(AasxCompatibilityModels.AdminShellV10.View src) - : base(src) - { - if (src.semanticId != null) - this.semanticId = new SemanticId(src.semanticId); - if (src.hasDataSpecification != null) - this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - if (src.containedElements != null) - this.containedElements = new ContainedElements(src.containedElements); - } -#endif - - public static View CreateNew(string idShort) - { - var v = new View() { idShort = idShort }; - return (v); - } - - public void AddDataSpecification(Key k) - { - if (hasDataSpecification == null) - hasDataSpecification = new HasDataSpecification(); - var r = new Reference(); - r.Keys.Add(k); - hasDataSpecification.Add(new EmbeddedDataSpecification(r)); - } - - public void AddContainedElement(Key k) - { - if (containedElements == null) - containedElements = new ContainedElements(); - var r = new ContainedElementRef(); - r.Keys.Add(k); - containedElements.reference.Add(r); - } - - public void AddContainedElement(List keys) - { - if (containedElements == null) - containedElements = new ContainedElements(); - var r = new ContainedElementRef(); - foreach (var k in keys) - r.Keys.Add(k); - containedElements.reference.Add(r); - } - - public void AddContainedElement(Reference r) - { - if (containedElements == null) - containedElements = new ContainedElements(); - containedElements.reference.Add(ContainedElementRef.CreateNew(r)); - } - - public void AddContainedElement(List rlist) - { - if (containedElements == null) - containedElements = new ContainedElements(); - foreach (var r in rlist) - containedElements.reference.Add(ContainedElementRef.CreateNew(r)); - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("View", "View"); - } - - public Tuple ToCaptionInfo() - { - var caption = AdminShellUtilV20.EvalToNonNullString("\"{0}\" ", idShort, ""); - var info = ""; - if (this.semanticId != null) - info = Key.KeyListToString(this.semanticId.Keys); - if (this.containedElements != null && this.containedElements.reference != null) - info = (info + " ").Trim() + - String.Format("({0} elements)", this.containedElements.reference.Count); - return Tuple.Create(caption, info); - } - - public override string ToString() - { - var ci = ToCaptionInfo(); - return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); - } - - // validation - - public override void Validate(AasValidationRecordList results) - { - // access - if (results == null) - return; - - // check - base.Validate(results); - KeyList.Validate(results, semanticId?.Keys, this); - } - } - - public class Views - { - [XmlElement(ElementName = "view")] - [JsonIgnore] - public List views = new List(); - - // constructors - - public Views() { } - - public Views(Views src) - { - if (src != null && src.views != null) - foreach (var v in src.views) - this.views.Add(new View(v)); - } - -#if !DoNotUseAasxCompatibilityModels - public Views(AasxCompatibilityModels.AdminShellV10.Views src) - { - if (src != null && src.views != null) - foreach (var v in src.views) - this.views.Add(new View(v)); - } -#endif - - public static Views CreateOrSetInnerViews(Views outer, View[] inner) - { - var res = outer; - if (res == null) - res = new Views(); - if (inner == null) - { - res.views = null; - return res; - } - res.views = new List(inner); - return res; - } - } - - /// - /// Multiple lang string for the AAS namespace - /// - public class LangStringSet - { - - // members - - [XmlElement(ElementName = "langString", Namespace = "http://www.admin-shell.io/aas/2/0")] - public ListOfLangStr langString = new ListOfLangStr(); - - // getters / setters - - [XmlIgnore] - [JsonIgnore] - public bool IsEmpty { get { return langString == null || langString.Count < 1; } } - [XmlIgnore] - [JsonIgnore] - public int Count { get { if (langString == null) return 0; return langString.Count; } } - [XmlIgnore] - [JsonIgnore] - public LangStr this[int index] { get { return langString[index]; } } - - // constructors - - public LangStringSet() { } - - public LangStringSet(LangStringSet src) - { - if (src.langString != null) - foreach (var ls in src.langString) - this.langString.Add(new LangStr(ls)); - } - - public LangStringSet(ListOfLangStr src) - { - if (src != null) - foreach (var ls in src) - this.langString.Add(new LangStr(ls)); - } - -#if !DoNotUseAasxCompatibilityModels - // not available in V1.0 -#endif - public LangStringSet(string lang, string str) - { - if (str == null || str.Trim() == "") - return; - this.langString.Add(new LangStr(lang, str)); - } - - // converter - - public static LangStringSet CreateFrom(List src) - { - var res = new LangStringSet(); - if (src != null) - foreach (var ls in src) - res.langString.Add(new LangStr(ls)); - return res; - } - - // add - - public LangStr Add(LangStr ls) - { - this.langString.Add(ls); - return ls; - } - - public LangStr Add(string lang, string str) - { - var ls = new LangStr(lang, str); - this.langString.Add(ls); - return ls; - } - - // single string representation - public string GetDefaultStr(string defaultLang = null) - { - return this.langString?.GetDefaultStr(defaultLang); - } - } - - /// - /// Multiple lang string for the IEC61360 namespace - /// - public class LangStringSetIEC61360 : ListOfLangStr - { - - // getters / setters - - [XmlIgnore] - [JsonIgnore] - public bool IsEmpty { get { return this.Count < 1; } } - - // constructors - - public LangStringSetIEC61360() { } - - public LangStringSetIEC61360(ListOfLangStr lol) : base(lol) { } - - public LangStringSetIEC61360(LangStringSetIEC61360 src) - { - foreach (var ls in src) - this.Add(new LangStr(ls)); - } - -#if !DoNotUseAasxCompatibilityModels - public LangStringSetIEC61360(AasxCompatibilityModels.AdminShellV10.LangStringIEC61360 src) - { - if (src.langString != null) - foreach (var ls in src.langString) - this.Add(new LangStr(ls)); - } -#endif - public LangStringSetIEC61360(string lang, string str) - { - if (str == null || str.Trim() == "") - return; - this.Add(new LangStr(lang, str)); - } - - // converter - - public static LangStringSetIEC61360 CreateFrom(List src) - { - var res = new LangStringSetIEC61360(); - if (src != null) - foreach (var ls in src) - res.Add(new LangStr(ls)); - return res; - } - - } - - public class UnitId - { - - // members - - [XmlIgnore] - [JsonIgnore] - public KeyList keys = new KeyList(); - - // getter / setters - - [XmlArray("keys")] - [XmlArrayItem("key")] - [JsonIgnore] - public KeyList Keys { get { return keys; } } - [XmlIgnore] - [JsonProperty(PropertyName = "keys")] - public KeyList JsonKeys - { - get - { - keys?.NumberIndices(); - return keys; - } - } - - [XmlIgnore] - [JsonIgnore] - public bool IsEmpty { get { return keys == null || keys.IsEmpty; } } - [XmlIgnore] - [JsonIgnore] - public int Count { get { if (keys == null) return 0; return keys.Count; } } - [XmlIgnore] - [JsonIgnore] - public Key this[int index] { get { return keys[index]; } } - - // constructors / creators - - public UnitId() { } - - public UnitId(UnitId src) - { - if (src.keys != null) - foreach (var k in src.Keys) - this.keys.Add(new Key(k)); - } - -#if !DoNotUseAasxCompatibilityModels - public UnitId(AasxCompatibilityModels.AdminShellV10.UnitId src) - { - if (src.keys != null) - foreach (var k in src.Keys) - this.keys.Add(new Key(k)); - } -#endif - - public static UnitId CreateNew(string type, bool local, string idType, string value) - { - var u = new UnitId(); - u.keys.Add(Key.CreateNew(type, local, idType, value)); - return u; - } - - public static UnitId CreateNew(Reference src) - { - if (src == null) - return null; - var res = new UnitId(); - if (src.Keys != null) - foreach (var k in src.Keys) - res.keys.Add(k); - return res; - } - } - - [XmlRoot(Namespace = "http://www.admin-shell.io/IEC61360/2/0")] - public class DataSpecificationIEC61360 - { - // static member - [XmlIgnore] - [JsonIgnore] - public static string[] DataTypeNames = { - "STRING", - "STRING_TRANSLATABLE", - "REAL_MEASURE", - "REAL_COUNT", - "REAL_CURRENCY", - "INTEGER_MEASURE", - "INTEGER_COUNT", - "INTEGER_CURRENCY", - "BOOLEAN", - "URL", - "RATIONAL", - "RATIONAL_MEASURE", - "TIME", - "TIMESTAMP", - "DATE" }; - - // members - // TODO (MIHO, 2020-08-27): According to spec, cardinality is [1..1][1..n] - // these cardinalities are NOT MAINTAINED in ANY WAY by the system - public LangStringSetIEC61360 preferredName = new LangStringSetIEC61360(); - - // TODO (MIHO, 2020-08-27): According to spec, cardinality is [0..1][1..n] - // these cardinalities are NOT MAINTAINED in ANY WAY by the system - public LangStringSetIEC61360 shortName = null; - - [MetaModelName("DataSpecificationIEC61360.unit")] - [TextSearchable] - [CountForHash] - public string unit = ""; - - public UnitId unitId = null; - - [MetaModelName("DataSpecificationIEC61360.valueFormat")] - [TextSearchable] - [CountForHash] - public string valueFormat = null; - - [MetaModelName("DataSpecificationIEC61360.sourceOfDefinition")] - [TextSearchable] - [CountForHash] - public string sourceOfDefinition = null; - - [MetaModelName("DataSpecificationIEC61360.symbol")] - [TextSearchable] - [CountForHash] - public string symbol = null; - - [MetaModelName("DataSpecificationIEC61360.dataType")] - [TextSearchable] - [CountForHash] - public string dataType = ""; - - // TODO (MIHO, 2020-08-27): According to spec, cardinality is [0..1][1..n] - // these cardinalities are NOT MAINTAINED in ANY WAY by the system - public LangStringSetIEC61360 definition = null; - - // getter / setters - - // constructors - - public DataSpecificationIEC61360() { } - - public DataSpecificationIEC61360(DataSpecificationIEC61360 src) - { - if (src.preferredName != null) - this.preferredName = new LangStringSetIEC61360(src.preferredName); - this.shortName = src.shortName; - this.unit = src.unit; - if (src.unitId != null) - this.unitId = new UnitId(src.unitId); - this.valueFormat = src.valueFormat; - this.sourceOfDefinition = src.sourceOfDefinition; - this.symbol = src.symbol; - this.dataType = src.dataType; - if (src.definition != null) - this.definition = new LangStringSetIEC61360(src.definition); - } - -#if !DoNotUseAasxCompatibilityModels - public DataSpecificationIEC61360(AasxCompatibilityModels.AdminShellV10.DataSpecificationIEC61360 src) - { - if (src.preferredName != null) - this.preferredName = new LangStringSetIEC61360(src.preferredName); - this.shortName = new LangStringSetIEC61360("EN?", src.shortName); - this.unit = src.unit; - if (src.unitId != null) - this.unitId = new UnitId(src.unitId); - this.valueFormat = src.valueFormat; - if (src.sourceOfDefinition != null && src.sourceOfDefinition.Count > 0) - this.sourceOfDefinition = src.sourceOfDefinition[0].str; - this.symbol = src.symbol; - this.dataType = src.dataType; - if (src.definition != null) - this.definition = new LangStringSetIEC61360(src.definition); - } -#endif - - public static DataSpecificationIEC61360 CreateNew( - string[] preferredName = null, - string shortName = "", - string unit = "", - UnitId unitId = null, - string valueFormat = null, - string sourceOfDefinition = null, - string symbol = null, - string dataType = "", - string[] definition = null - ) - { - var d = new DataSpecificationIEC61360(); - if (preferredName != null) - { - d.preferredName = new LangStringSetIEC61360(LangStr.CreateManyFromStringArray(preferredName)); - } - d.shortName = new LangStringSetIEC61360("EN?", shortName); - d.unit = unit; - d.unitId = unitId; - d.valueFormat = valueFormat; - d.sourceOfDefinition = sourceOfDefinition; - d.symbol = symbol; - d.dataType = dataType; - if (definition != null) - { - if (d.definition == null) - d.definition = new LangStringSetIEC61360(); - d.definition = new LangStringSetIEC61360(LangStr.CreateManyFromStringArray(definition)); - } - return (d); - } - - // "constants" - - public static Key GetKey() - { - return Key.CreateNew( - "GlobalReference", false, "IRI", - "http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/2/0"); - } - - // validation - - public void Validate(AasValidationRecordList results, ConceptDescription cd) - { - // access - if (results == null || cd == null) - return; - - // check IEC61360 spec - if (this.preferredName == null || this.preferredName.Count < 1) - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, cd, - "ConceptDescription: missing preferredName", - () => - { - this.preferredName = new AdminShell.LangStringSetIEC61360("EN?", - AdminShellUtilV20.EvalToNonEmptyString("{0}", cd.idShort, "UNKNOWN")); - })); - - if (this.shortName != null && this.shortName.Count < 1) - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, cd, - "ConceptDescription: existing shortName with missing langString", - () => - { - this.shortName = null; - })); - - if (this.definition != null && this.definition.Count < 1) - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, cd, - "ConceptDescription: existing definition with missing langString", - () => - { - this.definition = null; - })); - - // check data type - string foundDataType = null; - if (this.dataType != null) - foreach (var dtn in DataTypeNames) - if (this.dataType.Trim() == dtn.Trim()) - foundDataType = this.dataType; - if (foundDataType == null) - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, cd, - "ConceptDescription: dataType does not match allowed enumeration values", - () => - { - this.dataType = "STRING"; - })); - } - } - - // ReSharper disable ClassNeverInstantiated.Global .. class is important to show potential for ISO! - - public class DataSpecificationISO99999 - { - } - - // ReSharper enable ClassNeverInstantiated.Global - - public class DataSpecificationContent - { - - // members - - public DataSpecificationIEC61360 dataSpecificationIEC61360 = null; - public DataSpecificationISO99999 dataSpecificationISO99999 = null; - - // constructors - - public DataSpecificationContent() { } - - public DataSpecificationContent(DataSpecificationContent src) - { - if (src.dataSpecificationIEC61360 != null) - this.dataSpecificationIEC61360 = new DataSpecificationIEC61360(src.dataSpecificationIEC61360); - } - -#if !DoNotUseAasxCompatibilityModels - public DataSpecificationContent(AasxCompatibilityModels.AdminShellV10.DataSpecificationContent src) - { - if (src.dataSpecificationIEC61360 != null) - this.dataSpecificationIEC61360 = new DataSpecificationIEC61360(src.dataSpecificationIEC61360); - } -#endif - } - - public class EmbeddedDataSpecification - { - // members - - [JsonIgnore] - public DataSpecificationContent dataSpecificationContent = null; - - [XmlIgnore] - [JsonProperty("dataSpecificationContent")] - public DataSpecificationIEC61360 JsonWrongDataSpec61360 - { - get { return dataSpecificationContent?.dataSpecificationIEC61360; } - set - { - if (dataSpecificationContent == null) - dataSpecificationContent = new DataSpecificationContent(); - dataSpecificationContent.dataSpecificationIEC61360 = value; - } - } - - public DataSpecificationRef dataSpecification = null; - - // constructors - - public EmbeddedDataSpecification() { } - - public EmbeddedDataSpecification( - DataSpecificationRef dataSpecification, - DataSpecificationContent dataSpecificationContent) - { - this.dataSpecification = dataSpecification; - this.dataSpecificationContent = dataSpecificationContent; - } - - public EmbeddedDataSpecification(EmbeddedDataSpecification src) - { - if (src.dataSpecification != null) - this.dataSpecification = new DataSpecificationRef(src.dataSpecification); - if (src.dataSpecificationContent != null) - this.dataSpecificationContent = new DataSpecificationContent(src.dataSpecificationContent); - } - - public EmbeddedDataSpecification(Reference src) - { - if (src != null) - this.dataSpecification = new DataSpecificationRef(src); - } - -#if !DoNotUseAasxCompatibilityModels - public EmbeddedDataSpecification(AasxCompatibilityModels.AdminShellV10.EmbeddedDataSpecification src) - { - if (src.hasDataSpecification != null) - this.dataSpecification = new DataSpecificationRef(src.hasDataSpecification); - if (src.dataSpecificationContent != null) - this.dataSpecificationContent = new DataSpecificationContent(src.dataSpecificationContent); - } - - public EmbeddedDataSpecification(AasxCompatibilityModels.AdminShellV10.Reference src) - { - if (src != null) - this.dataSpecification = new DataSpecificationRef(src); - } -#endif - - public static EmbeddedDataSpecification CreateIEC61360WithContent() - { - var eds = new EmbeddedDataSpecification(new DataSpecificationRef(), new DataSpecificationContent()); - - eds.dataSpecification.Keys.Add(DataSpecificationIEC61360.GetKey()); - - eds.dataSpecificationContent.dataSpecificationIEC61360 = - AdminShell.DataSpecificationIEC61360.CreateNew(); - - return eds; - } - - public DataSpecificationIEC61360 GetIEC61360() - { - return this.dataSpecificationContent?.dataSpecificationIEC61360; - } - } - - public class ConceptDescription : Identifiable, System.IDisposable - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // members - - // do this in order to be IDisposable, that is: suitable for (using) - void System.IDisposable.Dispose() { } - public void GetData() { } - // from HasDataSpecification - -#if __not_anymore - - [XmlElement(ElementName = "embeddedDataSpecification")] - [JsonIgnore] - public EmbeddedDataSpecification embeddedDataSpecification = new EmbeddedDataSpecification(); -#else - // According to Spec V2.0.1, a ConceptDescription might feature alos multiple data specifications - /* TODO (MIHO, 2020-08-30): align wording of the member ("embeddedDataSpecification") with the - * wording of the other entities ("hasDataSpecification") */ - [XmlElement(ElementName = "embeddedDataSpecification")] - [JsonIgnore] - public HasDataSpecification embeddedDataSpecification = null; -#endif - - [XmlIgnore] - [JsonProperty(PropertyName = "embeddedDataSpecifications")] - public EmbeddedDataSpecification[] JsonEmbeddedDataSpecifications - { - get - { - return this.embeddedDataSpecification?.ToArray(); - } - set - { - embeddedDataSpecification = new HasDataSpecification(value); - } - } - - // old - - // this class - [XmlIgnore] - private List isCaseOf = null; - - // getter / setter - - [XmlElement(ElementName = "isCaseOf")] - [JsonProperty(PropertyName = "isCaseOf")] - public List IsCaseOf - { - get { return isCaseOf; } - set { isCaseOf = value; } - } - - // constructors / creators - - public ConceptDescription() : base() { } - - public ConceptDescription(ConceptDescription src) - : base(src) - { - if (src.embeddedDataSpecification != null) - this.embeddedDataSpecification = new HasDataSpecification(src.embeddedDataSpecification); - if (src.isCaseOf != null) - foreach (var ico in src.isCaseOf) - { - if (this.isCaseOf == null) - this.isCaseOf = new List(); - this.isCaseOf.Add(new Reference(ico)); - } - } - -#if !DoNotUseAasxCompatibilityModels - public ConceptDescription(AasxCompatibilityModels.AdminShellV10.ConceptDescription src) - : base(src) - { - if (src.embeddedDataSpecification != null) - { - this.embeddedDataSpecification = new HasDataSpecification(); - this.embeddedDataSpecification.Add(new EmbeddedDataSpecification(src.embeddedDataSpecification)); - } - if (src.IsCaseOf != null) - foreach (var ico in src.IsCaseOf) - { - if (this.isCaseOf == null) - this.isCaseOf = new List(); - this.isCaseOf.Add(new Reference(ico)); - } - } -#endif - - public static ConceptDescription CreateNew( - string idShort, string idType, string id, string version = null, string revision = null) - { - var cd = new ConceptDescription(); - cd.idShort = idShort; - cd.identification.idType = idType; - cd.identification.id = id; - if (version != null) - { - if (cd.administration == null) - cd.administration = new Administration(); - cd.administration.version = version; - cd.administration.revision = revision; - } - return (cd); - } - - public Key GetSingleKey() - { - return Key.CreateNew(this.GetElementName(), true, this.identification.idType, this.identification.id); - } - - public ConceptDescriptionRef GetCdReference() - { - var r = new ConceptDescriptionRef(); - r.Keys.Add( - Key.CreateNew( - this.GetElementName(), true, this.identification.idType, this.identification.id)); - return r; - } - - public void SetIEC61360Spec( - string[] preferredNames = null, - string shortName = "", - string unit = "", - UnitId unitId = null, - string valueFormat = null, - string sourceOfDefinition = null, - string symbol = null, - string dataType = "", - string[] definition = null - ) - { - var eds = new EmbeddedDataSpecification(new DataSpecificationRef(), new DataSpecificationContent()); - eds.dataSpecification.Keys.Add( - DataSpecificationIEC61360.GetKey()); - eds.dataSpecificationContent.dataSpecificationIEC61360 = - AdminShell.DataSpecificationIEC61360.CreateNew( - preferredNames, shortName, unit, unitId, valueFormat, sourceOfDefinition, symbol, - dataType, definition); - - this.embeddedDataSpecification = new HasDataSpecification(); - this.embeddedDataSpecification.Add(eds); - - this.AddIsCaseOf( - Reference.CreateNew( - new Key("ConceptDescription", false, this.identification.idType, this.identification.id))); - } - - public DataSpecificationIEC61360 GetIEC61360() - { - return this.embeddedDataSpecification?.IEC61360Content; - } - - // as experimental approach, forward the IEC getter/sett of hasDataSpec directly - - [XmlIgnore] - [JsonIgnore] - public EmbeddedDataSpecification IEC61360DataSpec - { - get - { - return this.embeddedDataSpecification?.IEC61360; - } - set - { - // add embeddedDataSpecification first? - if (this.embeddedDataSpecification == null) - this.embeddedDataSpecification = new HasDataSpecification(); - this.embeddedDataSpecification.IEC61360 = value; - } - } - - [XmlIgnore] - [JsonIgnore] - public DataSpecificationIEC61360 IEC61360Content - { - get - { - return this.embeddedDataSpecification?.IEC61360Content; - } - set - { - // add embeddedDataSpecification first? - if (this.embeddedDataSpecification == null) - this.embeddedDataSpecification = new HasDataSpecification(); - - // check, if e IEC61360 can be found - var eds = this.embeddedDataSpecification.IEC61360; - - // if already there, update - if (eds != null) - { - eds.dataSpecificationContent = new DataSpecificationContent(); - eds.dataSpecificationContent.dataSpecificationIEC61360 = value; - return; - } - - // no: add a full record - eds = EmbeddedDataSpecification.CreateIEC61360WithContent(); - eds.dataSpecificationContent.dataSpecificationIEC61360 = value; - this.embeddedDataSpecification.Add(eds); - } - } - - public DataSpecificationIEC61360 CreateDataSpecWithContentIec61360() - { - var eds = AdminShell.EmbeddedDataSpecification.CreateIEC61360WithContent(); - if (this.embeddedDataSpecification == null) - this.embeddedDataSpecification = new HasDataSpecification(); - this.embeddedDataSpecification.Add(eds); - return eds.dataSpecificationContent?.dataSpecificationIEC61360; - } - - public string GetDefaultPreferredName(string defaultLang = null) - { - return "" + - GetIEC61360()? - .preferredName?.GetDefaultStr(defaultLang); - } - - public string GetDefaultShortName(string defaultLang = null) - { - return "" + - GetIEC61360()? - .shortName?.GetDefaultStr(defaultLang); - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("ConceptDescription", "CD"); - } - - public Tuple ToCaptionInfo() - { - var caption = ""; - if (this.idShort != null && this.idShort.Trim() != "") - caption = $"\"{this.idShort.Trim()}\""; - if (this.identification != null) - caption = (caption + " " + this.identification).Trim(); - - var info = "" + GetDefaultShortName(); - - return Tuple.Create(caption, info); - } - - public override string ToString() - { - var ci = ToCaptionInfo(); - return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); - } - - public void AddIsCaseOf(Reference ico) - { - if (isCaseOf == null) - isCaseOf = new List(); - isCaseOf.Add(ico); - } - - public static IDisposable CreateNew() - { - throw new NotImplementedException(); - } - - // validation - - public override void Validate(AasValidationRecordList results) - { - // access - if (results == null) - return; - - // check CD itself - base.Validate(results); - - // check IEC61360 spec - var eds61360 = this.IEC61360DataSpec; - if (eds61360 != null) - { - // check data spec - if (eds61360.dataSpecification == null || - !(eds61360.dataSpecification.MatchesExactlyOneKey(DataSpecificationIEC61360.GetKey()))) - results.Add(new AasValidationRecord( - AasValidationSeverity.SpecViolation, this, - "HasDataSpecification: data specification content set to IEC61360, but no " + - "data specification reference set!", - () => - { - eds61360.dataSpecification = new DataSpecificationRef( - new Reference( - DataSpecificationIEC61360.GetKey())); - })); - - // validate content - if (eds61360.dataSpecificationContent?.dataSpecificationIEC61360 == null) - { - results.Add(new AasValidationRecord( - AasValidationSeverity.SpecViolation, this, - "HasDataSpecification: data specification reference set to IEC61360, but no " + - "data specification content set!", - () => - { - eds61360.dataSpecificationContent = new DataSpecificationContent(); - eds61360.dataSpecificationContent.dataSpecificationIEC61360 = - new DataSpecificationIEC61360(); - })); - } - else - { - // validate - eds61360.dataSpecificationContent.dataSpecificationIEC61360.Validate(results, this); - } - } - } - - // more find - - public IEnumerable FindAllReferences() - { - yield break; - } - } - - public class ListOfConceptDescriptions : List, IAasElement - { - // finding - - public ConceptDescription Find(ConceptDescriptionRef cdr) - { - if (cdr == null) - return null; - return Find(cdr.Keys); - } - - public ConceptDescription Find(Identification id) - { - var cdr = ConceptDescriptionRef.CreateNew("Conceptdescription", true, id.idType, id.id); - return Find(cdr); - } - - public ConceptDescription Find(List keys) - { - // trivial - if (keys == null) - return null; - // can only refs with 1 key - if (keys.Count != 1) - return null; - // and we're picky - var key = keys[0]; - if (!key.local || key.type.ToLower().Trim() != "conceptdescription") - return null; - // brute force - foreach (var cd in this) - if (cd.identification.idType.ToLower().Trim() == key.idType.ToLower().Trim() - && cd.identification.id.ToLower().Trim() == key.value.ToLower().Trim()) - return cd; - // uups - return null; - } - - // item management - - public ConceptDescription AddIfNew(ConceptDescription cd) - { - if (cd == null) - return null; - - var exist = this.Find(cd.identification); - if (exist != null) - return exist; - - this.Add(cd); - return cd; - } - - // self decscription - - public AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("ConceptDescriptions", "CDS"); - } - - public string GetElementName() - { - return this.GetSelfDescription()?.ElementName; - } - - // sorting - - - } - - public class ConceptDictionary : Referable - { - [XmlElement(ElementName = "conceptDescriptions")] - public ConceptDescriptionRefs conceptDescriptionsRefs = null; - - // constructors - - public ConceptDictionary() { } - - public ConceptDictionary(ConceptDictionary src) - { - if (src.conceptDescriptionsRefs != null) - this.conceptDescriptionsRefs = new ConceptDescriptionRefs(src.conceptDescriptionsRefs); - } - -#if !DoNotUseAasxCompatibilityModels - public ConceptDictionary(AasxCompatibilityModels.AdminShellV10.ConceptDictionary src) - { - if (src.conceptDescriptionsRefs != null) - this.conceptDescriptionsRefs = new ConceptDescriptionRefs(src.conceptDescriptionsRefs); - } -#endif - - public static ConceptDictionary CreateNew(string idShort = null) - { - var d = new ConceptDictionary(); - if (idShort != null) - d.idShort = idShort; - return (d); - } - - // add - - public void AddReference(Reference r) - { - var cdr = (ConceptDescriptionRef)(ConceptDescriptionRef.CreateNew(r.Keys)); - if (conceptDescriptionsRefs == null) - conceptDescriptionsRefs = new ConceptDescriptionRefs(); - conceptDescriptionsRefs.conceptDescriptions.Add(cdr); - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("ConceptDictionary", "CDic"); - } - } - - /// - /// Use by FindAllReference to provide a enumeration of referenced with location - /// info, where they are contained - /// - public class LocatedReference - { - public Identifiable Identifiable; - public Reference Reference; - - public LocatedReference() { } - public LocatedReference(Identifiable identifiable, Reference reference) - { - Identifiable = identifiable; - Reference = reference; - } - } - - [XmlRoot(ElementName = "aasenv", Namespace = "http://www.admin-shell.io/aas/2/0")] - public class AdministrationShellEnv : IFindAllReferences, IAasElement, IDiaryData, IRecurseOnReferables - { - - // diary (as e.g. deleted AASes need to be listed somewhere) - - [XmlIgnore] - [JsonIgnore] - [SkipForHash] - [SkipForReflection] - private DiaryDataDef _diaryData = new DiaryDataDef(); - - [XmlIgnore] - [JsonIgnore] - [SkipForReflection] - public DiaryDataDef DiaryData { get { return _diaryData; } } - - // members - - [XmlAttribute(Namespace = System.Xml.Schema.XmlSchema.InstanceNamespace)] - [JsonIgnore] - public string schemaLocation = - "http://www.admin-shell.io/aas/2/0 AAS.xsd http://www.admin-shell.io/IEC61360/2/0 IEC61360.xsd"; - - [XmlIgnore] // will be ignored, anyway - private ListOfAdministrationShells administrationShells = new ListOfAdministrationShells(); - [XmlIgnore] // will be ignored, anyway - private ListOfAssets assets = new ListOfAssets(); - [XmlIgnore] // will be ignored, anyway - private ListOfSubmodels submodels = new ListOfSubmodels(); - [XmlIgnore] // will be ignored, anyway - private ListOfConceptDescriptions conceptDescriptions = new ListOfConceptDescriptions(); - - // getter / setters - - [XmlArray("assetAdministrationShells")] - [XmlArrayItem("assetAdministrationShell")] - [JsonProperty(PropertyName = "assetAdministrationShells")] - public ListOfAdministrationShells AdministrationShells - { - get { return administrationShells; } - set { administrationShells = value; } - } - - [XmlArray("assets")] - [XmlArrayItem("asset")] - [JsonProperty(PropertyName = "assets")] - public ListOfAssets Assets - { - get { return assets; } - set { assets = value; } - } - - [XmlArray("submodels")] - [XmlArrayItem("submodel")] - [JsonProperty(PropertyName = "submodels")] - public ListOfSubmodels Submodels - { - get { return submodels; } - set { submodels = value; } - } - - [XmlArray("conceptDescriptions")] - [XmlArrayItem("conceptDescription")] - [JsonProperty(PropertyName = "conceptDescriptions")] - public ListOfConceptDescriptions ConceptDescriptions - { - get { return conceptDescriptions; } - set { conceptDescriptions = value; } - } - - // constructors - - public AdministrationShellEnv() { } - -#if !DoNotUseAasxCompatibilityModels - public AdministrationShellEnv(AasxCompatibilityModels.AdminShellV10.AdministrationShellEnv src) - { - if (src.AdministrationShells != null) - foreach (var aas in src.AdministrationShells) - this.administrationShells.Add(new AdministrationShell(aas)); - - if (src.Assets != null) - foreach (var asset in src.Assets) - this.assets.Add(new Asset(asset)); - - if (src.Submodels != null) - foreach (var sm in src.Submodels) - this.submodels.Add(new Submodel(sm)); - - if (src.ConceptDescriptions != null) - foreach (var cd in src.ConceptDescriptions) - this.conceptDescriptions.Add(new ConceptDescription(cd)); - } -#endif - - // to String - - public override string ToString() - { - var res = "AAS-ENV"; - if (AdministrationShells != null) - res += $" {AdministrationShells.Count} AAS"; - if (Assets != null) - res += $" {Assets.Count} Assets"; - if (Submodels != null) - res += $" {Submodels.Count} Submodels"; - if (ConceptDescriptions != null) - res += $" {ConceptDescriptions.Count} CDs"; - return res; - } - - // self decscription - - public AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("AdministrationShellEnv", "Env"); - } - - public string GetElementName() - { - return this.GetSelfDescription()?.ElementName; - } - - // finders - - public AdministrationShell FindAAS(Identification id) - { - if (id == null) - return null; - foreach (var aas in this.AdministrationShells) - if (aas.identification != null && aas.identification.IsEqual(id)) - return aas; - return null; - } - - public AdministrationShell FindAAS(string idShort) - { - if (idShort == null) - return null; - foreach (var aas in this.AdministrationShells) - if (aas.idShort != null && aas.idShort.Trim().ToLower() == idShort.Trim().ToLower()) - return aas; - return null; - } - - public AdministrationShell FindAASwithSubmodel(Identification smid) - { - if (smid == null) - return null; - foreach (var aas in this.AdministrationShells) - if (aas.submodelRefs != null) - foreach (var smref in aas.submodelRefs) - if (smref.Matches(smid)) - return aas; - return null; - } - - public IEnumerable FindAllAAS( - Predicate p = null) - { - if (this.administrationShells == null) - yield break; - foreach (var x in this.administrationShells) - if (p == null || p(x)) - yield return x; - } - - public IEnumerable FindAllSubmodelGroupedByAAS( - Func p = null) - { - if (this.administrationShells == null || this.submodels == null) - yield break; - foreach (var aas in this.administrationShells) - { - if (aas?.submodelRefs == null) - continue; - foreach (var smref in aas.submodelRefs) - { - var sm = this.FindSubmodel(smref); - if (sm != null && (p == null || p(aas, sm))) - yield return sm; - } - } - } - - public Asset FindAsset(Identification id) - { - if (id == null) - return null; - foreach (var asset in this.Assets) - if (asset.identification != null && asset.identification.IsEqual(id)) - return asset; - return null; - } - - public Asset FindAsset(AssetRef aref) - { - // trivial - if (aref == null) - return null; - // can only refs with 1 key - if (aref.Count != 1) - return null; - // and we're picky - var key = aref[0]; - if (!key.local || key.type.ToLower().Trim() != "asset") - return null; - // brute force - foreach (var a in assets) - if (a.identification.idType.ToLower().Trim() == key.idType.ToLower().Trim() - && a.identification.id.ToLower().Trim() == key.value.ToLower().Trim()) - return a; - // uups - return null; - } - - public Submodel FindSubmodel(Identification id) - { - if (id == null) - return null; - foreach (var sm in this.Submodels) - if (sm.identification != null && sm.identification.IsEqual(id)) - return sm; - return null; - } - - public Submodel FindSubmodel(SubmodelRef smref) - { - // trivial - if (smref == null) - return null; - // can only refs with 1 key - if (smref.Count != 1) - return null; - // and we're picky - var key = smref.Keys[0]; - if (!key.local || key.type.ToLower().Trim() != "submodel") - return null; - // brute force - foreach (var sm in this.Submodels) - if (sm.identification.idType.ToLower().Trim() == key.idType.ToLower().Trim() - && sm.identification.id.ToLower().Trim() == key.value.ToLower().Trim()) - return sm; - // uups - return null; - } - - public Submodel FindFirstSubmodelBySemanticId(Key semId) - { - // access - if (semId == null) - return null; - - // brute force - foreach (var sm in this.Submodels) - if (true == sm.semanticId?.MatchesExactlyOneKey(semId)) - return sm; - - return null; - } - - public IEnumerable FindAllSubmodelBySemanticId( - Key semId, Key.MatchMode matchMode = Key.MatchMode.Strict) - { - // access - if (semId == null) - yield break; - - // brute force - foreach (var sm in this.Submodels) - if (true == sm.semanticId?.MatchesExactlyOneKey(semId, matchMode)) - yield return sm; - } - - public IEnumerable FindAllReferable(Predicate p) - { - if (p == null) - yield break; - - foreach (var r in this.FindAllReferable()) - if (r != null && p(r)) - yield return r; - } - - public IEnumerable FindAllReferable(bool onlyIdentifiables = false) - { - if (this.AdministrationShells != null) - foreach (var aas in this.AdministrationShells) - if (aas != null) - { - // AAS itself - yield return aas; - - if (!onlyIdentifiables) - { - // Views - if (aas.views?.views != null) - foreach (var view in aas.views.views) - yield return view; - } - } - - if (this.Assets != null) - foreach (var asset in this.Assets) - if (asset != null) - yield return asset; - - if (this.Submodels != null) - foreach (var sm in this.Submodels) - if (sm != null) - { - yield return sm; - - if (!onlyIdentifiables) - { - // TODO (MIHO, 2020-08-26): not very elegant, yet. Avoid temporary collection - var allsme = new ListOfSubmodelElement(); - sm.RecurseOnSubmodelElements(null, (state, parents, sme) => - { - allsme.Add(sme); return true; - }); - foreach (var sme in allsme) - yield return sme; - } - } - - if (this.ConceptDescriptions != null) - foreach (var cd in this.ConceptDescriptions) - if (cd != null) - yield return cd; - } - - // - // Reference handling - // - - public Referable FindReferableByReference(Reference rf, int keyIndex = 0, bool exactMatch = false) - { - return FindReferableByReference(rf?.Keys); - } - - public Referable FindReferableByReference(KeyList kl, int keyIndex = 0, bool exactMatch = false, - ReferableRootInfo rootInfo = null) - { - // first index needs to exist .. - if (kl == null || keyIndex >= kl.Count) - return null; - - // which type? - var firstType = kl[keyIndex].type.Trim().ToLower(); - var firstIdentification = new Identification(kl[keyIndex].idType, kl[keyIndex].value); - AdministrationShell aasToFollow = null; - - if (firstType == Key.AAS.Trim().ToLower()) - { - // search aas - var aas = this.FindAAS(firstIdentification); - - // not found or already at end with our search? - if (aas == null || keyIndex >= kl.Count - 1) - return aas; - - // side info? - if (rootInfo != null) - { - rootInfo.AAS = aas; - rootInfo.NrOfRootKeys = 1 + keyIndex; - } - - // follow up - aasToFollow = aas; - } - - if (firstType == Key.Asset.Trim().ToLower()) - { - // search asset - var asset = this.FindAsset(firstIdentification); - - // not found or already at end with our search? - if (asset == null || keyIndex >= kl.Count - 1) - return exactMatch ? null : asset; - - // try find aas for it - var aas = this.FindAllAAS((a) => - { - return a?.assetRef?.Matches(asset.identification) == true; - }).FirstOrDefault(); - if (aas == null) - return exactMatch ? null : asset; - - // side info? - if (rootInfo != null) - { - rootInfo.Asset = asset; - rootInfo.NrOfRootKeys = 1 + keyIndex; - } - - // follow up - aasToFollow = aas; - } - - // try - if (aasToFollow != null) - { - // search different entities - if (kl[keyIndex + 1].type.Trim().ToLower() == Key.Submodel.ToLower() - || kl[keyIndex + 1].type.Trim().ToLower() == Key.SubmodelRef.ToLower()) - { - // ok, search SubmodelRef - var smref = aasToFollow.FindSubmodelRef(kl[keyIndex + 1].ToId()); - if (smref == null) - return exactMatch ? null : aasToFollow; - - // validate matching submodel - var sm = this.FindSubmodel(smref); - if (sm == null) - return exactMatch ? null : aasToFollow; - - // side info - // side info? - if (rootInfo != null) - { - rootInfo.Submodel = sm; - rootInfo.NrOfRootKeys = 2 + keyIndex; - } - - // at our end? - if (keyIndex >= kl.Count - 2) - return sm; - - // go inside - return SubmodelElementWrapper.FindReferableByReference(sm.submodelElements, kl, keyIndex + 2); - } - } - - if (firstType == Key.ConceptDescription.Trim().ToLower()) - return this.FindConceptDescription(firstIdentification); - - if (firstType == Key.Submodel.Trim().ToLower()) - { - // ok, search Submodel - var sm = this.FindSubmodel(new Identification(kl[keyIndex].idType, kl[keyIndex].value)); - if (sm == null) - return null; - - // notice in side info - if (rootInfo != null) - { - rootInfo.Submodel = sm; - rootInfo.NrOfRootKeys = 1 + keyIndex; - - // add even more info - if (rootInfo.AAS == null) - { - foreach (var aas2 in this.AdministrationShells) - { - var smref2 = aas2.FindSubmodelRef(sm.identification); - if (smref2 != null) - { - rootInfo.AAS = aas2; - break; - } - } - } - } - - // at our end? - if (keyIndex >= kl.Count - 1) - return sm; - - // go inside - return SubmodelElementWrapper.FindReferableByReference(sm.submodelElements, kl, keyIndex + 1); - } - - // nothing in this Environment - return null; - } - - // - // Handling of CDs - // - - public ConceptDescription FindConceptDescription(ConceptDescriptionRef cdr) - { - if (cdr == null) - return null; - return FindConceptDescription(cdr.Keys); - } - - public ConceptDescription FindConceptDescription(SemanticId semId) - { - if (semId == null) - return null; - return FindConceptDescription(semId.Keys); - } - - public ConceptDescription FindConceptDescription(Reference rf) - { - if (rf == null) - return null; - return FindConceptDescription(rf.Keys); - } - - public ConceptDescription FindConceptDescription(Identification id) - { - var cdr = ConceptDescriptionRef.CreateNew("Conceptdescription", true, id.idType, id.id); - return FindConceptDescription(cdr); - } - - public ConceptDescription FindConceptDescription(List keys) - { - // trivial - if (keys == null) - return null; - // can only refs with 1 key - if (keys.Count != 1) - return null; - // and we're picky - var key = keys[0]; - if (!key.local || key.type.ToLower().Trim() != "conceptdescription") - return null; - // brute force - foreach (var cd in conceptDescriptions) - if (cd.identification.idType.ToLower().Trim() == key.idType.ToLower().Trim() - && cd.identification.id.ToLower().Trim() == key.value.ToLower().Trim()) - return cd; - // uups - return null; - } - - public IEnumerable FindAllSubmodelElements( - Predicate match = null, AdministrationShell onlyForAAS = null) where T : SubmodelElement - { - // more or less two different schemes - if (onlyForAAS != null) - { - if (onlyForAAS.submodelRefs == null) - yield break; - foreach (var smr in onlyForAAS.submodelRefs) - { - var sm = this.FindSubmodel(smr); - if (sm?.submodelElements != null) - foreach (var x in sm.submodelElements.FindDeep(match)) - yield return x; - } - } - else - { - if (this.Submodels != null) - foreach (var sm in this.Submodels) - if (sm?.submodelElements != null) - foreach (var x in sm.submodelElements.FindDeep(match)) - yield return x; - } - } - - public ConceptDescription FindConceptDescription(Key key) - { - if (key == null) - return null; - var l = new List { key }; - return (FindConceptDescription(l)); - } - - public IEnumerable FindAllReferences() - { - if (this.AdministrationShells != null) - foreach (var aas in this.AdministrationShells) - if (aas != null) - foreach (var r in aas.FindAllReferences()) - yield return r; - - if (this.Assets != null) - foreach (var asset in this.Assets) - if (asset != null) - foreach (var r in asset.FindAllReferences()) - yield return new LocatedReference(asset, r); - - if (this.Submodels != null) - foreach (var sm in this.Submodels) - if (sm != null) - foreach (var r in sm.FindAllReferences()) - yield return r; - - if (this.ConceptDescriptions != null) - foreach (var cd in this.ConceptDescriptions) - if (cd != null) - foreach (var r in cd.FindAllReferences()) - yield return new LocatedReference(cd, r); - } - - // creators - - private void CopyConceptDescriptionsFrom( - AdministrationShellEnv srcEnv, SubmodelElement src, bool shallowCopy = false) - { - // access - if (srcEnv == null || src == null || src.semanticId == null) - return; - // check for this SubmodelElement in Source - var cdSrc = srcEnv.FindConceptDescription(src.semanticId.Keys); - if (cdSrc == null) - return; - // check for this SubmodelElement in Destnation (this!) - var cdDest = this.FindConceptDescription(src.semanticId.Keys); - if (cdDest != null) - return; - // copy new - this.ConceptDescriptions.Add(new ConceptDescription(cdSrc)); - // recurse? - if (!shallowCopy && src is SubmodelElementCollection) - foreach (var m in (src as SubmodelElementCollection).value) - CopyConceptDescriptionsFrom(srcEnv, m.submodelElement, shallowCopy: false); - - } - - public SubmodelElementWrapper CopySubmodelElementAndCD( - AdministrationShellEnv srcEnv, SubmodelElement srcElem, bool copyCD = false, bool shallowCopy = false) - { - // access - if (srcEnv == null || srcElem == null) - return null; - - // 1st result pretty easy (calling function will add this to the appropriate Submodel) - var res = new SubmodelElementWrapper(srcElem); - - // copy the CDs.. - if (copyCD) - CopyConceptDescriptionsFrom(srcEnv, srcElem, shallowCopy); - - // give back - return res; - } - - public SubmodelRef CopySubmodelRefAndCD( - AdministrationShellEnv srcEnv, SubmodelRef srcSubRef, bool copySubmodel = false, bool copyCD = false, - bool shallowCopy = false) - { - // access - if (srcEnv == null || srcSubRef == null) - return null; - - // need to have the source Submodel - var srcSub = srcEnv.FindSubmodel(srcSubRef); - if (srcSub == null) - return null; - - // 1st result pretty easy (calling function will add this to the appropriate AAS) - var dstSubRef = new SubmodelRef(srcSubRef); - - // get the destination and shall src != dst - var dstSub = this.FindSubmodel(dstSubRef); - if (srcSub == dstSub) - return null; - - // maybe we need the Submodel in our environment, as well - if (dstSub == null && copySubmodel) - { - dstSub = new Submodel(srcSub, shallowCopy); - this.Submodels.Add(dstSub); - } - else - if (dstSub != null) - { - // there is already an submodel, just add members - if (!shallowCopy && srcSub.submodelElements != null) - { - if (dstSub.submodelElements == null) - dstSub.submodelElements = new SubmodelElementWrapperCollection(); - foreach (var smw in srcSub.submodelElements) - dstSub.submodelElements.Add( - new SubmodelElementWrapper( - smw.submodelElement, shallowCopy: false)); - } - } - - // copy the CDs.. - if (copyCD && srcSub.submodelElements != null) - foreach (var smw in srcSub.submodelElements) - CopyConceptDescriptionsFrom(srcEnv, smw.submodelElement, shallowCopy); - - // give back - return dstSubRef; - } - - /// - /// Tries renaming an Identifiable, specifically: the identification of an Identifiable and - /// all references to it. - /// Currently supported: ConceptDescriptions - /// Returns a list of Referables, which were changed or null in case of error - /// - public List RenameIdentifiable(Identification oldId, Identification newId) - where T : Identifiable - { - // access - if (oldId == null || newId == null || oldId.IsEqual(newId)) - return null; - - var res = new List(); - - if (typeof(T) == typeof(ConceptDescription)) - { - // check, if exist or not exist - var cdOld = FindConceptDescription(oldId); - if (cdOld == null || FindConceptDescription(newId) != null) - return null; - - // rename old cd - cdOld.identification = newId; - res.Add(cdOld); - - // search all SMEs referring to this CD - foreach (var sme in this.FindAllSubmodelElements(match: (s) => - { - return (s != null && s.semanticId != null && s.semanticId.Matches(oldId)); - })) - { - sme.semanticId[0].idType = newId.idType; - sme.semanticId[0].value = newId.id; - res.Add(sme); - } - - // seems fine - return res; - } - - if (typeof(T) == typeof(Submodel)) - { - // check, if exist or not exist - var smOld = FindSubmodel(oldId); - if (smOld == null || FindSubmodel(newId) != null) - return null; - - // recurse all possible Referenes in the aas env - foreach (var lr in this.FindAllReferences()) - { - var r = lr?.Reference; - if (r != null) - for (int i = 0; i < r.Count; i++) - if (r[i].Matches(Key.Submodel, false, oldId.idType, oldId.id, Key.MatchMode.Relaxed)) - { - // directly replace - r[i].idType = newId.idType; - r[i].value = newId.id; - if (res.Contains(lr.Identifiable)) - res.Add(lr.Identifiable); - } - } - - // rename old Submodel - smOld.identification = newId; - - // seems fine - return res; - } - - if (typeof(T) == typeof(Asset)) - { - // check, if exist or not exist - var assetOld = FindAsset(oldId); - if (assetOld == null || FindAsset(newId) != null) - return null; - - // recurse all possible Referenes in the aas env - foreach (var lr in this.FindAllReferences()) - { - var r = lr?.Reference; - if (r != null) - for (int i = 0; i < r.Count; i++) - if (r[i].Matches(Key.Asset, false, oldId.idType, oldId.id, Key.MatchMode.Relaxed)) - { - // directly replace - r[i].idType = newId.idType; - r[i].value = newId.id; - if (res.Contains(lr.Identifiable)) - res.Add(lr.Identifiable); - } - } - - // rename old Submodel - assetOld.identification = newId; - - // seems fine - return res; - } - - // no result is false, as well - return null; - } - - // serializations - - public void SerializeXmlToStream(StreamWriter s) - { - var serializer = new XmlSerializer(typeof(AdminShell.AdministrationShellEnv)); - var nss = new XmlSerializerNamespaces(); - nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace); - nss.Add("aas", "http://www.admin-shell.io/aas/2/0"); - nss.Add("IEC61360", "http://www.admin-shell.io/IEC61360/2/0"); - serializer.Serialize(s, this, nss); - } - - public JsonWriter SerialiazeJsonToStream(StreamWriter sw, bool leaveJsonWriterOpen = false) - { - sw.AutoFlush = true; - - JsonSerializer serializer = new JsonSerializer() - { - NullValueHandling = NullValueHandling.Ignore, - ReferenceLoopHandling = ReferenceLoopHandling.Serialize, - Formatting = Newtonsoft.Json.Formatting.Indented - }; - - JsonWriter writer = new JsonTextWriter(sw); - serializer.Serialize(writer, this); - if (leaveJsonWriterOpen) - return writer; - writer.Close(); - return null; - } - - public AdministrationShellEnv DeserializeFromXmlStream(TextReader reader) - { - XmlSerializer serializer = new XmlSerializer( - typeof(AdminShell.AdministrationShellEnv), "http://www.admin-shell.io/aas/2/0"); - var res = serializer.Deserialize(reader) as AdminShell.AdministrationShellEnv; - return res; - } - - public AdministrationShellEnv DeserializeFromJsonStream(TextReader reader) - { - JsonSerializer serializer = new JsonSerializer(); - serializer.Converters.Add(new AdminShellConverters.JsonAasxConverter("modelType", "name")); - var res = (AdministrationShellEnv)serializer.Deserialize(reader, typeof(AdministrationShellEnv)); - return res; - } - - // special functions - - private static void CreateFromExistingEnvRecurseForCDs( - AdministrationShellEnv src, List wrappers, - ref List filterForCD) - { - if (wrappers == null || filterForCD == null) - return; - - foreach (var w in wrappers) - { - // access - if (w == null) - continue; - - // include in filter .. - if (w.submodelElement.semanticId != null) - { - var cd = src.FindConceptDescription(w.submodelElement.semanticId.Keys); - if (cd != null) - filterForCD.Add(cd); - } - - // recurse? - if (w.submodelElement is SubmodelElementCollection smec) - CreateFromExistingEnvRecurseForCDs(src, smec.value, ref filterForCD); - - if (w.submodelElement is Operation op) - for (int i = 0; i < 2; i++) - { - var w2s = Operation.GetWrappers(op[i]); - CreateFromExistingEnvRecurseForCDs(src, w2s, ref filterForCD); - } - - if (w.submodelElement is Entity smee) - CreateFromExistingEnvRecurseForCDs(src, smee.statements, ref filterForCD); - - if (w.submodelElement is AnnotatedRelationshipElement smea) - CreateFromExistingEnvRecurseForCDs(src, smea.annotations, ref filterForCD); - } - } - - public static AdministrationShellEnv CreateFromExistingEnv(AdministrationShellEnv src, - List filterForAas = null, - List filterForAsset = null, - ListOfSubmodels filterForSubmodel = null, - List filterForCD = null) - { - // prepare defaults - if (filterForAas == null) - filterForAas = new List(); - if (filterForAsset == null) - filterForAsset = new List(); - if (filterForSubmodel == null) - filterForSubmodel = new ListOfSubmodels(); - if (filterForCD == null) - filterForCD = new List(); - - // make new - var res = new AdministrationShellEnv(); - - // take over AAS - foreach (var aas in src.administrationShells) - if (filterForAas.Contains(aas)) - { - // take over - res.administrationShells.Add(new AdministrationShell(aas)); - - // consequences - if (aas.assetRef != null) - { - var asset = src.FindAsset(aas.assetRef); - if (asset != null) - filterForAsset.Add(asset); - } - - if (aas.submodelRefs != null) - foreach (var smr in aas.submodelRefs) - { - var sm = src.FindSubmodel(smr); - if (sm != null) - filterForSubmodel.Add(sm); - } - - if (aas.conceptDictionaries != null) - foreach (var cdd in aas.conceptDictionaries) - if (cdd.conceptDescriptionsRefs != null && - cdd.conceptDescriptionsRefs.conceptDescriptions != null) - foreach (var cdr in cdd.conceptDescriptionsRefs.conceptDescriptions) - { - var cd = src.FindConceptDescription(cdr); - if (cd != null) - filterForCD.Add(cd); - } - } - - // take over Assets - foreach (var asset in src.assets) - if (filterForAsset.Contains(asset)) - { - // take over - res.assets.Add(new Asset(asset)); - } - - // take over Submodels - foreach (var sm in src.Submodels) - if (filterForSubmodel.Contains(sm)) - { - // take over - res.submodels.Add(new Submodel(sm)); - - // recursion in order to find used CDs - CreateFromExistingEnvRecurseForCDs(src, sm.submodelElements, ref filterForCD); - } - - // ConceptDescriptions - foreach (var cd in src.ConceptDescriptions) - if (filterForCD.Contains(cd)) - { - // take over - res.conceptDescriptions.Add(new ConceptDescription(cd)); - } - - // ok - return res; - } - - // Sorting - - public Referable.ComparerIndexed CreateIndexedComparerCdsForSmUsage() - { - var cmp = new Referable.ComparerIndexed(); - int nr = 0; - foreach (var sm in FindAllSubmodelGroupedByAAS()) - foreach (var sme in sm.FindDeep()) - { - if (sme.semanticId == null) - continue; - var cd = this.FindConceptDescription(sme.semanticId); - if (cd == null) - continue; - if (cmp.Index.ContainsKey(cd)) - continue; - cmp.Index[cd] = nr++; - } - return cmp; - } - - // Validation - - public AasValidationRecordList ValidateAll() - { - // collect results - var results = new AasValidationRecordList(); - - // all entities - foreach (var rf in this.FindAllReferable()) - rf.Validate(results); - - // give back - return results; - } - - public int AutoFix(IEnumerable records) - { - // access - if (records == null) - return -1; - - // collect Referables (expensive safety measure) - var allowedReferables = this.FindAllReferable().ToList(); - - // go thru records - int res = 0; - foreach (var rec in records) - { - // access - if (rec == null || rec.Fix == null || rec.Source == null) - continue; - - // minimal safety measure - if (!allowedReferables.Contains(rec.Source)) - continue; - - // apply fix - res++; - try - { - rec.Fix.Invoke(); - } - catch - { - res--; - } - } - - // return number of applied fixes - return res; - } - - public void RecurseOnReferables( - object state, Func lambda, bool includeThis = false) - { - // includeThis does not make sense, as no Referable - // just use the others - foreach (var idf in this.FindAllReferable(onlyIdentifiables: true)) - idf?.RecurseOnReferables(state, lambda, includeThis); - } - } - - // - // Submodel + Submodel elements - // - - public interface IGetReference - { - Reference GetReference(bool includeParents = true); - } - - public interface IGetQualifiers - { - QualifierCollection GetQualifiers(); - } - - public class Qualifier : IAasElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // member - // from hasSemantics: - [XmlElement(ElementName = "semanticId")] - public SemanticId semanticId = null; - - // this class - // TODO (Michael Hoffmeister, 2020-08-01): check, if Json has Qualifiers or not - - [MetaModelName("Qualifier.type")] - [TextSearchable] - [CountForHash] - public string type = ""; - - [MetaModelName("Qualifier.valueType")] - [TextSearchable] - [CountForHash] - public string valueType = ""; - - [CountForHash] - public Reference valueId = null; - - [MetaModelName("Qualifier.value")] - [TextSearchable] - [CountForHash] - public string value = null; - - // dead-csharp off - // Remark: due to publication of v2.0.1, the order of elements has changed!!! - // from hasSemantics: - // [XmlElement(ElementName = "semanticId")] - // [JsonIgnore] - // public SemanticId semanticId = null; - // dead-csharp on - - // constructors - - public Qualifier() { } - - public Qualifier(Qualifier src) - { - if (src.semanticId != null) - this.semanticId = new SemanticId(src.semanticId); - this.type = src.type; - this.value = src.value; - if (src.valueId != null) - this.valueId = new Reference(src.valueId); - } - - public Qualifier(string type, string value) - { - this.type = type; - this.value = value; - } - -#if !DoNotUseAasxCompatibilityModels - public Qualifier(AasxCompatibilityModels.AdminShellV10.Qualifier src) - { - if (src.semanticId != null) - this.semanticId = new SemanticId(src.semanticId); - this.type = src.qualifierType; - this.value = src.qualifierValue; - if (src.qualifierValueId != null) - this.valueId = new Reference(src.qualifierValueId); - } -#endif - - public AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("Qualifier", "Qfr"); - } - - public string GetElementName() - { - return this.GetSelfDescription()?.ElementName; - } - - // ReSharper disable MethodOverloadWithOptionalParameter .. this seems to work, anyhow - // ReSharper disable RedundantArgumentDefaultValue - public string ToString(int format = 0, string delimiter = ",") - { - var res = "" + type; - if (res == "") - res += "" + semanticId?.ToString(format, delimiter); - - if (value != null) - res += " = " + value; - else if (valueId != null) - res += " = " + valueId?.ToString(format, delimiter); - - return res; - } - - public override string ToString() - { - return this.ToString(0); - } - // ReSharper enable MethodOverloadWithOptionalParameter - // ReSharper enable RedundantArgumentDefaultValue - - public static Qualifier Parse(string input) - { - var m = Regex.Match(input, @"\s*([^,]*)(,[^=]+){0,1}\s*=\s*([^,]*)(,.+){0,1}\s*"); - if (!m.Success) - return null; - - return new Qualifier() - { - type = m.Groups[1].ToString().Trim(), - semanticId = SemanticId.Parse(m.Groups[1].ToString().Trim()), - value = m.Groups[3].ToString().Trim(), - valueId = Reference.Parse(m.Groups[1].ToString().Trim()) - }; - } - } - - /// - /// This class holds some convenience functions for Qualifiers - /// - public class QualifierCollection : List - { - public QualifierCollection() - { - - } - -#if !DoNotUseAasxCompatibilityModels - public QualifierCollection( - List src, bool shallowCopy = false) - - { - if (src != null && src.Count != 0) - { - foreach (var q in src) - { - this.Add(new Qualifier(q)); - } - } - } -#endif - - /// - /// Add qualifier. If null, do nothing - /// - public new void Add(Qualifier q) - { - if (q == null) - return; - base.Add(q); - } - - public Qualifier FindType(string type) - { - if (type == null) - return null; - foreach (var q in this) - if (q != null && q.type != null && q.type.Trim() == type.Trim()) - return q; - return null; - } - - public Qualifier FindSemanticId(SemanticId semId) - { - if (semId == null) - return null; - foreach (var q in this) - if (q != null && q.semanticId != null && q.semanticId.Matches(semId)) - return q; - return null; - } - - // ReSharper disable MethodOverloadWithOptionalParameter .. this seems to work, anyhow - // ReSharper disable RedundantArgumentDefaultValue - public string ToString(int format = 0, string delimiter = ";", string referencesDelimiter = ",") - { - var res = ""; - foreach (var q in this) - { - if (res != "") - res += delimiter; - res += q.ToString(format, referencesDelimiter); - } - return res; - } - - public override string ToString() - { - return this.ToString(0); - } - // ReSharper enable MethodOverloadWithOptionalParameter - // ReSharper enable RedundantArgumentDefaultValue - - // for convenience methods of Submodel, SubmodelElement - - public static void AddQualifier( - ref QualifierCollection qualifiers, - Qualifier q) - { - if (q == null) - return; - if (qualifiers == null) - qualifiers = new QualifierCollection(); - qualifiers.Add(q); - } - - public static void AddQualifier( - ref QualifierCollection qualifiers, - string qualifierType = null, string qualifierValue = null, KeyList semanticKeys = null, - Reference qualifierValueId = null) - { - if (qualifiers == null) - qualifiers = new QualifierCollection(); - var q = new Qualifier() - { - type = qualifierType, - value = qualifierValue, - valueId = qualifierValueId, - }; - if (semanticKeys != null) - q.semanticId = SemanticId.CreateFromKeys(semanticKeys); - qualifiers.Add(q); - } - - public static Qualifier HasQualifierOfType( - QualifierCollection qualifiers, - string qualifierType) - { - if (qualifiers == null || qualifierType == null) - return null; - foreach (var q in qualifiers) - if (q.type.Trim().ToLower() == qualifierType.Trim().ToLower()) - return q; - return null; - } - - public IEnumerable FindAllQualifierType(string qualifierType) - { - if (qualifierType == null) - yield break; - foreach (var q in this) - if (q.type.Trim().ToLower() == qualifierType.Trim().ToLower()) - yield return q; - } - } - - public class ListOfSubmodelElement : List - { - // conversion to other list - - public KeyList ToKeyList() - { - var res = new KeyList(); - foreach (var sme in this) - res.Add(sme.ToKey()); - return res; - } - - public Reference GetReference() - { - return Reference.CreateNew(ToKeyList()); - } - } - - public class SubmodelElement : Referable, System.IDisposable, IGetReference, IGetSemanticId, IGetQualifiers - { - // constants - public static Type[] PROP_MLP = new Type[] { - typeof(AdminShell.MultiLanguageProperty), typeof(AdminShell.Property) }; - - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // members - - // do this in order to be IDisposable, that is: suitable for (using) - void System.IDisposable.Dispose() { } - public void GetData() { } - - // from HasKind - [XmlElement(ElementName = "kind")] - [JsonIgnore] - public ModelingKind kind = new ModelingKind(); - [XmlIgnore] - [JsonProperty(PropertyName = "kind")] - public string JsonKind - { - get - { - if (kind == null) - return null; - return kind.kind; - } - set - { - if (kind == null) - kind = new ModelingKind(); - kind.kind = value; - } - } - - // from hasSemanticId: - [XmlElement(ElementName = "semanticId")] - public SemanticId semanticId = new SemanticId(); - public SemanticId GetSemanticId() { return semanticId; } - - // from Qualifiable: - [XmlArray("qualifier")] - [XmlArrayItem("qualifier")] - [JsonProperty(PropertyName = "constraints")] - public QualifierCollection qualifiers = null; - public QualifierCollection GetQualifiers() => qualifiers; - - // from hasDataSpecification: - [XmlElement(ElementName = "embeddedDataSpecification")] - public HasDataSpecification hasDataSpecification = null; - - // getter / setter - - // constructors / creators - - public SubmodelElement() - : base() { } - - public SubmodelElement(SubmodelElement src) - : base(src) - { - if (src == null) - return; - if (src.hasDataSpecification != null) - hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - if (src.semanticId != null) - semanticId = new SemanticId(src.semanticId); - if (src.kind != null) - kind = new ModelingKind(src.kind); - if (src.qualifiers != null) - { - if (qualifiers == null) - qualifiers = new QualifierCollection(); - foreach (var q in src.qualifiers) - qualifiers.Add(new Qualifier(q)); - } - } - -#if !DoNotUseAasxCompatibilityModels - public SubmodelElement(AasxCompatibilityModels.AdminShellV10.SubmodelElement src) - : base(src) - { - if (src.hasDataSpecification != null) - hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - if (src.semanticId != null) - semanticId = new SemanticId(src.semanticId); - if (src.kind != null) - kind = new ModelingKind(src.kind); - if (src.qualifiers != null) - { - if (qualifiers == null) - qualifiers = new QualifierCollection(src.qualifiers); - foreach (var q in src.qualifiers) - qualifiers.Add(new Qualifier(q)); - } - } -#endif - - public static T CreateNew(string idShort = null, string category = null, Reference semanticId = null) - where T : SubmodelElement, new() - { - var res = new T(); - if (idShort != null) - res.idShort = idShort; - if (category != null) - res.category = category; - if (semanticId != null) - res.semanticId = new SemanticId(semanticId); - return res; - } - - public void CreateNewLogic(string idShort = null, string category = null, Key semanticIdKey = null) - { - if (idShort != null) - this.idShort = idShort; - if (category != null) - this.category = category; - if (semanticIdKey != null) - { - if (this.semanticId == null) - this.semanticId = new SemanticId(); - this.semanticId.Keys.Add(semanticIdKey); - } - } - - public void AddQualifier( - Qualifier q) - { - QualifierCollection.AddQualifier( - ref this.qualifiers, q); - } - - public void AddQualifier( - string qualifierType = null, string qualifierValue = null, KeyList semanticKeys = null, - Reference qualifierValueId = null) - { - QualifierCollection.AddQualifier( - ref this.qualifiers, qualifierType, qualifierValue, semanticKeys, qualifierValueId); - } - - public Qualifier HasQualifierOfType(string qualifierType) - { - return QualifierCollection.HasQualifierOfType(this.qualifiers, qualifierType); - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("SubmodelElement", "SME"); - } - - public override Reference GetReference(bool includeParents = true) - { - Reference r = new Reference(); - // this is the tail of our referencing chain .. - r.Keys.Add(Key.CreateNew(GetElementName(), true, "IdShort", this.idShort)); - // try to climb up .. - var current = this.parent; - while (includeParents && current != null) - { - if (current is Identifiable cid) - { - // add big information set - r.Keys.Insert(0, Key.CreateNew( - current.GetElementName(), - true, - cid.identification.idType, - cid.identification.id)); - } - else - if (current is Referable crf) - { - // reference via idShort - r.Keys.Insert(0, Key.CreateNew( - current.GetElementName(), - true, - "IdShort", crf.idShort)); - } - - if (current is Referable crf2) - current = crf2.parent; - else - current = null; - } - return r; - } - - public IEnumerable FindAllParents( - Predicate p, - bool includeThis = false, bool includeSubmodel = false, - bool passOverMiss = false) - { - // call for this? - if (includeThis) - { - if (p == null || p.Invoke(this)) - yield return this; - else - if (!passOverMiss) - yield break; - } - - // daisy chain all parents .. - if (this.parent != null) - { - if (this.parent is SubmodelElement psme) - { - foreach (var q in psme.FindAllParents(p, includeThis: true, - passOverMiss: passOverMiss)) - yield return q; - } - else if (includeSubmodel && this.parent is Submodel psm) - { - if (p == null || p.Invoke(psm)) - yield return this; - } - } - } - - public IEnumerable FindAllParentsWithSemanticId( - SemanticId semId, - bool includeThis = false, bool includeSubmodel = false, bool passOverMiss = false) - { - return (FindAllParents( - (rf) => (true == (rf as IGetSemanticId)?.GetSemanticId()?.Matches(semId, - matchMode: Key.MatchMode.Relaxed)), - includeThis: includeThis, includeSubmodel: includeSubmodel, passOverMiss: passOverMiss)); - } - - public Tuple ToCaptionInfo() - { - var caption = AdminShellUtilV20.EvalToNonNullString("\"{0}\" ", idShort, ""); - var info = ""; - // TODO (MIHO, 2021-07-08): obvious error .. info should receive semanticId .. but would change - // display presentation .. therefore to be checked again - if (semanticId != null) - AdminShellUtilV20.EvalToNonEmptyString("\u21e8 {0}", semanticId.ToString(), ""); - return Tuple.Create(caption, info); - } - - public override string ToString() - { - var ci = ToCaptionInfo(); - return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); - } - - public virtual string ValueAsText(string defaultLang = null) - { - return ""; - } - - public virtual double? ValueAsDouble() - { - return null; - } - - public virtual void ValueFromText(string text, string defaultLang = null) - { - } - - // validation - - public override void Validate(AasValidationRecordList results) - { - // access - if (results == null) - return; - - // check - base.Validate(results); - ModelingKind.Validate(results, kind, this); - KeyList.Validate(results, semanticId?.Keys, this); - } - } - - [XmlType(TypeName = "submodelElement")] - public class SubmodelElementWrapper - { - - // members - - [XmlElement(ElementName = "property", Type = typeof(Property))] - [XmlElement(ElementName = "multiLanguageProperty", Type = typeof(MultiLanguageProperty))] - [XmlElement(ElementName = "range", Type = typeof(Range))] - [XmlElement(ElementName = "file", Type = typeof(File))] - [XmlElement(ElementName = "blob", Type = typeof(Blob))] - [XmlElement(ElementName = "referenceElement", Type = typeof(ReferenceElement))] - [XmlElement(ElementName = "relationshipElement", Type = typeof(RelationshipElement))] - [XmlElement(ElementName = "annotatedRelationshipElement", Type = typeof(AnnotatedRelationshipElement))] - [XmlElement(ElementName = "capability", Type = typeof(Capability))] - [XmlElement(ElementName = "submodelElementCollection", Type = typeof(SubmodelElementCollection))] - [XmlElement(ElementName = "operation", Type = typeof(Operation))] - [XmlElement(ElementName = "basicEvent", Type = typeof(BasicEvent))] - [XmlElement(ElementName = "entity", Type = typeof(Entity))] - public SubmodelElement submodelElement; - - // element names - public enum AdequateElementEnum - { - Unknown = 0, SubmodelElementCollection, Property, MultiLanguageProperty, Range, File, Blob, - ReferenceElement, RelationshipElement, AnnotatedRelationshipElement, Capability, Operation, - BasicEvent, Entity - } - - public static AdequateElementEnum[] AdequateElementsDataElement = - { - AdequateElementEnum.SubmodelElementCollection, AdequateElementEnum.RelationshipElement, - AdequateElementEnum.AnnotatedRelationshipElement, AdequateElementEnum.Capability, - AdequateElementEnum.Operation, AdequateElementEnum.BasicEvent, AdequateElementEnum.Entity - }; - - public static string[] AdequateElementNames = { "Unknown", "SubmodelElementCollection", "Property", - "MultiLanguageProperty", "Range", "File", "Blob", "ReferenceElement", "RelationshipElement", - "AnnotatedRelationshipElement", "Capability", "Operation", "BasicEvent", "Entity" }; - - public static string[] AdequateElementShortName = { null, "SMC", null, - "MLP", null, null, null, "Ref", "Rel", - "ARel", null, null, "Event", "Entity" }; - - // constructors - - public SubmodelElementWrapper() { } - - // cloning - - public SubmodelElementWrapper(SubmodelElement src, bool shallowCopy = false) - { - /* TODO (MIHO, 2021-08-12): consider using: - Activator.CreateInstance(pl.GetType(), new object[] { pl }) */ - - if (src is SubmodelElementCollection) - this.submodelElement = new SubmodelElementCollection( - src as SubmodelElementCollection, shallowCopy: shallowCopy); - if (src is Property) - this.submodelElement = new Property(src as Property); - if (src is MultiLanguageProperty) - this.submodelElement = new MultiLanguageProperty(src as MultiLanguageProperty); - if (src is Range) - this.submodelElement = new Range(src as Range); - if (src is File) - this.submodelElement = new File(src as File); - if (src is Blob) - this.submodelElement = new Blob(src as Blob); - if (src is ReferenceElement) - this.submodelElement = new ReferenceElement(src as ReferenceElement); - if (src is RelationshipElement) - this.submodelElement = new RelationshipElement(src as RelationshipElement); - if (src is AnnotatedRelationshipElement) - this.submodelElement = new AnnotatedRelationshipElement(src as AnnotatedRelationshipElement); - if (src is Capability) - this.submodelElement = new Capability(src as Capability); - if (src is Operation) - this.submodelElement = new Operation(src as Operation); - if (src is BasicEvent) - this.submodelElement = new BasicEvent(src as BasicEvent); - if (src is Entity) - this.submodelElement = new Entity(src as Entity); - } - -#if !DoNotUseAasxCompatibilityModels - public SubmodelElementWrapper( - AasxCompatibilityModels.AdminShellV10.SubmodelElement src, bool shallowCopy = false) - { - if (src is AasxCompatibilityModels.AdminShellV10.SubmodelElementCollection) - this.submodelElement = new SubmodelElementCollection( - src as AasxCompatibilityModels.AdminShellV10.SubmodelElementCollection, - shallowCopy: shallowCopy); - if (src is AasxCompatibilityModels.AdminShellV10.Property) - this.submodelElement = new Property(src as AasxCompatibilityModels.AdminShellV10.Property); - if (src is AasxCompatibilityModels.AdminShellV10.File) - this.submodelElement = new File(src as AasxCompatibilityModels.AdminShellV10.File); - if (src is AasxCompatibilityModels.AdminShellV10.Blob) - this.submodelElement = new Blob(src as AasxCompatibilityModels.AdminShellV10.Blob); - if (src is AasxCompatibilityModels.AdminShellV10.ReferenceElement) - this.submodelElement = new ReferenceElement( - src as AasxCompatibilityModels.AdminShellV10.ReferenceElement); - if (src is AasxCompatibilityModels.AdminShellV10.RelationshipElement) - this.submodelElement = new RelationshipElement( - src as AasxCompatibilityModels.AdminShellV10.RelationshipElement); - if (src is AasxCompatibilityModels.AdminShellV10.Operation) - this.submodelElement = new Operation(src as AasxCompatibilityModels.AdminShellV10.Operation); - } -#endif - - public static string GetAdequateName(AdequateElementEnum ae) - { - return AdequateElementNames[(int)ae]; - } - - /// - /// Deprecated. See below. - /// - public static AdequateElementEnum GetAdequateEnum(string adequateName) - { - if (adequateName == null) - return AdequateElementEnum.Unknown; - - foreach (var en in (AdequateElementEnum[])Enum.GetValues(typeof(AdequateElementEnum))) - if (Enum.GetName(typeof(AdequateElementEnum), en)?.Trim().ToLower() == - adequateName.Trim().ToLower()) - return en; - - return AdequateElementEnum.Unknown; - } - - /// - /// This version uses the element name array and allows using ShortName - /// - public static AdequateElementEnum GetAdequateEnum2(string adequateName, bool useShortName = false) - { - if (adequateName == null) - return AdequateElementEnum.Unknown; - - foreach (var en in (AdequateElementEnum[])Enum.GetValues(typeof(AdequateElementEnum))) - if (((int)en < AdequateElementNames.Length - && AdequateElementNames[(int)en].Trim().ToLower() == adequateName.Trim().ToLower()) - || (useShortName - && (int)en < AdequateElementShortName.Length - && AdequateElementShortName[(int)en] != null - && AdequateElementShortName[(int)en].Trim().ToLower() == adequateName.Trim().ToLower())) - return en; - - return AdequateElementEnum.Unknown; - } - - public static IEnumerable GetAdequateEnums( - AdequateElementEnum[] excludeValues = null, AdequateElementEnum[] includeValues = null) - { - if (includeValues != null) - { - foreach (var en in includeValues) - yield return en; - } - else - { - foreach (var en in (AdequateElementEnum[])Enum.GetValues(typeof(AdequateElementEnum))) - { - if (en == AdequateElementEnum.Unknown) - continue; - if (excludeValues != null && excludeValues.Contains(en)) - continue; - yield return en; - } - } - } - - /// - /// Introduced for JSON serialization, can create SubModelElements based on a string name - /// - public static SubmodelElement CreateAdequateType(AdequateElementEnum ae, SubmodelElement src = null) - { - if (ae == AdequateElementEnum.Property) - return new Property(src); - if (ae == AdequateElementEnum.MultiLanguageProperty) - return new MultiLanguageProperty(src); - if (ae == AdequateElementEnum.Range) - return new Range(src); - if (ae == AdequateElementEnum.File) - return new File(src); - if (ae == AdequateElementEnum.Blob) - return new Blob(src); - if (ae == AdequateElementEnum.ReferenceElement) - return new ReferenceElement(src); - if (ae == AdequateElementEnum.RelationshipElement) - return new RelationshipElement(src); - if (ae == AdequateElementEnum.AnnotatedRelationshipElement) - return new AnnotatedRelationshipElement(src); - if (ae == AdequateElementEnum.Capability) - return new Capability(src); - if (ae == AdequateElementEnum.SubmodelElementCollection) - return new SubmodelElementCollection(src); - if (ae == AdequateElementEnum.Operation) - return new Operation(src); - if (ae == AdequateElementEnum.BasicEvent) - return new BasicEvent(src); - if (ae == AdequateElementEnum.Entity) - return new Entity(src); - return null; - } - - /// - /// Introduced for JSON serialization, can create SubModelElements based on a string name - /// - /// string name (standard PascalCased) - public static SubmodelElement CreateAdequateType(string elementName) - { - return CreateAdequateType(GetAdequateEnum(elementName)); - } - - /// - /// Can create SubmodelElements based on a given type information - /// - /// Type of the SME to be created - /// SubmodelElement or null - public static SubmodelElement CreateAdequateType(Type t) - { - if (t == null || !t.IsSubclassOf(typeof(AdminShell.SubmodelElement))) - return null; - var sme = Activator.CreateInstance(t) as SubmodelElement; - return sme; - } - - public string GetElementAbbreviation() - { - if (submodelElement == null) - return ("Null"); - var dsc = submodelElement.GetSelfDescription(); - if (dsc?.ElementAbbreviation == null) - return ("Null"); - return dsc.ElementAbbreviation; - } - - public static string GetElementNameByAdequateType(SubmodelElement sme) - { - // access - var sd = sme.GetSelfDescription(); - if (sd == null || sd.ElementEnum == AdequateElementEnum.Unknown) - return null; - var en = sd.ElementEnum; - - // get the names - string res = null; - if ((int)en < AdequateElementNames.Length) - res = AdequateElementNames[(int)en].Trim(); - if ((int)en < AdequateElementShortName.Length && AdequateElementShortName[(int)en] != null) - res = AdequateElementShortName[(int)en].Trim(); - return res; - } - - public static ListOfSubmodelElement ListOfWrappersToListOfElems(List wrappers) - { - var res = new ListOfSubmodelElement(); - if (wrappers == null) - return res; - foreach (var w in wrappers) - if (w.submodelElement != null) - res.Add(w.submodelElement); - return res; - } - - public static SubmodelElementWrapper CreateFor(SubmodelElement sme) - { - var res = new SubmodelElementWrapper() { submodelElement = sme }; - return res; - } - - public static Referable FindReferableByReference( - List wrappers, Reference rf, int keyIndex) - { - return FindReferableByReference(wrappers, rf?.Keys, keyIndex); - } - - public static Referable FindReferableByReference( - List wrappers, KeyList rf, int keyIndex) - { - // first index needs to exist .. - if (wrappers == null || rf == null || keyIndex >= rf.Count) - return null; - - // as SubmodelElements are not Identifiables, the actual key shall be IdShort - if (rf[keyIndex].idType.Trim().ToLower() != Key.GetIdentifierTypeName( - Key.IdentifierType.IdShort).Trim().ToLower()) - return null; - - // over all wrappers - foreach (var smw in wrappers) - if (smw.submodelElement != null && - smw.submodelElement.idShort.Trim().ToLower() == rf[keyIndex].value.Trim().ToLower()) - { - // match on this level. Did we find a leaf element? - if ((keyIndex + 1) >= rf.Count) - return smw.submodelElement; - - // dive into SMC? - if (smw.submodelElement is SubmodelElementCollection smc) - { - var found = FindReferableByReference(smc.value, rf, keyIndex + 1); - if (found != null) - return found; - } - - // dive into Entity statements? - if (smw.submodelElement is Entity ent) - { - var found = FindReferableByReference(ent.statements, rf, keyIndex + 1); - if (found != null) - return found; - } - - // else: - return null; - } - - // no? - return null; - } - - // typecasting wrapper into specific type - public T GetAs() where T : SubmodelElement - { - var x = (this.submodelElement) as T; - return x; - } - - } - - public class SubmodelElementWrapperCollection : BaseSubmodelElementWrapperCollection - { - public SubmodelElementWrapperCollection() : base() { } - - public SubmodelElementWrapperCollection(SubmodelElementWrapper smw) : base(smw) { } - - public SubmodelElementWrapperCollection(SubmodelElement sme) : base(sme) { } - - public SubmodelElementWrapperCollection(SubmodelElementWrapperCollection other) : base(other) { } - } - - public class DataElementWrapperCollection : BaseSubmodelElementWrapperCollection - { - public DataElementWrapperCollection() : base() { } - - public DataElementWrapperCollection(SubmodelElementWrapperCollection other) - : base(other) - { - } - - public DataElementWrapperCollection(DataElementWrapperCollection other) - : base() - { - foreach (var wo in other) - this.Add(wo); - } - } - - /// - /// Provides some more functionalities for searching specific elements, e.g. in a SMEC - /// - // OZ - // Resharper disable UnusedTypeParameter - public class BaseSubmodelElementWrapperCollection : List - where ELEMT : SubmodelElement - { - // Resharper enable UnusedTypeParameter - - // member: Parent - // will be held correctly by the containing class - public Referable Parent = null; - - // constructors - - public BaseSubmodelElementWrapperCollection() : base() { } - - public BaseSubmodelElementWrapperCollection(SubmodelElementWrapperCollection other) - : base() - { - if (other == null) - return; - - foreach (var smw in other) - this.Add(new SubmodelElementWrapper(smw.submodelElement)); - } - - public BaseSubmodelElementWrapperCollection(SubmodelElementWrapper smw) - : base() - { - if (smw != null) - this.Add(smw); - } - - public BaseSubmodelElementWrapperCollection(SubmodelElement sme) - : base() - { - if (sme != null) - this.Add(new SubmodelElementWrapper(sme)); - } - - // better find functions - - public IEnumerable FindDeep(Predicate match = null) where T : SubmodelElement - { - foreach (var smw in this) - { - var current = smw.submodelElement; - if (current == null) - continue; - - // call lambda for this element - if (current is T) - if (match == null || match.Invoke(current as T)) - yield return current as T; - - // dive into? - // TODO (MIHO, 2020-07-31): would be nice to use IEnumerateChildren for this .. - if (current is SubmodelElementCollection smc && smc.value != null) - foreach (var x in smc.value.FindDeep(match)) - yield return x; - - if (current is AnnotatedRelationshipElement are && are.annotations != null) - foreach (var x in are.annotations.FindDeep(match)) - yield return x; - - if (current is Entity ent && ent.statements != null) - foreach (var x in ent.statements.FindDeep(match)) - yield return x; - - if (current is Operation op) - for (int i = 0; i < 2; i++) - if (Operation.GetWrappers(op[i]) != null) - foreach (var x in Operation.GetWrappers(op[i]).FindDeep(match)) - yield return x; - } - } - - public IEnumerable FindAllIdShort(string idShort) - { - foreach (var smw in this) - if (smw.submodelElement != null) - if (smw.submodelElement.idShort.Trim().ToLower() == idShort.Trim().ToLower()) - yield return smw; - } - - public IEnumerable FindAllIdShortAs(string idShort) where T : SubmodelElement - { - foreach (var smw in this) - if (smw.submodelElement != null && smw.submodelElement is T) - if (smw.submodelElement.idShort.Trim().ToLower() == idShort.Trim().ToLower()) - yield return smw.submodelElement as T; - } - - public SubmodelElementWrapper FindFirstIdShort(string idShort) - { - return FindAllIdShort(idShort)?.FirstOrDefault(); - } - - public T FindFirstIdShortAs(string idShort) where T : SubmodelElement - { - return FindAllIdShortAs(idShort)?.FirstOrDefault(); - } - - public IEnumerable FindAllSemanticId( - Key semId, Type[] allowedTypes = null, Key.MatchMode matchMode = Key.MatchMode.Strict) - { - foreach (var smw in this) - if (smw.submodelElement != null && smw.submodelElement.semanticId != null) - { - if (smw.submodelElement == null) - continue; - - if (allowedTypes != null) - { - var smwt = smw.submodelElement.GetType(); - if (!allowedTypes.Contains(smwt)) - continue; - } - - if (smw.submodelElement.semanticId.MatchesExactlyOneKey(semId, matchMode)) - yield return smw; - } - } - - public IEnumerable FindAllSemanticIdAs(Key semId, Key.MatchMode matchMode = Key.MatchMode.Strict) - where T : SubmodelElement - { - foreach (var smw in this) - if (smw.submodelElement != null && smw.submodelElement is T - && smw.submodelElement.semanticId != null) - if (smw.submodelElement.semanticId.MatchesExactlyOneKey(semId, matchMode)) - yield return smw.submodelElement as T; - } - - public IEnumerable FindAllSemanticIdAs(Reference semId, - Key.MatchMode matchMode = Key.MatchMode.Strict) - where T : SubmodelElement - { - foreach (var smw in this) - if (smw.submodelElement != null && smw.submodelElement is T - && smw.submodelElement.semanticId != null) - if (smw.submodelElement.semanticId.Matches(semId, matchMode)) - yield return smw.submodelElement as T; - } - - public IEnumerable FindAllSemanticIdAs(ConceptDescription cd, - Key.MatchMode matchMode = Key.MatchMode.Strict) - where T : SubmodelElement - { - foreach (var x in FindAllSemanticIdAs(cd.GetReference(), matchMode)) - yield return x; - } - - public SubmodelElementWrapper FindFirstSemanticId( - Key semId, Type[] allowedTypes = null, Key.MatchMode matchMode = Key.MatchMode.Strict) - { - return FindAllSemanticId(semId, allowedTypes, matchMode)?.FirstOrDefault(); - } - - public SubmodelElementWrapper FindFirstAnySemanticId( - Key[] semId, Type[] allowedTypes = null, Key.MatchMode matchMode = Key.MatchMode.Strict) - { - if (semId == null) - return null; - foreach (var si in semId) - { - var found = FindAllSemanticId(si, allowedTypes, matchMode)? - .FirstOrDefault(); - if (found != null) - return found; - } - return null; - } - - public T FindFirstSemanticIdAs(Key semId, Key.MatchMode matchMode = Key.MatchMode.Strict) - where T : SubmodelElement - { - return FindAllSemanticIdAs(semId, matchMode)?.FirstOrDefault(); - } - - public T FindFirstAnySemanticIdAs(Key[] semId, Key.MatchMode matchMode = Key.MatchMode.Strict) - where T : SubmodelElement - { - if (semId == null) - return null; - foreach (var si in semId) - { - var found = FindAllSemanticIdAs(si, matchMode)?.FirstOrDefault(); - if (found != null) - return found; - } - return null; - } - - public T FindFirstSemanticIdAs(Reference semId, Key.MatchMode matchMode = Key.MatchMode.Strict) - where T : SubmodelElement - { - return FindAllSemanticIdAs(semId, matchMode)?.FirstOrDefault(); - } - - /* TODO (MIHO, 2021-10-18): there are overlaps of this new function with - * this old function: FindFirstAnySemanticId(Key[] semId .. - * clarify/ refactor */ - public IEnumerable FindAllSemanticId( - Key[] allowedSemId, Key.MatchMode matchMode = Key.MatchMode.Strict, - bool invertAllowed = false) - where T : SubmodelElement - { - if (allowedSemId == null || allowedSemId.Length < 1) - yield break; - - foreach (var smw in this) - { - if (smw.submodelElement == null || !(smw.submodelElement is T)) - continue; - - if (smw.submodelElement.semanticId == null || smw.submodelElement.semanticId.Count < 1) - { - if (invertAllowed) - yield return smw.submodelElement as T; - continue; - } - - var found = false; - foreach (var semId in allowedSemId) - if (smw.submodelElement.semanticId.MatchesExactlyOneKey(semId, matchMode)) - { - found = true; - break; - } - - if (invertAllowed) - found = !found; - - if (found) - yield return smw.submodelElement as T; - } - } - - public T FindFirstAnySemanticId( - Key[] allowedSemId, Key.MatchMode matchMode = Key.MatchMode.Strict, - bool invertAllowed = false) - where T : SubmodelElement - { - return FindAllSemanticId(allowedSemId, matchMode, invertAllowed)?.FirstOrDefault(); - } - - // recursion - - /// - /// Recurses on all Submodel elements of a Submodel or SME, which allows children. - /// The state object will be passed to the lambda function in order to provide - /// stateful approaches. Also a list of parents will be provided to - /// the lambda. This list of parents can be initialized or simply set to null - /// in order to be created automatically. - /// - /// State object to be provided to lambda. Could be null. - /// List of already existing parents to be provided to lambda. - /// Could be null. - /// The lambda function as (state, parents, SME) - /// The lambda shall return TRUE in order to deep into recursion. - /// - public void RecurseOnReferables( - object state, ListOfReferable parents, - Func lambda) - { - // trivial - if (lambda == null) - return; - if (parents == null) - parents = new ListOfReferable(); - - // over all elements - foreach (var smw in this) - { - var current = smw.submodelElement; - if (current == null) - continue; - - // call lambda for this element - // AND decide, if to recurse! - var goDeeper = lambda(state, parents, current); - - if (goDeeper) - { - // add to parents - parents.Add(current); - - // dive into? - if (current is SubmodelElementCollection smc) - smc.value?.RecurseOnReferables(state, parents, lambda); - - if (current is Entity ent) - ent.statements?.RecurseOnReferables(state, parents, lambda); - - if (current is Operation op) - for (int i = 0; i < 2; i++) - Operation.GetWrappers(op[i])?.RecurseOnReferables(state, parents, lambda); - - if (current is AnnotatedRelationshipElement arel) - arel.annotations?.RecurseOnReferables(state, parents, lambda); - - // remove from parents - parents.RemoveAt(parents.Count - 1); - } - } - } - - // idShort management - - /// - /// Checks, if given idShort is already existing in the collection of SubmodelElements. - /// Trims the string, but does not ignore upper/ lowercase. An empty idShort returns false. - /// - public bool CheckIdShortIsUnique(string idShort) - { - idShort = idShort?.Trim(); - if (idShort == null || idShort.Length < 1) - return false; - - var res = true; - foreach (var smw in this) - if (smw.submodelElement != null && smw.submodelElement.idShort != null && - smw.submodelElement.idShort == idShort) - { - res = false; - break; - } - - return res; - } - - /// - /// The string idShortTemplate shall contain Format.String partt such as {0}. - /// A int-Parameter is as long incremented, until the resulting idShort proves - /// to be unique in the collection of SubmodelElements or maxNum is reached. - /// Returns null in case of any error. - /// - public string IterateIdShortTemplateToBeUnique(string idShortTemplate, int maxNum) - { - if (idShortTemplate == null || maxNum < 1 || !idShortTemplate.Contains("{0")) - return null; - - int i = 1; - while (i < maxNum) - { - var ids = String.Format(idShortTemplate, i); - if (this.CheckIdShortIsUnique(ids)) - return ids; - i++; - } - - return null; - } - - // give more direct access to SMEs - - /// - /// Add sme by creating a SubmodelElementWrapper for it and adding to this collection. - /// - public void Add(SubmodelElement sme) - { - if (sme == null) - return; - sme.parent = this.Parent; - this.Add(SubmodelElementWrapper.CreateFor(sme)); - } - - /// - /// Add sme by creating a SubmodelElementWrapper for it and adding to this collection. - /// - public void Insert(int index, SubmodelElement sme) - { - if (sme == null || index < 0 || index >= this.Count) - return; - sme.parent = this.Parent; - this.Insert(index, SubmodelElementWrapper.CreateFor(sme)); - } - - /// - /// Finds the first (shall be only 1!) SubmodelElementWrapper with SubmodelElement sme. - /// - public SubmodelElementWrapper FindSubModelElement(SubmodelElement sme) - { - if (sme != null) - foreach (var smw in this) - if (smw?.submodelElement == sme) - return smw; - return null; - } - - /// - /// Removes the first (shall be only 1!) SubmodelElementWrapper with SubmodelElement sme. - /// - public void Remove(SubmodelElement sme) - { - if (sme == null) - return; - var found = FindSubModelElement(sme); - if (found != null) - this.Remove(found); - } - - // a little more business logic - - public T CreateSMEForCD(ConceptDescription cd, string category = null, string idShort = null, - string idxTemplate = null, int maxNum = 999, bool addSme = false, bool isTemplate = false) - where T : SubmodelElement, new() - { - // access - if (cd == null) - return null; - - // try to potentially figure out idShort - var ids = cd.idShort; - if ((ids == null || ids.Trim() == "") && cd.GetIEC61360() != null) - ids = cd.GetIEC61360().shortName? - .GetDefaultStr(); - if (idShort != null) - ids = idShort; - if (ids == null) - return null; - - // unique? - if (idxTemplate != null) - ids = this.IterateIdShortTemplateToBeUnique(idxTemplate, maxNum); - - // make a new instance - var sme = new T() - { - idShort = ids, - semanticId = new SemanticId(cd.GetCdReference()) - }; - if (category != null) - sme.category = category; - if (isTemplate) - sme.kind = ModelingKind.CreateAsTemplate(); - - // if its a SMC, make sure its accessible - if (sme is SubmodelElementCollection smc) - smc.value = new SubmodelElementWrapperCollection(); - - // instantanously add it? - if (addSme) - this.Add(sme); - - // give back - return sme; - } - - public T CreateSMEForIdShort(string idShort, string category = null, - string idxTemplate = null, int maxNum = 999, bool addSme = false) where T : SubmodelElement, new() - { - // access - if (idShort == null) - return null; - - // try to potentially figure out idShort - var ids = idShort; - - // unique? - if (idxTemplate != null) - ids = this.IterateIdShortTemplateToBeUnique(idxTemplate, maxNum); - - // make a new instance - var sme = new T() { idShort = ids }; - if (category != null) - sme.category = category; - - // instantanously add it? - if (addSme) - this.Add(sme); - - // give back - return sme; - } - - // for conversion - - public T AdaptiveConvertTo( - SubmodelElement anySrc, - ConceptDescription createDefault = null, - string idShort = null, bool addSme = false) where T : SubmodelElement, new() - { - if (typeof(T) == typeof(MultiLanguageProperty) - && anySrc is Property srcProp) - { - var res = this.CreateSMEForCD(createDefault, idShort: idShort, addSme: addSme); - if (res is MultiLanguageProperty mlp) - { - mlp.value = new LangStringSet("EN?", srcProp.value); - mlp.valueId = srcProp.valueId; - return res; - } - } - - if (typeof(T) == typeof(Property) - && anySrc is MultiLanguageProperty srcMlp) - { - var res = this.CreateSMEForCD(createDefault, idShort: idShort, addSme: addSme); - if (res is Property prp) - { - prp.value = "" + srcMlp.value?.GetDefaultStr(); - prp.valueId = srcMlp.valueId; - return res; - } - } - - return null; - } - - public T CopyOneSMEbyCopy(Key destSemanticId, - SubmodelElementWrapperCollection sourceSmc, Key[] sourceSemanticId, - ConceptDescription createDefault = null, Action setDefault = null, - Key.MatchMode matchMode = Key.MatchMode.Relaxed, - string idShort = null, bool addSme = false) where T : SubmodelElement, new() - { - // get source - var src = sourceSmc?.FindFirstAnySemanticIdAs(sourceSemanticId, matchMode); - - // may be make an adaptive conversion - if (src == null) - { - var anySrc = sourceSmc?.FindFirstAnySemanticId(sourceSemanticId, matchMode: matchMode); - src = AdaptiveConvertTo(anySrc?.submodelElement, createDefault, - idShort: idShort, addSme: false); - } - - // proceed - var aeSrc = SubmodelElementWrapper.GetAdequateEnum(src?.GetElementName()); - if (src == null || aeSrc == SubmodelElementWrapper.AdequateElementEnum.Unknown) - { - // create a default? - if (createDefault == null) - return null; - - // ok, default - var dflt = this.CreateSMEForCD(createDefault, idShort: idShort, addSme: addSme); - - // set default? - setDefault?.Invoke(dflt); - - // return - return dflt; - } - - // ok, create new one - var dst = SubmodelElementWrapper.CreateAdequateType(aeSrc, src) as T; - if (dst == null) - return null; - - // make same things sure - dst.idShort = src.idShort; - dst.category = src.category; - dst.semanticId = new SemanticId(destSemanticId); - - // instantanously add it? - if (addSme) - this.Add(dst); - - // give back - return dst; - } - - public T CopyOneSMEbyCopy(ConceptDescription destCD, - SubmodelElementWrapperCollection sourceSmc, ConceptDescription sourceCD, - bool createDefault = false, Action setDefault = null, - Key.MatchMode matchMode = Key.MatchMode.Relaxed, - string idShort = null, bool addSme = false) where T : SubmodelElement, new() - { - return this.CopyOneSMEbyCopy(destCD?.GetSingleKey(), sourceSmc, new[] { sourceCD?.GetSingleKey() }, - createDefault ? destCD : null, setDefault, matchMode, idShort, addSme); - } - - public T CopyOneSMEbyCopy(ConceptDescription destCD, - SubmodelElementWrapperCollection sourceSmc, Key[] sourceKeys, - bool createDefault = false, Action setDefault = null, - Key.MatchMode matchMode = Key.MatchMode.Relaxed, - string idShort = null, bool addSme = false) where T : SubmodelElement, new() - { - return this.CopyOneSMEbyCopy(destCD?.GetSingleKey(), sourceSmc, sourceKeys, - createDefault ? destCD : null, setDefault, matchMode, idShort, addSme); - } - - public void CopyManySMEbyCopy(Key destSemanticId, - SubmodelElementWrapperCollection sourceSmc, Key sourceSemanticId, - ConceptDescription createDefault = null, Action setDefault = null, - Key.MatchMode matchMode = Key.MatchMode.Relaxed) where T : SubmodelElement, new() - { - // bool find possible sources - bool foundSrc = false; - if (sourceSmc == null) - return; - foreach (var src in sourceSmc.FindAllSemanticIdAs(sourceSemanticId, matchMode)) - { - // type of found src? - var aeSrc = SubmodelElementWrapper.GetAdequateEnum(src?.GetElementName()); - - // ok? - if (src == null || aeSrc == SubmodelElementWrapper.AdequateElementEnum.Unknown) - continue; - foundSrc = true; - - // ok, create new one - var dst = SubmodelElementWrapper.CreateAdequateType(aeSrc, src) as T; - if (dst != null) - { - // make same things sure - dst.idShort = src.idShort; - dst.category = src.category; - dst.semanticId = new SemanticId(destSemanticId); - - // instantanously add it? - this.Add(dst); - } - } - - // default? - if (createDefault != null && !foundSrc) - { - // ok, default - var dflt = this.CreateSMEForCD(createDefault, addSme: true); - - // set default? - setDefault?.Invoke(dflt); - } - } - - public void CopyManySMEbyCopy(ConceptDescription destCD, - SubmodelElementWrapperCollection sourceSmc, ConceptDescription sourceCD, - bool createDefault = false, Action setDefault = null, - Key.MatchMode matchMode = Key.MatchMode.Relaxed) where T : SubmodelElement, new() - { - CopyManySMEbyCopy(destCD.GetSingleKey(), sourceSmc, sourceCD.GetSingleKey(), - createDefault ? destCD : null, setDefault, matchMode); - } - } - - public interface IManageSubmodelElements - { - void Add(SubmodelElement sme); - void Insert(int index, SubmodelElement sme); - void Remove(SubmodelElement sme); - } - - public class Submodel : Identifiable, IManageSubmodelElements, - System.IDisposable, IEnumerateChildren, IFindAllReferences, - IGetSemanticId, IGetQualifiers - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // members - - // do this in order to be IDisposable, that is: suitable for (using) - void System.IDisposable.Dispose() { } - public void GetData() { } - - // from HasKind - [XmlElement(ElementName = "kind")] - [JsonIgnore] - public ModelingKind kind = new ModelingKind(); - [XmlIgnore] - [JsonProperty(PropertyName = "kind")] - public string JsonKind - { - get - { - if (kind == null) - return null; - return kind.kind; - } - set - { - if (kind == null) - kind = new ModelingKind(); - kind.kind = value; - } - } - - // from hasSemanticId: - [XmlElement(ElementName = "semanticId")] - public SemanticId semanticId = new SemanticId(); - public SemanticId GetSemanticId() { return semanticId; } - - // from Qualifiable: - [XmlArray("qualifier")] - [XmlArrayItem("qualifier")] - public QualifierCollection qualifiers = null; - public QualifierCollection GetQualifiers() => qualifiers; - - // from hasDataSpecification: - [XmlElement(ElementName = "embeddedDataSpecification")] - public HasDataSpecification hasDataSpecification = null; - - // from this very class - [XmlIgnore] - [JsonIgnore] - private SubmodelElementWrapperCollection _submodelElements = null; - - [JsonIgnore] - public SubmodelElementWrapperCollection submodelElements - { - get { return _submodelElements; } - set { _submodelElements = value; _submodelElements.Parent = this; } - } - - [XmlIgnore] - [JsonProperty(PropertyName = "submodelElements")] - public SubmodelElement[] JsonSubmodelElements - { - get - { - var res = new ListOfSubmodelElement(); - if (submodelElements != null) - foreach (var smew in submodelElements) - res.Add(smew.submodelElement); - return res.ToArray(); - } - set - { - if (value != null) - { - this.submodelElements = new SubmodelElementWrapperCollection(); - foreach (var x in value) - { - var smew = new SubmodelElementWrapper() { submodelElement = x }; - this.submodelElements.Add(smew); - } - } - } - } - - // getter / setter - - // constructors / creators - - public Submodel() : base() { } - - public Submodel(Submodel src, bool shallowCopy = false) - : base(src) - { - if (src == null) - return; - if (src.hasDataSpecification != null) - this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - if (src.semanticId != null) - this.semanticId = new SemanticId(src.semanticId); - if (src.kind != null) - this.kind = new ModelingKind(src.kind); - if (!shallowCopy && src.submodelElements != null) - { - if (this.submodelElements == null) - this.submodelElements = new SubmodelElementWrapperCollection(); - foreach (var smw in src.submodelElements) - this.submodelElements.Add(new SubmodelElementWrapper(smw.submodelElement, shallowCopy: false)); - } - } - -#if !DoNotUseAasxCompatibilityModels - public Submodel(AasxCompatibilityModels.AdminShellV10.Submodel src, bool shallowCopy = false) - : base(src) - { - if (src.hasDataSpecification != null) - this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - if (src.semanticId != null) - this.semanticId = new SemanticId(src.semanticId); - if (src.kind != null) - this.kind = new ModelingKind(src.kind); - if (src.qualifiers != null) - this.qualifiers = new QualifierCollection(src.qualifiers); - if (!shallowCopy && src.submodelElements != null) - { - if (this.submodelElements == null) - this.submodelElements = new SubmodelElementWrapperCollection(); - foreach (var smw in src.submodelElements) - this.submodelElements.Add(new SubmodelElementWrapper(smw.submodelElement, shallowCopy: false)); - } - } -#endif - - public static Submodel CreateNew(string idType, string id, string version = null, string revision = null) - { - var s = new Submodel() { identification = new Identification(idType, id) }; - if (version != null) - { - if (s.administration == null) - s.administration = new Administration(); - s.administration.version = version; - s.administration.revision = revision; - } - return (s); - } - - [JsonIgnore] - [XmlIgnore] - public SubmodelElementWrapperCollection SmeForWrite - { - get - { - if (this.submodelElements == null) - this.submodelElements = new SubmodelElementWrapperCollection(); - return this.submodelElements; - } - } - - // from IEnumarateChildren - public IEnumerable EnumerateChildren() - { - if (this.submodelElements != null) - foreach (var smw in this.submodelElements) - yield return smw; - } - - public EnumerationPlacmentBase GetChildrenPlacement(SubmodelElement child) - { - return null; - } - - public object AddChild(SubmodelElementWrapper smw, EnumerationPlacmentBase placement = null) - { - if (smw == null) - return null; - if (this.submodelElements == null) - this.submodelElements = new SubmodelElementWrapperCollection(); - if (smw.submodelElement != null) - smw.submodelElement.parent = this; - this.submodelElements.Add(smw); - return smw; - } - - // from IManageSubmodelElements - public void Add(SubmodelElement sme) - { - if (submodelElements == null) - submodelElements = new SubmodelElementWrapperCollection(); - var sew = new SubmodelElementWrapper(); - sme.parent = this; // track parent here! - sew.submodelElement = sme; - submodelElements.Add(sew); - } - - public void Insert(int index, SubmodelElement sme) - { - if (submodelElements == null) - submodelElements = new SubmodelElementWrapperCollection(); - var sew = new SubmodelElementWrapper(); - sme.parent = this; // track parent here! - sew.submodelElement = sme; - if (index < 0 || index >= submodelElements.Count) - return; - submodelElements.Insert(index, sew); - } - - public void Remove(SubmodelElement sme) - { - if (submodelElements != null) - submodelElements.Remove(sme); - } - - // further - - public void AddQualifier( - string qualifierType = null, string qualifierValue = null, KeyList semanticKeys = null, - Reference qualifierValueId = null) - { - QualifierCollection.AddQualifier( - ref this.qualifiers, qualifierType, qualifierValue, semanticKeys, qualifierValueId); - } - - public Qualifier HasQualifierOfType(string qualifierType) - { - return QualifierCollection.HasQualifierOfType(this.qualifiers, qualifierType); - } - - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("Submodel", "SM"); - } - - public SubmodelRef GetSubmodelRef() - { - SubmodelRef l = new SubmodelRef(); - l.Keys.Add( - Key.CreateNew( - this.GetElementName(), true, this.identification.idType, this.identification.id)); - return l; - } - - /// - /// If instance, return semanticId as on key. - /// If template, return identification as key. - /// - /// - public Key GetSemanticKey() - { - if (true == this.kind?.IsTemplate) - return new Key(this.GetElementName(), true, this.identification?.idType, this.identification?.id); - else - return this.semanticId?.GetAsExactlyOneKey(); - } - - public void AddDataSpecification(Key k) - { - if (hasDataSpecification == null) - hasDataSpecification = new HasDataSpecification(); - var r = new Reference(); - r.Keys.Add(k); - hasDataSpecification.Add(new EmbeddedDataSpecification(r)); - } - - public SubmodelElementWrapper FindSubmodelElementWrapper(string idShort) - { - if (this.submodelElements == null) - return null; - foreach (var smw in this.submodelElements) - if (smw.submodelElement != null) - if (smw.submodelElement.idShort.Trim().ToLower() == idShort.Trim().ToLower()) - return smw; - return null; - } - - public IEnumerable FindDeep(Predicate match = null) where T : SubmodelElement - { - if (this.submodelElements == null) - yield break; - foreach (var x in this.submodelElements.FindDeep(match)) - yield return x; - } - - public Tuple ToCaptionInfo() - { - var caption = AdminShellUtilV20.EvalToNonNullString("\"{0}\" ", idShort, ""); - if (administration != null) - caption += "V" + administration.version + "." + administration.revision; - var info = ""; - if (identification != null) - info = $"[{identification.idType}, {identification.id}]"; - return Tuple.Create(caption, info); - } - - public override string ToString() - { - var ci = ToCaptionInfo(); - return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); - } - - // Recursing - - /// - /// Recurses on all Submodel elements of a Submodel or SME, which allows children. - /// The state object will be passed to the lambda function in order to provide - /// stateful approaches. - /// - /// State object to be provided to lambda. Could be null. - /// The lambda function as (state, parents, SME) - /// The lambda shall return TRUE in order to deep into recursion. - /// - public void RecurseOnSubmodelElements( - object state, Func lambda) - { - this.submodelElements?.RecurseOnReferables(state, null, (o, par, rf) => - { - if (rf is SubmodelElement sme) - return lambda(o, par, sme); - else - return true; - }); - } - - /// - /// Recurses on all Submodel elements of a Submodel or SME, which allows children. - /// The state object will be passed to the lambda function in order to provide - /// stateful approaches. Include this element, as well. - /// - /// State object to be provided to lambda. Could be null. - /// The lambda function as (state, parents, SME) - /// The lambda shall return TRUE in order to deep into recursion. - /// Include this element as well. parents will then - /// include this element as well! - public override void RecurseOnReferables( - object state, Func lambda, - bool includeThis = false) - { - var parents = new ListOfReferable(); - if (includeThis) - { - lambda(state, null, this); - parents.Add(this); - } - this.submodelElements?.RecurseOnReferables(state, parents, lambda); - } - - // Parents stuff - - public static void SetParentsForSME(Referable parent, SubmodelElement se) - { - if (se == null) - return; - - se.parent = parent; - - // via interface enumaration - if (se is IEnumerateChildren) - { - var childs = (se as IEnumerateChildren).EnumerateChildren(); - if (childs != null) - foreach (var c in childs) - SetParentsForSME(se, c.submodelElement); - } - } - - public void SetAllParents() - { - if (this.submodelElements != null) - foreach (var sme in this.submodelElements) - SetParentsForSME(this, sme.submodelElement); - } - - public T CreateSMEForCD(ConceptDescription cd, string category = null, string idShort = null, - string idxTemplate = null, int maxNum = 999, bool addSme = false) where T : SubmodelElement, new() - { - if (this.submodelElements == null) - this.submodelElements = new SubmodelElementWrapperCollection(); - return this.submodelElements.CreateSMEForCD(cd, category, idShort, idxTemplate, maxNum, addSme); - } - - public T CreateSMEForIdShort(string idShort, string category = null, - string idxTemplate = null, int maxNum = 999, bool addSme = false) where T : SubmodelElement, new() - { - if (this.submodelElements == null) - this.submodelElements = new SubmodelElementWrapperCollection(); - return this.submodelElements.CreateSMEForIdShort(idShort, category, idxTemplate, maxNum, addSme); - } - - // validation - - public override void Validate(AasValidationRecordList results) - { - // access - if (results == null) - return; - - // check - base.Validate(results); - ModelingKind.Validate(results, kind, this); - KeyList.Validate(results, semanticId?.Keys, this); - } - - // find - - public IEnumerable FindAllReferences() - { - // not nice: use temp list - var temp = new List(); - - // recurse - this.RecurseOnSubmodelElements(null, (state, parents, sme) => - { - if (sme is ReferenceElement re) - if (re.value != null) - temp.Add(re.value); - if (sme is RelationshipElement rl) - { - if (rl.first != null) - temp.Add(rl.first); - if (rl.second != null) - temp.Add(rl.second); - } - // recurse - return true; - }); - - // now, give back - foreach (var r in temp) - yield return new LocatedReference(this, r); - } - } - - public class ListOfSubmodels : List, IAasElement - { - // self decscription - - public AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("Submodels", "SMS"); - } - - public string GetElementName() - { - return this.GetSelfDescription()?.ElementName; - } - } - - // - // Derived from SubmodelElements - // - - public class DataElement : SubmodelElement - { - public static string ValueType_STRING = "string"; - public static string ValueType_DATE = "date"; - public static string ValueType_BOOLEAN = "boolean"; - - public static string[] ValueTypeItems = new string[] { - "anyType", "complexType", "anySimpleType", "anyAtomicType", "anyURI", "base64Binary", - "boolean", "date", "dateTime", - "dateTimeStamp", "decimal", "integer", "long", "int", "short", "byte", "nonNegativeInteger", - "positiveInteger", - "unsignedLong", "unsignedInt", "unsignedShort", "unsignedByte", "nonPositiveInteger", - "negativeInteger", "double", "duration", - "dayTimeDuration", "yearMonthDuration", "float", "hexBinary", "string", "langString", "time" }; - - public static string[] ValueTypes_Number = new[] { - "decimal", "integer", "long", "int", "short", "byte", "nonNegativeInteger", - "positiveInteger", - "unsignedLong", "unsignedInt", "unsignedShort", "unsignedByte", "nonPositiveInteger", - "negativeInteger", "double", "float" }; - - public DataElement() { } - - public DataElement(SubmodelElement src) : base(src) { } - - public DataElement(DataElement src) : base(src) { } - -#if !DoNotUseAasxCompatibilityModels - public DataElement(AasxCompatibilityModels.AdminShellV10.DataElement src) - : base(src) - { } -#endif - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("DataElement", "DE"); - } - } - - public class JsonValueTypeCast - { - - public class JsonDataObjectType - { - [JsonProperty(PropertyName = "name")] - public string name = ""; - } - - [JsonProperty(PropertyName = "dataObjectType")] - public JsonDataObjectType dataObjectType = new JsonDataObjectType(); - - public JsonValueTypeCast(string name) - { - this.dataObjectType.name = name; - } - } - - public class Property : DataElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - - [MetaModelName("Property.valueType")] - [TextSearchable] - [JsonIgnore] - public string valueType = ""; - [XmlIgnore] - [JsonProperty(PropertyName = "valueType")] - public JsonValueTypeCast JsonValueType - { - get { return new JsonValueTypeCast(this.valueType); } - set { this.valueType = value?.dataObjectType?.name; } - } - - - [MetaModelName("Property.value")] - [TextSearchable] - public string value = ""; - public Reference valueId = null; - - // constructors - - public Property() { } - - public Property(SubmodelElement src) - : base(src) - { - if (!(src is Property p)) - return; - this.valueType = p.valueType; - this.value = p.value; - if (p.valueId != null) - valueId = new Reference(p.valueId); - } - -#if !DoNotUseAasxCompatibilityModels - public Property(AasxCompatibilityModels.AdminShellV10.Property src) - : base(src) - { - if (src == null) - return; - - this.valueType = src.valueType; - this.value = src.value; - if (src.valueId != null) - this.valueId = new Reference(src.valueId); - } -#endif - - public static Property CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new Property(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - public Property Set(string valueType = "", string value = "") - { - this.valueType = valueType; - this.value = value; - return this; - } - - public Property Set(string type, bool local, string idType, string value) - { - this.valueId = Reference.CreateNew(Key.CreateNew(type, local, idType, value)); - return this; - } - - public Property Set(Qualifier q) - { - if (q != null) - this.AddQualifier(q); - return this; - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("Property", "Prop", - SubmodelElementWrapper.AdequateElementEnum.Property); - } - - public override string ValueAsText(string defaultLang = null) - { - return "" + value; - } - - public override void ValueFromText(string text, string defaultLang = null) - { - value = "" + text; - } - - public bool IsTrue() - { - if (this.valueType?.Trim().ToLower() == "boolean") - { - var v = "" + this.value?.Trim().ToLower(); - if (v == "true" || v == "1") - return true; - } - return false; - } - - public override double? ValueAsDouble() - { - // pointless - if (this.value == null || this.value.Trim() == "" || this.valueType == null) - return null; - - // type? - var vt = this.valueType.Trim().ToLower(); - if (!DataElement.ValueTypes_Number.Contains(vt)) - return null; - - // try convert - if (double.TryParse(this.value, NumberStyles.Any, CultureInfo.InvariantCulture, out double dbl)) - return dbl; - - // no - return null; - } - - } - - public class MultiLanguageProperty : DataElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - - public LangStringSet value = new LangStringSet(); - public Reference valueId = null; - - // constructors - - public MultiLanguageProperty() { } - - public MultiLanguageProperty(SubmodelElement src) - : base(src) - { - if (!(src is MultiLanguageProperty mlp)) - return; - - this.value = new LangStringSet(mlp.value); - if (mlp.valueId != null) - valueId = new Reference(mlp.valueId); - } - -#if !DoNotUseAasxCompatibilityModels - // not available in V1.0 -#endif - - public static MultiLanguageProperty CreateNew( - string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new MultiLanguageProperty(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("MultiLanguageProperty", "MLP", - SubmodelElementWrapper.AdequateElementEnum.MultiLanguageProperty); - } - - public MultiLanguageProperty Set(LangStringSet ls) - { - this.value = ls; - return this; - } - - public MultiLanguageProperty Set(ListOfLangStr ls) - { - this.value = new LangStringSet(ls); - return this; - } - - public MultiLanguageProperty Set(LangStr ls) - { - if (ls == null) - return this; - if (this.value?.langString == null) - this.value = new LangStringSet(); - this.value.langString[ls.lang] = ls.str; - return this; - } - - public MultiLanguageProperty Set(string lang, string str) - { - return this.Set(new LangStr(lang, str)); - } - - public override string ValueAsText(string defaultLang = null) - { - return "" + value?.GetDefaultStr(defaultLang); - } - - public override void ValueFromText(string text, string defaultLang = null) - { - Set(defaultLang, text); - } - - } - - public class Range : DataElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - - [MetaModelName("Range.valueType")] - [TextSearchable] - [JsonIgnore] - [CountForHash] - public string valueType = ""; - - [XmlIgnore] - [JsonProperty(PropertyName = "valueType")] - public JsonValueTypeCast JsonValueType - { - get { return new JsonValueTypeCast(this.valueType); } - set { this.valueType = value?.dataObjectType?.name; } - } - - [MetaModelName("Range.min")] - [TextSearchable] - [CountForHash] - public string min = ""; - - [MetaModelName("Range.max")] - [TextSearchable] - [CountForHash] - public string max = ""; - - // constructors - - public Range() { } - - public Range(SubmodelElement src) - : base(src) - { - if (!(src is Range rng)) - return; - - this.valueType = rng.valueType; - this.min = rng.min; - this.max = rng.max; - } - -#if !DoNotUseAasxCompatibilityModels - // not available in V1.0 -#endif - - public static Range CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new Range(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("Range", "Range", - SubmodelElementWrapper.AdequateElementEnum.Range); - } - - public override string ValueAsText(string defaultLang = null) - { - return "" + min + " .. " + max; - } - - } - - public class Blob : DataElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - - [MetaModelName("Blob.mimeType")] - [TextSearchable] - [CountForHash] - public string mimeType = ""; - - [MetaModelName("Blob.value")] - [TextSearchable] - [CountForHash] - public string value = ""; - - // constructors - - public Blob() { } - - public Blob(SubmodelElement src) - : base(src) - { - if (!(src is Blob blb)) - return; - - this.mimeType = blb.mimeType; - this.value = blb.value; - } - -#if !DoNotUseAasxCompatibilityModels - public Blob(AasxCompatibilityModels.AdminShellV10.Blob src) - : base(src) - { - if (src == null) - return; - - this.mimeType = src.mimeType; - this.value = src.value; - } -#endif - - public static Blob CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new Blob(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - public void Set(string mimeType = "", string value = "") - { - this.mimeType = mimeType; - this.value = value; - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("Blob", "Blob", - SubmodelElementWrapper.AdequateElementEnum.Blob); - } - - } - - public class File : DataElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - - [MetaModelName("File.mimeType")] - [TextSearchable] - [CountForHash] - public string mimeType = ""; - - [MetaModelName("File.value")] - [TextSearchable] - [CountForHash] - public string value = ""; - - // constructors - - public File() { } - - public File(SubmodelElement src) - : base(src) - { - if (!(src is File fil)) - return; - - this.mimeType = fil.mimeType; - this.value = fil.value; - } - -#if !DoNotUseAasxCompatibilityModels - public File(AasxCompatibilityModels.AdminShellV10.File src) - : base(src) - { - if (src == null) - return; - - this.mimeType = src.mimeType; - this.value = src.value; - } -#endif - - public static File CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new File(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - public void Set(string mimeType = "", string value = "") - { - this.mimeType = mimeType; - this.value = value; - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("File", "File", - SubmodelElementWrapper.AdequateElementEnum.File); - } - - public static string[] GetPopularMimeTypes() - { - return - new[] { - System.Net.Mime.MediaTypeNames.Text.Plain, - System.Net.Mime.MediaTypeNames.Text.Xml, - System.Net.Mime.MediaTypeNames.Text.Html, - "application/json", - "application/rdf+xml", - System.Net.Mime.MediaTypeNames.Application.Pdf, - System.Net.Mime.MediaTypeNames.Image.Jpeg, - "image/png", - System.Net.Mime.MediaTypeNames.Image.Gif, - "application/iges", - "application/step" - }; - } - - public override string ValueAsText(string defaultLang = null) - { - return "" + value; - } - } - - public class ReferenceElement : DataElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - - public Reference value = new Reference(); - - // constructors - - public ReferenceElement() { } - - public ReferenceElement(SubmodelElement src) - : base(src) - { - if (!(src is ReferenceElement re)) - return; - - if (re.value != null) - this.value = new Reference(re.value); - } - -#if !DoNotUseAasxCompatibilityModels - public ReferenceElement(AasxCompatibilityModels.AdminShellV10.ReferenceElement src) - : base(src) - { - if (src == null) - return; - - if (src.value != null) - this.value = new Reference(src.value); - } -#endif - - public static ReferenceElement CreateNew( - string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new ReferenceElement(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - public void Set(Reference value = null) - { - this.value = value; - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("ReferenceElement", "Ref", - SubmodelElementWrapper.AdequateElementEnum.ReferenceElement); - } - - } - - public class RelationshipElement : DataElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - - public Reference first = new Reference(); - public Reference second = new Reference(); - - // constructors - - public RelationshipElement() { } - - public RelationshipElement(SubmodelElement src) - : base(src) - { - if (!(src is RelationshipElement rel)) - return; - - if (rel.first != null) - this.first = new Reference(rel.first); - if (rel.second != null) - this.second = new Reference(rel.second); - } - -#if !DoNotUseAasxCompatibilityModels - public RelationshipElement(AasxCompatibilityModels.AdminShellV10.RelationshipElement src) - : base(src) - { - if (src == null) - return; - - if (src.first != null) - this.first = new Reference(src.first); - if (src.second != null) - this.second = new Reference(src.second); - } -#endif - - public static RelationshipElement CreateNew( - string idShort = null, string category = null, Key semanticIdKey = null, Reference first = null, - Reference second = null) - { - var x = new RelationshipElement(); - x.CreateNewLogic(idShort, category, semanticIdKey); - x.first = first; - x.second = second; - return (x); - } - - public void Set(Reference first = null, Reference second = null) - { - this.first = first; - this.second = second; - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("RelationshipElement", "Rel", - SubmodelElementWrapper.AdequateElementEnum.RelationshipElement); - } - } - - public class AnnotatedRelationshipElement : RelationshipElement, IManageSubmodelElements, IEnumerateChildren - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - - // from this very class - - [JsonIgnore] - [SkipForHash] // do NOT count children! - [XmlArray("annotations")] - [XmlArrayItem("dataElement")] - public DataElementWrapperCollection annotations = null; - - [XmlIgnore] - [JsonProperty(PropertyName = "annotations")] - public DataElement[] JsonAnotations - { - get - { - var res = new List(); - if (annotations != null) - foreach (var smew in annotations) - if (smew.submodelElement is DataElement de) - res.Add(de); - return res.ToArray(); - } - set - { - if (value != null) - { - this.annotations = new DataElementWrapperCollection(); - foreach (var x in value) - { - var smew = new SubmodelElementWrapper() { submodelElement = x }; - this.annotations.Add(smew); - } - } - } - } - - // constructors - - public AnnotatedRelationshipElement() { } - - public AnnotatedRelationshipElement(SubmodelElement src) - : base(src) - { - if (!(src is AnnotatedRelationshipElement arel)) - return; - if (arel.first != null) - this.first = new Reference(arel.first); - if (arel.second != null) - this.second = new Reference(arel.second); - if (arel.annotations != null) - this.annotations = new DataElementWrapperCollection(arel.annotations); - } - - public new static AnnotatedRelationshipElement CreateNew( - string idShort = null, string category = null, Key semanticIdKey = null, - Reference first = null, Reference second = null) - { - var x = new AnnotatedRelationshipElement(); - x.CreateNewLogic(idShort, category, semanticIdKey); - x.first = first; - x.second = second; - return (x); - } - - // enumerates its children - - public IEnumerable EnumerateChildren() - { - if (this.annotations != null) - foreach (var smw in this.annotations) - yield return smw; - } - - public EnumerationPlacmentBase GetChildrenPlacement(SubmodelElement child) - { - return null; - } - - public object AddChild(SubmodelElementWrapper smw, EnumerationPlacmentBase placement = null) - { - if (smw == null || !(smw.submodelElement is DataElement)) - return null; - if (this.annotations == null) - this.annotations = new DataElementWrapperCollection(); - if (smw.submodelElement != null) - smw.submodelElement.parent = this; - this.annotations.Add(smw); - return smw; - } - - // from IManageSubmodelElements - public void Add(SubmodelElement sme) - { - if (annotations == null) - annotations = new DataElementWrapperCollection(); - var sew = new SubmodelElementWrapper(); - sme.parent = this; // track parent here! - sew.submodelElement = sme; - annotations.Add(sew); - } - - public void Insert(int index, SubmodelElement sme) - { - if (annotations == null) - annotations = new DataElementWrapperCollection(); - var sew = new SubmodelElementWrapper(); - sme.parent = this; // track parent here! - if (index < 0 || index >= annotations.Count) - return; - annotations.Insert(index, sew); - } - - public void Remove(SubmodelElement sme) - { - if (annotations != null) - annotations.Remove(sme); - } - - // further - - public new void Set(Reference first = null, Reference second = null) - { - this.first = first; - this.second = second; - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("AnnotatedRelationshipElement", "RelA", - SubmodelElementWrapper.AdequateElementEnum.AnnotatedRelationshipElement); - } - - - } - - public class Capability : SubmodelElement - { - public Capability() { } - - public Capability(SubmodelElement src) - : base(src) - { } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("Capability", "Cap", - SubmodelElementWrapper.AdequateElementEnum.Capability); - } - } - - - public class SubmodelElementCollection : SubmodelElement, IManageSubmodelElements, IEnumerateChildren - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // values == SMEs - [XmlIgnore] - [JsonIgnore] - [SkipForHash] // do NOT count children! - private SubmodelElementWrapperCollection _value = null; - - [JsonIgnore] - public SubmodelElementWrapperCollection value - { - get { return _value; } - set { _value = value; _value.Parent = this; } - } - - [XmlIgnore] - [JsonProperty(PropertyName = "value")] - public SubmodelElement[] JsonValue - { - get - { - var res = new ListOfSubmodelElement(); - if (value != null) - foreach (var smew in value) - res.Add(smew.submodelElement); - return res.ToArray(); - } - set - { - if (value != null) - { - this.value = new SubmodelElementWrapperCollection(); - foreach (var x in value) - { - var smew = new SubmodelElementWrapper() { submodelElement = x }; - this.value.Add(smew); - } - } - } - } - - // constant members - public bool ordered = false; - public bool allowDuplicates = false; - - // enumartes its children - - public IEnumerable EnumerateChildren() - { - if (this.value != null) - foreach (var smw in this.value) - yield return smw; - } - - public EnumerationPlacmentBase GetChildrenPlacement(SubmodelElement child) - { - return null; - } - - public object AddChild(SubmodelElementWrapper smw, EnumerationPlacmentBase placement = null) - { - if (smw == null) - return null; - if (this.value == null) - this.value = new SubmodelElementWrapperCollection(); - if (smw.submodelElement != null) - smw.submodelElement.parent = this; - this.value.Add(smw); - return smw; - } - - // constructors - - public SubmodelElementCollection() { } - - public SubmodelElementCollection(SubmodelElement src, bool shallowCopy = false) - : base(src) - { - if (!(src is SubmodelElementCollection smc)) - return; - - this.ordered = smc.ordered; - this.allowDuplicates = smc.allowDuplicates; - this.value = new SubmodelElementWrapperCollection(); - if (!shallowCopy) - foreach (var smw in smc.value) - value.Add(new SubmodelElementWrapper(smw.submodelElement)); - } - -#if !DoNotUseAasxCompatibilityModels - public SubmodelElementCollection( - AasxCompatibilityModels.AdminShellV10.SubmodelElementCollection src, bool shallowCopy = false) - : base(src) - { - if (src == null) - return; - - this.ordered = src.ordered; - this.allowDuplicates = src.allowDuplicates; - this.value = new SubmodelElementWrapperCollection(); - if (!shallowCopy) - foreach (var smw in src.value) - value.Add(new SubmodelElementWrapper(smw.submodelElement)); - } -#endif - - public static SubmodelElementCollection CreateNew( - string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new SubmodelElementCollection(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - // from IManageSubmodelElements - public void Add(SubmodelElement sme) - { - if (value == null) - value = new SubmodelElementWrapperCollection(); - var sew = new SubmodelElementWrapper(); - sme.parent = this; // track parent here! - sew.submodelElement = sme; - value.Add(sew); - } - - public void Insert(int index, SubmodelElement sme) - { - if (value == null) - value = new SubmodelElementWrapperCollection(); - var sew = new SubmodelElementWrapper(); - sme.parent = this; // track parent here! - sew.submodelElement = sme; - if (index < 0 || index >= value.Count) - return; - value.Insert(index, sew); - } - - public void Remove(SubmodelElement sme) - { - if (value != null) - value.Remove(sme); - } - - // further - - public void Set(bool allowDuplicates = false, bool ordered = false) - { - this.allowDuplicates = allowDuplicates; - this.ordered = ordered; - } - - public SubmodelElementWrapper FindFirstIdShort(string idShort) - { - return this.value?.FindFirstIdShort(idShort); - } - - public T CreateSMEForCD(ConceptDescription cd, string category = null, string idShort = null, - string idxTemplate = null, int maxNum = 999, bool addSme = false) where T : SubmodelElement, new() - { - if (this.value == null) - this.value = new SubmodelElementWrapperCollection(); - return this.value.CreateSMEForCD(cd, category, idShort, idxTemplate, maxNum, addSme); - } - - public T CreateSMEForIdShort(string idShort, string category = null, - string idxTemplate = null, int maxNum = 999, bool addSme = false) where T : SubmodelElement, new() - { - if (this.value == null) - this.value = new SubmodelElementWrapperCollection(); - return this.value.CreateSMEForIdShort(idShort, category, idxTemplate, maxNum, addSme); - } - - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("SubmodelElementCollection", "SMC", - SubmodelElementWrapper.AdequateElementEnum.SubmodelElementCollection); - } - - // Recursing - - /// - /// Recurses on all Submodel elements of a Submodel or SME, which allows children. - /// The state object will be passed to the lambda function in order to provide - /// stateful approaches. - /// - /// State object to be provided to lambda. Could be null. - /// The lambda function as (state, parents, SME) - /// The lambda shall return TRUE in order to deep into recursion. - /// - public void RecurseOnSubmodelElements( - object state, Func lambda) - { - this.value?.RecurseOnReferables(state, null, (o, par, rf) => - { - if (rf is SubmodelElement sme) - return lambda(o, par, sme); - else - return true; - }); - } - - /// - /// Recurses on all Submodel elements of a Submodel or SME, which allows children. - /// The state object will be passed to the lambda function in order to provide - /// stateful approaches. Include this element, as well. - /// - /// State object to be provided to lambda. Could be null. - /// The lambda function as (state, parents, SME) - /// The lambda shall return TRUE in order to deep into recursion. - /// Include this element as well. parents will then - /// include this element as well! - public override void RecurseOnReferables( - object state, Func lambda, - bool includeThis = false) - { - var parents = new ListOfReferable(); - if (includeThis) - { - lambda(state, null, this); - parents.Add(this); - } - this.value?.RecurseOnReferables(state, parents, lambda); - } - } - - public class OperationVariable : IAasElement - { - public enum Direction { In, Out, InOut }; - - // Note: for OperationVariable, the values of the SubmodelElement itself ARE NOT TO BE USED! - // only the SME attributes of "value" are counting - - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // members - public SubmodelElementWrapper value = null; - - // constructors - - public OperationVariable() - { - } - - public OperationVariable(OperationVariable src, bool shallowCopy = false) - { - this.value = new SubmodelElementWrapper(src?.value?.submodelElement, shallowCopy); - } - -#if !DoNotUseAasxCompatibilityModels - public OperationVariable( - AasxCompatibilityModels.AdminShellV10.OperationVariable src, bool shallowCopy = false) - { - this.value = new SubmodelElementWrapper(src.value.submodelElement, shallowCopy); - } -#endif - - public OperationVariable(SubmodelElement elem) - : base() - { - this.value = new SubmodelElementWrapper(elem); - } - - public AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("OperationVariable", "OprVar"); - } - - public string GetElementName() - { - return this.GetSelfDescription()?.ElementName; - } - } - - public class Operation : SubmodelElement, IEnumerateChildren - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - [JsonIgnore] - [XmlElement(ElementName = "inputVariable")] - [SkipForHash] // do NOT count children! - public List inputVariable = new List(); - - [JsonIgnore] - [XmlElement(ElementName = "outputVariable")] - [SkipForHash] // do NOT count children! - public List outputVariable = new List(); - - [JsonIgnore] - [XmlElement(ElementName = "inoutputVariable")] - [SkipForHash] // do NOT count children! - public List inoutputVariable = new List(); - - [XmlIgnore] - // MICHA 190504: enabled JSON operation variables! - [JsonProperty(PropertyName = "inputVariable")] - public OperationVariable[] JsonInputVariable - { - get { return inputVariable?.ToArray(); } - set { inputVariable = (value != null) ? new List(value) : null; } - } - - [XmlIgnore] - [JsonProperty(PropertyName = "outputVariable")] - // MICHA 190504: enabled JSON operation variables! - public OperationVariable[] JsonOutputVariable - { - get { return outputVariable?.ToArray(); } - set { outputVariable = (value != null) ? new List(value) : null; } - } - - [XmlIgnore] - [JsonProperty(PropertyName = "inoutputVariable")] - // MICHA 190504: enabled JSON operation variables! - public OperationVariable[] JsonInOutputVariable - { - get { return inoutputVariable?.ToArray(); } - set { inoutputVariable = (value != null) ? new List(value) : null; } - } - - public List this[OperationVariable.Direction dir] - { - get - { - if (dir == OperationVariable.Direction.In) - return inputVariable; - else - if (dir == OperationVariable.Direction.Out) - return outputVariable; - else - return inoutputVariable; - } - set - { - if (dir == OperationVariable.Direction.In) - inputVariable = value; - else - if (dir == OperationVariable.Direction.Out) - outputVariable = value; - else - inoutputVariable = value; - } - } - - public List this[int dir] - { - get - { - if (dir == 0) - return inputVariable; - else - if (dir == 1) - return outputVariable; - else - return inoutputVariable; - } - set - { - if (dir == 0) - inputVariable = value; - else - if (dir == 1) - outputVariable = value; - else - inoutputVariable = value; - } - } - - public static SubmodelElementWrapperCollection GetWrappers(List ovl) - { - var res = new SubmodelElementWrapperCollection(); - foreach (var ov in ovl) - if (ov.value != null) - res.Add(ov.value); - return res; - } - - // enumartes its children - public IEnumerable EnumerateChildren() - { - if (this.inputVariable != null) - foreach (var smw in this.inputVariable) - yield return smw?.value; - - if (this.outputVariable != null) - foreach (var smw in this.outputVariable) - yield return smw?.value; - - if (this.inoutputVariable != null) - foreach (var smw in this.inoutputVariable) - yield return smw?.value; - } - - public class EnumerationPlacmentOperationVariable : EnumerationPlacmentBase - { - public OperationVariable.Direction Direction; - public OperationVariable OperationVariable; - } - - public EnumerationPlacmentBase GetChildrenPlacement(SubmodelElement child) - { - // trivial - if (child == null) - return null; - - // search - OperationVariable.Direction? dir = null; - OperationVariable opvar = null; - if (this.inputVariable != null) - foreach (var ov in this.inputVariable) - if (ov?.value?.submodelElement == child) - { - dir = OperationVariable.Direction.In; - opvar = ov; - } - - if (this.outputVariable != null) - foreach (var ov in this.outputVariable) - if (ov?.value?.submodelElement == child) - { - dir = OperationVariable.Direction.Out; - opvar = ov; - } - - if (this.inoutputVariable != null) - foreach (var ov in this.inoutputVariable) - if (ov?.value?.submodelElement == child) - { - dir = OperationVariable.Direction.InOut; - opvar = ov; - } - - // found - if (!dir.HasValue) - return null; - return new EnumerationPlacmentOperationVariable() - { - Direction = dir.Value, - OperationVariable = opvar - }; - } - - public object AddChild(SubmodelElementWrapper smw, EnumerationPlacmentBase placement = null) - { - // not enough information to select list of children? - var pl = placement as EnumerationPlacmentOperationVariable; - if (smw == null || pl == null) - return null; - - // ok, use information - var ov = new OperationVariable(); - ov.value = smw; - - if (smw.submodelElement != null) - smw.submodelElement.parent = this; - - if (pl.Direction == OperationVariable.Direction.In) - { - if (inputVariable == null) - inputVariable = new List(); - inputVariable.Add(ov); - } - - if (pl.Direction == OperationVariable.Direction.Out) - { - if (outputVariable == null) - outputVariable = new List(); - outputVariable.Add(ov); - } - - if (pl.Direction == OperationVariable.Direction.InOut) - { - if (inoutputVariable == null) - inoutputVariable = new List(); - inoutputVariable.Add(ov); - } - - return ov; - } - - // constructors - - public Operation() { } - - public Operation(SubmodelElement src) - : base(src) - { - if (!(src is Operation op)) - return; - - for (int i = 0; i < 2; i++) - if (op[i] != null) - { - if (this[i] == null) - this[i] = new List(); - foreach (var ov in op[i]) - this[i].Add(new OperationVariable(ov)); - } - } - -#if !DoNotUseAasxCompatibilityModels - public Operation(AasxCompatibilityModels.AdminShellV10.Operation src) - : base(src) - { - for (int i = 0; i < 2; i++) - if (src[i] != null) - { - if (this[i] == null) - this[i] = new List(); - foreach (var ov in src[i]) - this[i].Add(new OperationVariable(ov)); - } - } -#endif - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("Operation", "Opr", - SubmodelElementWrapper.AdequateElementEnum.Operation); - } - } - - public class Entity : SubmodelElement, IManageSubmodelElements, IEnumerateChildren - { - public enum EntityTypeEnum { CoManagedEntity = 0, SelfManagedEntity = 1, Undef = 3 } - public static string[] EntityTypeNames = new string[] { "CoManagedEntity", "SelfManagedEntity" }; - - // for JSON only - - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // from this very class - [XmlIgnore] - [JsonIgnore] - [SkipForHash] // do NOT count children! - private SubmodelElementWrapperCollection _statements = null; - - [JsonIgnore] - public SubmodelElementWrapperCollection statements - { - get { return _statements; } - set { _statements = value; _statements.Parent = this; } - } - - [XmlIgnore] - [JsonProperty(PropertyName = "statements")] - public SubmodelElement[] JsonStatements - { - get - { - var res = new ListOfSubmodelElement(); - if (statements != null) - foreach (var smew in statements) - res.Add(smew.submodelElement); - return res.ToArray(); - } - set - { - if (value != null) - { - this.statements = new SubmodelElementWrapperCollection(); - foreach (var x in value) - { - var smew = new SubmodelElementWrapper() { submodelElement = x }; - this.statements.Add(smew); - } - } - } - } - - // further members - - [CountForHash] - public string entityType = ""; - - [JsonProperty(PropertyName = "asset")] - public AssetRef assetRef = null; - - // enumerates its children - - public IEnumerable EnumerateChildren() - { - if (this.statements != null) - foreach (var smw in this.statements) - yield return smw; - } - - public EnumerationPlacmentBase GetChildrenPlacement(SubmodelElement child) - { - return null; - } - - public object AddChild(SubmodelElementWrapper smw, EnumerationPlacmentBase placement = null) - { - if (smw == null) - return null; - if (this.statements == null) - this.statements = new SubmodelElementWrapperCollection(); - if (smw.submodelElement != null) - smw.submodelElement.parent = this; - this.statements.Add(smw); - return smw; - } - - // constructors - - public Entity() { } - - public Entity(SubmodelElement src) - : base(src) - { - if (!(src is Entity ent)) - return; - - if (ent.statements != null) - { - this.statements = new SubmodelElementWrapperCollection(); - foreach (var smw in ent.statements) - this.statements.Add(new SubmodelElementWrapper(smw.submodelElement)); - } - this.entityType = ent.entityType; - if (ent.assetRef != null) - this.assetRef = new AssetRef(ent.assetRef); - } - - public Entity(EntityTypeEnum entityType, string idShort = null, AssetRef assetRef = null, - string category = null, Key semanticIdKey = null) - { - CreateNewLogic(idShort, null, semanticIdKey); - - this.entityType = EntityTypeNames[(int)entityType]; - this.assetRef = assetRef; - } - -#if !DoNotUseAasxCompatibilityModels - // not available in V1.0 -#endif - - public static Entity CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new Entity(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - // from IManageSubmodelElements - public void Add(SubmodelElement sme) - { - if (statements == null) - statements = new SubmodelElementWrapperCollection(); - var sew = new SubmodelElementWrapper(); - sme.parent = this; // track parent here! - sew.submodelElement = sme; - statements.Add(sew); - } - - public void Insert(int index, SubmodelElement sme) - { - if (statements == null) - statements = new SubmodelElementWrapperCollection(); - var sew = new SubmodelElementWrapper(); - sme.parent = this; // track parent here! - sew.submodelElement = sme; - if (index < 0 || index >= statements.Count) - return; - statements.Insert(index, sew); - } - - public void Remove(SubmodelElement sme) - { - if (statements != null) - statements.Remove(sme); - } - - // management of elememts - - public SubmodelElementWrapper FindSubmodelElementWrapper(string idShort) - { - if (this.statements == null) - return null; - foreach (var smw in this.statements) - if (smw.submodelElement != null) - if (smw.submodelElement.idShort.Trim().ToLower() == idShort.Trim().ToLower()) - return smw; - return null; - } - - public T CreateSMEForCD(ConceptDescription cd, string category = null, string idShort = null, - string idxTemplate = null, int maxNum = 999, bool addSme = false) where T : SubmodelElement, new() - { - if (this.statements == null) - this.statements = new SubmodelElementWrapperCollection(); - return this.statements.CreateSMEForCD(cd, category, idShort, idxTemplate, maxNum, addSme); - } - - public T CreateSMEForIdShort(string idShort, string category = null, - string idxTemplate = null, int maxNum = 999, bool addSme = false) where T : SubmodelElement, new() - { - if (this.statements == null) - this.statements = new SubmodelElementWrapperCollection(); - return this.statements.CreateSMEForIdShort(idShort, category, idxTemplate, maxNum, addSme); - } - - // entity type - - public EntityTypeEnum GetEntityType() - { - EntityTypeEnum res = EntityTypeEnum.Undef; - if (this.entityType != null && this.entityType.Trim().ToLower() == EntityTypeNames[0].ToLower()) - res = EntityTypeEnum.CoManagedEntity; - if (this.entityType != null && this.entityType.Trim().ToLower() == EntityTypeNames[1].ToLower()) - res = EntityTypeEnum.SelfManagedEntity; - return res; - } - - // name - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("Entity", "Ent", - SubmodelElementWrapper.AdequateElementEnum.Entity); - } - } - - public class BasicEvent : SubmodelElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // from this very class - public Reference observed = new Reference(); - - // constructors - - public BasicEvent() { } - - public BasicEvent(SubmodelElement src) - : base(src) - { - if (!(src is BasicEvent be)) - return; - - if (be.observed != null) - this.observed = new Reference(be.observed); - } - -#if !DoNotUseAasxCompatibilityModels - // not available in V1.0 -#endif - - public static BasicEvent CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new BasicEvent(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("BasicEvent", "Evt", - SubmodelElementWrapper.AdequateElementEnum.BasicEvent); - } - } - - // - // Handling of packages - // - } - - #endregion -} - diff --git a/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellConverters.cs b/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellConverters.cs deleted file mode 100644 index ce541f0c0..000000000 --- a/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellConverters.cs +++ /dev/null @@ -1,170 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Reflection; -using AasxCompatibilityModels; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using Newtonsoft.Json.Serialization; - -//namespace AdminShellNS -namespace AdminShell_V20 -{ - public static class AdminShellConverters - { - /// - /// This converter is used for reading JSON files; it claims to be responsible for - /// "Referable" (the base class) - /// and decides, which sub-class of the base class shall be populated. - /// If the object is SubmodelElement, the decision, shich special sub-class to create is done in a factory - /// AdminShell.SubmodelElementWrapper.CreateAdequateType(), - /// in order to have all sub-class specific decisions in one place (SubmodelElementWrapper) - /// Remark: There is a NuGet package JsonSubTypes, which could have done the job, except the fact of having - /// "modelType" being a class property with a contained property "name". - /// - public class JsonAasxConverter : JsonConverter - { - private string UpperClassProperty = "modelType"; - private string LowerClassProperty = "name"; - - public JsonAasxConverter() : base() - { - } - - public JsonAasxConverter(string UpperClassProperty, string LowerClassProperty) : base() - { - this.UpperClassProperty = UpperClassProperty; - this.LowerClassProperty = LowerClassProperty; - } - - public override bool CanConvert(Type objectType) - { - // Info MIHO 21 APR 2020: changed this from SubmodelElement to Referable - if (typeof(AdminShell.Referable).IsAssignableFrom(objectType)) - return true; - return false; - } - - public override bool CanWrite - { - get { return false; } - } - - public override object ReadJson(JsonReader reader, - Type objectType, - object existingValue, - JsonSerializer serializer) - { - // Load JObject from stream - JObject jObject = JObject.Load(reader); - - // Create target object based on JObject - object target = new AdminShell.Referable(); - - if (jObject.ContainsKey(UpperClassProperty)) - { - var j2 = jObject[UpperClassProperty]; - if (j2 != null) - foreach (var c in j2.Children()) - { - var cprop = c as Newtonsoft.Json.Linq.JProperty; - if (cprop == null) - continue; - if (cprop.Name == LowerClassProperty && cprop.Value.Type.ToString() == "String") - { - var cpval = cprop.Value.ToObject(); - if (cpval == null) - continue; - // Info MIHO 21 APR 2020: use Referable.CreateAdequateType instead of SMW... - var o = AdminShell.Referable.CreateAdequateType(cpval); - if (o != null) - target = o; - } - } - } - - // Populate the object properties - serializer.Populate(jObject.CreateReader(), target); - - return target; - } - - /// - /// Introduced for JSON serialization, can create Referables based on a string name - /// - /// string name (standard PascalCased) - - - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) - { - throw new NotImplementedException(); - } - } - - /// - /// This converter / contract resolver for Json.NET adaptively filters different levels of depth - /// of nested AASX structures. - /// - public class AdaptiveFilterContractResolver : DefaultContractResolver - { - public bool AasHasViews = true; - public bool BlobHasValue = true; - public bool SubmodelHasElements = true; - public bool SmcHasValue = true; - public bool OpHasVariables = true; - - public AdaptiveFilterContractResolver() { } - - public AdaptiveFilterContractResolver(bool deep = true, bool complete = true) - { - if (!deep) - { - this.SubmodelHasElements = false; - this.SmcHasValue = false; - this.OpHasVariables = false; - } - if (!complete) - { - this.AasHasViews = false; - this.BlobHasValue = false; - } - - } - - protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) - { - JsonProperty property = base.CreateProperty(member, memberSerialization); - - if (!BlobHasValue && property.DeclaringType == typeof(AdminShell.Blob) && - property.PropertyName == "value") - property.ShouldSerialize = instance => { return false; }; - - if (!SubmodelHasElements && property.DeclaringType == typeof(AdminShell.Submodel) && - property.PropertyName == "submodelElements") - property.ShouldSerialize = instance => { return false; }; - - if (!SmcHasValue && property.DeclaringType == typeof(AdminShell.SubmodelElementCollection) && - property.PropertyName == "value") - property.ShouldSerialize = instance => { return false; }; - - if (!OpHasVariables && property.DeclaringType == typeof(AdminShell.Operation) && - (property.PropertyName == "in" || property.PropertyName == "out")) - property.ShouldSerialize = instance => { return false; }; - - if (!AasHasViews && property.DeclaringType == typeof(AdminShell.AdministrationShell) && - property.PropertyName == "views") - property.ShouldSerialize = instance => { return false; }; - - return property; - } - } - - } -} diff --git a/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellUtil.cs b/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellUtil.cs deleted file mode 100644 index 1452421de..000000000 --- a/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellUtil.cs +++ /dev/null @@ -1,633 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using AasxCompatibilityModels; -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Text.RegularExpressions; - -//namespace AdminShellNS -namespace AdminShell_V20 -{ - public static class AdminShellUtilV20 - { - public static string EvalToNonNullString(string fmt, object o, string elseString = "") - { - if (o == null) - return elseString; - return string.Format(fmt, o); - } - - public static string EvalToNonEmptyString(string fmt, string o, string elseString = "") - { - if (o == null || o == "") - return elseString; - return string.Format(fmt, o); - } - - /// Creates a filter-friendly name from the source. - /// - /// Assert.AreEqual("", AdminShellUtil.FilterFriendlyName("")); - /// Assert.AreEqual("someName", AdminShellUtil.FilterFriendlyName("someName")); - /// Assert.AreEqual("some__name", AdminShellUtil.FilterFriendlyName("some!;name")); - /// - public static string FilterFriendlyName(string src) - { - if (src == null) - return null; - return Regex.Replace(src, @"[^a-zA-Z0-9\-_]", "_"); - } - - /// - /// Assert.IsFalse(AdminShellUtil.HasWhitespace("")); - /// Assert.IsTrue(AdminShellUtil.HasWhitespace(" ")); - /// Assert.IsTrue(AdminShellUtil.HasWhitespace("aa bb")); - /// Assert.IsTrue(AdminShellUtil.HasWhitespace(" aabb")); - /// Assert.IsTrue(AdminShellUtil.HasWhitespace("aabb ")); - /// Assert.IsFalse(AdminShellUtil.HasWhitespace("aabb")); - /// - public static bool HasWhitespace(string src) - { - if (src == null) - throw new ArgumentNullException(nameof(src)); - foreach (var s in src) - if (char.IsWhiteSpace(s)) - return true; - return false; - } - - /// Assert.IsTrue(AdminShellUtil.ComplyIdShort("")); - public static bool ComplyIdShort(string src) - { - if (src == null) - throw new ArgumentNullException(nameof(src)); - var res = true; - foreach (var s in src) - if (!Char.IsLetterOrDigit(s) && s != '_') - res = false; - if (src.Length > 0 && !Char.IsLetter(src[0])) - res = false; - return res; - } - - public static string ByteSizeHumanReadable(long len) - { - // see: https://stackoverflow.com/questions/281640/ - // how-do-i-get-a-human-readable-file-size-in-bytes-abbreviation-using-net - string[] sizes = { "B", "KB", "MB", "GB", "TB" }; - int order = 0; - while (len >= 1024 && order < sizes.Length - 1) - { - order++; - len = len / 1024; - } - // Adjust the format string to your preferences. For example "{0:0.#}{1}" would - // show a single decimal place, and no space. - string res = String.Format("{0:0.##} {1}", len, sizes[order]); - return res; - } - - public static string ExtractPascalCasingLetters(string src) - { - // access - src = src?.Trim(); - if (src == null || src.Length < 1) - return null; - - // walk through - var res = ""; - var arm = true; - foreach (var c in src) - { - // take? - if (arm && Char.IsUpper(c)) - res += c; - // state for next iteration - arm = !Char.IsUpper(c); - } - - // result - return res; - } - - public static int CountHeadingSpaces(string line) - { - if (line == null) - return 0; - int j; - for (j = 0; j < line.Length; j++) - if (!Char.IsWhiteSpace(line[j])) - break; - return j; - } - - /// - /// Used to re-reformat a C# here string, which is multiline string introduced by @" ... "; - /// - public static string[] CleanHereStringToArray(string here) - { - if (here == null) - return null; - - // convert all weird breaks to pure new lines - here = here.Replace("\r\n", "\n"); - here = here.Replace("\n\r", "\n"); - - // convert all tabs to spaces - here = here.Replace("\t", " "); - - // split these - var lines = new List(here.Split('\n')); - if (lines.Count < 1) - return lines.ToArray(); - - // the first line could be special - string firstLine = null; - if (lines[0].Trim() != "") - { - firstLine = lines[0].Trim(); - lines.RemoveAt(0); - } - - // detect an constant amount of heading spaces - var headSpaces = int.MaxValue; - foreach (var line in lines) - if (line.Trim() != "") - headSpaces = Math.Min(headSpaces, CountHeadingSpaces(line)); - - // multi line trim possible? - if (headSpaces != int.MaxValue && headSpaces > 0) - for (int i = 0; i < lines.Count; i++) - if (lines[i].Length > headSpaces) - lines[i] = lines[i].Substring(headSpaces); - - // re-compose again - if (firstLine != null) - lines.Insert(0, firstLine); - - // return - return lines.ToArray(); - } - - /// - /// Used to re-reformat a C# here string, which is multiline string introduced by @" ... "; - /// - public static string CleanHereStringWithNewlines(string here, string nl = null) - { - if (nl == null) - nl = System.Environment.NewLine; - var lines = CleanHereStringToArray(here); - if (lines == null) - return null; - return String.Join(nl, lines); - } - - public static string ShortLocation(Exception ex) - { - if (ex == null || ex.StackTrace == null) - return ""; - string[] lines = ex.StackTrace.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None); - if (lines.Length < 1) - return ""; - // search for " in " - // as the most actual stacktrace might be a built-in function, this might not work and therefore - // go down in the stack - int currLine = 0; - while (true) - { - // nothing found at all - if (currLine >= lines.Length) - return ""; - // access current line - /* TODO (MIHO, 2020-11-12): replace with Regex for multi language. Ideally have Exception messages - always as English. */ - var p = lines[currLine].IndexOf(" in ", StringComparison.Ordinal); - if (p < 0) - p = lines[currLine].IndexOf(" bei ", StringComparison.Ordinal); - if (p < 0) - { - // advance to next oldest line - currLine++; - continue; - } - // search last "\" or "/", to get only filename portion and position - p = lines[currLine].LastIndexOfAny(new[] { '\\', '/' }); - if (p < 0) - { - // advance to next oldest line - currLine++; - continue; - } - // return this - return lines[currLine].Substring(p); - } - } - - public enum ConstantFoundEnum { No, AnyCase, ExactCase } - - public static ConstantFoundEnum CheckIfInConstantStringArray(string[] arr, string str) - { - if (arr == null || str == null) - return ConstantFoundEnum.No; - - bool anyCaseFound = false; - bool exactCaseFound = false; - foreach (var a in arr) - { - anyCaseFound = anyCaseFound || str.ToLower() == a.ToLower(); - exactCaseFound = exactCaseFound || str == a; - } - if (exactCaseFound) - return ConstantFoundEnum.ExactCase; - if (anyCaseFound) - return ConstantFoundEnum.AnyCase; - return ConstantFoundEnum.No; - } - - public static string CorrectCasingForConstantStringArray(string[] arr, string str) - { - if (arr == null || str == null) - return str; - - foreach (var a in arr) - if (str.ToLower() == a.ToLower()) - return a; - - return str; - } - - // - // - // - // - // - - public static void PrintSearchableProperties(object obj, int indent) - { - if (obj == null) return; - string indentString = new string(' ', indent); - Type objType = obj.GetType(); - PropertyInfo[] properties = objType.GetProperties(); - foreach (PropertyInfo property in properties) - { - object propValue = property.GetValue(obj, null); - var elems = propValue as IList; - if (elems != null) - { - foreach (var item in elems) - { - PrintSearchableProperties(item, indent + 3); - } - } - else - { - // This will not cut-off System.Collections because of the first check - if (property.PropertyType.Assembly == objType.Assembly) - { - Console.WriteLine("{0}{1}:", indentString, property.Name); - - PrintSearchableProperties(propValue, indent + 2); - } - else - { - Console.WriteLine("{0}{1}: {2}", indentString, property.Name, propValue); - } - } - } - } - - public class SearchOptions - { - public Assembly[] allowedAssemblies = null; - public int maxDepth = int.MaxValue; - public bool findFirst = false; - public int skipFirstResults = 0; - public string findText = null; - public bool isIgnoreCase = false; - public bool isRegex = false; - } - - public class SearchResultItem : IEquatable - { - public SearchOptions searchOptions; - public string qualifiedNameHead; - public string metaModelName; - public object businessObject; - public string foundText; - public object foundObject; - public object containingObject; - public int foundHash; - - public bool Equals(SearchResultItem other) - { - if (other == null) - return false; - - return this.qualifiedNameHead == other.qualifiedNameHead && - this.metaModelName == other.metaModelName && - this.businessObject == other.businessObject && - this.containingObject == other.containingObject && - this.foundText == other.foundText && - this.foundHash == other.foundHash; - } - } - - public class SearchResults - { - public int foundIndex = 0; - public List foundResults = new List(); - - public void Clear() - { - foundIndex = -1; - foundResults.Clear(); - } - } - - public static void CheckSearchable( - SearchResults results, SearchOptions options, string qualifiedNameHead, object businessObject, - MemberInfo mi, object memberValue, object containingObject, Func getMemberHash) - { - // try get a speaking name - var metaModelName = ""; - var x1 = mi.GetCustomAttribute(); - if (x1 != null && x1.name != null) - metaModelName = x1.name; - - // check if this object is searchable - var x2 = mi.GetCustomAttribute(); - if (x2 != null) - { - // what to check? - string foundText = "" + memberValue?.ToString(); - - // find options - var found = true; - if (options.findText != null) - found = foundText.IndexOf( - options.findText, options.isIgnoreCase ? StringComparison.CurrentCultureIgnoreCase : 0) >= 0; - - // add? - if (found) - { - var sri = new SearchResultItem(); - sri.searchOptions = options; - sri.qualifiedNameHead = qualifiedNameHead; - sri.metaModelName = metaModelName; - sri.businessObject = businessObject; - sri.foundText = foundText; - sri.foundObject = memberValue; - sri.containingObject = containingObject; - if (getMemberHash != null) - sri.foundHash = getMemberHash(); - - // avoid duplicates - if (!results.foundResults.Contains(sri)) - results.foundResults.Add(sri); - } - } - } - - public static void EnumerateSearchable( - SearchResults results, object obj, string qualifiedNameHead, int depth, SearchOptions options, - object businessObject = null) - { - // access - if (results == null || obj == null || options == null) - return; - Type objType = obj.GetType(); - - // depth - if (depth > options.maxDepth) - return; - - // try to get element name of an AAS entity - string elName = null; - if (obj is AdminShell.Referable) - { - elName = (obj as AdminShell.Referable).GetElementName(); - businessObject = obj; - } - - // enrich qualified name, accordingly - var qualifiedName = qualifiedNameHead; - if (elName != null) - qualifiedName = qualifiedName + (qualifiedName.Length > 0 ? "." : "") + elName; - - // do NOT dive into objects, which are not in the reight assembly - if (options.allowedAssemblies == null || !options.allowedAssemblies.Contains(objType.Assembly)) - return; - - // do not dive into enums - if (objType.IsEnum) - return; - - // look at fields, first - var fields = objType.GetFields(); - foreach (var fi in fields) - { - // is the object marked to be skipped? - var x3 = fi.GetCustomAttribute(); - if (x3 != null) - continue; - - var x4 = fi.GetCustomAttribute(); - if (x4 != null) - continue; - - // get value(s) - var fieldValue = fi.GetValue(obj); - if (fieldValue == null) - continue; - var valueElems = fieldValue as IList; - if (valueElems != null) - { - // field is a collection .. dive deeper, if allowed - foreach (var el in valueElems) - EnumerateSearchable(results, el, qualifiedName, depth + 1, options, businessObject); - } - else - { - // field is a single entity .. check it - CheckSearchable( - results, options, qualifiedName, businessObject, fi, fieldValue, obj, - () => { return fieldValue.GetHashCode(); }); - - // dive deeper .. - EnumerateSearchable(results, fieldValue, qualifiedName, depth + 1, options, businessObject); - } - } - - // properties & objects behind - var properties = objType.GetProperties(); - foreach (var pi in properties) - { - var gip = pi.GetIndexParameters(); - if (gip.Length > 0) - // no indexed properties, yet - continue; - - // is the object marked to be skipped? - var x3 = pi.GetCustomAttribute(); - if (x3 != null) - continue; - - var x4 = pi.GetCustomAttribute(); - if (x4 != null) - continue; - - // get value(s) - var propValue = pi.GetValue(obj, null); - if (propValue == null) - continue; - var valueElems = propValue as IList; - if (valueElems != null) - { - // property is a collection .. dive deeper, if allowed - foreach (var el in valueElems) - EnumerateSearchable(results, el, qualifiedName, depth + 1, options, businessObject); - } - else - { - // field is a single entity .. check it - CheckSearchable( - results, options, qualifiedName, businessObject, pi, propValue, obj, - () => { return propValue.GetHashCode(); }); - - // dive deeper .. - EnumerateSearchable(results, propValue, qualifiedName, depth + 1, options, businessObject); - } - } - } - - // - // String manipulations - // - - public static string ReplacePercentPlaceholder( - string input, - string searchFor, - Func substLamda, - StringComparison comparisonType = StringComparison.InvariantCulture) - { - // access - if (input == null || searchFor == null || searchFor == "") - return input; - - // find - while (true) - { - // any occurence - var p = input.IndexOf(searchFor, comparisonType); - if (p < 0) - break; - - // split - var left = input.Substring(0, p); - var right = ""; - var rp = p + searchFor.Length; - if (rp < input.Length) - right = input.Substring(rp); - - // lambda - var repl = "" + substLamda?.Invoke(); - - // build new - input = left + repl + right; - } - - // ok - return input; - } - - // - // Base 64 - // - - public static string Base64Encode(string plainText) - { - var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText); - return System.Convert.ToBase64String(plainTextBytes); - } - - public static string Base64Decode(string base64EncodedData) - { - var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData); - return System.Text.Encoding.UTF8.GetString(base64EncodedBytes); - } - - // - // Generation of Ids - // - - private static Random MyRnd = new Random(); - - public static string GenerateIdAccordingTemplate(string tpl) - { - // generate a deterministic decimal digit string - var decimals = String.Format("{0:ffffyyMMddHHmmss}", DateTime.UtcNow); - decimals = new string(decimals.Reverse().ToArray()); - // convert this to an int - if (!Int64.TryParse(decimals, out Int64 decii)) - decii = MyRnd.Next(Int32.MaxValue); - // make an hex out of this - string hexamals = decii.ToString("X"); - // make an alphanumeric string out of this - string alphamals = ""; - var dii = decii; - while (dii >= 1) - { - var m = dii % 26; - alphamals += Convert.ToChar(65 + m); - dii = dii / 26; - } - - // now, "salt" the strings - for (int i = 0; i < 32; i++) - { - var c = Convert.ToChar(48 + MyRnd.Next(10)); - decimals += c; - hexamals += c; - alphamals += c; - } - - // now, can just use the template - var id = ""; - foreach (var tpli in tpl) - { - if (tpli == 'D' && decimals.Length > 0) - { - id += decimals[0]; - decimals = decimals.Remove(0, 1); - } - else - if (tpli == 'X' && hexamals.Length > 0) - { - id += hexamals[0]; - hexamals = hexamals.Remove(0, 1); - } - else - if (tpli == 'A' && alphamals.Length > 0) - { - id += alphamals[0]; - alphamals = alphamals.Remove(0, 1); - } - else - id += tpli; - } - - // ok - return id; - } - - } -} diff --git a/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellValidate.cs b/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellValidate.cs deleted file mode 100644 index 1119c235e..000000000 --- a/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellValidate.cs +++ /dev/null @@ -1,320 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using JetBrains.Annotations; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Text.RegularExpressions; -using System.Xml; -using System.Xml.Schema; - -//namespace AdminShellNS -namespace AdminShell_V20 -{ - /// - /// validates the XML content against the AASX XML schema. - /// - /// Please produce instances with . - /// - public class XmlValidator - { - private System.Xml.Schema.XmlSchemaSet xmlSchemaSet; - - internal XmlValidator(XmlSchemaSet xmlSchemaSet) - { - this.xmlSchemaSet = xmlSchemaSet; - } - - /// - /// validates the given XML content and stores the results in the . - /// - /// Validation records - /// Content to be validated - public void Validate(AasValidationRecordList recs, Stream xmlContent) - { - if (recs == null) - throw new ArgumentException($"Unexpected null {nameof(recs)}"); - - if (xmlContent == null) - throw new ArgumentException($"Unexpected null {nameof(xmlContent)}"); - - // load/ validate on same records - var settings = new System.Xml.XmlReaderSettings(); - settings.ValidationType = System.Xml.ValidationType.Schema; - settings.Schemas = xmlSchemaSet; - - settings.ValidationEventHandler += - (object sender, System.Xml.Schema.ValidationEventArgs e) => - { - recs.Add( - new AasValidationRecord( - AasValidationSeverity.Serialization, null, - $"XML: {e?.Exception?.LineNumber}, {e?.Exception?.LinePosition}: {e?.Message}")); - }; - - // use the xml stream - using (var reader = System.Xml.XmlReader.Create(xmlContent, settings)) - { - while (reader.Read()) - { - // Invoke callbacks - }; - } - } - } - - public enum AasValidationSeverity - { - Hint, Warning, SpecViolation, SchemaViolation, Serialization - } - - [UsedImplicitlyAttribute] // for eventual use - public enum AasValidationAction - { - No, ToBeDeleted - } - - public class AasValidationRecord - { - public AasValidationSeverity Severity = AasValidationSeverity.Hint; - public AasxCompatibilityModels.AdminShellV20.Referable Source = null; - public string Message = ""; - - public Action Fix = null; - - public AasValidationRecord(AasValidationSeverity Severity, AasxCompatibilityModels.AdminShellV20.Referable Source, - string Message, Action Fix = null) - { - this.Severity = Severity; - this.Source = Source; - this.Message = Message; - this.Fix = Fix; - } - - public override string ToString() - { - return $"[{Severity.ToString()}] in {"" + Source?.ToString()}: {"" + Message}"; - } - - public string DisplaySeverity { get { return "" + Severity.ToString(); } } - public string DisplaySource - { - get - { - return "" + ((Source != null) ? Source.ToString() : "(whole content)"); - } - } - public string DisplayMessage { get { return "" + Message?.ToString(); } } - } - - public class AasValidationRecordList : List - { - } - - public static class AasSchemaValidation - { - public enum SerializationFormat { XML, JSON } - - public static string[] GetSchemaResources(SerializationFormat fmt) - { - if (fmt == SerializationFormat.XML) - { - return new[] - { - "AdminShellNS.Resources.schemaV201.AAS.xsd", - "AdminShellNS.Resources.schemaV201.AAS_ABAC.xsd", - "AdminShellNS.Resources.schemaV201.IEC61360.xsd" - }; - } - if (fmt == SerializationFormat.JSON) - { - return new[] - { - "AdminShellNS.Resources.schemaV201.aas.json" - }; - } - return null; - } - - /// - /// produces a validator which validates XML AASX files. - /// - /// initialized validator - public static XmlValidator NewXmlValidator() - { - // Load the schema files - var files = GetSchemaResources(SerializationFormat.XML); - if (files == null) - throw new InvalidOperationException("No XML schema files could be found in the resources."); - - var xmlSchemaSet = new System.Xml.Schema.XmlSchemaSet(); - xmlSchemaSet.XmlResolver = new System.Xml.XmlUrlResolver(); - - try - { - Assembly myAssembly = Assembly.GetExecutingAssembly(); - foreach (var schemaFn in files) - { - using (Stream schemaStream = myAssembly.GetManifestResourceStream(schemaFn)) - { - using (XmlReader schemaReader = XmlReader.Create(schemaStream)) - { - xmlSchemaSet.Add(null, schemaReader); - } - } - } - } - catch (Exception ex) - { - throw new FileNotFoundException( - $"Error accessing embedded resource schema files: {ex.Message}"); - } - - var newRecs = new AasValidationRecordList(); - - // set up messages - xmlSchemaSet.ValidationEventHandler += (object sender, System.Xml.Schema.ValidationEventArgs e) => - { - newRecs.Add( - new AasValidationRecord( - AasValidationSeverity.Serialization, null, - $"{e?.Exception?.LineNumber}, {e?.Exception?.LinePosition}: {e?.Message}")); - }; - - // compile - try - { - xmlSchemaSet.Compile(); - } - catch (Exception ex) - { - throw new InvalidOperationException( - $"Error compiling schema files: {ex.Message}"); - } - - if (newRecs.Count > 0) - { - var parts = new List { $"Failed to compile the schema files:" }; - parts.AddRange(newRecs.Select((r) => r.Message)); - throw new InvalidOperationException(string.Join(System.Environment.NewLine, parts)); - } - - return new XmlValidator(xmlSchemaSet); - } - - /// - /// creates an XML validator and applies it on the given content. - /// - /// If you repeatedly need to validate XML against a schema, re-use an instance of - /// produced with . - /// - /// Validation records - /// Content to be validated - public static void ValidateXML(AasValidationRecordList recs, Stream xmlContent) - { - var validator = NewXmlValidator(); - validator.Validate(recs, xmlContent); - } - - public static int ValidateJSONAlternative(AasValidationRecordList recs, Stream jsonContent) - { - // see: https://github.com/RicoSuter/NJsonSchema/wiki/JsonSchemaValidator - var newRecs = new AasValidationRecordList(); - - // access - if (recs == null || jsonContent == null) - return -1; - - // Load the schema files - // right now: exactly ONE schema file - var files = GetSchemaResources(SerializationFormat.JSON); - if (files == null || files.Length != 1) - return -1; - - NJsonSchema.JsonSchema schema = null; - - try - { - Assembly myAssembly = Assembly.GetExecutingAssembly(); - foreach (var schemaFn in files) - { - using (Stream schemaStream = myAssembly.GetManifestResourceStream(schemaFn)) - { - using (var streamReader = new StreamReader(schemaStream)) - { - var allTxt = streamReader.ReadToEnd(); - schema = NJsonSchema.JsonSchema.FromJsonAsync(allTxt).GetAwaiter().GetResult(); - break; - } - } - } - } - catch (Exception ex) - { - throw new FileNotFoundException("ValidateJSON: Error loading schema: " + - ex.Message); - } - - if (schema == null) - { - throw new FileNotFoundException("ValidateJSON: Schema not found properly."); - } - - // create validator - var validator = new NJsonSchema.Validation.JsonSchemaValidator(); - - // load the JSON content - string jsonTxt = null; - try - { - using (var streamReader = new StreamReader(jsonContent)) - { - jsonTxt = streamReader.ReadToEnd(); - } - } - catch (Exception ex) - { - throw new InvalidOperationException("ValidateJSON: Error loading JSON content: " + - ex.Message); - } - - if (jsonTxt == null || jsonTxt == "") - throw new InvalidOperationException("ValidateJSON: Error loading JSON content gave null."); - - // validate - ICollection errors; - try - { - errors = validator.Validate(jsonTxt, schema); - } - catch (Exception ex) - { - throw new InvalidOperationException("ValidateJSON: Error when validating: " + - ex.Message); - } - - // re-format messages - if (errors != null) - foreach (var ve in errors) - { - var msg = ("" + ve.ToString()); - msg = Regex.Replace(msg, @"\s+", " "); - newRecs.Add(new AasValidationRecord(AasValidationSeverity.Serialization, null, - $"JSON: {ve.LineNumber,5},{ve.LinePosition:3}: {msg}")); - } - - // result - recs.AddRange(newRecs); - return newRecs.Count; - } - } -} diff --git a/src/AasxCsharpLibrary/AasxCsharpLibrary.csproj b/src/AasxCsharpLibrary/AasxCsharpLibrary.csproj deleted file mode 100644 index e195fc0ba..000000000 --- a/src/AasxCsharpLibrary/AasxCsharpLibrary.csproj +++ /dev/null @@ -1,43 +0,0 @@ - - - net6.0 - Library - AdminShellNS - false - - - TRACE;UseAasxCompatibilityModels - - - - - - - PreserveNewest - - - - - Designer - PreserveNewest - - - Designer - PreserveNewest - - - Designer - PreserveNewest - - - - - - - - - - - - - diff --git a/src/AasxCsharpLibrary/AdminShellCollections.cs b/src/AasxCsharpLibrary/AdminShellCollections.cs deleted file mode 100644 index 32e6774ab..000000000 --- a/src/AasxCsharpLibrary/AdminShellCollections.cs +++ /dev/null @@ -1,92 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System.Collections.Generic; - -namespace AdminShellNS -{ - /// - /// Just add some convenience methods to Dictionary - /// Note: Not an extension class in order to not interfere with really - /// commonly used standard class. - /// - public class ConvenientDictionary : Dictionary - { - public V GetValueOrDefault(K key) - { - if (key != null && this.ContainsKey(key)) - return this[key]; - return default(V); - } - } - - public class MultiValueDictionary - { - private Dictionary> dict = new Dictionary>(); - public void Add(K key, V value) - { - if (dict.TryGetValue(key, out var list)) - list.Add(value); - else - dict.Add(key, new List { value }); - } - - public bool ContainsKey(K key) => dict.ContainsKey(key); - - public List this[K key] => dict[key]; - - public IEnumerable> Keys - { - get - { - return dict.Values; - } - } - } - - public class DoubleSidedDict - { - private Dictionary _forward = new Dictionary(); - private Dictionary _backward = new Dictionary(); - - public void AddPair(T1 item1, T2 item2) - { - _forward.Add(item1, item2); - _backward.Add(item2, item1); - } - - public bool Contains1(T1 key1) => _forward.ContainsKey(key1); - public bool Contains2(T2 key2) => _backward.ContainsKey(key2); - - public T2 Get2(T1 key1) => _forward[key1]; - public T1 Get1(T2 key2) => _backward[key2]; - - public T2 Get2OrDefault(T1 key1) - => (key1 != null && _forward.ContainsKey(key1)) ? _forward[key1] : default(T2); - public T1 Get1OrDefault(T2 key2) - => (key2 != null && _backward.ContainsKey(key2)) ? _backward[key2] : default(T1); - - public void Clear() { _forward.Clear(); _backward.Clear(); } - } - - public class IntValueDictionary : Dictionary - { - public void IncKey(K key) - { - if (!this.ContainsKey(key)) - this.Add(key, 1); - else - { - var i = this[key]; - this.Remove(key); - this.Add(key, i + 1); - } - } - } -} diff --git a/src/AasxCsharpLibrary/AdminShellConverters.cs b/src/AasxCsharpLibrary/AdminShellConverters.cs deleted file mode 100644 index f75a1588c..000000000 --- a/src/AasxCsharpLibrary/AdminShellConverters.cs +++ /dev/null @@ -1,327 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using Extensions; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using Newtonsoft.Json.Serialization; -using System; -using System.IO; -using System.Reflection; - -namespace AdminShellNS -{ - public static class AdminShellConverters - { - /// - /// This converter is used for reading JSON files; it claims to be responsible for - /// "Referable" (the base class) - /// and decides, which sub-class of the base class shall be populated. - /// If the object is SubmodelElement, the decision, shich special sub-class to create is done in a factory - /// SubmodelElementWrapper.CreateAdequateType(), - /// in order to have all sub-class specific decisions in one place (SubmodelElementWrapper) - /// Remark: There is a NuGet package JsonSubTypes, which could have done the job, except the fact of having - /// "modelType" being a class property with a contained property "name". - /// - public class JsonAasxConverter : JsonConverter - { - private string UpperClassProperty = "modelType"; - private string LowerClassProperty = "name"; - - public JsonAasxConverter() : base() - { - } - - public JsonAasxConverter(string UpperClassProperty, string LowerClassProperty) : base() - { - this.UpperClassProperty = UpperClassProperty; - this.LowerClassProperty = LowerClassProperty; - } - - public override bool CanConvert(Type objectType) - { - // Info MIHO 21 APR 2020: changed this from SubmodelElement to Referable - if (typeof(IReferable).IsAssignableFrom(objectType)) - return true; - return false; - } - - public override bool CanWrite - { - get { return false; } - } - - public override object ReadJson(JsonReader reader, - Type objectType, - object existingValue, - JsonSerializer serializer) - { - // Load JObject from stream - JObject jObject = JObject.Load(reader); - - // Create target object based on JObject - IReferable target = null; - - if (jObject.ContainsKey(UpperClassProperty)) - { - var j2 = jObject[UpperClassProperty]; - if (j2 != null) - foreach (var c in j2.Children()) - { - var cprop = c as Newtonsoft.Json.Linq.JProperty; - if (cprop == null) - continue; - if (cprop.Name == LowerClassProperty && cprop.Value.Type.ToString() == "String") - { - var cpval = cprop.Value.ToObject(); - if (cpval == null) - continue; - // Info MIHO 21 APR 2020: use Referable.CreateAdequateType instead of SMW... - var o = CreateAdequateType(cpval); - if (o != null) - target = o; - } - } - } - - // Populate the object properties - serializer.Populate(jObject.CreateReader(), target); - - return target; - } - - public static IReferable CreateAdequateType(string elementName) - { - if (elementName == KeyTypes.AssetAdministrationShell.ToString()) - return new AssetAdministrationShell("", null); - // dead-csharp off - //TODO (jtikekar, 0000-00-00): refactor default - //if (elementName == "Asset") - //TODO (jtikekar, 0000-00-00): Change - // return new AssetInformation(AssetKind.Instance); - if (elementName == KeyTypes.ConceptDescription.ToString()) - return new ConceptDescription(""); - if (elementName == KeyTypes.Submodel.ToString()) - return new Submodel(""); - //if (elementName == KeyTypes.View) - // return new View(); - // dead-csharp on - return CreateSubmodelElementIstance(elementName); - } - - private static ISubmodelElement CreateSubmodelElementIstance(string typeName) - { - //TODO (jtikekar, 0000-00-00): Need to test - Type type = Type.GetType(typeName); - if (type == null || !type.IsSubclassOf(typeof(ISubmodelElement))) - return null; - var sme = Activator.CreateInstance(type) as ISubmodelElement; - return sme; - } - - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) - { - throw new NotImplementedException(); - } - } - - /// - /// This converter / contract resolver for Json.NET adaptively filters different levels of depth - /// of nested AASX structures. - /// - public class AdaptiveFilterContractResolver : DefaultContractResolver - { - public bool AasHasViews = true; - public bool BlobHasValue = true; - public bool SubmodelHasElements = true; - public bool SmcHasValue = true; - public bool OpHasVariables = true; - - public AdaptiveFilterContractResolver() { } - - public AdaptiveFilterContractResolver(bool deep = true, bool complete = true) - { - if (!deep) - { - this.SubmodelHasElements = false; - this.SmcHasValue = false; - this.OpHasVariables = false; - } - if (!complete) - { - this.AasHasViews = false; - this.BlobHasValue = false; - } - - } - - // see: https://stackoverflow.com/questions/4963160/ - // how-to-determine-if-a-type-implements-an-interface-with-c-sharp-reflection - - protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) - { - JsonProperty property = base.CreateProperty(member, memberSerialization); - var icic = StringComparison.InvariantCultureIgnoreCase; - - if (!BlobHasValue && typeof(IBlob).IsAssignableFrom(property.DeclaringType) - && property.PropertyName.Equals("value", icic)) - property.ShouldSerialize = instance => { return false; }; - - if (!SubmodelHasElements && typeof(ISubmodel).IsAssignableFrom(property.DeclaringType) - && property.PropertyName.Equals("submodelElements", icic)) - property.ShouldSerialize = instance => { return false; }; - - if (!SmcHasValue && typeof(ISubmodelElementCollection).IsAssignableFrom(property.DeclaringType) - && property.PropertyName.Equals("value", icic)) - property.ShouldSerialize = instance => { return false; }; - - if (!OpHasVariables && typeof(IOperation).IsAssignableFrom(property.DeclaringType) - && (property.PropertyName.Equals("in", icic) - || property.PropertyName.Equals("out", icic))) - property.ShouldSerialize = instance => { return false; }; - - if (!AasHasViews && typeof(IAssetAdministrationShell).IsAssignableFrom(property.DeclaringType) - && property.PropertyName.Equals("views", icic)) - property.ShouldSerialize = instance => { return false; }; - - return property; - } - } - - public class AdaptiveAasIClassConverter : JsonConverter - { - public enum ConversionMode - { - /// - /// For (known) nodes of the AAS meta model, the converison of Newtonsoft.Json - /// is used. This is done by invoking creation of the real data type for the - /// desired interface types. - /// Assumption: fast, sloppy, fault-tolerant - /// - - Typecast, - /// - /// For (known) nodes of the AAS meta model, the sub-node content is converted - /// to string representation and subsequently converted by the AAS core deserialization. - /// Assumption: slow, precise but provide maximum compatibility. - /// - AasCore - }; - - public ConversionMode Mode = ConversionMode.Typecast; - - public bool WriteRawAasCore = false; - - /// - /// For **SERIALIZATION** and **JsonConverter attribute** a parameterless - /// constructor is needed. - /// - public AdaptiveAasIClassConverter() : base() - { - Mode = ConversionMode.AasCore; - } - - public AdaptiveAasIClassConverter(ConversionMode mode) : base() - { - Mode = mode; - } - - public override bool CanConvert(Type objectType) - { - if (typeof(IReference).IsAssignableFrom(objectType) - || typeof(IKey).IsAssignableFrom(objectType)) - return true; - return false; - } - - public override bool CanWrite - { - get { return true; } - } - - public override object ReadJson(JsonReader reader, - Type objectType, - object existingValue, - JsonSerializer serializer) - { - // check - if (reader.TokenType == JsonToken.Null) - return null; - - // spooky? - if (Mode == ConversionMode.AasCore) - { - var json = JRaw.Create(reader).ToString(); - var node = System.Text.Json.Nodes.JsonNode.Parse(json); - return ExtendIClass.IClassFrom(objectType, node); - } - - // Load JObject from stream - JObject jObject = JObject.Load(reader); - - // Create target object based on JObject - object target = null; - if (typeof(IReference).IsAssignableFrom(objectType)) - target = new Reference(ReferenceTypes.ExternalReference, null); - if (typeof(IKey).IsAssignableFrom(objectType)) - target = new Key(KeyTypes.GlobalReference, ""); - - // Populate the object properties - serializer.Populate(jObject.CreateReader(), target); - - return target; - } - - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) - { - if (value is IClass ic) - { - // serialize by AAS core - var jsonStr = Jsonization.Serialize.ToJsonObject(ic) - .ToJsonString(new System.Text.Json.JsonSerializerOptions() - { - WriteIndented = true - }); - - // how to write - if (WriteRawAasCore) - { - // directly write raw string into serializer - // drawback: no indentation - writer.WriteStartObject(); - jsonStr = jsonStr.TrimStart('{').TrimEnd('}'); - writer.WriteRaw(jsonStr); - writer.WriteEndObject(); - } - else - { - // double-digest by a text reader and rewrite token stream - // pro: indentation - // con: run time performance, chance of de-serialization issues - using (var reader = new JsonTextReader(new StringReader(jsonStr)) - { - DateParseHandling = DateParseHandling.None, - FloatParseHandling = FloatParseHandling.Decimal - }) - { - writer.WriteToken(reader); - } - } - } - else - { - // normal serialization - var jo = JObject.FromObject(value); - jo.WriteTo(writer); - } - } - } - - } -} diff --git a/src/AasxCsharpLibrary/AdminShellPackageEnv.cs b/src/AasxCsharpLibrary/AdminShellPackageEnv.cs deleted file mode 100644 index 1d726e98a..000000000 --- a/src/AasxCsharpLibrary/AdminShellPackageEnv.cs +++ /dev/null @@ -1,1695 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using Extensions; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using System; -using System.Collections.Generic; -using System.IO; -using System.IO.Packaging; -using System.Linq; -using System.Net; -using System.Net.Http; -using System.Text.RegularExpressions; -using System.Threading.Tasks; -using System.Xml; -using System.Xml.Serialization; - -namespace AdminShellNS -{ - /// - /// This class lets an outer functionality keep track on the supplementary files, which are in or - /// are pending to be added or deleted to an Package. - /// - public class AdminShellPackageSupplementaryFile /*: IReferable*/ - { - public delegate byte[] SourceGetByteChunk(); - - public enum LocationType { InPackage, AddPending, DeletePending } - - public enum SpecialHandlingType { None, EmbedAsThumbnail } - - public readonly Uri Uri = null; - - public readonly string UseMimeType = null; - - public readonly string SourceLocalPath = null; - public readonly SourceGetByteChunk SourceGetBytesDel = null; - - public LocationType Location; - public readonly SpecialHandlingType SpecialHandling; - - public AdminShellPackageSupplementaryFile( - Uri uri, string sourceLocalPath = null, LocationType location = LocationType.InPackage, - SpecialHandlingType specialHandling = SpecialHandlingType.None, - SourceGetByteChunk sourceGetBytesDel = null, string useMimeType = null) - { - Uri = uri; - UseMimeType = useMimeType; - SourceLocalPath = sourceLocalPath; - SourceGetBytesDel = sourceGetBytesDel; - Location = location; - SpecialHandling = specialHandling; - } - - // class derives from Referable in order to provide GetElementName - public string GetElementName() - { - return "File"; - } - - } - - public class ListOfAasSupplementaryFile : List - { - public AdminShellPackageSupplementaryFile FindByUri(string path) - { - if (path == null) - return null; - - return this.FirstOrDefault( - x => x?.Uri?.ToString().Trim() == path.Trim()); - } - } - - /// - /// Provides (static?) helpers for serializing AAS.. - /// - public static class AdminShellSerializationHelper - { - - public static string TryReadXmlFirstElementNamespaceURI(Stream s) - { - string res = null; - try - { - var xr = System.Xml.XmlReader.Create(s); - int i = 0; - while (xr.Read()) - { - // limit amount of read - i++; - if (i > 99) - // obviously not found - break; - - // find element - if (xr.NodeType == System.Xml.XmlNodeType.Element) - { - res = xr.NamespaceURI; - break; - } - } - xr.Close(); - } - catch (Exception ex) - { - LogInternally.That.SilentlyIgnoredError(ex); - } - - // return to zero pos - s.Seek(0, SeekOrigin.Begin); - - // give back - return res; - } - - /// - /// Skips first few tokens of an XML content until first "real" element is encountered - /// - /// - public static void XmlSkipHeader(XmlReader xmlReader) - { - while (xmlReader.NodeType == XmlNodeType.XmlDeclaration || - xmlReader.NodeType == XmlNodeType.Whitespace || - xmlReader.NodeType == XmlNodeType.Comment || - xmlReader.NodeType == XmlNodeType.None) - xmlReader.Read(); - } - - /// - /// De-serialize an open stream into Environment. Does version/ compatibility management. - /// - /// Open for read stream - /// - public static AasCore.Aas3_0.Environment DeserializeXmlFromStreamWithCompat(Stream s) - { - // not sure - AasCore.Aas3_0.Environment res = null; - - // try get first element - var nsuri = TryReadXmlFirstElementNamespaceURI(s); - - // read V1.0? - if (nsuri != null && nsuri.Trim() == "http://www.admin-shell.io/aas/1/0") - { -#if !DoNotUseAasxCompatibilityModels - XmlSerializer serializer = new XmlSerializer( - typeof(AasxCompatibilityModels.AdminShellV10.AdministrationShellEnv), - "http://www.admin-shell.io/aas/1/0"); - var v10 = serializer.Deserialize(s) as AasxCompatibilityModels.AdminShellV10.AdministrationShellEnv; - res = new AasCore.Aas3_0.Environment(new List(), new List(), new List()); - res.ConvertFromV10(v10); - return res; -#else - throw (new Exception("Cannot handle AAS file format http://www.admin-shell.io/aas/1/0 !")); -#endif - } - - // read V2.0? - if (nsuri != null && nsuri.Trim() == "http://www.admin-shell.io/aas/2/0") - { -#if !DoNotUseAasxCompatibilityModels - XmlSerializer serializer = new XmlSerializer( - typeof(AasxCompatibilityModels.AdminShellV20.AdministrationShellEnv), - "http://www.admin-shell.io/aas/2/0"); - var v20 = serializer.Deserialize(s) as AasxCompatibilityModels.AdminShellV20.AdministrationShellEnv; - res = new AasCore.Aas3_0.Environment(new List(), new List(), new List()); - res.ConvertFromV20(v20); - return res; -#else - throw (new Exception("Cannot handle AAS file format http://www.admin-shell.io/aas/1/0 !")); -#endif - } - - // read V3.0? - if (nsuri != null && nsuri.Trim() == Xmlization.NS) - { - // dead-csharp off - //XmlSerializer serializer = new XmlSerializer( - // typeof(AasCore.Aas3_0_RC02.Environment), "http://www.admin-shell.io/aas/3/0"); - //res = serializer.Deserialize(s) as AasCore.Aas3_0_RC02.Environment; - // dead-csharp on - using (var xmlReader = XmlReader.Create(s)) - { - // TODO (MIHO, 2022-12-26): check if could be feature of AAS core - XmlSkipHeader(xmlReader); - res = Xmlization.Deserialize.EnvironmentFrom(xmlReader); - return res; - } - } - - // nope! - return null; - } - // dead-csharp off - //public static JsonSerializer BuildDefaultAasxJsonSerializer() - //{ - // var serializer = new JsonSerializer(); - // serializer.Converters.Add( - // new AdminShellConverters.JsonAasxConverter( - // "modelType", "name")); - // return serializer; - //} - public static T DeserializeFromJSON(string data) where T : IReferable - { - //using (var tr = new StringReader(data)) - //{ - //var serializer = BuildDefaultAasxJsonSerializer(); - //var rf = (T)serializer.Deserialize(tr, typeof(T)); - - var node = System.Text.Json.Nodes.JsonNode.Parse(data); - var rf = Jsonization.Deserialize.IReferableFrom(node); - - return (T)rf; - //} - } - - //public static T DeserializeFromJSON(JToken obj) where T : IReferable - //{ - // if (obj == null) - // return default(T); - // var serializer = BuildDefaultAasxJsonSerializer(); - // var rf = obj.ToObject(serializer); - // return rf; - //} - - ///// - ///// Use this, if DeserializeFromJSON is too tight. - ///// - //public static T DeserializePureObjectFromJSON(string data) - //{ - // using (var tr = new StringReader(data)) - // { - // //var serializer = BuildDefaultAasxJsonSerializer(); - // //var rf = (T)serializer.Deserialize(tr, typeof(T)); - // return null; - // } - //} - // dead-csharp on - } - - /// - /// This class encapsulates an AdminShellEnvironment and supplementary files into an AASX Package. - /// Specifically has the capability to load, update and store .XML, .JSON and .AASX packages. - /// - public class AdminShellPackageEnv : IDisposable - { - private string _fn = "New Package"; - - private string _tempFn = null; - - private AasCore.Aas3_0.Environment _aasEnv = new AasCore.Aas3_0.Environment(new List(), new List(), new List()); - private Package _openPackage = null; - private readonly ListOfAasSupplementaryFile _pendingFilesToAdd = new ListOfAasSupplementaryFile(); - private readonly ListOfAasSupplementaryFile _pendingFilesToDelete = new ListOfAasSupplementaryFile(); - - public AdminShellPackageEnv() { } - - public AdminShellPackageEnv(AasCore.Aas3_0.Environment env) - { - if (env != null) - _aasEnv = env; - } - - public AdminShellPackageEnv(string fn, bool indirectLoadSave = false) - { - Load(fn, indirectLoadSave); - } - - public bool IsOpen - { - get - { - return _openPackage != null; - } - } - - public void SetFilename(string fileName) - { - _fn = fileName; - } - - public string Filename - { - get - { - return _fn; - } - } - - public AasCore.Aas3_0.Environment AasEnv - { - get - { - return _aasEnv; - } - } - - private static AasCore.Aas3_0.Environment LoadXml(string fn) - { - try - { - using (var reader = new StreamReader(fn)) - { - var aasEnv = AdminShellSerializationHelper.DeserializeXmlFromStreamWithCompat( - reader.BaseStream); - - if (aasEnv == null) - throw new Exception("Type error for XML file"); - - return aasEnv; - } - } - catch (Exception ex) - { - throw new Exception( - $"While reading AAS {fn} at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); - } - } - - private static AasCore.Aas3_0.Environment LoadJson(string fn) - { - try - { - using (var file = System.IO.File.OpenRead(fn)) - { - // dead-csharp off - //// TODO (Michael Hoffmeister, 2020-08-01): use a unified function to create a serializer - //var serializer = new JsonSerializer(); - //serializer.Converters.Add( - // new AdminShellConverters.JsonAasxConverter( - // "modelType", "name")); - - //var aasEnv = (AasCore.Aas3_0_RC02.Environment)serializer.Deserialize( - // file, typeof(AasCore.Aas3_0_RC02.Environment)); - // dead-csharp on - var node = System.Text.Json.Nodes.JsonNode.Parse(file); - var aasEnv = Jsonization.Deserialize.EnvironmentFrom(node); - - return aasEnv; - } - } - catch (Exception ex) - { - throw new Exception( - $"While reading AAS {fn} at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); - } - } - - /// is unequal if indirectLoadSave is used. - private static (AasCore.Aas3_0.Environment, Package) LoadPackageAasx(string fn, string fnToLoad) - { - AasCore.Aas3_0.Environment aasEnv; - Package openPackage = null; - - Package package; - try - { - package = Package.Open(fnToLoad, FileMode.Open); - } - catch (Exception ex) - { - throw new Exception( - fn == fnToLoad - ? $"While opening the package to read AASX {fn} " + - $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}" - : $"While opening the package to read AASX {fn} indirectly from {fnToLoad} " + - $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); - } - - try - { - // get the origin from the package - PackagePart originPart = null; - var xs = package.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aasx-origin"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/") - { - //originPart = package.GetPart(x.TargetUri); - var absoluteURI = PackUriHelper.ResolvePartUri(x.SourceUri, x.TargetUri); - if (package.PartExists(absoluteURI)) - { - originPart = package.GetPart(absoluteURI); - } - break; - } - - if (originPart == null) - throw (new Exception("Unable to find AASX origin. Aborting!")); - - // get the specs from the package - PackagePart specPart = null; - xs = originPart.GetRelationshipsByType("http://www.admin-shell.io/aasx/relationships/aas-spec"); - foreach (var x in xs) - { - //specPart = package.GetPart(x.TargetUri); - var absoluteURI = PackUriHelper.ResolvePartUri(x.SourceUri, x.TargetUri); - if (package.PartExists(absoluteURI)) - { - specPart = package.GetPart(absoluteURI); - } - break; - } - - if (specPart == null) - throw (new Exception("Unable to find AASX spec(s). Aborting!")); - - // open spec part to read - try - { - if (specPart.Uri.ToString().ToLower().Trim().EndsWith("json")) - { - using (var s = specPart.GetStream(FileMode.Open)) - { - // dead-csharp off - //using (var file = new StreamReader(s)) - //{ - //JsonSerializer serializer = new JsonSerializer(); - //serializer.Converters.Add( - // new AdminShellConverters.JsonAasxConverter( - // "modelType", "name")); - - //aasEnv = (AasCore.Aas3_0_RC02.Environment)serializer.Deserialize( - // file, typeof(AasCore.Aas3_0_RC02.Environment)); - - var node = System.Text.Json.Nodes.JsonNode.Parse(s); - aasEnv = Jsonization.Deserialize.EnvironmentFrom(node); - //} - // dead-csharp on - } - } - else - { - using (var s = specPart.GetStream(FileMode.Open)) - { - // own catch loop to be more specific - aasEnv = AdminShellSerializationHelper.DeserializeXmlFromStreamWithCompat(s); - openPackage = package; - - if (aasEnv == null) - throw new Exception("Type error for XML file!"); - } - } - } - catch (Exception ex) - { - throw new Exception( - fn == fnToLoad - ? $"While reading spec from the AASX {fn} " + - $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}" - : $"While reading spec from the {fn} (and indirectly over {fnToLoad}) " + - $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); - } - } - catch (Exception ex) - { - throw new Exception( - fn == fnToLoad - ? $"While reading the AASX {fn} " + - $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}" - : $"While reading the {fn} (and indirectly over {fnToLoad}) " + - $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); - } - finally - { - if (openPackage == null) - { - package.Close(); - } - } - - return (aasEnv, openPackage); - } - - public void Load(string fn, bool indirectLoadSave = false) - { - _fn = fn; - _openPackage?.Close(); - _openPackage = null; - - string extension = Path.GetExtension(fn).ToLower(); - switch (extension) - { - case ".xml": - { - _aasEnv = LoadXml(fn); - break; - } - case ".json": - { - _aasEnv = LoadJson(fn); - break; - } - case ".aasx": - { - var fnToLoad = fn; - _tempFn = null; - if (indirectLoadSave) - { - try - { - _tempFn = System.IO.Path.GetTempFileName().Replace(".tmp", ".aasx"); - System.IO.File.Copy(fn, _tempFn); - fnToLoad = _tempFn; - - } - catch (Exception ex) - { - throw new Exception( - $"While copying AASX {fn} for indirect load to {fnToLoad} " + - $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); - } - } - - // load package AASX - (_aasEnv, _openPackage) = LoadPackageAasx(fn, fnToLoad); - break; - } - default: - throw new Exception( - $"Does not know how to handle the extension {extension} of the file: {fn}"); - } - } - - public void SetTempFn(string fn) - { - try - { - _tempFn = System.IO.Path.GetTempFileName().Replace(".tmp", ".aasx"); - System.IO.File.Copy(fn, _tempFn); - - } - catch (Exception ex) - { - throw new Exception( - $"While copying AASX {fn}" + - $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); - } - } - - public void LoadFromAasEnvString(string content) - { - try - { - // dead-csharp off - //using (var file = new StringReader(content)) - //{ - // TODO (Michael Hoffmeister, 2020-08-01): use a unified function to create a serializer - //JsonSerializer serializer = new JsonSerializer(); - //serializer.Converters.Add(new AdminShellConverters.JsonAasxConverter("modelType", "name")); - //_aasEnv = (AasCore.Aas3_0_RC02.Environment)serializer.Deserialize( - // file, typeof(AasCore.Aas3_0_RC02.Environment)); - - var node = System.Text.Json.Nodes.JsonNode.Parse(content); - _aasEnv = Jsonization.Deserialize.EnvironmentFrom(node); - //} - // dead-csharp on - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While reading AASENV string {0} gave: {1}", - AdminShellUtil.ShortLocation(ex), ex.Message))); - } - } - - public enum SerializationFormat { None, Xml, Json }; - // dead-csharp off - //public static XmlSerializerNamespaces GetXmlDefaultNamespaces() - //{ - // var nss = new XmlSerializerNamespaces(); - // nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace); - // nss.Add("aas", "http://www.admin-shell.io/aas/2/0"); - // nss.Add("IEC", "http://www.admin-shell.io/IEC61360/2/0"); - // nss.Add("abac", "http://www.admin-shell.io/aas/abac/2/0"); - // return nss; - //} - // dead-csharp on - public bool SaveAs(string fn, bool writeFreshly = false, SerializationFormat prefFmt = SerializationFormat.None, - MemoryStream useMemoryStream = null, bool saveOnlyCopy = false) - { - // silently fix flaws - _aasEnv?.SilentFix30(); - - // ok, which format? - if (fn.ToLower().EndsWith(".xml")) - { - // save only XML - if (!saveOnlyCopy) - _fn = fn; - try - { - Stream s = (useMemoryStream != null) - ? (Stream)useMemoryStream - : System.IO.File.Open(fn, FileMode.Create, FileAccess.Write); - - try - { - // dead-csharp off - // TODO (Michael Hoffmeister, 2020-08-01): use a unified function to create a serializer - //var serializer = new XmlSerializer(typeof(AasCore.Aas3_0_RC02.Environment)); - //var nss = GetXmlDefaultNamespaces(); - //serializer.Serialize(s, _aasEnv, nss); - // dead-csharp on - var writer = XmlWriter.Create(s, new XmlWriterSettings() - { - Indent = true, - OmitXmlDeclaration = true - }); - Xmlization.Serialize.To( - _aasEnv, writer); - writer.Flush(); - writer.Close(); - s.Flush(); - } - finally - { - // close? - if (useMemoryStream == null) - s.Close(); - } - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While writing AAS {0} at {1} gave: {2}", - fn, AdminShellUtil.ShortLocation(ex), ex.Message))); - } - return true; - } - - if (fn.ToLower().EndsWith(".json")) - { - // save only JSON - // This functionality is an initial test. - if (!saveOnlyCopy) - _fn = fn; - try - { - Stream s = (useMemoryStream != null) ? (Stream)useMemoryStream - : System.IO.File.Open(fn, FileMode.Create, FileAccess.Write); - - try - { - // dead-csharp off - //// TODO (Michael Hoffmeister, 2020-08-01): use a unified function to create a serializer - //JsonSerializer serializer = new JsonSerializer() - //{ - // NullValueHandling = NullValueHandling.Ignore, - // ReferenceLoopHandling = ReferenceLoopHandling.Serialize, - // Formatting = Newtonsoft.Json.Formatting.Indented - //}; - - //var sw = new StreamWriter(s); - //var writer = new JsonTextWriter(sw); - - //serializer.Serialize(writer, _aasEnv); - //writer.Flush(); - //sw.Flush(); - //s.Flush(); - - //if (useMemoryStream == null) - //{ - // writer.Close(); - // sw.Close(); - //} - // dead-csharp on - using (var wr = new System.Text.Json.Utf8JsonWriter(s)) - { - Jsonization.Serialize.ToJsonObject(_aasEnv).WriteTo(wr, - new System.Text.Json.JsonSerializerOptions() - { - WriteIndented = true - }); - wr.Flush(); - s.Flush(); - } - } - finally - { - // close? - if (useMemoryStream == null) - s.Close(); - } - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While writing AAS {0} at {1} gave: {2}", - fn, AdminShellUtil.ShortLocation(ex), ex.Message))); - } - return true; - } - - if (fn.ToLower().EndsWith(".aasx")) - { - // save package AASX - try - { - // We want existing contents to be preserved, but do not want to allow the change of the file name. - // Therefore: copy the file to a new name, then re-open. - // fn could be changed, therefore close "old" package first - if (_openPackage != null) - { - try - { - _openPackage.Close(); - if (!writeFreshly) - { - if (_tempFn != null) - System.IO.File.Copy(_tempFn, fn); - else - { - /* TODO (MIHO, 2021-01-02): check again. - * Revisiting this code after a while, and after - * the code has undergo some changes by MR, the following copy command needed - * to be amended with a if to protect against self-copy. */ - if (_fn != fn) - System.IO.File.Copy(_fn, fn); - } - } - } - catch (Exception ex) - { - LogInternally.That.SilentlyIgnoredError(ex); - } - _openPackage = null; - } - - // approach is to utilize the existing package, if possible. If not, create from scratch - Package package = null; - if (useMemoryStream != null) - { - package = Package.Open( - useMemoryStream, (writeFreshly) ? FileMode.Create : FileMode.OpenOrCreate); - } - else - { - package = Package.Open( - (_tempFn != null) ? _tempFn : fn, - (writeFreshly) ? FileMode.Create : FileMode.OpenOrCreate); - } - _fn = fn; - - // get the origin from the package - PackagePart originPart = null; - var xs = package.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aasx-origin"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/") - { - //originPart = package.GetPart(x.TargetUri); - var absoluteURI = PackUriHelper.ResolvePartUri(x.SourceUri, x.TargetUri); - if (package.PartExists(absoluteURI)) - { - originPart = package.GetPart(absoluteURI); - } - break; - } - if (originPart == null) - { - // create, as not existing - originPart = package.CreatePart( - new Uri("/aasx/aasx-origin", UriKind.RelativeOrAbsolute), - System.Net.Mime.MediaTypeNames.Text.Plain, CompressionOption.Maximum); - using (var s = originPart.GetStream(FileMode.Create)) - { - var bytes = System.Text.Encoding.ASCII.GetBytes("Intentionally empty"); - s.Write(bytes, 0, bytes.Length); - } - package.CreateRelationship( - originPart.Uri, TargetMode.Internal, - "http://www.admin-shell.io/aasx/relationships/aasx-origin"); - } - - // get the specs from the package - PackagePart specPart = null; - PackageRelationship specRel = null; - xs = originPart.GetRelationshipsByType("http://www.admin-shell.io/aasx/relationships/aas-spec"); - foreach (var x in xs) - { - specRel = x; - //specPart = package.GetPart(x.TargetUri); - var absoluteURI = PackUriHelper.ResolvePartUri(x.SourceUri, x.TargetUri); - if (package.PartExists(absoluteURI)) - { - specPart = package.GetPart(absoluteURI); - } - break; - } - - // check, if we have to change the spec part - if (specPart != null && specRel != null) - { - var name = System.IO.Path.GetFileNameWithoutExtension( - specPart.Uri.ToString()).ToLower().Trim(); - var ext = System.IO.Path.GetExtension(specPart.Uri.ToString()).ToLower().Trim(); - if ((ext == ".json" && prefFmt == SerializationFormat.Xml) - || (ext == ".xml" && prefFmt == SerializationFormat.Json) - || (name.StartsWith("aasenv-with-no-id"))) - { - // try kill specpart - try - { - originPart.DeleteRelationship(specRel.Id); - package.DeletePart(specPart.Uri); - } - catch (Exception ex) - { - LogInternally.That.SilentlyIgnoredError(ex); - } - finally { specPart = null; specRel = null; } - } - } - - if (specPart == null) - { - // create, as not existing - var frn = "aasenv-with-no-id"; - if (_aasEnv.AssetAdministrationShells.Count > 0) - frn = _aasEnv.AssetAdministrationShells[0].GetFriendlyName() ?? frn; - var aas_spec_fn = "/aasx/#/#.aas"; - if (prefFmt == SerializationFormat.Json) - aas_spec_fn += ".json"; - else - aas_spec_fn += ".xml"; - aas_spec_fn = aas_spec_fn.Replace("#", "" + frn); - specPart = package.CreatePart( - new Uri(aas_spec_fn, UriKind.RelativeOrAbsolute), - System.Net.Mime.MediaTypeNames.Text.Xml, CompressionOption.Maximum); - originPart.CreateRelationship( - specPart.Uri, TargetMode.Internal, - "http://www.admin-shell.io/aasx/relationships/aas-spec"); - } - - // now, specPart shall be != null! - if (specPart.Uri.ToString().ToLower().Trim().EndsWith("json")) - { - using (var s = specPart.GetStream(FileMode.Create)) - { - JsonSerializer serializer = new JsonSerializer(); - serializer.NullValueHandling = NullValueHandling.Ignore; - serializer.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; - serializer.Formatting = Newtonsoft.Json.Formatting.Indented; - using (var sw = new StreamWriter(s)) - { - using (JsonWriter writer = new JsonTextWriter(sw)) - { - serializer.Serialize(writer, _aasEnv); - } - } - } - } - else - { - using (var s = specPart.GetStream(FileMode.Create)) - { - - var writer = XmlWriter.Create(s, new XmlWriterSettings() - { - Indent = true, - OmitXmlDeclaration = true - }); - Xmlization.Serialize.To( - _aasEnv, writer); - writer.Flush(); - writer.Close(); - s.Flush(); - } - } - - // there might be pending files to be deleted (first delete, then add, - // in case of identical files in both categories) - foreach (var psfDel in _pendingFilesToDelete) - { - // try find an existing part for that file .. - var found = false; - - // normal files - xs = specPart.GetRelationshipsByType("http://www.admin-shell.io/aasx/relationships/aas-suppl"); - foreach (var x in xs) - if (x.TargetUri == psfDel.Uri) - { - // try to delete - specPart.DeleteRelationship(x.Id); - package.DeletePart(psfDel.Uri); - found = true; - break; - } - - // thumbnails - xs = package.GetRelationshipsByType( - "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); - foreach (var x in xs) - if (x.TargetUri == psfDel.Uri) - { - // try to delete - package.DeleteRelationship(x.Id); - package.DeletePart(psfDel.Uri); - found = true; - break; - } - - if (!found) - throw (new Exception( - $"Not able to delete pending file {psfDel.Uri} in saving package {fn}")); - } - - // after this, there are no more pending for delete files - _pendingFilesToDelete.Clear(); - - // write pending supplementary files - foreach (var psfAdd in _pendingFilesToAdd) - { - // make sure .. - if ((psfAdd.SourceLocalPath == null && psfAdd.SourceGetBytesDel == null) || - psfAdd.Location != AdminShellPackageSupplementaryFile.LocationType.AddPending) - continue; - - // normal file? - if (psfAdd.SpecialHandling == AdminShellPackageSupplementaryFile.SpecialHandlingType.None || - psfAdd.SpecialHandling == - AdminShellPackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail) - { - - // try find an existing part for that file .. - PackagePart filePart = null; - if (psfAdd.SpecialHandling == AdminShellPackageSupplementaryFile.SpecialHandlingType.None) - { - xs = specPart.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aas-suppl"); - foreach (var x in xs) - if (x.TargetUri == psfAdd.Uri) - { - //filePart = package.GetPart(x.TargetUri); - var absoluteURI = PackUriHelper.ResolvePartUri(x.SourceUri, x.TargetUri); - if (package.PartExists(absoluteURI)) - { - filePart = package.GetPart(absoluteURI); - } - break; - } - } - if (psfAdd.SpecialHandling == - AdminShellPackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail) - { - xs = package.GetRelationshipsByType( - "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/" && x.TargetUri == psfAdd.Uri) - { - //filePart = package.GetPart(x.TargetUri); - var absoluteURI = PackUriHelper.ResolvePartUri(x.SourceUri, x.TargetUri); - if (package.PartExists(absoluteURI)) - { - filePart = package.GetPart(absoluteURI); - } - break; - } - } - - if (filePart == null) - { - // determine mimeType - var mimeType = psfAdd.UseMimeType; - // reconcile mime - if (mimeType == null && psfAdd.SourceLocalPath != null) - mimeType = AdminShellPackageEnv.GuessMimeType(psfAdd.SourceLocalPath); - // still null? - if (mimeType == null) - // see: https://stackoverflow.com/questions/6783921/ - // which-mime-type-to-use-for-a-binary-file-thats-specific-to-my-program - mimeType = "application/octet-stream"; - - // create new part and link - filePart = package.CreatePart(psfAdd.Uri, mimeType, CompressionOption.Maximum); - if (psfAdd.SpecialHandling == - AdminShellPackageSupplementaryFile.SpecialHandlingType.None) - specPart.CreateRelationship( - filePart.Uri, TargetMode.Internal, - "http://www.admin-shell.io/aasx/relationships/aas-suppl"); - if (psfAdd.SpecialHandling == - AdminShellPackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail) - package.CreateRelationship( - filePart.Uri, TargetMode.Internal, - "http://schemas.openxmlformats.org/package/2006/" + - "relationships/metadata/thumbnail"); - } - - // now should be able to write - using (var s = filePart.GetStream(FileMode.Create)) - { - if (psfAdd.SourceLocalPath != null) - { - var bytes = System.IO.File.ReadAllBytes(psfAdd.SourceLocalPath); - s.Write(bytes, 0, bytes.Length); - } - - if (psfAdd.SourceGetBytesDel != null) - { - var bytes = psfAdd.SourceGetBytesDel(); - if (bytes != null) - s.Write(bytes, 0, bytes.Length); - } - } - } - } - - // after this, there are no more pending for add files - _pendingFilesToAdd.Clear(); - - // flush, but leave open - package.Flush(); - _openPackage = package; - - // if in temp fn, close the package, copy to original fn, re-open the package - if (_tempFn != null) - try - { - package.Close(); - System.IO.File.Copy(_tempFn, _fn, overwrite: true); - _openPackage = Package.Open(_tempFn, FileMode.OpenOrCreate); - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While write AASX {0} indirectly at {1} gave: {2}", - fn, AdminShellUtil.ShortLocation(ex), ex.Message))); - } - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While write AASX {0} at {1} gave: {2}", - fn, AdminShellUtil.ShortLocation(ex), ex.Message))); - } - return true; - } - - // Don't know to handle - throw new Exception($"Does not know how to handle the file: {fn}"); - } - - /// - /// Temporariyl saves & closes package and executes lambda. Afterwards, the package is re-opened - /// under the same file name - /// - /// Action which is to be executed while the file is CLOSED - /// Format for the saved file - public void TemporarilySaveCloseAndReOpenPackage( - Action lambda, - AdminShellPackageEnv.SerializationFormat prefFmt = AdminShellPackageEnv.SerializationFormat.None) - { - // access - if (!this.IsOpen) - throw (new Exception( - string.Format("Could not temporarily close and re-open AASX {0}, because package" + - "not open as expected!", Filename))); - - try - { - // save (it will be open, still) - SaveAs(this.Filename, prefFmt: prefFmt); - - // close - _openPackage.Flush(); - _openPackage.Close(); - - // execute lambda - lambda?.Invoke(); - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While temporarily close and re-open AASX {0} at {1} gave: {2}", - Filename, AdminShellUtil.ShortLocation(ex), ex.Message))); - } - finally - { - // even after failing of the lambda, the package shall be re-opened - if (Filename.ToLower().EndsWith(".aasx")) - { - _openPackage = Package.Open(Filename, FileMode.OpenOrCreate); - - } - } - } - - private int BackupIndex = 0; - - public void BackupInDir(string backupDir, int maxFiles) - { - // access - if (backupDir == null || maxFiles < 1) - return; - - // we do it not caring on any errors - try - { - // get index in form - if (BackupIndex == 0) - { - // do not always start at 0!! - var rnd = new Random(); - BackupIndex = rnd.Next(maxFiles); - } - var ndx = BackupIndex % maxFiles; - BackupIndex += 1; - - // build a filename - var bdfn = Path.Combine(backupDir, $"backup{ndx:000}.xml"); - - // raw save - using (var s = new StreamWriter(bdfn)) - { - // dead-csharp off - //var serializer = new XmlSerializer(typeof(AasCore.Aas3_0_RC02.Environment)); - //var nss = new XmlSerializerNamespaces(); - //nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace); - //nss.Add("aas", "http://www.admin-shell.io/aas/2/0"); - //nss.Add("IEC61360", "http://www.admin-shell.io/IEC61360/2/0"); - //serializer.Serialize(s, _aasEnv, nss); - // dead-csharp on - var writer = XmlWriter.Create(s, new XmlWriterSettings() - { - Indent = true, - OmitXmlDeclaration = true - }); - Xmlization.Serialize.To( - _aasEnv, writer); - writer.Flush(); - writer.Close(); - s.Flush(); - } - } - catch (Exception ex) - { - LogInternally.That.SilentlyIgnoredError(ex); - } - } - - public Stream GetStreamFromUriOrLocalPackage(string uriString, - FileMode mode = FileMode.Open, - FileAccess access = FileAccess.Read) - { - // local - if (IsLocalFile(uriString)) - return GetLocalStreamFromPackage(uriString, mode, access); - - // no .. - return System.IO.File.Open(uriString, mode, access); - } - - public byte[] GetByteArrayFromUriOrLocalPackage(string uriString) - { - try - { - using (var input = GetStreamFromUriOrLocalPackage(uriString)) - { - using (MemoryStream ms = new MemoryStream()) - { - input.CopyTo(ms); - return ms.ToArray(); - } - } - } - catch (Exception ex) - { - AdminShellNS.LogInternally.That.SilentlyIgnoredError(ex); - return null; - } - } - - public bool IsLocalFile(string uriString) - { - // access - if (_openPackage == null) - return false; - if (uriString == null || uriString == "" || !uriString.StartsWith("/")) - return false; - - // check - var isLocal = _openPackage.PartExists(new Uri(uriString, UriKind.RelativeOrAbsolute)); - return isLocal; - } - - private static WebProxy proxy = null; - - public Stream GetLocalStreamFromPackage(string uriString, FileMode mode = FileMode.Open, FileAccess access = FileAccess.Read) - { - // Check, if remote - if (uriString.ToLower().Substring(0, 4) == "http") - { - if (proxy == null) - { - string proxyAddress = ""; - string username = ""; - string password = ""; - - string proxyFile = "proxy.txt"; - if (System.IO.File.Exists(proxyFile)) - { - try - { // Open the text file using a stream reader. - using (StreamReader sr = new StreamReader(proxyFile)) - { - proxyFile = sr.ReadLine(); - } - } - catch (IOException e) - { - Console.WriteLine("proxy.txt could not be read:"); - Console.WriteLine(e.Message); - } - } - - try - { - using (StreamReader sr = new StreamReader(proxyFile)) - { - proxyAddress = sr.ReadLine(); - username = sr.ReadLine(); - password = sr.ReadLine(); - } - } - catch (Exception e) - { - Console.WriteLine(e.Message); - Console.WriteLine(proxyFile + " not found!"); - } - - if (proxyAddress != "") - { - proxy = new WebProxy(); - Uri newUri = new Uri(proxyAddress); - proxy.Address = newUri; - proxy.Credentials = new NetworkCredential(username, password); - Console.WriteLine("Using proxy: " + proxyAddress); - } - } - - var handler = new HttpClientHandler(); - - if (proxy != null) - handler.Proxy = proxy; - else - handler.DefaultProxyCredentials = CredentialCache.DefaultCredentials; - var hc = new HttpClient(handler); - - var response = hc.GetAsync(uriString).GetAwaiter().GetResult(); - - // if you call response.EnsureSuccessStatusCode here it will throw an exception - if (response.StatusCode == HttpStatusCode.Moved - || response.StatusCode == HttpStatusCode.Found) - { - var location = response.Headers.Location; - response = hc.GetAsync(location).GetAwaiter().GetResult(); - } - - response.EnsureSuccessStatusCode(); - var s = response.Content.ReadAsStreamAsync().GetAwaiter().GetResult(); - - if (s.Length < 500) // indirect load? - { - StreamReader reader = new StreamReader(s); - string json = reader.ReadToEnd(); - var parsed = JObject.Parse(json); - try - { - string url = parsed.SelectToken("url").Value(); - response = hc.GetAsync(url).GetAwaiter().GetResult(); - response.EnsureSuccessStatusCode(); - s = response.Content.ReadAsStreamAsync().GetAwaiter().GetResult(); - } - catch - { - } - } - - return s; - } - - // access - if (_openPackage == null) - throw (new Exception(string.Format($"AASX Package {_fn} not opened. Aborting!"))); - - // exist - var puri = new Uri(uriString, UriKind.RelativeOrAbsolute); - if (!_openPackage.PartExists(puri)) - throw (new Exception(string.Format($"AASX Package has no part {uriString}. Aborting!"))); - - // get part - var part = _openPackage.GetPart(puri); - if (part == null) - throw (new Exception( - string.Format($"Cannot access part {uriString} in {_fn}. Aborting!"))); - return part.GetStream(mode, access); - } - - public async Task ReplaceSupplementaryFileInPackageAsync(string sourceUri, string targetFile, string targetContentType, Stream fileContent) - { - // access - if (_openPackage == null) - throw (new Exception(string.Format($"AASX Package {_fn} not opened. Aborting!"))); - - if (!string.IsNullOrEmpty(sourceUri)) - { - _openPackage.DeletePart(new Uri(sourceUri, UriKind.RelativeOrAbsolute)); - - } - var targetUri = PackUriHelper.CreatePartUri(new Uri(targetFile, UriKind.RelativeOrAbsolute)); - PackagePart packagePart = _openPackage.CreatePart(targetUri, targetContentType); - fileContent.Position = 0; - using (Stream dest = packagePart.GetStream()) - { - fileContent.CopyTo(dest); - } - } - - public long GetStreamSizeFromPackage(string uriString) - { - long res = 0; - try - { - if (_openPackage == null) - return 0; - - PackagePart part = null; - var uri = new Uri(uriString, UriKind.RelativeOrAbsolute); - if (_openPackage.PartExists(uri)) - { - part = _openPackage.GetPart(uri); - } - if (part != null) - { - using (var s = part.GetStream(FileMode.Open)) - { - res = s.Length; - } - } - } - catch (Exception ex) - { - LogInternally.That.SilentlyIgnoredError(ex); - return 0; - } - return res; - } - - /// - /// Ensures: - ///
  • result == null || result.CanRead
- ///
- public Stream GetLocalThumbnailStream(ref Uri thumbUri) - { - // access - if (_openPackage == null) - throw (new Exception(string.Format($"AASX Package {_fn} not opened. Aborting!"))); - // get the thumbnail over the relationship - PackagePart thumbPart = null; - var xs = _openPackage.GetRelationshipsByType( - "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/") - { - //thumbPart = _openPackage.GetPart(x.TargetUri); - var absoluteURI = PackUriHelper.ResolvePartUri(x.SourceUri, x.TargetUri); - if (_openPackage.PartExists(absoluteURI)) - { - thumbPart = _openPackage.GetPart(absoluteURI); - } - thumbUri = x.TargetUri; - break; - } - if (thumbPart == null) - throw (new Exception("Unable to find AASX thumbnail. Aborting!")); - - var result = thumbPart.GetStream(FileMode.Open); - - // Post-condition - if (!(result == null || result.CanRead)) - { - throw new InvalidOperationException("Unexpected unreadable result stream"); - } - - return result; - } - - /// - /// Ensures: - ///
  • result == null || result.CanRead
- ///
- public Stream GetLocalThumbnailStream() - { - Uri dummy = null; - var result = GetLocalThumbnailStream(ref dummy); - - // Post-condition - if (!(result == null || result.CanRead)) - { - throw new InvalidOperationException("Unexpected unreadable result stream"); - } - - return result; - } - - public ListOfAasSupplementaryFile GetListOfSupplementaryFiles() - { - // new result - var result = new ListOfAasSupplementaryFile(); - - // access - if (_openPackage != null) - { - - // get the thumbnail(s) from the package - var xs = _openPackage.GetRelationshipsByType( - "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/") - { - result.Add(new AdminShellPackageSupplementaryFile( - x.TargetUri, - location: AdminShellPackageSupplementaryFile.LocationType.InPackage, - specialHandling: AdminShellPackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail)); - } - - // get the origin from the package - PackagePart originPart = null; - xs = _openPackage.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aasx-origin"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/") - { - //originPart = _openPackage.GetPart(x.TargetUri); - var absoluteURI = PackUriHelper.ResolvePartUri(x.SourceUri, x.TargetUri); - if (_openPackage.PartExists(absoluteURI)) - { - originPart = _openPackage.GetPart(absoluteURI); - } - break; - } - - if (originPart != null) - { - // get the specs from the origin - PackagePart specPart = null; - xs = originPart.GetRelationshipsByType("http://www.admin-shell.io/aasx/relationships/aas-spec"); - foreach (var x in xs) - { - //specPart = _openPackage.GetPart(x.TargetUri); - var absoluteURI = PackUriHelper.ResolvePartUri(x.SourceUri, x.TargetUri); - if (_openPackage.PartExists(absoluteURI)) - { - specPart = _openPackage.GetPart(absoluteURI); - } - break; - } - - if (specPart != null) - { - // get the supplementaries from the package, derived from spec - xs = specPart.GetRelationshipsByType("http://www.admin-shell.io/aasx/relationships/aas-suppl"); - foreach (var x in xs) - { - result.Add( - new AdminShellPackageSupplementaryFile( - x.TargetUri, location: AdminShellPackageSupplementaryFile.LocationType.InPackage)); - } - } - } - } - - // add or modify the files to delete - foreach (var psfDel in _pendingFilesToDelete) - { - // already in - var found = result.Find(x => { return x.Uri == psfDel.Uri; }); - if (found != null) - found.Location = AdminShellPackageSupplementaryFile.LocationType.DeletePending; - else - { - psfDel.Location = AdminShellPackageSupplementaryFile.LocationType.DeletePending; - result.Add(psfDel); - } - } - - // add the files to store as well - foreach (var psfAdd in _pendingFilesToAdd) - { - // already in (should not happen ?!) - var found = result.Find(x => { return x.Uri == psfAdd.Uri; }); - if (found != null) - found.Location = AdminShellPackageSupplementaryFile.LocationType.AddPending; - else - { - psfAdd.Location = AdminShellPackageSupplementaryFile.LocationType.AddPending; - result.Add(psfAdd); - } - } - - // done - return result; - } - - public static string GuessMimeType(string fn) - { - var file_ext = System.IO.Path.GetExtension(fn).ToLower().Trim(); - var content_type = System.Net.Mime.MediaTypeNames.Text.Plain; - if (file_ext == ".pdf") content_type = System.Net.Mime.MediaTypeNames.Application.Pdf; - if (file_ext == ".xml") content_type = System.Net.Mime.MediaTypeNames.Text.Xml; - if (file_ext == ".txt") content_type = System.Net.Mime.MediaTypeNames.Text.Plain; - if (file_ext == ".igs") content_type = "application/iges"; - if (file_ext == ".iges") content_type = "application/iges"; - if (file_ext == ".stp") content_type = "application/step"; - if (file_ext == ".step") content_type = "application/step"; - if (file_ext == ".jpg") content_type = System.Net.Mime.MediaTypeNames.Image.Jpeg; - if (file_ext == ".jpeg") content_type = System.Net.Mime.MediaTypeNames.Image.Jpeg; - if (file_ext == ".png") content_type = "image/png"; - if (file_ext == ".gif") content_type = System.Net.Mime.MediaTypeNames.Image.Gif; - return content_type; - } - - public void PrepareSupplementaryFileParameters(ref string targetDir, ref string targetFn) - { - // re-work target dir - if (targetDir != null) - targetDir = targetDir.Replace(@"\", "/"); - - // rework targetFn - if (targetFn != null) - targetFn = Regex.Replace(targetFn, @"[^A-Za-z0-9-.]+", "_"); - } - - /// - /// Add a file as supplementary file to package. Operation will be pending, package needs to be saved in order - /// materialize embedding. - /// - /// Target path of file in package - public string AddSupplementaryFileToStore( - string sourcePath, string targetDir, string targetFn, bool embedAsThumb, - AdminShellPackageSupplementaryFile.SourceGetByteChunk sourceGetBytesDel = null, string useMimeType = null) - { - // beautify parameters - if ((sourcePath == null && sourceGetBytesDel == null) || targetDir == null || targetFn == null) - return null; - - // build target path - targetDir = targetDir.Trim(); - if (!targetDir.EndsWith("/")) - targetDir += "/"; - targetFn = targetFn.Trim(); - if (sourcePath == "" || targetDir == "" || targetFn == "") - throw (new Exception("Trying add supplementary file with empty name or path!")); - - var targetPath = "" + targetDir.Trim() + targetFn.Trim(); - - // base function - AddSupplementaryFileToStore(sourcePath, targetPath, embedAsThumb, sourceGetBytesDel, useMimeType); - - // return target path - return targetPath; - } - - public void AddSupplementaryFileToStore(string sourcePath, string targetPath, bool embedAsThumb, - AdminShellPackageSupplementaryFile.SourceGetByteChunk sourceGetBytesDel = null, string useMimeType = null) - { - // beautify parameters - if ((sourcePath == null && sourceGetBytesDel == null) || targetPath == null) - return; - - sourcePath = sourcePath?.Trim(); - targetPath = targetPath.Trim(); - - // add record - _pendingFilesToAdd.Add( - new AdminShellPackageSupplementaryFile( - new Uri(targetPath, UriKind.RelativeOrAbsolute), - sourcePath, - location: AdminShellPackageSupplementaryFile.LocationType.AddPending, - specialHandling: (embedAsThumb - ? AdminShellPackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail - : AdminShellPackageSupplementaryFile.SpecialHandlingType.None), - sourceGetBytesDel: sourceGetBytesDel, - useMimeType: useMimeType) - ); - - } - - public void DeleteSupplementaryFile(AdminShellPackageSupplementaryFile psf) - { - if (psf == null) - throw (new Exception("No supplementary file given!")); - - if (psf.Location == AdminShellPackageSupplementaryFile.LocationType.AddPending) - { - // is still pending in add list -> remove - _pendingFilesToAdd.RemoveAll((x) => { return x.Uri == psf.Uri; }); - } - - if (psf.Location == AdminShellPackageSupplementaryFile.LocationType.InPackage) - { - // add to pending delete list - _pendingFilesToDelete.Add(psf); - } - } - - public void Close() - { - _openPackage?.Close(); - _openPackage = null; - _fn = ""; - _aasEnv = null; - } - - public void Flush() - { - if (_openPackage != null) - _openPackage.Flush(); - } - - public void Dispose() - { - Close(); - } - - public string MakePackageFileAvailableAsTempFile(string packageUri, bool keepFilename = false) - { - // access - if (packageUri == null) - return null; - - // get input stream - using (var input = GetLocalStreamFromPackage(packageUri)) - { - // generate tempfile name - string tempext = System.IO.Path.GetExtension(packageUri); - string temppath = System.IO.Path.GetTempFileName().Replace(".tmp", tempext); - - // maybe modify tempfile name? - if (keepFilename) - { - var masterFn = System.IO.Path.GetFileNameWithoutExtension(packageUri); - var tmpDir = System.IO.Path.GetDirectoryName(temppath); - var tmpFnExt = System.IO.Path.GetFileName(temppath); - - temppath = System.IO.Path.Combine(tmpDir, "" + masterFn + "_" + tmpFnExt); - } - - // copy to temp file - using (var temp = System.IO.File.OpenWrite(temppath)) - { - input.CopyTo(temp); - return temppath; - } - } - } - - public void EmbeddAssetInformationThumbnail(IResource defaultThumbnail, Stream fileContent) - { - // access - if (_openPackage == null) - throw (new Exception(string.Format($"AASX Package {_fn} not opened. Aborting!"))); - - if (!string.IsNullOrEmpty(defaultThumbnail.Path)) - { - var sourceUri = defaultThumbnail.Path.Replace(Path.DirectorySeparatorChar, '/'); - _openPackage.DeletePart(new Uri(sourceUri, UriKind.RelativeOrAbsolute)); - - } - var targetUri = PackUriHelper.CreatePartUri(new Uri(defaultThumbnail.Path, UriKind.RelativeOrAbsolute)); - - PackagePart packagePart = _openPackage.CreatePart(targetUri, defaultThumbnail.ContentType, compressionOption: CompressionOption.Maximum); - - _openPackage.CreateRelationship(packagePart.Uri, TargetMode.Internal, - "http://schemas.openxmlformats.org/package/2006/" + - "relationships/metadata/thumbnail"); - - //Write to the part - fileContent.Position = 0; - using (Stream dest = packagePart.GetStream()) - { - fileContent.CopyTo(dest); - } - } - } -} \ No newline at end of file diff --git a/src/AasxCsharpLibrary/AdminShellUtil.cs b/src/AasxCsharpLibrary/AdminShellUtil.cs deleted file mode 100644 index 34ba39821..000000000 --- a/src/AasxCsharpLibrary/AdminShellUtil.cs +++ /dev/null @@ -1,1129 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using AasxCompatibilityModels; -using Extensions; -using System; -using System.Collections; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.IO.Packaging; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Text.RegularExpressions; - -namespace AdminShellNS -{ - public static class AdminShellUtil - { - - #region Various utilities - // ------------------------------------------------------------------------------------ - - public static T[] GetEnumValues() where T : Enum - => (T[])Enum.GetValues(typeof(T)); - - public static IEnumerable GetEnumValues(T[] excludes) where T : Enum - { - foreach (var v in (T[])Enum.GetValues(typeof(T))) - if (!excludes.Contains(v)) - yield return v; - } - - #endregion - - #region V3 Methods - - public static void EnumerateSearchable( - SearchResults results, object obj, string qualifiedNameHead, int depth, SearchOptions options, - object businessObject = null) - { - // access - if (results == null || obj == null || options == null) - return; - Type objType = obj.GetType(); - - // depth - if (depth > options.maxDepth) - return; - - // try to get element name of an AAS entity - string elName = null; - if (obj is IReferable) - { - elName = (obj as IReferable).GetType().Name; - businessObject = obj; - } - - // enrich qualified name, accordingly - var qualifiedName = qualifiedNameHead; - if (elName != null) - qualifiedName = qualifiedName + (qualifiedName.Length > 0 ? "." : "") + elName; - - // do NOT dive into objects, which are not in the reight assembly - if (options.allowedAssemblies == null || !options.allowedAssemblies.Contains(objType.Assembly)) - return; - - // do not dive into enums - if (objType.IsEnum) - return; - - // look at fields, first - var fields = objType.GetFields(); - foreach (var fi in fields) - { - // is the object marked to be skipped? - var x3 = fi.GetCustomAttribute(); - if (x3 != null) - continue; - - var x4 = fi.GetCustomAttribute(); - if (x4 != null) - continue; - - // get value(s) - var fieldValue = fi.GetValue(obj); - if (fieldValue == null) - continue; - var valueElems = fieldValue as IList; - if (valueElems != null) - { - // field is a collection .. dive deeper, if allowed - foreach (var el in valueElems) - EnumerateSearchable(results, el, qualifiedName, depth + 1, options, businessObject); - } - else - { - // field is a single entity .. check it - CheckSearchable( - results, options, qualifiedName, businessObject, fi, fieldValue, obj, - () => { return fieldValue.GetHashCode(); }); - - // dive deeper .. - EnumerateSearchable(results, fieldValue, qualifiedName, depth + 1, options, businessObject); - } - } - - // properties & objects behind - var properties = objType.GetProperties(); - foreach (var pi in properties) - { - var gip = pi.GetIndexParameters(); - if (gip.Length > 0) - // no indexed properties, yet - continue; - - // is the object marked to be skipped? - var x3 = pi.GetCustomAttribute(); - if (x3 != null) - continue; - - var x4 = pi.GetCustomAttribute(); - if (x4 != null) - continue; - - // get value(s) - var propValue = pi.GetValue(obj, null); - if (propValue == null) - continue; - var valueElems = propValue as IList; - if (valueElems != null) - { - // property is a collection .. dive deeper, if allowed - foreach (var el in valueElems) - EnumerateSearchable(results, el, qualifiedName, depth + 1, options, businessObject); - } - else - { - // field is a single entity .. check it - CheckSearchable( - results, options, qualifiedName, businessObject, pi, propValue, obj, - () => { return propValue.GetHashCode(); }); - - // dive deeper .. - EnumerateSearchable(results, propValue, qualifiedName, depth + 1, options, businessObject); - } - } - } - - public static void CheckSearchable( - SearchResults results, SearchOptions options, string qualifiedNameHead, object businessObject, - MemberInfo mi, object memberValue, object containingObject, Func getMemberHash) - { - // try get a speaking name - var metaModelName = ""; - var x1 = mi.GetCustomAttribute(); - if (x1 != null && x1.name != null) - metaModelName = x1.name; - - // check if this object is searchable - var x2 = mi.GetCustomAttribute(); - if (x2 != null) - { - // what to check? - string foundText = "" + memberValue?.ToString(); - - // find options - var found = true; - if (options.findText != null) - found = foundText.IndexOf( - options.findText, options.isIgnoreCase ? StringComparison.CurrentCultureIgnoreCase : 0) >= 0; - - // add? - if (found) - { - var sri = new SearchResultItem(); - sri.searchOptions = options; - sri.qualifiedNameHead = qualifiedNameHead; - sri.metaModelName = metaModelName; - sri.businessObject = businessObject; - sri.foundText = foundText; - sri.foundObject = memberValue; - sri.containingObject = containingObject; - if (getMemberHash != null) - sri.foundHash = getMemberHash(); - - // avoid duplicates - if (!results.foundResults.Contains(sri)) - results.foundResults.Add(sri); - } - } - } - - public class SearchResultItem : IEquatable - { - public SearchOptions searchOptions; - public string qualifiedNameHead; - public string metaModelName; - public object businessObject; - public string foundText; - public object foundObject; - public object containingObject; - public int foundHash; - - public bool Equals(SearchResultItem other) - { - if (other == null) - return false; - - return this.qualifiedNameHead == other.qualifiedNameHead && - this.metaModelName == other.metaModelName && - this.businessObject == other.businessObject && - this.containingObject == other.containingObject && - this.foundText == other.foundText && - this.foundHash == other.foundHash; - } - } - - public class SearchResults - { - public int foundIndex = 0; - public List foundResults = new List(); - - public void Clear() - { - foundIndex = -1; - foundResults.Clear(); - } - } - - public class SearchOptions - { - public Assembly[] allowedAssemblies = null; - public int maxDepth = int.MaxValue; - public bool findFirst = false; - public int skipFirstResults = 0; - public string findText = null; - public bool isIgnoreCase = false; - public bool isRegex = false; - } - - public static string[] GetPopularMimeTypes() - { - return - new[] { - System.Net.Mime.MediaTypeNames.Text.Plain, - System.Net.Mime.MediaTypeNames.Text.Xml, - System.Net.Mime.MediaTypeNames.Text.Html, - "text/markdown", - "text/asciidoc", - "application/json", - "application/rdf+xml", - System.Net.Mime.MediaTypeNames.Application.Pdf, - System.Net.Mime.MediaTypeNames.Image.Jpeg, - "image/png", - System.Net.Mime.MediaTypeNames.Image.Gif, - "application/iges", - "application/step" - }; - } - - public static bool CheckForTextContentType(string input) - { - if (input == null) - return false; - input = input.Trim().ToLower(); - foreach (var tst in new[] { - System.Net.Mime.MediaTypeNames.Text.Plain, - System.Net.Mime.MediaTypeNames.Text.Xml, - System.Net.Mime.MediaTypeNames.Text.Html, - "text/markdown", - "text/asciidoc", - "application/json", - "application/rdf+xml" - }) - if (input.Contains(tst.ToLower())) - return true; - return false; - } - - public static IEnumerable GetAdequateEnums(AasSubmodelElements[] excludeValues = null, AasSubmodelElements[] includeValues = null) - { - if (includeValues != null) - { - foreach (var en in includeValues) - yield return en; - } - else - { - foreach (var en in (AasSubmodelElements[])Enum.GetValues(typeof(AasSubmodelElements))) - { - if (en == AasSubmodelElements.SubmodelElement) - continue; - if (excludeValues != null && excludeValues.Contains(en)) - continue; - yield return en; - } - } - } - - public static AasSubmodelElements? AasSubmodelElementsFrom() where T : ISubmodelElement - { - if (typeof(T) == typeof(Property)) - return AasSubmodelElements.Property; - if (typeof(T) == typeof(MultiLanguageProperty)) - return AasSubmodelElements.MultiLanguageProperty; - if (typeof(T) == typeof(AasCore.Aas3_0.Range)) - return AasSubmodelElements.Range; - if (typeof(T) == typeof(AasCore.Aas3_0.File)) - return AasSubmodelElements.File; - if (typeof(T) == typeof(Blob)) - return AasSubmodelElements.Blob; - if (typeof(T) == typeof(ReferenceElement)) - return AasSubmodelElements.ReferenceElement; - if (typeof(T) == typeof(RelationshipElement)) - return AasSubmodelElements.RelationshipElement; - if (typeof(T) == typeof(AnnotatedRelationshipElement)) - return AasSubmodelElements.AnnotatedRelationshipElement; - if (typeof(T) == typeof(Capability)) - return AasSubmodelElements.Capability; - if (typeof(T) == typeof(SubmodelElementCollection)) - return AasSubmodelElements.SubmodelElementCollection; - if (typeof(T) == typeof(Operation)) - return AasSubmodelElements.Operation; - if (typeof(T) == typeof(BasicEventElement)) - return AasSubmodelElements.BasicEventElement; - if (typeof(T) == typeof(Entity)) - return AasSubmodelElements.Entity; - return null; - } - - public static ISubmodelElement CreateSubmodelElementFromEnum(AasSubmodelElements smeEnum, ISubmodelElement sourceSme = null) - { - switch (smeEnum) - { - case AasSubmodelElements.Property: - { - return new Property(DataTypeDefXsd.String).UpdateFrom(sourceSme); - } - case AasSubmodelElements.MultiLanguageProperty: - { - return new MultiLanguageProperty().UpdateFrom(sourceSme); - } - case AasSubmodelElements.Range: - { - return new AasCore.Aas3_0.Range(DataTypeDefXsd.String).UpdateFrom(sourceSme); - } - case AasSubmodelElements.File: - { - return new AasCore.Aas3_0.File("").UpdateFrom(sourceSme); - } - case AasSubmodelElements.Blob: - { - return new Blob("").UpdateFrom(sourceSme); - } - case AasSubmodelElements.ReferenceElement: - { - // TODO (??, 0000-00-00): AAS core crashes without this - return new ReferenceElement( - value: new Reference(ReferenceTypes.ExternalReference, new List()) - ).UpdateFrom(sourceSme); - } - case AasSubmodelElements.RelationshipElement: - { - return new RelationshipElement( - new Reference(ReferenceTypes.ExternalReference, new List()), - new Reference(ReferenceTypes.ExternalReference, new List())) - .UpdateFrom(sourceSme); - } - case AasSubmodelElements.AnnotatedRelationshipElement: - { - return new AnnotatedRelationshipElement( - new Reference(ReferenceTypes.ExternalReference, new List()), - new Reference(ReferenceTypes.ExternalReference, new List())) - .UpdateFrom(sourceSme); - } - case AasSubmodelElements.Capability: - { - return new Capability().UpdateFrom(sourceSme); - } - case AasSubmodelElements.SubmodelElementCollection: - { - return new SubmodelElementCollection().UpdateFrom(sourceSme); - } - case AasSubmodelElements.SubmodelElementList: - { - return new SubmodelElementList(AasSubmodelElements.SubmodelElement).UpdateFrom(sourceSme); - } - case AasSubmodelElements.Operation: - { - return new Operation().UpdateFrom(sourceSme); - } - case AasSubmodelElements.BasicEventElement: - { - return new BasicEventElement(null, Direction.Input, StateOfEvent.Off).UpdateFrom(sourceSme); - } - case AasSubmodelElements.Entity: - { - return new Entity(EntityType.SelfManagedEntity).UpdateFrom(sourceSme); - } - default: - { - return null; - } - } - } - - #endregion - public static string EvalToNonNullString(string fmt, object o, string elseString = "") - { - if (o == null) - return elseString; - return string.Format(fmt, o); - } - - public static string EvalToNonEmptyString(string fmt, string o, string elseString = "") - { - if (o == null || o == "") - return elseString; - return string.Format(fmt, o); - } - - /// - /// If len of exceeds then - /// string is shortened and returned with an ellipsis(…) at the end. - /// - /// Shortened string - public static string ShortenWithEllipses(string str, int maxLen) - { - if (str == null) - return null; - if (maxLen >= 0 && str.Length > maxLen) - str = str.Substring(0, maxLen) + "\u2026"; - return str; - } - - /// - /// Returns a string without newlines and shortened (with ellipsis) - /// to a certain length - /// - /// Single-line, shortened string - public static string ToSingleLineShortened(string str, int maxLen, string textNewLine = " ") - { - str = str.ReplaceLineEndings(textNewLine); - return ShortenWithEllipses(str, maxLen); - } - - /// Creates a filter-friendly name from the source. - /// - /// Assert.AreEqual("", AdminShellUtil.FilterFriendlyName("")); - /// Assert.AreEqual("someName", AdminShellUtil.FilterFriendlyName("someName")); - /// Assert.AreEqual("some__name", AdminShellUtil.FilterFriendlyName("some!;name")); - /// - public static string FilterFriendlyName(string src) - { - if (src == null) - return null; - return Regex.Replace(src, @"[^a-zA-Z0-9\-_]", "_"); - } - - /// - /// Assert.IsFalse(AdminShellUtil.HasWhitespace("")); - /// Assert.IsTrue(AdminShellUtil.HasWhitespace(" ")); - /// Assert.IsTrue(AdminShellUtil.HasWhitespace("aa bb")); - /// Assert.IsTrue(AdminShellUtil.HasWhitespace(" aabb")); - /// Assert.IsTrue(AdminShellUtil.HasWhitespace("aabb ")); - /// Assert.IsFalse(AdminShellUtil.HasWhitespace("aabb")); - /// - public static bool HasWhitespace(string src) - { - if (src == null) - throw new ArgumentNullException(nameof(src)); - foreach (var s in src) - if (char.IsWhiteSpace(s)) - return true; - return false; - } - - /// Assert.IsTrue(AdminShellUtil.ComplyIdShort("")); - public static bool ComplyIdShort(string src) - { - if (src == null) - throw new ArgumentNullException(nameof(src)); - var res = true; - foreach (var s in src) - if (!Char.IsLetterOrDigit(s) && s != '_') - res = false; - if (src.Length > 0 && !Char.IsLetter(src[0])) - res = false; - return res; - } - - public static string ByteSizeHumanReadable(long len) - { - // see: https://stackoverflow.com/questions/281640/ - // how-do-i-get-a-human-readable-file-size-in-bytes-abbreviation-using-net - string[] sizes = { "B", "KB", "MB", "GB", "TB" }; - int order = 0; - while (len >= 1024 && order < sizes.Length - 1) - { - order++; - len = len / 1024; - } - // Adjust the format string to your preferences. For example "{0:0.#}{1}" would - // show a single decimal place, and no space. - string res = String.Format("{0:0.##} {1}", len, sizes[order]); - return res; - } - - public static string ExtractPascalCasingLetters(string src) - { - // access - src = src?.Trim(); - if (src == null || src.Length < 1) - return null; - - // walk through - var res = ""; - var arm = true; - foreach (var c in src) - { - // take? - if (arm && Char.IsUpper(c)) - res += c; - // state for next iteration - arm = !Char.IsUpper(c); - } - - // result - return res; - } - - public static string FromDouble(double input, string format) - { - return string.Format(CultureInfo.InvariantCulture, format, input); - } - - public static int CountHeadingSpaces(string line) - { - if (line == null) - return 0; - int j; - for (j = 0; j < line.Length; j++) - if (!Char.IsWhiteSpace(line[j])) - break; - return j; - } - - /// - /// Used to re-reformat a C# here string, which is multiline string introduced by @" ... "; - /// - public static string[] CleanHereStringToArray(string here) - { - if (here == null) - return null; - - // convert all weird breaks to pure new lines - here = here.Replace("\r\n", "\n"); - here = here.Replace("\n\r", "\n"); - - // convert all tabs to spaces - here = here.Replace("\t", " "); - - // split these - var lines = new List(here.Split('\n')); - if (lines.Count < 1) - return lines.ToArray(); - - // the first line could be special - string firstLine = null; - if (lines[0].Trim() != "") - { - firstLine = lines[0].Trim(); - lines.RemoveAt(0); - } - - // detect an constant amount of heading spaces - var headSpaces = int.MaxValue; - foreach (var line in lines) - if (line.Trim() != "") - headSpaces = Math.Min(headSpaces, CountHeadingSpaces(line)); - - // multi line trim possible? - if (headSpaces != int.MaxValue && headSpaces > 0) - for (int i = 0; i < lines.Count; i++) - if (lines[i].Length > headSpaces) - lines[i] = lines[i].Substring(headSpaces); - - // re-compose again - if (firstLine != null) - lines.Insert(0, firstLine); - - // return - return lines.ToArray(); - } - - /// - /// Used to re-reformat a C# here string, which is multiline string introduced by @" ... "; - /// - public static string CleanHereStringWithNewlines(string here, string nl = null) - { - if (nl == null) - nl = System.Environment.NewLine; - var lines = CleanHereStringToArray(here); - if (lines == null) - return null; - return String.Join(nl, lines); - } - - public static string ShortLocation(Exception ex) - { - if (ex == null || ex.StackTrace == null) - return ""; - string[] lines = ex.StackTrace.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None); - if (lines.Length < 1) - return ""; - // search for " in " - // as the most actual stacktrace might be a built-in function, this might not work and therefore - // go down in the stack - int currLine = 0; - while (true) - { - // nothing found at all - if (currLine >= lines.Length) - return ""; - // access current line - /* TODO (MIHO, 2020-11-12): replace with Regex for multi language. Ideally have Exception messages - always as English. */ - var p = lines[currLine].IndexOf(" in ", StringComparison.Ordinal); - if (p < 0) - p = lines[currLine].IndexOf(" bei ", StringComparison.Ordinal); - if (p < 0) - { - // advance to next oldest line - currLine++; - continue; - } - // search last "\" or "/", to get only filename portion and position - p = lines[currLine].LastIndexOfAny(new[] { '\\', '/' }); - if (p < 0) - { - // advance to next oldest line - currLine++; - continue; - } - // return this - return lines[currLine].Substring(p); - } - } - - public static string MapIntToStringArray(int? input, string ifNull, string[] choices) - { - if (input == null || choices == null || choices.Length < 1) - return ifNull; - int i = input ?? 0; - if (i < 0 || i >= choices.Length) - return ifNull; - return choices[i]; - } - - public static string MapBoolToStringArray(bool? input, string ifNull, string[] choices) - { - if (input == null || choices == null || choices.Length != 2) - return ifNull; - bool b = input ?? false; - return choices[b ? 1 : 0]; - } - - public enum ConstantFoundEnum { No, AnyCase, ExactCase } - - public static ConstantFoundEnum CheckIfInConstantStringArray(string[] arr, string str) - { - if (arr == null || str == null) - return ConstantFoundEnum.No; - - bool anyCaseFound = false; - bool exactCaseFound = false; - foreach (var a in arr) - { - anyCaseFound = anyCaseFound || str.ToLower() == a.ToLower(); - exactCaseFound = exactCaseFound || str == a; - } - if (exactCaseFound) - return ConstantFoundEnum.ExactCase; - if (anyCaseFound) - return ConstantFoundEnum.AnyCase; - return ConstantFoundEnum.No; - } - - public static string CorrectCasingForConstantStringArray(string[] arr, string str) - { - if (arr == null || str == null) - return str; - - foreach (var a in arr) - if (str.ToLower() == a.ToLower()) - return a; - - return str; - } - - // - // String manipulations - // - - public static string ReplacePercentPlaceholder( - string input, - string searchFor, - Func substLamda, - StringComparison comparisonType = StringComparison.InvariantCulture) - { - // access - if (input == null || searchFor == null || searchFor == "") - return input; - - // find - while (true) - { - // any occurence - var p = input.IndexOf(searchFor, comparisonType); - if (p < 0) - break; - - // split - var left = input.Substring(0, p); - var right = ""; - var rp = p + searchFor.Length; - if (rp < input.Length) - right = input.Substring(rp); - - // lambda - var repl = "" + substLamda?.Invoke(); - - // build new - input = left + repl + right; - } - - // ok - return input; - } - - public static string WrapLinesAtColumn(string text, int columnLimit) - { - // access - if (text == null) - return null; - if (columnLimit < 10) - return text; - - // idea: - // https://stackoverflow.com/questions/3961278/word-wrap-a-string-in-multiple-lines - // but: outer loop to handle line breaks, inner loop to handle words - - // split lines, preserving empty lines - var lines = Regex.Split(text, "\r\n|\r|\n"); - var outLines = new StringBuilder(); - foreach (var textLine in lines) - { - // now words. In future, may use regex? - var words = text.Split(new string[] { " " }, StringSplitOptions.None); - var sumLine = ""; - foreach (var word in words) - { - sumLine += word + " "; - if (sumLine.Length >= columnLimit) - { - outLines.AppendLine(sumLine); - sumLine = ""; - } - } - } - - // ok, result - return outLines.ToString(); - } - - // - // Reflection - // - - public static void SetFieldLazyValue(FieldInfo f, object obj, object value) - { - // access - if (f == null || obj == null) - return; - - switch (Type.GetTypeCode(f.FieldType)) - { - case TypeCode.String: - f.SetValue(obj, "" + value); - break; - - case TypeCode.Byte: - if (Byte.TryParse("" + value, out var ui8)) - f.SetValue(obj, ui8); - break; - - case TypeCode.SByte: - if (SByte.TryParse("" + value, out var i8)) - f.SetValue(obj, i8); - break; - - case TypeCode.Int16: - if (Int16.TryParse("" + value, out var i16)) - f.SetValue(obj, i16); - break; - - case TypeCode.Int32: - if (Int32.TryParse("" + value, out var i32)) - f.SetValue(obj, i32); - break; - - case TypeCode.Int64: - if (Int64.TryParse("" + value, out var i64)) - f.SetValue(obj, i64); - break; - - case TypeCode.UInt16: - if (UInt16.TryParse("" + value, out var ui16)) - f.SetValue(obj, ui16); - break; - - case TypeCode.UInt32: - if (UInt32.TryParse("" + value, out var ui32)) - f.SetValue(obj, ui32); - break; - - case TypeCode.UInt64: - if (UInt64.TryParse("" + value, out var ui64)) - f.SetValue(obj, ui64); - break; - - case TypeCode.Single: - if (Single.TryParse("" + value, NumberStyles.Float, - CultureInfo.InvariantCulture, out var sgl)) - f.SetValue(obj, sgl); - break; - - case TypeCode.Double: - if (Double.TryParse("" + value, NumberStyles.Float, - CultureInfo.InvariantCulture, out var dbl)) - f.SetValue(obj, dbl); - break; - - case TypeCode.Boolean: - var isFalse = value == null - || (value is int vi && vi == 0) - || (value is string vs && (vs == "" || vs == "false")) - || (value is bool vb && !vb); - f.SetValue(obj, !isFalse); - break; - } - } - - // - // temp file utilities - // - - // see: https://stackoverflow.com/questions/278439/creating-a-temporary-directory-in-windows - public static string GetTemporaryDirectory() - { - string tempDirectory = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); - Directory.CreateDirectory(tempDirectory); - return tempDirectory; - } - - // see: https://stackoverflow.com/questions/6386113/using-system-io-packaging-to-generate-a-zip-file - public static void AddFileToZip( - string zipFilename, string fileToAdd, - CompressionOption compression = CompressionOption.Normal, - FileMode fileMode = FileMode.OpenOrCreate) - { - using (Package zip = System.IO.Packaging.Package.Open(zipFilename, FileMode.OpenOrCreate)) - { - string destFilename = ".\\" + Path.GetFileName(fileToAdd); - Uri uri = PackUriHelper.CreatePartUri(new Uri(destFilename, UriKind.Relative)); - if (zip.PartExists(uri)) - { - zip.DeletePart(uri); - } - PackagePart part = zip.CreatePart(uri, "", compression); - using (FileStream fileStream = new FileStream(fileToAdd, FileMode.Open, FileAccess.Read)) - { - using (Stream dest = part.GetStream()) - { - fileStream.CopyTo(dest); - } - } - } - } - - // - // some URL enabled path handling - // - - /// - /// Uses System.IO.Path.GetExtension() to determine the extension part - /// of a path. If a URL based query is added to the extension, remove this. - /// - public static string GetExtensionWoQuery(string fn) - { - // access - if (fn == null) - return null; - - // use system function - var ext = System.IO.Path.GetExtension(fn).ToLower().Trim(); - - // as URLs *might* have an extension, but a loto f query string afterwards, - // lets try to cut of it - var extMatch = Regex.Match(ext, @"([._A-Za-z0-9]+)"); - if (extMatch.Success) - ext = extMatch.Groups[1].ToString(); - - // ok - return ext; - } - - // - // Base 64 - // - - public static string Base64Encode(string plainText) - { - var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText); - return System.Convert.ToBase64String(plainTextBytes); - } - - public static string Base64Decode(string base64EncodedData) - { - var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData); - return System.Text.Encoding.UTF8.GetString(base64EncodedBytes); - } - - public static bool CheckIfAsciiOnly(byte[] data, int bytesToCheck = int.MaxValue) - { - if (data == null) - return true; - - var ascii = true; - for (int i = 0; i < Math.Min(data.Length, bytesToCheck); i++) - if (data[i] >= 128) - ascii = false; - return ascii; - } - - // see: https://stackoverflow.com/questions/5209506/how-can-i-know-what-image-format-i-get-from-a-stream - // based on https://devblogs.microsoft.com/scripting/psimaging-part-1-test-image/ - // see https://en.wikipedia.org/wiki/List_of_file_signatures - /* Bytes in c# have a range of 0 to 255 so each byte can be represented as - * a two digit hex string. */ - private static readonly Dictionary SignatureTable = new Dictionary - { - { - ".jpg", - new[] - { - new[] {"FF", "D8", "FF", "DB"}, - new[] {"FF", "D8", "FF", "EE"}, - new[] {"FF", "D8", "FF", "E0", "00", "10", "4A", "46", "49", "46", "00", "01"} - } - }, - { - ".gif", - new[] - { - new [] { "47", "49", "46", "38", "37", "61" }, - new [] { "47", "49", "46", "38", "39", "61" } - } - }, - { - ".png", - new[] - { - new[] {"89", "50", "4E", "47", "0D", "0A", "1A", "0A"} - } - }, - { - ".bmp", - new [] - { - new[] { "42", "4D" } - } - } - }; - - /// - /// Takes a byte array and determines the image file type by - /// comparing the first few bytes of the file to a list of known - /// image file signatures. - /// - public static string GuessImageTypeExtension(byte[] imageData) - { - foreach (KeyValuePair signatureEntry in SignatureTable) - { - foreach (string[] signature in signatureEntry.Value) - { - bool isMatch = true; - for (int i = 0; i < signature.Length; i++) - { - string signatureByte = signature[i]; - - // ToString("X") gets the hex representation and pads it to always be length 2 - string imageByte = imageData[i] - .ToString("X2"); - - if (signatureByte == imageByte) - continue; - isMatch = false; - break; - } - - if (isMatch) - { - return signatureEntry.Key; - } - } - } - - return null; - } - - // - // Generation of Ids - // - - private static Random MyRnd = new Random(); - - public static string GenerateIdAccordingTemplate(string tpl) - { - // generate a deterministic decimal digit string - var decimals = String.Format("{0:ffffyyMMddHHmmss}", DateTime.UtcNow); - decimals = new string(decimals.Reverse().ToArray()); - // convert this to an int - if (!Int64.TryParse(decimals, out Int64 decii)) - decii = MyRnd.Next(Int32.MaxValue); - // make an hex out of this - string hexamals = decii.ToString("X"); - // make an alphanumeric string out of this - string alphamals = ""; - var dii = decii; - while (dii >= 1) - { - var m = dii % 26; - alphamals += Convert.ToChar(65 + m); - dii = dii / 26; - } - - // now, "salt" the strings - for (int i = 0; i < 32; i++) - { - var c = Convert.ToChar(48 + MyRnd.Next(10)); - decimals += c; - hexamals += c; - alphamals += c; - } - - // now, can just use the template - var id = ""; - foreach (var tpli in tpl) - { - if (tpli == 'D' && decimals.Length > 0) - { - id += decimals[0]; - decimals = decimals.Remove(0, 1); - } - else - if (tpli == 'X' && hexamals.Length > 0) - { - id += hexamals[0]; - hexamals = hexamals.Remove(0, 1); - } - else - if (tpli == 'A' && alphamals.Length > 0) - { - id += alphamals[0]; - alphamals = alphamals.Remove(0, 1); - } - else - id += tpli; - } - - // ok - return id; - } - - public static string RemoveNewLinesAndLimit(string input, int maxLength = -1, string ellipsis = "..") - { - // access - if (input == null) - return null; - - // maybe do a generouse limit first - if (maxLength >= 1 && input.Length > 2 * maxLength) - input = input.Substring(0, 2 * maxLength); - - // now do expensive operations - input = input.Replace('\r', ' '); - input = input.Replace('\n', ' '); - input = Regex.Replace(input, @"\s+", " ", RegexOptions.Compiled); - - // now apply exact limit - if (maxLength >= 1 && input.Length > maxLength) - input = input.Substring(0, maxLength) + ellipsis; - - // ok - return input; - } - - // - // language handling - // (used by some function on this basic level) - // - - public static string DefaultLngIso639 = "en?"; - - public static string GetDefaultLngIso639() - { - return DefaultLngIso639; - } - } -} diff --git a/src/AasxCsharpLibrary/AdminShellValidate.cs b/src/AasxCsharpLibrary/AdminShellValidate.cs deleted file mode 100644 index 028062908..000000000 --- a/src/AasxCsharpLibrary/AdminShellValidate.cs +++ /dev/null @@ -1,320 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using JetBrains.Annotations; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Text.RegularExpressions; -using System.Xml; -using System.Xml.Schema; -using Environment = System.Environment; - -namespace AdminShellNS -{ - /// - /// validates the XML content against the AASX XML schema. - /// - /// Please produce instances with . - /// - public class XmlValidator - { - private System.Xml.Schema.XmlSchemaSet xmlSchemaSet; - - internal XmlValidator(XmlSchemaSet xmlSchemaSet) - { - this.xmlSchemaSet = xmlSchemaSet; - } - - /// - /// validates the given XML content and stores the results in the . - /// - /// Validation records - /// Content to be validated - public void Validate(AasValidationRecordList recs, Stream xmlContent) - { - if (recs == null) - throw new ArgumentException($"Unexpected null {nameof(recs)}"); - - if (xmlContent == null) - throw new ArgumentException($"Unexpected null {nameof(xmlContent)}"); - - // load/ validate on same records - var settings = new System.Xml.XmlReaderSettings(); - settings.ValidationType = System.Xml.ValidationType.Schema; - settings.Schemas = xmlSchemaSet; - - settings.ValidationEventHandler += - (object sender, System.Xml.Schema.ValidationEventArgs e) => - { - recs.Add( - new AasValidationRecord( - AasValidationSeverity.Serialization, null, - $"XML: {e?.Exception?.LineNumber}, {e?.Exception?.LinePosition}: {e?.Message}")); - }; - - // use the xml stream - using (var reader = System.Xml.XmlReader.Create(xmlContent, settings)) - { - while (reader.Read()) - { - // Invoke callbacks - }; - } - } - } - - public enum AasValidationSeverity - { - Hint, Warning, SpecViolation, SchemaViolation, Serialization - } - - [UsedImplicitlyAttribute] // for eventual use - public enum AasValidationAction - { - No, ToBeDeleted - } - - public class AasValidationRecord - { - public AasValidationSeverity Severity = AasValidationSeverity.Hint; - public IReferable Source = null; - public string Message = ""; - - public Action Fix = null; - - public AasValidationRecord(AasValidationSeverity Severity, IReferable Source, - string Message, Action Fix = null) - { - this.Severity = Severity; - this.Source = Source; - this.Message = Message; - this.Fix = Fix; - } - - public override string ToString() - { - return $"[{Severity.ToString()}] in {"" + Source?.ToString()}: {"" + Message}"; - } - - public string DisplaySeverity { get { return "" + Severity.ToString(); } } - public string DisplaySource - { - get - { - return "" + ((Source != null) ? Source.ToString() : "(whole content)"); - } - } - public string DisplayMessage { get { return "" + Message?.ToString(); } } - } - - public class AasValidationRecordList : List - { - } - - public static class AasSchemaValidation - { - public enum SerializationFormat { XML, JSON } - - public static string[] GetSchemaResources(SerializationFormat fmt) - { - if (fmt == SerializationFormat.XML) - { - return new[] - { - "AdminShellNS.Resources.schemaV201.AAS.xsd", - "AdminShellNS.Resources.schemaV201.AAS_ABAC.xsd", - "AdminShellNS.Resources.schemaV201.IEC61360.xsd" - }; - } - if (fmt == SerializationFormat.JSON) - { - return new[] - { - "AdminShellNS.Resources.schemaV201.aas.json" - }; - } - return null; - } - - /// - /// produces a validator which validates XML AASX files. - /// - /// initialized validator - public static XmlValidator NewXmlValidator() - { - // Load the schema files - var files = GetSchemaResources(SerializationFormat.XML); - if (files == null) - throw new InvalidOperationException("No XML schema files could be found in the resources."); - - var xmlSchemaSet = new System.Xml.Schema.XmlSchemaSet(); - xmlSchemaSet.XmlResolver = new System.Xml.XmlUrlResolver(); - - try - { - Assembly myAssembly = Assembly.GetExecutingAssembly(); - foreach (var schemaFn in files) - { - using (Stream schemaStream = myAssembly.GetManifestResourceStream(schemaFn)) - { - using (XmlReader schemaReader = XmlReader.Create(schemaStream)) - { - xmlSchemaSet.Add(null, schemaReader); - } - } - } - } - catch (Exception ex) - { - throw new FileNotFoundException( - $"Error accessing embedded resource schema files: {ex.Message}"); - } - - var newRecs = new AasValidationRecordList(); - - // set up messages - xmlSchemaSet.ValidationEventHandler += (object sender, System.Xml.Schema.ValidationEventArgs e) => - { - newRecs.Add( - new AasValidationRecord( - AasValidationSeverity.Serialization, null, - $"{e?.Exception?.LineNumber}, {e?.Exception?.LinePosition}: {e?.Message}")); - }; - - // compile - try - { - xmlSchemaSet.Compile(); - } - catch (Exception ex) - { - throw new InvalidOperationException( - $"Error compiling schema files: {ex.Message}"); - } - - if (newRecs.Count > 0) - { - var parts = new List { $"Failed to compile the schema files:" }; - parts.AddRange(newRecs.Select((r) => r.Message)); - throw new InvalidOperationException(string.Join(Environment.NewLine, parts)); - } - - return new XmlValidator(xmlSchemaSet); - } - - /// - /// creates an XML validator and applies it on the given content. - /// - /// If you repeatedly need to validate XML against a schema, re-use an instance of - /// produced with . - /// - /// Validation records - /// Content to be validated - public static void ValidateXML(AasValidationRecordList recs, Stream xmlContent) - { - var validator = NewXmlValidator(); - validator.Validate(recs, xmlContent); - } - - public static int ValidateJSONAlternative(AasValidationRecordList recs, Stream jsonContent) - { - // see: https://github.com/RicoSuter/NJsonSchema/wiki/JsonSchemaValidator - var newRecs = new AasValidationRecordList(); - - // access - if (recs == null || jsonContent == null) - return -1; - - // Load the schema files - // right now: exactly ONE schema file - var files = GetSchemaResources(SerializationFormat.JSON); - if (files == null || files.Length != 1) - return -1; - - NJsonSchema.JsonSchema schema = null; - - try - { - Assembly myAssembly = Assembly.GetExecutingAssembly(); - foreach (var schemaFn in files) - { - using (Stream schemaStream = myAssembly.GetManifestResourceStream(schemaFn)) - { - using (var streamReader = new StreamReader(schemaStream)) - { - var allTxt = streamReader.ReadToEnd(); - schema = NJsonSchema.JsonSchema.FromJsonAsync(allTxt).GetAwaiter().GetResult(); - break; - } - } - } - } - catch (Exception ex) - { - throw new FileNotFoundException("ValidateJSON: Error loading schema: " + - ex.Message); - } - - if (schema == null) - { - throw new FileNotFoundException("ValidateJSON: Schema not found properly."); - } - - // create validator - var validator = new NJsonSchema.Validation.JsonSchemaValidator(); - - // load the JSON content - string jsonTxt = null; - try - { - using (var streamReader = new StreamReader(jsonContent)) - { - jsonTxt = streamReader.ReadToEnd(); - } - } - catch (Exception ex) - { - throw new InvalidOperationException("ValidateJSON: Error loading JSON content: " + - ex.Message); - } - - if (jsonTxt == null || jsonTxt == "") - throw new InvalidOperationException("ValidateJSON: Error loading JSON content gave null."); - - // validate - ICollection errors; - try - { - errors = validator.Validate(jsonTxt, schema); - } - catch (Exception ex) - { - throw new InvalidOperationException("ValidateJSON: Error when validating: " + - ex.Message); - } - - // re-format messages - if (errors != null) - foreach (var ve in errors) - { - var msg = ("" + ve.ToString()); - msg = Regex.Replace(msg, @"\s+", " "); - newRecs.Add(new AasValidationRecord(AasValidationSeverity.Serialization, null, - $"JSON: {ve.LineNumber,5},{ve.LinePosition:3}: {msg}")); - } - - // result - recs.AddRange(newRecs); - return newRecs.Count; - } - } -} diff --git a/src/AasxCsharpLibrary/Display/EnumerationPlacmentBase.cs b/src/AasxCsharpLibrary/Display/EnumerationPlacmentBase.cs deleted file mode 100644 index cabfedcf0..000000000 --- a/src/AasxCsharpLibrary/Display/EnumerationPlacmentBase.cs +++ /dev/null @@ -1,15 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -namespace AdminShellNS -{ - public class EnumerationPlacmentBase - { - - } -} diff --git a/src/AasxCsharpLibrary/Display/EnumerationPlacmentOperationVariable.cs b/src/AasxCsharpLibrary/Display/EnumerationPlacmentOperationVariable.cs deleted file mode 100644 index 39e005483..000000000 --- a/src/AasxCsharpLibrary/Display/EnumerationPlacmentOperationVariable.cs +++ /dev/null @@ -1,16 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -namespace AdminShellNS -{ - public class EnumerationPlacmentOperationVariable : EnumerationPlacmentBase - { - public OperationVariableDirection Direction; - public OperationVariable OperationVariable; - } -} diff --git a/src/AasxCsharpLibrary/Display/OperationVariableDirection.cs b/src/AasxCsharpLibrary/Display/OperationVariableDirection.cs deleted file mode 100644 index 479344aa0..000000000 --- a/src/AasxCsharpLibrary/Display/OperationVariableDirection.cs +++ /dev/null @@ -1,17 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -namespace AdminShellNS -{ - public enum OperationVariableDirection - { - In, - Out, - InOut - } -} diff --git a/src/AasxCsharpLibrary/Exceptions/MetamodelVerificationException.cs b/src/AasxCsharpLibrary/Exceptions/MetamodelVerificationException.cs deleted file mode 100644 index c392c6441..000000000 --- a/src/AasxCsharpLibrary/Exceptions/MetamodelVerificationException.cs +++ /dev/null @@ -1,26 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System; -using System.Collections.Generic; -using static AasCore.Aas3_0.Reporting; - -namespace AdminShellNS.Exceptions -{ - public class MetamodelVerificationException : Exception - { - public List ErrorList { get; } - - public MetamodelVerificationException(List errorList) : base($"The request body not conformant with the metamodel. Found {errorList.Count} errors !!") - { - ErrorList = errorList; - } - - - } -} diff --git a/src/AasxCsharpLibrary/Exceptions/NullValueException.cs b/src/AasxCsharpLibrary/Exceptions/NullValueException.cs deleted file mode 100644 index bd6eea201..000000000 --- a/src/AasxCsharpLibrary/Exceptions/NullValueException.cs +++ /dev/null @@ -1,20 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System; - -namespace AdminShellNS.Exceptions -{ - public class NullValueException : Exception - { - public NullValueException(string field) : base($"The field {field} is null!!") - { - - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/AasElementSelfDescription.cs b/src/AasxCsharpLibrary/Extensions/AasElementSelfDescription.cs deleted file mode 100644 index 30f50dee3..000000000 --- a/src/AasxCsharpLibrary/Extensions/AasElementSelfDescription.cs +++ /dev/null @@ -1,30 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -namespace Extensions -{ - public class AasElementSelfDescription - { - public string AasElementName { get; set; } - - public string ElementAbbreviation { get; set; } - - public KeyTypes? KeyType { get; set; } - - public AasSubmodelElements? SmeType { get; set; } - - public AasElementSelfDescription(string aasElementName, string elementAbbreviation, - KeyTypes? keyType, AasSubmodelElements? smeType) - { - AasElementName = aasElementName; - ElementAbbreviation = elementAbbreviation; - KeyType = keyType; - SmeType = smeType; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ComparerUtils.cs b/src/AasxCsharpLibrary/Extensions/ComparerUtils.cs deleted file mode 100644 index b3cf12662..000000000 --- a/src/AasxCsharpLibrary/Extensions/ComparerUtils.cs +++ /dev/null @@ -1,69 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System.Collections.Generic; -using System.Globalization; - -namespace Extensions -{ - public static class CompareUtils - { - public static bool Compare(T x, T y) - { - return EqualityComparer.Default.Equals(x, y); - } - } - public class ComparerIdShort : IComparer - { - public int Compare(IReferable a, IReferable b) - { - return string.Compare(a?.IdShort, b?.IdShort, - CultureInfo.InvariantCulture, CompareOptions.IgnoreCase); - } - } - - public class ComparerIdentification : IComparer - { - public int Compare(IIdentifiable a, IIdentifiable b) - { - return string.Compare(a.Id, b.Id, - CultureInfo.InvariantCulture, CompareOptions.IgnoreCase | CompareOptions.IgnoreNonSpace); - } - } - - - - public class ComparerIndexed : IComparer - { - public int NullIndex = int.MaxValue; - public Dictionary Index = new(); - - public int Compare(IReferable a, IReferable b) - { - var ca = Index.ContainsKey(a); - var cb = Index.ContainsKey(b); - - if (!ca && !cb) - return 0; - // make CDs without usage to appear at end of list - if (!ca) - return +1; - if (!cb) - return -1; - - var ia = Index[a]; - var ib = Index[b]; - - if (ia == ib) - return 0; - if (ia < ib) - return -1; - return +1; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendAnnotatedRelationshipElement.cs b/src/AasxCsharpLibrary/Extensions/ExtendAnnotatedRelationshipElement.cs deleted file mode 100644 index 3538adfa1..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendAnnotatedRelationshipElement.cs +++ /dev/null @@ -1,132 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using AdminShellNS; -using AdminShellNS.Extensions; -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Extensions -{ - public static class ExtendAnnotatedRelationshipElement - { - #region AasxPackageExplorer - - public static void Add(this AnnotatedRelationshipElement annotatedRelationshipElement, ISubmodelElement submodelElement) - { - if (annotatedRelationshipElement != null) - { - annotatedRelationshipElement.Annotations ??= new(); - - submodelElement.Parent = annotatedRelationshipElement; - - annotatedRelationshipElement.Annotations.Add((IDataElement)submodelElement); - } - } - - public static void Remove(this AnnotatedRelationshipElement annotatedRelationshipElement, ISubmodelElement submodelElement) - { - if (annotatedRelationshipElement != null) - { - if (annotatedRelationshipElement.Annotations != null) - { - annotatedRelationshipElement.Annotations.Remove((IDataElement)submodelElement); - } - } - } - - public static object AddChild( - this AnnotatedRelationshipElement annotatedRelationshipElement, - ISubmodelElement childSubmodelElement, - EnumerationPlacmentBase placement = null) - { - if (childSubmodelElement == null || childSubmodelElement is not IDataElement) - return null; - - annotatedRelationshipElement.Annotations ??= new(); - - if (childSubmodelElement != null) - childSubmodelElement.Parent = annotatedRelationshipElement; - - annotatedRelationshipElement.Annotations.Add((IDataElement)childSubmodelElement); - return childSubmodelElement; - } - - #endregion - public static AnnotatedRelationshipElement ConvertAnnotationsFromV20(this AnnotatedRelationshipElement annotatedRelationshipElement, AasxCompatibilityModels.AdminShellV20.AnnotatedRelationshipElement sourceAnnotedRelElement) - { - if (sourceAnnotedRelElement == null) - { - return null; - } - - if (!sourceAnnotedRelElement.annotations.IsNullOrEmpty()) - { - annotatedRelationshipElement.Annotations ??= new List(); - foreach (var submodelElementWrapper in sourceAnnotedRelElement.annotations) - { - var sourceSubmodelElement = submodelElementWrapper.submodelElement; - ISubmodelElement outputSubmodelElement = null; - if (sourceSubmodelElement != null) - { - outputSubmodelElement = outputSubmodelElement.ConvertFromV20(sourceSubmodelElement); - } - annotatedRelationshipElement.Annotations.Add((IDataElement)outputSubmodelElement); - } - } - - return annotatedRelationshipElement; - } - - public static T FindFirstIdShortAs(this AnnotatedRelationshipElement annotedRelationshipElement, string idShort) where T : ISubmodelElement - { - - var submodelElements = annotedRelationshipElement.Annotations.Where(sme => sme != null && sme is T && sme.IdShort.Equals(idShort, StringComparison.OrdinalIgnoreCase)); - - if (submodelElements.Any()) - { - return (T)submodelElements.First(); - } - - return default; - } - - public static AnnotatedRelationshipElement Set(this AnnotatedRelationshipElement elem, - Reference first, Reference second) - { - elem.First = first; - elem.Second = second; - return elem; - } - - public static AnnotatedRelationshipElement UpdateFrom( - this AnnotatedRelationshipElement elem, ISubmodelElement source) - { - if (source == null) - return elem; - - ((ISubmodelElement)elem).UpdateFrom(source); - - if (source is ReferenceElement srcRef) - { - if (srcRef.Value != null) - elem.First = srcRef.Value.Copy(); - } - - if (source is RelationshipElement srcRel) - { - if (srcRel.First != null) - elem.First = srcRel.First.Copy(); - } - - return elem; - } - - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendAssetAdministrationShell.cs b/src/AasxCsharpLibrary/Extensions/ExtendAssetAdministrationShell.cs deleted file mode 100644 index b2d2407b8..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendAssetAdministrationShell.cs +++ /dev/null @@ -1,271 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using AdminShellNS; -using AdminShellNS.Extensions; -using System; -using System.Collections.Generic; -using System.Text.RegularExpressions; - -namespace Extensions -{ - public static class ExtendAssetAdministrationShell - { - #region AasxPackageExplorer - - public static Tuple ToCaptionInfo(this IAssetAdministrationShell assetAdministrationShell) - { - var caption = AdminShellUtil.EvalToNonNullString("\"{0}\" ", assetAdministrationShell.IdShort, "\"AAS\""); - if (assetAdministrationShell.Administration != null) - caption += "V" + assetAdministrationShell.Administration.Version + "." + assetAdministrationShell.Administration.Revision; - - var info = ""; - if (assetAdministrationShell.Id != null) - info = $"[{assetAdministrationShell.Id}]"; - return Tuple.Create(caption, info); - } - - public static IEnumerable FindAllReferences(this IAssetAdministrationShell assetAdministrationShell) - { - // dead-csharp off - // Asset - //TODO (jtikekar, 0000-00-00): support asset - //if (assetAdministrationShell.AssetInformation != null) - // yield return new LocatedReference(assetAdministrationShell, assetAdministrationShell.AssetInformation); - // dead-csharp on - // Submodel references - if (assetAdministrationShell.Submodels != null) - foreach (var r in assetAdministrationShell.Submodels) - yield return new LocatedReference(assetAdministrationShell, r); - - } - - #endregion - - public static bool HasSubmodelReference(this IAssetAdministrationShell assetAdministrationShell, Reference submodelReference) - { - if (submodelReference == null) - { - return false; - } - - foreach (var aasSubmodelReference in assetAdministrationShell.Submodels) - { - if (aasSubmodelReference.Matches(submodelReference)) - { - return true; - } - } - - return false; - } - - public static void AddSubmodelReference(this IAssetAdministrationShell assetAdministrationShell, IReference newSubmodelReference) - { - if (assetAdministrationShell.Submodels == null) - { - assetAdministrationShell.Submodels = new List(); - } - - assetAdministrationShell.Submodels.Add(newSubmodelReference); - } - - //TODO (jtikekar, 0000-00-00): Change the name, currently based on older implementation - public static string GetFriendlyName(this IAssetAdministrationShell assetAdministrationShell) - { - if (string.IsNullOrEmpty(assetAdministrationShell.IdShort)) - { - return null; - } - - return Regex.Replace(assetAdministrationShell.IdShort, @"[^a-zA-Z0-9\-_]", "_"); - } - - public static AssetAdministrationShell ConvertFromV10(this AssetAdministrationShell assetAdministrationShell, AasxCompatibilityModels.AdminShellV10.AdministrationShell sourceAas) - { - if (sourceAas == null) - { - return null; - } - - if (string.IsNullOrEmpty(sourceAas.idShort)) - { - assetAdministrationShell.IdShort = ""; - } - else - { - assetAdministrationShell.IdShort = sourceAas.idShort; - } - - if (sourceAas.description != null) - { - assetAdministrationShell.Description = ExtensionsUtil.ConvertDescriptionFromV10(sourceAas.description); - } - - if (sourceAas.administration != null) - { - assetAdministrationShell.Administration = new AdministrativeInformation(version: sourceAas.administration.version, revision: sourceAas.administration.revision); - } - - if (sourceAas.derivedFrom != null) - { - var newKeyList = new List(); - - foreach (var sourceKey in sourceAas.derivedFrom.Keys) - { - var keyType = Stringification.KeyTypesFromString(sourceKey.type); - if (keyType != null) - { - newKeyList.Add(new Key((KeyTypes)keyType, sourceKey.value)); - } - else - { - Console.WriteLine($"KeyType value {sourceKey.type} not found."); - } - } - assetAdministrationShell.DerivedFrom = new Reference(ReferenceTypes.ExternalReference, newKeyList); - } - - if (!sourceAas.submodelRefs.IsNullOrEmpty()) - { - foreach (var submodelRef in sourceAas.submodelRefs) - { - if (!submodelRef.IsEmpty) - { - var keyList = new List(); - foreach (var refKey in submodelRef.Keys) - { - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {refKey.type} not found."); - } - } - assetAdministrationShell.Submodels ??= new List(); - assetAdministrationShell.Submodels.Add(new Reference(ReferenceTypes.ModelReference, keyList)); - } - } - } - - if (sourceAas.hasDataSpecification != null && sourceAas.hasDataSpecification.reference.Count > 0) - { - //TODO (jtikekar, 0000-00-00): EmbeddedDataSpecification?? (as per old implementation) - assetAdministrationShell.EmbeddedDataSpecifications ??= new List(); - foreach (var dataSpecification in sourceAas.hasDataSpecification.reference) - { - if (!dataSpecification.IsEmpty) - { - assetAdministrationShell.EmbeddedDataSpecifications.Add(new EmbeddedDataSpecification( - ExtensionsUtil.ConvertReferenceFromV10(dataSpecification, ReferenceTypes.ExternalReference), - null)); - } - } - } - - return assetAdministrationShell; - } - - public static AssetAdministrationShell ConvertFromV20(this AssetAdministrationShell assetAdministrationShell, AasxCompatibilityModels.AdminShellV20.AdministrationShell sourceAas) - { - if (sourceAas == null) - { - return null; - } - - if (string.IsNullOrEmpty(sourceAas.idShort)) - { - assetAdministrationShell.IdShort = ""; - } - else - { - assetAdministrationShell.IdShort = sourceAas.idShort; - } - - if (sourceAas.description != null) - { - assetAdministrationShell.Description = ExtensionsUtil.ConvertDescriptionFromV20(sourceAas.description); - } - - if (sourceAas.administration != null) - { - assetAdministrationShell.Administration = new AdministrativeInformation(version: sourceAas.administration.version, revision: sourceAas.administration.revision); - } - - if (sourceAas.derivedFrom != null) - { - var newKeyList = new List(); - - foreach (var sourceKey in sourceAas.derivedFrom.Keys) - { - var keyType = Stringification.KeyTypesFromString(sourceKey.type); - if (keyType != null) - { - newKeyList.Add(new Key((KeyTypes)keyType, sourceKey.value)); - } - else - { - Console.WriteLine($"KeyType value {sourceKey.type} not found."); - } - } - assetAdministrationShell.DerivedFrom = new Reference(ReferenceTypes.ExternalReference, newKeyList); - } - - if (!sourceAas.submodelRefs.IsNullOrEmpty()) - { - foreach (var submodelRef in sourceAas.submodelRefs) - { - if (!submodelRef.IsEmpty) - { - var keyList = new List(); - foreach (var refKey in submodelRef.Keys) - { - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {refKey.type} not found."); - } - } - assetAdministrationShell.Submodels ??= new List(); - assetAdministrationShell.Submodels.Add(new Reference(ReferenceTypes.ModelReference, keyList)); - } - } - } - - if (sourceAas.hasDataSpecification != null && sourceAas.hasDataSpecification.Count > 0) - { - //TODO (jtikekar, 0000-00-00): EmbeddedDataSpecification?? (as per old implementation) - if (assetAdministrationShell.EmbeddedDataSpecifications == null) - { - assetAdministrationShell.EmbeddedDataSpecifications = new List(); - } - - //TODO (jtikekar, 0000-00-00): DataSpecificationContent?? (as per old implementation) - foreach (var sourceDataSpec in sourceAas.hasDataSpecification) - { - if (sourceDataSpec.dataSpecification != null) - { - assetAdministrationShell.EmbeddedDataSpecifications.Add( - new EmbeddedDataSpecification( - ExtensionsUtil.ConvertReferenceFromV20(sourceDataSpec.dataSpecification, ReferenceTypes.ExternalReference), - null)); - } - } - } - - return assetAdministrationShell; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendAssetInformation.cs b/src/AasxCsharpLibrary/Extensions/ExtendAssetInformation.cs deleted file mode 100644 index 29250c4c3..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendAssetInformation.cs +++ /dev/null @@ -1,65 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System; - -namespace Extensions -{ - public static class ExtendAssetInformation - { - #region AasxPackageExplorer - - public static Tuple ToCaptionInfo(this IAssetInformation assetInformation) - { - // dead-csharp off - //TODO (jtikekar, 0000-00-00): support KeyType.AssetInformation - //var caption = Key.AssetInformation; - // dead-csharp on - var caption = "AssetInformation"; - var info = "" + assetInformation.GlobalAssetId; - return Tuple.Create(caption, info); - } - - #endregion - public static AssetInformation ConvertFromV10(this AssetInformation assetInformation, AasxCompatibilityModels.AdminShellV10.Asset sourceAsset) - { - //Determine AssetKind - var assetKind = AssetKind.Instance; - if (sourceAsset.kind.IsType) - { - assetKind = AssetKind.Type; - } - - assetInformation.AssetKind = assetKind; - - - //Assign GlobalAssetId - assetInformation.GlobalAssetId = sourceAsset.identification.id; - - return assetInformation; - } - - public static AssetInformation ConvertFromV20(this AssetInformation assetInformation, AasxCompatibilityModels.AdminShellV20.Asset sourceAsset) - { - //Determine AssetKind - var assetKind = AssetKind.Instance; - if (sourceAsset.kind.IsType) - { - assetKind = AssetKind.Type; - } - - assetInformation.AssetKind = assetKind; - - - //Assign GlobalAssetId - assetInformation.GlobalAssetId = sourceAsset.identification.id; - - return assetInformation; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendBlob.cs b/src/AasxCsharpLibrary/Extensions/ExtendBlob.cs deleted file mode 100644 index d8ee065e8..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendBlob.cs +++ /dev/null @@ -1,75 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System.Text; - -namespace Extensions -{ - public static class ExtendBlob - { - public static void Set(this Blob blob, - string contentType = "", byte[]? value = null) - { - blob.ContentType = contentType; - blob.Value = value; - } - - public static Blob ConvertFromV10(this Blob blob, AasxCompatibilityModels.AdminShellV10.Blob sourceBlob) - { - blob.ContentType = sourceBlob.mimeType; - blob.Value = Encoding.ASCII.GetBytes(sourceBlob.value); - return blob; - } - - public static Blob ConvertFromV20(this Blob blob, AasxCompatibilityModels.AdminShellV20.Blob sourceBlob) - { - blob.ContentType = sourceBlob.mimeType; - if (!string.IsNullOrEmpty(sourceBlob.value)) - { - blob.Value = Encoding.ASCII.GetBytes(sourceBlob.value); - } - return blob; - } - - public static Blob UpdateFrom(this Blob elem, ISubmodelElement source) - { - if (source == null) - return elem; - - ((ISubmodelElement)elem).UpdateFrom(source); - - if (source is Property srcProp) - { - if (srcProp.Value != null) - elem.Value = Encoding.Default.GetBytes(srcProp.Value); - } - - if (source is AasCore.Aas3_0.Range srcRng) - { - if (srcRng.Min != null) - elem.Value = Encoding.Default.GetBytes(srcRng.Min); - } - - if (source is MultiLanguageProperty srcMlp) - { - var s = srcMlp.Value?.GetDefaultString(); - if (s != null) - elem.Value = Encoding.Default.GetBytes(s); - } - - if (source is File srcFile) - { - if (srcFile.Value != null) - elem.Value = Encoding.Default.GetBytes(srcFile.Value); - } - - return elem; - } - - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendCollection.cs b/src/AasxCsharpLibrary/Extensions/ExtendCollection.cs deleted file mode 100644 index 3acde94a4..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendCollection.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Collections.Generic; - -namespace AdminShellNS.Extensions -{ - public static class ExtendCollection - { - public static bool IsNullOrEmpty(this List list) - { - if (list != null && list.Count != 0) - { - return false; - } - - return true; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendConceptDescription.cs b/src/AasxCsharpLibrary/Extensions/ExtendConceptDescription.cs deleted file mode 100644 index 7bb64c7e8..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendConceptDescription.cs +++ /dev/null @@ -1,320 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using AdminShellNS; -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Extensions -{ - public static class ExtendConceptDescription - { - #region AasxPackageExplorer - - public static string GetDefaultPreferredName(this IConceptDescription conceptDescription, string defaultLang = null) - { - return "" + - conceptDescription.GetIEC61360()? - .PreferredName?.GetDefaultString(defaultLang); - } - - public static EmbeddedDataSpecification SetIEC61360Spec(this IConceptDescription conceptDescription, - string[] preferredNames = null, - string shortName = "", - string unit = "", - Reference unitId = null, - string valueFormat = null, - string sourceOfDefinition = null, - string symbol = null, - string dataType = "", - string[] definition = null - ) - { - var eds = new EmbeddedDataSpecification( - new Reference(ReferenceTypes.ExternalReference, - new List { ExtendIDataSpecificationContent.GetKeyForIec61360() }), - new DataSpecificationIec61360( - ExtendLangStringSet.CreateManyPreferredNamesFromStringArray(preferredNames), - new List { - new LangStringShortNameTypeIec61360(AdminShellUtil.GetDefaultLngIso639(), shortName) }, - unit, - unitId, - sourceOfDefinition, - symbol, - Stringification.DataTypeIec61360FromString(dataType), - ExtendLangStringSet.CreateManyDefinitionFromStringArray(definition) - )); - - conceptDescription.EmbeddedDataSpecifications = new List { eds }; - // dead-csharp off - // TODO (MIHO, 2022-12-22): Check, but I think it makes no sense - // conceptDescription.IsCaseOf ??= new List(); - // conceptDescription.IsCaseOf.Add(new Reference(ReferenceTypes.ModelReference, new List() { new Key(KeyTypes.ConceptDescription, conceptDescription.Id) })); - - return eds; - } - - /* - - public static DataSpecificationIec61360 CreateDataSpecWithContentIec61360(this ConceptDescription conceptDescription) - { - var eds = EmbeddedDataSpecification.CreateIEC61360WithContent(); - conceptDescription.EmbeddedDataSpecification ??= new HasDataSpecification(); - conceptDescription.EmbeddedDataSpecification.Add(eds); - return eds.DataSpecificationContent?.DataSpecificationIEC61360; - } - - */ - // dead-csharp on - - public static Tuple ToCaptionInfo(this IConceptDescription conceptDescription) - { - var caption = ""; - if (!string.IsNullOrEmpty(conceptDescription.IdShort)) - caption = $"\"{conceptDescription.IdShort.Trim()}\""; - if (conceptDescription.Id != null) - caption = (caption + " " + conceptDescription.Id).Trim(); - - var info = "" + conceptDescription.GetDefaultShortName(); - - return Tuple.Create(caption, info); - } - - public static string GetDefaultShortName(this IConceptDescription conceptDescription, string defaultLang = null) - { - return "" + - conceptDescription.GetIEC61360()? - .ShortName?.GetDefaultString(defaultLang); - } - - public static DataSpecificationIec61360 GetIEC61360(this IConceptDescription conceptDescription) - { - return conceptDescription.EmbeddedDataSpecifications?.GetIEC61360Content(); - } - - //TODO (jtikekar, 0000-00-00): DataSpecificationPhysicalUnit -#if SupportDataSpecificationPhysicalUnit - public static DataSpecificationPhysicalUnit GetPhysicalUnit(this ConceptDescription conceptDescription) - { - return conceptDescription.EmbeddedDataSpecifications?.GetPhysicalUnitContent(); - } -#endif - - public static IEnumerable FindAllReferences(this IConceptDescription conceptDescription) - { - yield break; - } - - #endregion - #region ListOfConceptDescription - public static IConceptDescription AddConceptDescriptionOrReturnExisting(this List conceptDescriptions, ConceptDescription newConceptDescription) - { - if (newConceptDescription == null) - { - return null; - } - if (conceptDescriptions != null) - { - var existingCd = conceptDescriptions.Where(c => c.Id == newConceptDescription.Id).FirstOrDefault(); - if (existingCd != null) - { - return existingCd; - } - else - { - conceptDescriptions.Add(newConceptDescription); - } - } - - return newConceptDescription; - } - #endregion - - public static void Validate( - this IConceptDescription conceptDescription, AasValidationRecordList results) - { - // access - if (results == null) - return; - - // dead-csharp off - // check CD itself - //Handled by BaseValidation Method - //conceptDescription.Validate(results); - - // check IEC61360 spec - - //TODO (jtikekar, 0000-00-00): Temporarily Removed - //var eds61360 = this.IEC61360DataSpec; - //if (eds61360 != null) - //{ - // // check data spec - // if (eds61360.dataSpecification == null || - // !(eds61360.dataSpecification.MatchesExactlyOneKey(DataSpecificationIEC61360.GetKey()))) - // results.Add(new AasValidationRecord( - // AasValidationSeverity.SpecViolation, this, - // "HasDataSpecification: data specification content set to IEC61360, but no " + - // "data specification reference set!", - // () => - // { - // eds61360.dataSpecification = new DataSpecificationRef( - // new Reference( - // DataSpecificationIEC61360.GetKey())); - // })); - - // // validate content - // if (eds61360.dataSpecificationContent?.dataSpecificationIEC61360 == null) - // { - // results.Add(new AasValidationRecord( - // AasValidationSeverity.SpecViolation, this, - // "HasDataSpecification: data specification reference set to IEC61360, but no " + - // "data specification content set!", - // () => - // { - // eds61360.dataSpecificationContent = new DataSpecificationContent(); - // eds61360.dataSpecificationContent.dataSpecificationIEC61360 = - // new DataSpecificationIEC61360(); - // })); - // } - // else - // { - // // validate - // eds61360.dataSpecificationContent.dataSpecificationIEC61360.Validate(results, this); - // } - // dead-csharp on - } - - public static Key GetSingleKey(this IConceptDescription conceptDescription) - { - return new Key(KeyTypes.ConceptDescription, conceptDescription.Id); - } - - public static ConceptDescription ConvertFromV10( - this ConceptDescription conceptDescription, AasxCompatibilityModels.AdminShellV10.ConceptDescription sourceConceptDescription) - { - if (sourceConceptDescription == null) - { - return null; - } - - if (string.IsNullOrEmpty(sourceConceptDescription.idShort)) - { - conceptDescription.IdShort = ""; - } - else - { - conceptDescription.IdShort = sourceConceptDescription.idShort; - } - - if (sourceConceptDescription.description != null) - { - conceptDescription.Description = ExtensionsUtil.ConvertDescriptionFromV10(sourceConceptDescription.description); - } - - if (sourceConceptDescription.administration != null) - { - conceptDescription.Administration = new AdministrativeInformation(version: sourceConceptDescription.administration.version, revision: sourceConceptDescription.administration.revision); - } - - if (sourceConceptDescription.IsCaseOf != null && sourceConceptDescription.IsCaseOf.Count != 0) - { - if (conceptDescription.IsCaseOf == null) - { - conceptDescription.IsCaseOf = new List(); - } - foreach (var caseOf in sourceConceptDescription.IsCaseOf) - { - conceptDescription.IsCaseOf.Add(ExtensionsUtil.ConvertReferenceFromV10(caseOf, ReferenceTypes.ModelReference)); - } - } - - return conceptDescription; - } - - public static ConceptDescription ConvertFromV20( - this ConceptDescription cd, AasxCompatibilityModels.AdminShellV20.ConceptDescription srcCD) - { - if (srcCD == null) - return null; - - if (string.IsNullOrEmpty(srcCD.idShort)) - cd.IdShort = ""; - else - cd.IdShort = srcCD.idShort; - - if (srcCD.identification?.id != null) - cd.Id = srcCD.identification.id; - - if (srcCD.description != null && srcCD.description.langString.Count >= 1) - cd.Description = ExtensionsUtil.ConvertDescriptionFromV20(srcCD.description); - - if (srcCD.administration != null) - cd.Administration = new AdministrativeInformation( - version: srcCD.administration.version, revision: srcCD.administration.revision); - - if (srcCD.IsCaseOf != null && srcCD.IsCaseOf.Count != 0) - { - foreach (var caseOf in srcCD.IsCaseOf) - { - IReference newCaseOf = null; - if(caseOf != null && !caseOf.IsEmpty) - { - newCaseOf = ExtensionsUtil.ConvertReferenceFromV20(caseOf, ReferenceTypes.ModelReference); - } - - if(newCaseOf != null) - { - cd.IsCaseOf ??= new List(); - cd.IsCaseOf.Add(newCaseOf); - } - } - } - - //jtikekar:as per old implementation - if (srcCD.embeddedDataSpecification != null && srcCD.embeddedDataSpecification.Count > 0) - { - foreach (var sourceEds in srcCD.embeddedDataSpecification) - { - var eds = new EmbeddedDataSpecification(null, null); - eds.ConvertFromV20(sourceEds); - cd.AddEmbeddedDataSpecification(eds); - } - } - - return cd; - } - - public static EmbeddedDataSpecification AddEmbeddedDataSpecification( - this IConceptDescription cd, EmbeddedDataSpecification eds) - { - if (cd == null) - return null; - if (cd.EmbeddedDataSpecifications == null) - cd.EmbeddedDataSpecifications = new List(); - if (eds == null) - return null; - cd.EmbeddedDataSpecifications.Add(eds); - return eds; - } - - public static Reference GetCdReference(this IConceptDescription conceptDescription) - { - var key = new Key(KeyTypes.GlobalReference, conceptDescription.Id); - return new Reference(ReferenceTypes.ExternalReference, new List { key }); - } - - public static void AddIsCaseOf(this IConceptDescription cd, - Reference ico) - { - if (cd.IsCaseOf == null) - cd.IsCaseOf = new List(); - cd.IsCaseOf.Add(ico); - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendDataElement.cs b/src/AasxCsharpLibrary/Extensions/ExtendDataElement.cs deleted file mode 100644 index 717fcefcb..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendDataElement.cs +++ /dev/null @@ -1,20 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -namespace Extensions -{ - public static class ExtendDataElement - { - public static DataTypeDefXsd[] ValueTypes_Number = - new[] { DataTypeDefXsd.Decimal, DataTypeDefXsd.Double, DataTypeDefXsd.Float, - DataTypeDefXsd.Integer, DataTypeDefXsd.Long, DataTypeDefXsd.Int, DataTypeDefXsd.Short, - DataTypeDefXsd.Byte, DataTypeDefXsd.NonNegativeInteger, DataTypeDefXsd.NonPositiveInteger, - DataTypeDefXsd.UnsignedInt, DataTypeDefXsd.Integer, DataTypeDefXsd.UnsignedByte, - DataTypeDefXsd.UnsignedLong, DataTypeDefXsd.UnsignedShort, DataTypeDefXsd.NegativeInteger }; - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendDataSpecificationIEC61360.cs b/src/AasxCsharpLibrary/Extensions/ExtendDataSpecificationIEC61360.cs deleted file mode 100644 index 85f3cdee2..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendDataSpecificationIEC61360.cs +++ /dev/null @@ -1,50 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System.Collections.Generic; - -namespace Extensions -{ - public static class ExtendDataSpecificationIEC61360 - { - public static DataSpecificationIec61360 ConvertFromV20(this DataSpecificationIec61360 ds61360, AasxCompatibilityModels.AdminShellV20.DataSpecificationIEC61360 src616360) - { - if (src616360.preferredName != null) - ds61360.PreferredName = new List().ConvertFromV20(src616360.preferredName); - - if (src616360.shortName != null) - ds61360.ShortName = new List().ConvertFromV20(src616360.shortName); - - if (!string.IsNullOrEmpty(src616360.unit)) - { - ds61360.Unit = src616360.unit; - } - - if (src616360.unitId != null) - ds61360.UnitId = ExtensionsUtil.ConvertReferenceFromV20(AasxCompatibilityModels.AdminShellV20.Reference.CreateNew(src616360.unitId.keys), ReferenceTypes.ExternalReference); - - ds61360.ValueFormat = src616360.valueFormat; - ds61360.SourceOfDefinition = src616360.sourceOfDefinition; - ds61360.Symbol = src616360.symbol; - if (!(string.IsNullOrEmpty(src616360.dataType))) - { - var dt = src616360.dataType; - if (!dt.StartsWith("xs:")) - dt = "xs:" + dt; - ds61360.DataType = Stringification.DataTypeIec61360FromString(dt); - } - if (src616360.definition != null) - ds61360.Definition = new List().ConvertFromV20(src616360.definition); - - //TODO (jtikekar, 0000-00-00): check with Andreas - ds61360.Value = ""; - - return ds61360; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendEmbeddedDataSpecification.cs b/src/AasxCsharpLibrary/Extensions/ExtendEmbeddedDataSpecification.cs deleted file mode 100644 index f914e75f8..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendEmbeddedDataSpecification.cs +++ /dev/null @@ -1,118 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System.Collections.Generic; - -namespace Extensions -{ - // TODO (Jui, 2022-12-21): I do not know, if to put the List<> extension here or in a separate file - public static class ExtendListOfEmbeddedDataSpecification - { - public static IEmbeddedDataSpecification FindFirstIEC61360Spec(this List list) - { - foreach (var eds in list) - if (eds?.DataSpecificationContent is DataSpecificationIec61360 - || eds?.DataSpecification?.MatchesExactlyOneKey( - ExtendIDataSpecificationContent.GetKeyForIec61360()) == true) - return eds; - return null; - } - - public static DataSpecificationIec61360 GetIEC61360Content(this List list) - { - foreach (var eds in list) - if (eds?.DataSpecificationContent is DataSpecificationIec61360 dsiec) - return dsiec; - return null; - } - - //TODO (jtikekar, 0000-00-00): DataSpecificationPhysicalUnit -#if SupportDataSpecificationPhysicalUnit - public static DataSpecificationPhysicalUnit GetPhysicalUnitContent(this List list) - { - foreach (var eds in list) - if (eds?.DataSpecificationContent is DataSpecificationPhysicalUnit dspu) - return dspu; - return null; - } -#endif - } - - public static class ExtendEmbeddedDataSpecification - { - public static EmbeddedDataSpecification ConvertFromV20(this EmbeddedDataSpecification embeddedDataSpecification, AasxCompatibilityModels.AdminShellV20.EmbeddedDataSpecification sourceEmbeddedSpec) - { - if (sourceEmbeddedSpec != null) - { - if (sourceEmbeddedSpec.dataSpecification != null) - { - embeddedDataSpecification.DataSpecification = ExtensionsUtil.ConvertReferenceFromV20(sourceEmbeddedSpec.dataSpecification, ReferenceTypes.ExternalReference); - - // TODO (MIHO, 2022-19-12): check again, see questions - var oldid = new[] { - "http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/2/0", - "http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360", - "www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360" - }; - var newid = "http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"; - - // map all "usable" old ids to new one .. - foreach (var oi in oldid) - if (sourceEmbeddedSpec.dataSpecification?.Matches("", false, "IRI", oi, - AasxCompatibilityModels.AdminShellV20.Key.MatchMode.Identification) == true) - { - embeddedDataSpecification.DataSpecification.Keys[0].Value = newid; - } - } - - if (sourceEmbeddedSpec.dataSpecificationContent != null) - { - if (sourceEmbeddedSpec.dataSpecificationContent?.dataSpecificationIEC61360 != null) - { - embeddedDataSpecification.DataSpecificationContent = - new DataSpecificationIec61360(null).ConvertFromV20( - sourceEmbeddedSpec.dataSpecificationContent.dataSpecificationIEC61360); - } - } - } - - return embeddedDataSpecification; - } - - public static EmbeddedDataSpecification CreateIec61360WithContent(DataSpecificationIec61360 content = null) - { - if (content == null) - content = new DataSpecificationIec61360( - new List()); - - var res = new EmbeddedDataSpecification( - new Reference(ReferenceTypes.ExternalReference, - new List(new[] { ExtendIDataSpecificationContent.GetKeyForIec61360() })), - content); - return res; - } - - public static bool FixReferenceWrtContent(this IEmbeddedDataSpecification eds) - { - // does content tell something? - var ctc = ExtendIDataSpecificationContent.GuessContentTypeFor(eds?.DataSpecificationContent); - var ctr = ExtendIDataSpecificationContent.GuessContentTypeFor(eds?.DataSpecification); - - if (ctc == ExtendIDataSpecificationContent.ContentTypes.NoInfo) - return false; - - if (ctr == ctc) - return false; - - // ok, fix - eds.DataSpecification = new Reference(ReferenceTypes.ExternalReference, - new List { ExtendIDataSpecificationContent.GetKeyFor(ctc) }); - return true; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendEntity.cs b/src/AasxCsharpLibrary/Extensions/ExtendEntity.cs deleted file mode 100644 index 7d0376105..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendEntity.cs +++ /dev/null @@ -1,117 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using AdminShellNS; -using AdminShellNS.Extensions; -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Extensions -{ - public static class ExtendEntity - { - #region AasxPackageExplorer - - public static void Add(this Entity entity, ISubmodelElement submodelElement) - { - if (entity != null) - { - entity.Statements ??= new(); - - submodelElement.Parent = entity; - - entity.Statements.Add(submodelElement); - } - } - - public static void Remove(this Entity entity, ISubmodelElement submodelElement) - { - if (entity != null) - { - if (entity.Statements != null) - { - entity.Statements.Remove(submodelElement); - } - } - } - - public static object AddChild(this Entity entity, ISubmodelElement childSubmodelElement, EnumerationPlacmentBase placement = null) - { - if (childSubmodelElement == null) - return null; - if (entity.Statements == null) - entity.Statements = new(); - if (childSubmodelElement != null) - childSubmodelElement.Parent = entity; - entity.Statements.Add(childSubmodelElement); - return childSubmodelElement; - } - - #endregion - public static Entity ConvertFromV20(this Entity entity, AasxCompatibilityModels.AdminShellV20.Entity sourceEntity) - { - if (sourceEntity == null) - { - return null; - } - - if (!sourceEntity.statements.IsNullOrEmpty()) - { - entity.Statements ??= new List(); - foreach (var submodelElementWrapper in sourceEntity.statements) - { - var sourceSubmodelElement = submodelElementWrapper.submodelElement; - ISubmodelElement outputSubmodelElement = null; - if (sourceSubmodelElement != null) - { - outputSubmodelElement = outputSubmodelElement.ConvertFromV20(sourceSubmodelElement); - } - entity.Statements.Add(outputSubmodelElement); - } - } - - if (sourceEntity.assetRef != null) - { - //TODO (jtikekar, 0000-00-00): whether to convert to Global or specific asset id - var assetRef = ExtensionsUtil.ConvertReferenceFromV20(sourceEntity.assetRef, ReferenceTypes.ExternalReference); - if (assetRef != null) - { - entity.GlobalAssetId = assetRef.GetAsIdentifier(); - } - } - - return entity; - } - - public static T FindFirstIdShortAs(this Entity entity, string idShort) where T : ISubmodelElement - { - - var submodelElements = entity.Statements.Where(sme => (sme != null) && (sme is T) && sme.IdShort.Equals(idShort, StringComparison.OrdinalIgnoreCase)); - - if (submodelElements.Any()) - { - return (T)submodelElements.First(); - } - - return default; - } - - public static T CreateSMEForCD( - this Entity ent, - ConceptDescription conceptDescription, string category = null, string idShort = null, - string idxTemplate = null, int maxNum = 999, bool addSme = false, bool isTemplate = false) - where T : ISubmodelElement - { - if (ent.Statements == null) - ent.Statements = new List(); - return ent.Statements.CreateSMEForCD( - conceptDescription, category, idShort, idxTemplate, maxNum, addSme, isTemplate); - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendEnvironment.cs b/src/AasxCsharpLibrary/Extensions/ExtendEnvironment.cs deleted file mode 100644 index 7440d83d3..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendEnvironment.cs +++ /dev/null @@ -1,1092 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using AdminShellNS; -using AdminShellNS.Extensions; -using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; - -namespace Extensions -{ - public static class ExtendEnvironment - { - #region Environment - - #region AasxPackageExplorer - - public static void RecurseOnReferables(this AasCore.Aas3_0.Environment environment, - object state, Func, IReferable, bool> lambda, bool includeThis = false) - { - // includeThis does not make sense, as no Referable - // just use the others - foreach (var idf in environment.FindAllReferable(onlyIdentifiables: true)) - idf?.RecurseOnReferables(state, lambda, includeThis); - } - - #endregion - - /// - /// Deprecated? Not compatible with AAS core? - /// - public static AasValidationRecordList ValidateAll(this AasCore.Aas3_0.Environment environment) - { - // collect results - var results = new AasValidationRecordList(); - - // all entities - foreach (var rf in environment.FindAllReferable()) - rf.Validate(results); - - // give back - return results; - } - - /// - /// Deprecated? Not compatible with AAS core? - /// - public static int AutoFix(this AasCore.Aas3_0.Environment environment, IEnumerable records) - { - // access - if (records == null) - return -1; - - // collect Referables (expensive safety measure) - var allowedReferables = environment.FindAllReferable().ToList(); - - // go thru records - int res = 0; - foreach (var rec in records) - { - // access - if (rec == null || rec.Fix == null || rec.Source == null) - continue; - - // minimal safety measure - if (!allowedReferables.Contains(rec.Source)) - continue; - - // apply fix - res++; - try - { - rec.Fix.Invoke(); - } - catch - { - res--; - } - } - - // return number of applied fixes - return res; - } - - /// - /// This function tries to silently fix some issues preventing the environment - /// are parts of it to be properly serilaized. - /// - /// Number of fixes taken - public static int SilentFix30(this AasCore.Aas3_0.Environment env) - { - // access - int res = 0; - if (env == null) - return res; - - // AAS core crashes without AssetInformation - if (env.AssetAdministrationShells != null) - foreach (var aas in env.AssetAdministrationShells) - if (aas.AssetInformation == null) - { - aas.AssetInformation = new AssetInformation(assetKind: AssetKind.NotApplicable); - res++; - } - - // AAS core crashes without EmbeddedDataSpecification.DataSpecificationContent - // AAS core crashes without EmbeddedDataSpecification.DataSpecificationContent.PreferredName - foreach (var rf in env.FindAllReferable()) - if (rf is IHasDataSpecification hds) - if (hds.EmbeddedDataSpecifications != null) - foreach (var eds in hds.EmbeddedDataSpecifications) - { - if (eds.DataSpecificationContent == null) - eds.DataSpecificationContent = - new DataSpecificationIec61360( - new List()); - } - - // ok - return res; - } - - public static IEnumerable FindAllReferable(this AasCore.Aas3_0.Environment environment, bool onlyIdentifiables = false) - { - if (environment.AssetAdministrationShells != null) - foreach (var aas in environment.AssetAdministrationShells) - if (aas != null) - { - // AAS itself - yield return aas; - } - - if (environment.Submodels != null) - foreach (var sm in environment.Submodels) - if (sm != null) - { - yield return sm; - - if (!onlyIdentifiables) - { - // TODO (MIHO, 2020-08-26): not very elegant, yet. Avoid temporary collection - var allsme = new List(); - sm.RecurseOnSubmodelElements(null, (state, parents, sme) => - { - allsme.Add(sme); return true; - }); - foreach (var sme in allsme) - yield return sme; - } - } - - if (environment.ConceptDescriptions != null) - foreach (var cd in environment.ConceptDescriptions) - if (cd != null) - yield return cd; - } - -#if !DoNotUseAasxCompatibilityModels - - public static AasCore.Aas3_0.Environment ConvertFromV10(this AasCore.Aas3_0.Environment environment, AasxCompatibilityModels.AdminShellV10.AdministrationShellEnv sourceEnvironement) - { - //Convert Administration Shells - if (!sourceEnvironement.AdministrationShells.IsNullOrEmpty()) - { - environment.AssetAdministrationShells ??= new List(); - foreach (var sourceAas in sourceEnvironement.AdministrationShells) - { - var sourceAsset = sourceEnvironement?.FindAsset(sourceAas.assetRef); - if (sourceAsset != null) - { - var newAssetInformation = new AssetInformation(AssetKind.Instance); - newAssetInformation = newAssetInformation.ConvertFromV10(sourceAsset); - - var newAas = new AssetAdministrationShell(id: sourceAas.identification.id, newAssetInformation); - newAas = newAas.ConvertFromV10(sourceAas); - - environment.AssetAdministrationShells.Add(newAas); - } - - } - } - - //Convert Submodels - if (!sourceEnvironement.Submodels.IsNullOrEmpty()) - { - environment.Submodels ??= new List(); - foreach (var sourceSubmodel in sourceEnvironement.Submodels) - { - var newSubmodel = new Submodel(sourceSubmodel.identification.id); - newSubmodel = newSubmodel.ConvertFromV10(sourceSubmodel); - environment.Submodels.Add(newSubmodel); - } - } - - if (!sourceEnvironement.ConceptDescriptions.IsNullOrEmpty()) - { - environment.ConceptDescriptions ??= new List(); - foreach (var sourceConceptDescription in sourceEnvironement.ConceptDescriptions) - { - var newConceptDescription = new ConceptDescription(sourceConceptDescription.identification.id); - newConceptDescription = newConceptDescription.ConvertFromV10(sourceConceptDescription); - environment.ConceptDescriptions.Add(newConceptDescription); - } - } - - return environment; - } - - - public static AasCore.Aas3_0.Environment ConvertFromV20(this AasCore.Aas3_0.Environment environment, AasxCompatibilityModels.AdminShellV20.AdministrationShellEnv sourceEnvironement) - { - //Convert Administration Shells - if (!sourceEnvironement.AdministrationShells.IsNullOrEmpty()) - { - environment.AssetAdministrationShells ??= new List(); - foreach (var sourceAas in sourceEnvironement.AdministrationShells) - { - // first make the AAS - var newAas = new AssetAdministrationShell(id: sourceAas.identification.id, null); - newAas = newAas.ConvertFromV20(sourceAas); - environment.AssetAdministrationShells.Add(newAas); - - var sourceAsset = sourceEnvironement?.FindAsset(sourceAas.assetRef); - if (sourceAsset != null) - { - var newAssetInformation = new AssetInformation(AssetKind.Instance); - newAssetInformation = newAssetInformation.ConvertFromV20(sourceAsset); - newAas.AssetInformation = newAssetInformation; - } - - } - } - - //Convert Submodels - if (!sourceEnvironement.Submodels.IsNullOrEmpty()) - { - environment.Submodels ??= new List(); - foreach (var sourceSubmodel in sourceEnvironement.Submodels) - { - var newSubmodel = new Submodel(sourceSubmodel.identification.id); - newSubmodel = newSubmodel.ConvertFromV20(sourceSubmodel); - environment.Submodels.Add(newSubmodel); - } - } - - if (!sourceEnvironement.ConceptDescriptions.IsNullOrEmpty()) - { - environment.ConceptDescriptions ??= new List(); - foreach (var sourceConceptDescription in sourceEnvironement.ConceptDescriptions) - { - var newConceptDescription = new ConceptDescription(sourceConceptDescription.identification.id); - newConceptDescription = newConceptDescription.ConvertFromV20(sourceConceptDescription); - environment.ConceptDescriptions.Add(newConceptDescription); - } - } - - return environment; - } - -#endif - - //TODO (jtikekar, 0000-00-00): to test - public static AasCore.Aas3_0.Environment CreateFromExistingEnvironment(this AasCore.Aas3_0.Environment environment, - AasCore.Aas3_0.Environment sourceEnvironment, List filterForAas = null, List filterForAssets = null, List filterForSubmodel = null, - List filterForConceptDescriptions = null) - { - if (filterForAas == null) - { - filterForAas = new List(); - } - - if (filterForAssets == null) - { - filterForAssets = new List(); - } - - if (filterForSubmodel == null) - { - filterForSubmodel = new List(); - } - - if (filterForConceptDescriptions == null) - { - filterForConceptDescriptions = new List(); - } - - //Copy AssetAdministrationShells - foreach (var aas in sourceEnvironment.AssetAdministrationShells) - { - if (filterForAas.Contains(aas)) - { - environment.AssetAdministrationShells.Add(aas); - - if (aas.Submodels != null && aas.Submodels.Count > 0) - { - foreach (var submodelReference in aas.Submodels) - { - var submodel = sourceEnvironment.FindSubmodel(submodelReference); - if (submodel != null) - { - filterForSubmodel.Add(submodel); - } - } - } - } - } - - //Copy Submodel - foreach (var submodel in sourceEnvironment.Submodels) - { - if (filterForSubmodel.Contains(submodel)) - { - environment.Submodels.Add(submodel); - - //Find Used CDs - environment.CreateFromExistingEnvRecurseForCDs(sourceEnvironment, submodel.SubmodelElements, ref filterForConceptDescriptions); - } - } - - //Copy ConceptDescription - foreach (var conceptDescription in sourceEnvironment.ConceptDescriptions) - { - if (filterForConceptDescriptions.Contains(conceptDescription)) - { - environment.ConceptDescriptions.Add(conceptDescription); - } - } - - return environment; - - } - - public static void CreateFromExistingEnvRecurseForCDs(this AasCore.Aas3_0.Environment environment, AasCore.Aas3_0.Environment sourceEnvironment, - List submodelElements, ref List filterForConceptDescription) - { - if (submodelElements == null || submodelElements.Count == 0 || filterForConceptDescription == null || filterForConceptDescription.Count == 0) - { - return; - } - - foreach (var submodelElement in submodelElements) - { - if (submodelElement == null) - { - return; - } - - if (submodelElement.SemanticId != null) - { - var conceptDescription = sourceEnvironment.FindConceptDescriptionByReference(submodelElement.SemanticId); - if (conceptDescription != null) - { - filterForConceptDescription.Add(conceptDescription); - } - } - - if (submodelElement is SubmodelElementCollection smeColl) - { - environment.CreateFromExistingEnvRecurseForCDs(sourceEnvironment, smeColl.Value, ref filterForConceptDescription); - } - - if (submodelElement is SubmodelElementList smeList) - { - environment.CreateFromExistingEnvRecurseForCDs(sourceEnvironment, smeList.Value, ref filterForConceptDescription); - } - - if (submodelElement is Entity entity) - { - environment.CreateFromExistingEnvRecurseForCDs(sourceEnvironment, entity.Statements, ref filterForConceptDescription); - } - - if (submodelElement is AnnotatedRelationshipElement annotatedRelationshipElement) - { - var annotedELements = new List(); - foreach (var annotation in annotatedRelationshipElement.Annotations) - { - annotedELements.Add(annotation); - } - environment.CreateFromExistingEnvRecurseForCDs(sourceEnvironment, annotedELements, ref filterForConceptDescription); - } - - if (submodelElement is Operation operation) - { - var operationELements = new List(); - foreach (var inputVariable in operation.InputVariables) - { - operationELements.Add(inputVariable.Value); - } - - foreach (var outputVariable in operation.OutputVariables) - { - operationELements.Add(outputVariable.Value); - } - - foreach (var inOutVariable in operation.InoutputVariables) - { - operationELements.Add(inOutVariable.Value); - } - - environment.CreateFromExistingEnvRecurseForCDs(sourceEnvironment, operationELements, ref filterForConceptDescription); - - } - } - } - - public static ConceptDescription Add(this AasCore.Aas3_0.Environment env, ConceptDescription cd) - { - if (cd == null) - return null; - if (env.ConceptDescriptions == null) - env.ConceptDescriptions = new(); - env.ConceptDescriptions.Add(cd); - return cd; - } - - public static Submodel Add(this AasCore.Aas3_0.Environment env, Submodel sm) - { - if (sm == null) - return null; - if (env.Submodels == null) - env.Submodels = new(); - env.Submodels.Add(sm); - return sm; - } - - public static AssetAdministrationShell Add(this AasCore.Aas3_0.Environment env, AssetAdministrationShell aas) - { - if (aas == null) - return null; - if (env.AssetAdministrationShells == null) - env.AssetAdministrationShells = new(); - env.AssetAdministrationShells.Add(aas); - return aas; - } - - public static JsonWriter SerialiazeJsonToStream(this AasCore.Aas3_0.Environment environment, StreamWriter streamWriter, bool leaveJsonWriterOpen = false) - { - streamWriter.AutoFlush = true; - - JsonSerializer serializer = new JsonSerializer() - { - NullValueHandling = NullValueHandling.Ignore, - ReferenceLoopHandling = ReferenceLoopHandling.Serialize, - Formatting = Newtonsoft.Json.Formatting.Indented - }; - - JsonWriter writer = new JsonTextWriter(streamWriter); - serializer.Serialize(writer, environment); - if (leaveJsonWriterOpen) - return writer; - writer.Close(); - return null; - } - - #endregion - - #region Submodel Queries - - public static IEnumerable FindAllSubmodelGroupedByAAS(this AasCore.Aas3_0.Environment environment, Func p = null) - { - if (environment.AssetAdministrationShells == null || environment.Submodels == null) - yield break; - foreach (var aas in environment.AssetAdministrationShells) - { - if (aas?.Submodels == null) - continue; - foreach (var smref in aas.Submodels) - { - var sm = environment.FindSubmodel(smref); - if (sm != null && (p == null || p(aas, sm))) - yield return sm; - } - } - } - public static ISubmodel FindSubmodel(this AasCore.Aas3_0.Environment environment, IReference submodelReference) - { - if (environment == null || submodelReference == null) - { - return null; - } - - if (submodelReference.Keys.Count != 1) // Can have only one reference key - { - return null; - } - - var key = submodelReference.Keys[0]; - if (key.Type != KeyTypes.Submodel) - { - return null; - } - - var submodels = environment.Submodels.Where(s => s.Id.Equals(key.Value, StringComparison.OrdinalIgnoreCase)); - if (submodels.Any()) - { - return submodels.First(); - } - - return null; - } - - public static ISubmodel FindSubmodelById(this AasCore.Aas3_0.Environment environment, string submodelId) - { - if (string.IsNullOrEmpty(submodelId)) - { - return null; - } - - var submodels = environment.Submodels.Where(s => s.Id.Equals(submodelId)); - if (submodels.Any()) - { - return submodels.First(); - } - - return null; - } - // dead-csharp off - //public static IEnumerable FindAllSubmodelsGroupedByAAS(this AasCore.Aas3_0.Environment environment, Func p = null) - //{ - // if (environment.AssetAdministrationShells == null || environment.Submodels == null) - // yield break; - // foreach (var aas in environment.AssetAdministrationShells) - // { - // if (aas?.Submodels == null) - // continue; - // foreach (var submodelReference in aas.Submodels) - // { - // var submodel = environment.FindSubmodel(submodelReference); - // if (submodel != null && (p == null || p(aas, submodel))) - // yield return submodel; - // } - // } - //} - // dead-csharp on - public static IEnumerable FindAllSubmodelBySemanticId(this AasCore.Aas3_0.Environment environment, string semanticId) - { - if (semanticId == null) - yield break; - - foreach (var submodel in environment.Submodels) - if (true == submodel.SemanticId?.Matches(semanticId)) - yield return submodel; - } - - #endregion - - #region AssetAdministrationShell Queries - public static IAssetAdministrationShell FindAasWithSubmodelId(this AasCore.Aas3_0.Environment environment, string submodelId) - { - if (submodelId == null) - { - return null; - } - - var aas = environment.AssetAdministrationShells.Where(a => (a.Submodels?.Where(s => s.Matches(submodelId)).FirstOrDefault()) != null).FirstOrDefault(); - - return aas; - } - - public static IAssetAdministrationShell FindAasById(this AasCore.Aas3_0.Environment environment, string aasId) - { - if (string.IsNullOrEmpty(aasId)) - { - return null; - } - - var aas = environment.AssetAdministrationShells.Where(a => a.Id.Equals(aasId)).First(); - - return aas; - } - - #endregion - - #region ConceptDescription Queries - - public static IConceptDescription FindConceptDescriptionById( - this AasCore.Aas3_0.Environment env, string cdId) - { - if (string.IsNullOrEmpty(cdId)) - return null; - - if (env.ConceptDescriptions == null || env.ConceptDescriptions.Count == 0) - return null; - - var conceptDescription = env.ConceptDescriptions.Where(c => c.Id.Equals(cdId)).FirstOrDefault(); - return conceptDescription; - } - - public static IConceptDescription FindConceptDescriptionByReference( - this AasCore.Aas3_0.Environment env, IReference rf) - { - if (rf == null) - return null; - - return env.FindConceptDescriptionById(rf.GetAsIdentifier()); - } - - #endregion - - #region Referable Queries - - /// - /// Result of FindReferable in Environment - /// - public class ReferableRootInfo - { - public AssetAdministrationShell AAS = null; - public AssetInformation Asset = null; - public Submodel Submodel = null; - public ConceptDescription CD = null; - - public int NrOfRootKeys = 0; - - public bool IsValid - { - get - { - return NrOfRootKeys > 0 && (AAS != null || Submodel != null || Asset != null); - } - } - } - - //TODO (jtikekar, 0000-00-00): Need to test - public static IReferable FindReferableByReference( - this AasCore.Aas3_0.Environment environment, - IReference reference, - int keyIndex = 0, - IEnumerable submodelElems = null, - ReferableRootInfo rootInfo = null) - { - // access - var keyList = reference?.Keys; - if (keyList == null || keyList.Count == 0 || keyIndex >= keyList.Count) - return null; - - // shortcuts - var firstKeyType = keyList[keyIndex].Type; - var firstKeyId = keyList[keyIndex].Value; - - // different pathes - switch (firstKeyType) - { - case KeyTypes.AssetAdministrationShell: - { - var aas = environment.FindAasById(firstKeyId); - - // side info? - if (rootInfo != null) - { - rootInfo.AAS = aas as AssetAdministrationShell; - rootInfo.NrOfRootKeys = 1 + keyIndex; - } - - //Not found or already at the end of our search - if (aas == null || keyIndex >= keyList.Count - 1) - { - return aas; - } - - return environment.FindReferableByReference(reference, ++keyIndex); - } - // dead-csharp off - // TODO (MIHO, 2023-01-01): stupid generalization :-( - case KeyTypes.GlobalReference: - case KeyTypes.ConceptDescription: - { - // In meta model V3, multiple important things might by identified - // by a flat GlobalReference :-( - - // find an Asset by that id? - - var keyedAas = environment.FindAasWithAssetInformation(firstKeyId); - if (keyedAas?.AssetInformation != null) - { - // found an Asset - - // side info? - if (rootInfo != null) - { - rootInfo.AAS = keyedAas as AssetAdministrationShell; - rootInfo.Asset = (AssetInformation)(keyedAas?.AssetInformation); - rootInfo.NrOfRootKeys = 1 + keyIndex; - } - - // give back the AAS - return keyedAas; - } - - // Concept?Description - var keyedCd = environment.FindConceptDescriptionById(firstKeyId); - if (keyedCd != null) - { - // side info? - if (rootInfo != null) - { - rootInfo.CD = keyedCd as ConceptDescription; - rootInfo.NrOfRootKeys = 1 + keyIndex; - } - - // give back the CD - return keyedCd; - } - - // Nope - return null; - } - // dead-csharp on - case KeyTypes.Submodel: - { - var submodel = environment.FindSubmodelById(firstKeyId); - // No? - if (submodel == null) - return null; - - // notice in side info - if (rootInfo != null) - { - rootInfo.Submodel = submodel as Submodel; - rootInfo.NrOfRootKeys = 1 + keyIndex; - - // add even more info - if (rootInfo.AAS == null) - { - foreach (var aas2 in environment.AssetAdministrationShells) - { - var smref2 = environment.FindSubmodelById(submodel.Id); - if (smref2 != null) - { - rootInfo.AAS = (AssetAdministrationShell)aas2; - break; - } - } - } - } - - // at the end of the journey? - if (keyIndex >= keyList.Count - 1) - return submodel; - - return environment.FindReferableByReference(reference, ++keyIndex, submodel.SubmodelElements); - } - } - - - - if (firstKeyType.IsSME() && submodelElems != null) - { - ISubmodelElement submodelElement; - //check if key.value is index - bool isIndex = int.TryParse(firstKeyId, out int index); - if (isIndex) - { - var smeList = submodelElems.ToList(); - submodelElement = smeList[index]; - } - else - { - submodelElement = submodelElems.Where( - sme => sme.IdShort.Equals(keyList[keyIndex].Value, - StringComparison.OrdinalIgnoreCase)).First(); - } - - //This is required element - if (keyIndex + 1 >= keyList.Count) - { - return submodelElement; - } - - //Recurse again - if (submodelElement?.EnumeratesChildren() == true) - return environment.FindReferableByReference(reference, ++keyIndex, submodelElement.EnumerateChildren()); - } - - //Nothing in this environment - return null; - } - - #endregion - - #region AasxPackageExplorer - - public static IEnumerable FindAllSubmodelElements(this AasCore.Aas3_0.Environment environment, - Predicate match = null, AssetAdministrationShell onlyForAAS = null) where T : ISubmodelElement - { - // more or less two different schemes - if (onlyForAAS != null) - { - if (onlyForAAS.Submodels == null) - yield break; - foreach (var smr in onlyForAAS.Submodels) - { - var sm = environment.FindSubmodel(smr); - if (sm?.SubmodelElements != null) - foreach (var x in sm.SubmodelElements.FindDeep(match)) - yield return x; - } - } - else - { - if (environment.Submodels != null) - foreach (var sm in environment.Submodels) - if (sm?.SubmodelElements != null) - foreach (var x in sm.SubmodelElements.FindDeep(match)) - yield return x; - } - } - - public static IEnumerable FindAllReferences(this AasCore.Aas3_0.Environment environment) - { - if (environment.AssetAdministrationShells != null) - foreach (var aas in environment.AssetAdministrationShells) - if (aas != null) - foreach (var r in aas.FindAllReferences()) - yield return r; - - if (environment.Submodels != null) - foreach (var sm in environment.Submodels) - if (sm != null) - foreach (var r in sm.FindAllReferences()) - yield return r; - - if (environment.ConceptDescriptions != null) - foreach (var cd in environment.ConceptDescriptions) - if (cd != null) - foreach (var r in cd.FindAllReferences()) - yield return new LocatedReference(cd, r); - } - - /// - /// Tries renaming an Identifiable, specifically: the identification of an Identifiable and - /// all references to it. - /// Currently supported: ConceptDescriptions - /// Returns a list of Referables, which were changed or null in case of error - /// - public static List RenameIdentifiable(this AasCore.Aas3_0.Environment environment, string oldId, string newId) - where T : IClass - { - // access - if (oldId == null || newId == null || oldId.Equals(newId)) - return null; - - var res = new List(); - - if (typeof(T) == typeof(ConceptDescription)) - { - // check, if exist or not exist - var cdOld = environment.FindConceptDescriptionById(oldId); - if (cdOld == null || environment.FindConceptDescriptionById(newId) != null) - return null; - - // rename old cd - cdOld.Id = newId; - res.Add(cdOld); - - // search all SMEs referring to this CD - foreach (var sme in environment.FindAllSubmodelElements(match: (s) => - { - return (s != null && s.SemanticId != null && s.SemanticId.Matches(oldId)); - })) - { - sme.SemanticId.Keys[0].Value = newId; - res.Add(sme); - } - - // seems fine - return res; - } - else - if (typeof(T) == typeof(Submodel)) - { - // check, if exist or not exist - var smOld = environment.FindSubmodelById(oldId); - if (smOld == null || environment.FindSubmodelById(newId) != null) - return null; - - // recurse all possible Referenes in the aas env - foreach (var lr in environment.FindAllReferences()) - { - var r = lr?.Reference; - if (r != null) - for (int i = 0; i < r.Keys.Count; i++) - if (r.Keys[i].Matches(KeyTypes.Submodel, oldId, MatchMode.Relaxed)) - { - // directly replace - r.Keys[i].Value = newId; - if (res.Contains(lr.Identifiable)) - res.Add(lr.Identifiable); - } - } - - // rename old Submodel - smOld.Id = newId; - - // seems fine - return res; - } - else - if (typeof(T) == typeof(AssetAdministrationShell)) - { - // check, if exist or not exist - var aasOld = environment.FindAasById(oldId); - if (aasOld == null || environment.FindAasById(newId) != null) - return null; - - // recurse? -> no? - - // rename old Asset - aasOld.Id = newId; - - // seems fine - return res; - } - else - //TODO (jtikekar, 0000-00-00): support asset - if (typeof(T) == typeof(AssetInformation)) - { - // check, if exist or not exist - var assetOld = environment.FindAasWithAssetInformation(oldId); - if (assetOld == null || environment.FindAasWithAssetInformation(newId) != null) - return null; - - // recurse all possible Referenes in the aas env - foreach (var lr in environment.FindAllReferences()) - { - var r = lr?.Reference; - if (r != null) - for (int i = 0; i < r.Keys.Count; i++) - if (r.Keys[i].Matches(KeyTypes.GlobalReference, oldId)) - { - // directly replace - r.Keys[i].Value = newId; - if (res.Contains(lr.Identifiable)) - res.Add(lr.Identifiable); - } - } - - // rename old Asset - assetOld.AssetInformation.GlobalAssetId = newId; - - // seems fine - return res; - } - - // no result is false, as well - return null; - } - - public static IAssetAdministrationShell FindAasWithAssetInformation(this AasCore.Aas3_0.Environment environment, string globalAssetId) - { - if (string.IsNullOrEmpty(globalAssetId)) - { - return null; - } - - foreach (var aas in environment.AssetAdministrationShells) - { - if (aas.AssetInformation.GlobalAssetId.Equals(globalAssetId)) - { - return aas; - } - } - - return null; - } - - public static ComparerIndexed CreateIndexedComparerCdsForSmUsage(this AasCore.Aas3_0.Environment environment) - { - var cmp = new ComparerIndexed(); - int nr = 0; - foreach (var sm in environment.FindAllSubmodelGroupedByAAS()) - foreach (var sme in sm.FindDeep()) - { - if (sme.SemanticId == null) - continue; - var cd = environment.FindConceptDescriptionByReference(sme.SemanticId); - if (cd == null) - continue; - if (cmp.Index.ContainsKey(cd)) - continue; - cmp.Index[cd] = nr++; - } - return cmp; - } - - public static ISubmodelElement CopySubmodelElementAndCD(this AasCore.Aas3_0.Environment environment, - AasCore.Aas3_0.Environment srcEnv, ISubmodelElement srcElem, bool copyCD = false, bool shallowCopy = false) - { - // access - if (srcEnv == null || srcElem == null) - return null; - - // 1st result pretty easy (calling function will add this to the appropriate Submodel) - var res = srcElem.Copy(); - - // copy the CDs.. - if (copyCD) - environment.CopyConceptDescriptionsFrom(srcEnv, srcElem, shallowCopy); - - // give back - return res; - } - - public static IReference CopySubmodelRefAndCD(this AasCore.Aas3_0.Environment environment, - AasCore.Aas3_0.Environment srcEnv, IReference srcSubRef, bool copySubmodel = false, bool copyCD = false, - bool shallowCopy = false) - { - // access - if (srcEnv == null || srcSubRef == null) - return null; - - // need to have the source Submodel - var srcSub = srcEnv.FindSubmodel(srcSubRef); - if (srcSub == null) - return null; - - // 1st result pretty easy (calling function will add this to the appropriate AAS) - var dstSubRef = srcSubRef.Copy(); - - // get the destination and shall src != dst - var dstSub = environment.FindSubmodel(dstSubRef); - if (srcSub == dstSub) - return null; - - // maybe we need the Submodel in our environment, as well - if (dstSub == null && copySubmodel) - { - dstSub = srcSub.Copy(); - environment.Submodels.Add(dstSub); - } - else - if (dstSub != null) - { - // there is already an submodel, just add members - if (!shallowCopy && srcSub.SubmodelElements != null) - { - if (dstSub.SubmodelElements == null) - dstSub.SubmodelElements = new List(); - foreach (var smw in srcSub.SubmodelElements) - dstSub.SubmodelElements.Add( - smw.Copy()); - } - } - - // copy the CDs.. - if (copyCD && srcSub.SubmodelElements != null) - foreach (var smw in srcSub.SubmodelElements) - environment.CopyConceptDescriptionsFrom(srcEnv, smw, shallowCopy); - - // give back - return dstSubRef; - } - - private static void CopyConceptDescriptionsFrom(this AasCore.Aas3_0.Environment environment, - AasCore.Aas3_0.Environment srcEnv, ISubmodelElement src, bool shallowCopy = false) - { - // access - if (srcEnv == null || src == null || src.SemanticId == null) - return; - - // check for this SubmodelElement in Source - var cdSrc = srcEnv.FindConceptDescriptionByReference(src.SemanticId); - if (cdSrc == null) - return; - - // check for this SubmodelElement in Destnation (this!) - var cdDest = environment.FindConceptDescriptionByReference(src.SemanticId); - if (cdDest == null) - { - // copy new - environment.ConceptDescriptions.Add(cdSrc.Copy()); - } - - // recurse? - if (!shallowCopy) - foreach (var m in src.EnumerateChildren()) - environment.CopyConceptDescriptionsFrom(srcEnv, m, shallowCopy: false); - - } - #endregion - - } - - - -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendFile.cs b/src/AasxCsharpLibrary/Extensions/ExtendFile.cs deleted file mode 100644 index d2fbf79b0..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendFile.cs +++ /dev/null @@ -1,69 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -namespace Extensions -{ - public static class ExtendFile - { - public static string ValueAsText(this File file) - { - return "" + file.Value; - } - - public static void Set(this File file, - string contentType = "", string value = "") - { - file.ContentType = contentType; - file.Value = value; - } - - public static File ConvertFromV10(this File file, AasxCompatibilityModels.AdminShellV10.File sourceFile) - { - file.ContentType = sourceFile.mimeType; - file.Value = sourceFile.value; - return file; - } - public static File ConvertFromV20(this File file, AasxCompatibilityModels.AdminShellV20.File sourceFile) - { - file.ContentType = sourceFile.mimeType; - file.Value = sourceFile.value; - return file; - } - - public static File UpdateFrom(this File elem, ISubmodelElement source) - { - if (source == null) - return elem; - - ((ISubmodelElement)elem).UpdateFrom(source); - - if (source is Property srcProp) - { - elem.Value = srcProp.Value; - } - - if (source is AasCore.Aas3_0.Range srcRng) - { - elem.Value = srcRng.Min; - } - - if (source is MultiLanguageProperty srcMlp) - { - elem.Value = "" + srcMlp.Value?.GetDefaultString(); - } - - if (source is File srcFile) - { - elem.Value = "" + srcFile.Value; - } - - return elem; - } - - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendHasDataSpecification.cs b/src/AasxCsharpLibrary/Extensions/ExtendHasDataSpecification.cs deleted file mode 100644 index ca440e3cb..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendHasDataSpecification.cs +++ /dev/null @@ -1,25 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -namespace Extensions -{ - public static class ExtendHasDataSpecification - { - public static IHasDataSpecification ConvertFromV20(this IHasDataSpecification embeddedDataSpecifications, AasxCompatibilityModels.AdminShellV20.HasDataSpecification sourceSpecification) - { - foreach (var sourceSpec in sourceSpecification) - { - var newEmbeddedSpec = new EmbeddedDataSpecification(null, null); - newEmbeddedSpec.ConvertFromV20(sourceSpec); - embeddedDataSpecifications.EmbeddedDataSpecifications.Add(newEmbeddedSpec); - } - - return embeddedDataSpecifications; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendIAdministrativeInformation.cs b/src/AasxCsharpLibrary/Extensions/ExtendIAdministrativeInformation.cs deleted file mode 100644 index bb5617a66..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendIAdministrativeInformation.cs +++ /dev/null @@ -1,25 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Extensions -{ - public static class ExtendIAdministrativeInformation - { - public static string ToStringExtended(this IAdministrativeInformation ls, int fmt) - { - if (fmt == 2) - return String.Format("/{0}/{1}", ls.Version, ls.Revision); - return String.Format("[ver={0}, rev={1}, tmpl={2}, crea={3}]", - ls.Version, ls.Revision, ls.TemplateId, ls.Creator?.ToStringExtended(fmt)); - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendIClass.cs b/src/AasxCsharpLibrary/Extensions/ExtendIClass.cs deleted file mode 100644 index 0db74f58a..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendIClass.cs +++ /dev/null @@ -1,41 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System.Collections.Generic; -using System.Linq; - -namespace Extensions -{ - public static class ExtendIClass - { - // TODO (MIHO, 2023-05-28): liase with AAS core team to provide a general desrialization - /// - /// Deserializes a given objectType from its given JSON node representation. - /// Operates on a range of known AAS IClass subtypes (not all!!) - /// - /// Hint for IClass subtype - /// JSON representation - /// Null, if not a known IClass subtype - public static IClass IClassFrom(System.Type objectType, System.Text.Json.Nodes.JsonNode node) - { - if (typeof(IReference).IsAssignableFrom(objectType)) - return Jsonization.Deserialize.ReferenceFrom(node); - - if (typeof(IKey).IsAssignableFrom(objectType)) - return Jsonization.Deserialize.KeyFrom(node); - - if (typeof(IReferable).IsAssignableFrom(objectType)) - return Jsonization.Deserialize.IReferableFrom(node); - - if (typeof(IIdentifiable).IsAssignableFrom(objectType)) - return Jsonization.Deserialize.IIdentifiableFrom(node); - - return null; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendIDataSpecificationContent.cs b/src/AasxCsharpLibrary/Extensions/ExtendIDataSpecificationContent.cs deleted file mode 100644 index 8e76f302e..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendIDataSpecificationContent.cs +++ /dev/null @@ -1,77 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using AdminShellNS; -using System.Collections.Generic; - -namespace Extensions -{ - public static class ExtendIDataSpecificationContent - { - public enum ContentTypes { NoInfo, Iec61360, PhysicalUnit } - - public static Key GetKeyForIec61360() - { - return new Key(KeyTypes.GlobalReference, - "https://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"); - } - - public static Reference GetReferencForIec61360() - { - return new Reference(ReferenceTypes.ExternalReference, new List { GetKeyForIec61360() }); - } - - public static Key GetKeyForPhysicalUnit() - { - return new Key(KeyTypes.GlobalReference, - "https://admin-shell.io/DataSpecificationTemplates/DataSpecificationPhysicalUnit/3/0"); - } - - public static Key GetKeyFor(ContentTypes ct) - { - if (ct == ContentTypes.Iec61360) - return GetKeyForIec61360(); - if (ct == ContentTypes.PhysicalUnit) - return GetKeyForPhysicalUnit(); - return null; - } - - public static IDataSpecificationContent ContentFactoryFor(ContentTypes ct) - { - if (ct == ContentTypes.Iec61360) - return new DataSpecificationIec61360( - new List()); - //TODO (jtikekar, 0000-00-00): DataSpecificationPhysicalUnit -#if SupportDataSpecificationPhysicalUnit - if (ct == ContentTypes.PhysicalUnit) - return new DataSpecificationPhysicalUnit("", "", null); -#endif - return null; - } - - public static ContentTypes GuessContentTypeFor(IReference rf) - { - foreach (var v in AdminShellUtil.GetEnumValues(new[] { ContentTypes.NoInfo })) - if (rf?.MatchesExactlyOneKey(GetKeyFor(v)) == true) - return v; - return ContentTypes.NoInfo; - } - - public static ContentTypes GuessContentTypeFor(IDataSpecificationContent content) - { - if (content is DataSpecificationIec61360) - return ContentTypes.Iec61360; - //TODO (jtikekar, 0000-00-00): DataSpecificationPhysicalUnit -#if SupportDataSpecificationPhysicalUnit - if (content is DataSpecificationPhysicalUnit) - return ContentTypes.PhysicalUnit; -#endif - return ContentTypes.NoInfo; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendIIdentifiable.cs b/src/AasxCsharpLibrary/Extensions/ExtendIIdentifiable.cs deleted file mode 100644 index 97aa254c9..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendIIdentifiable.cs +++ /dev/null @@ -1,33 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System.Collections.Generic; -using System.Linq; - -namespace Extensions -{ - public static class ExtendIIdentifiable - { - #region List of Identifiers - - public static string ToStringExtended(this List identifiables, string delimiter = ",") - { - return string.Join(delimiter, identifiables.Select((x) => x.Id)); - } - - #endregion - public static IReference GetReference(this IIdentifiable identifiable) - { - var key = new Key(ExtensionsUtil.GetKeyType(identifiable), identifiable.Id); - //TODO (jtikekar, 0000-00-00): if model or Global reference? - var outputReference = new Reference(ReferenceTypes.ModelReference, new List() { key }); - - return outputReference; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendILangStringDefinitionTypeIec61360.cs b/src/AasxCsharpLibrary/Extensions/ExtendILangStringDefinitionTypeIec61360.cs deleted file mode 100644 index 46062fade..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendILangStringDefinitionTypeIec61360.cs +++ /dev/null @@ -1,66 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System; -using System.Collections.Generic; - -namespace Extensions -{ - public static class ExtendILangStringDefinitionTypeIec61360 - { - public static List CreateLangStringDefinitionType(string language, string text) - { - return new List { new LangStringDefinitionTypeIec61360(language, text) }; - } - public static string GetDefaultString(this List langStringSet, string defaultLang = null) - { - // start - if (defaultLang == null) - defaultLang = "en"; //Default Lang in old implementation is en - - string res = null; - - // search - foreach (var langString in langStringSet) - if (langString.Language.Equals(defaultLang, StringComparison.OrdinalIgnoreCase)) - res = langString.Text; - - if (res == null && langStringSet.Count > 0) - res = langStringSet[0].Text; - - // found? - return res; - } - public static List ConvertFromV20( - this List lss, - AasxCompatibilityModels.AdminShellV20.LangStringSetIEC61360 src) - { - lss = new List(); - if (src != null && src.Count != 0) - { - foreach (var sourceLangString in src) - { - //Remove ? in the end added by AdminShellV20, to avoid verification error - string lang = sourceLangString.lang; - if (!string.IsNullOrEmpty(sourceLangString.lang) && sourceLangString.lang.EndsWith("?")) - { - lang = sourceLangString.lang.Remove(sourceLangString.lang.Length - 1); - } - var langString = new LangStringDefinitionTypeIec61360(lang, sourceLangString.str); - lss.Add(langString); - } - } - else - { - //set default preferred name - lss.Add(new LangStringDefinitionTypeIec61360("en", "")); - } - return lss; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendILangStringNameType.cs b/src/AasxCsharpLibrary/Extensions/ExtendILangStringNameType.cs deleted file mode 100644 index e222b5c20..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendILangStringNameType.cs +++ /dev/null @@ -1,30 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Extensions -{ - public static class ExtendILangStringNameType - { - public static string ToStringExtended(this ILangStringNameType ls, int fmt) - { - if (fmt == 2) - return String.Format("{0}@{1}", ls.Text, ls.Language); - return String.Format("[{0},{1}]", ls.Language, ls.Text); - } - - public static string ToStringExtended(this List elems, - int format = 1, string delimiter = ",") - { - return string.Join(delimiter, elems.Select((k) => k.ToStringExtended(format))); - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendILangStringPreferredNameTypeIec61360.cs b/src/AasxCsharpLibrary/Extensions/ExtendILangStringPreferredNameTypeIec61360.cs deleted file mode 100644 index abff939d3..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendILangStringPreferredNameTypeIec61360.cs +++ /dev/null @@ -1,71 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System; -using System.Collections.Generic; - -namespace Extensions -{ - public static class ExtendILangStringPreferredNameTypeIec61360 - { - public static List CreateLangStringPreferredNameType(string language, string text) - { - return new List { new LangStringPreferredNameTypeIec61360(language, text) }; - } - - public static string GetDefaultString(this List langStringSet, string defaultLang = null) - { - return ExtendLangString.GetDefaultStringGen(langStringSet, defaultLang); - // dead-csharp off - //// start - //if (defaultLang == null) - // defaultLang = "en"; //Default Lang in old implementation is en - - //string res = null; - - //// search - //foreach (var langString in langStringSet) - // if (langString.Language.Equals(defaultLang, StringComparison.OrdinalIgnoreCase)) - // res = langString.Text; - - //if (res == null && langStringSet.Count > 0) - // res = langStringSet[0].Text; - - //// found? - //return res; - // dead-csharp on - } - - public static List ConvertFromV20( - this List lss, - AasxCompatibilityModels.AdminShellV20.LangStringSetIEC61360 src) - { - lss = new List(); - if (src != null && src.Count != 0) - { - foreach (var sourceLangString in src) - { - //Remove ? in the end added by AdminShellV20, to avoid verification error - string lang = sourceLangString.lang; - if (!string.IsNullOrEmpty(sourceLangString.lang) && sourceLangString.lang.EndsWith("?")) - { - lang = sourceLangString.lang.Remove(sourceLangString.lang.Length - 1); - } - var langString = new LangStringPreferredNameTypeIec61360(lang, sourceLangString.str); - lss.Add(langString); - } - } - else - { - //set default preferred name - lss.Add(new LangStringPreferredNameTypeIec61360("en", "")); - } - return lss; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendILangStringShortNameTypeIec61360.cs b/src/AasxCsharpLibrary/Extensions/ExtendILangStringShortNameTypeIec61360.cs deleted file mode 100644 index 8cdb0e3e3..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendILangStringShortNameTypeIec61360.cs +++ /dev/null @@ -1,71 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System; -using System.Collections.Generic; - -namespace Extensions -{ - public static class ExtendILangStringShortNameTypeIec61360 - { - public static List CreateLangStringShortNameType(string language, string text) - { - return new List { new LangStringShortNameTypeIec61360(language, text) }; - } - - public static string GetDefaultString(this List langStringSet, string defaultLang = null) - { - return ExtendLangString.GetDefaultStringGen(langStringSet, defaultLang); - // dead-csharp off - //// start - //if (defaultLang == null) - // defaultLang = "en"; //Default Lang in old implementation is en - - //string res = null; - - //// search - //foreach (var langString in langStringSet) - // if (langString.Language.Equals(defaultLang, StringComparison.OrdinalIgnoreCase)) - // res = langString.Text; - - //if (res == null && langStringSet.Count > 0) - // res = langStringSet[0].Text; - - //// found? - //return res; - // dead-csharp on - } - - public static List ConvertFromV20( - this List lss, - AasxCompatibilityModels.AdminShellV20.LangStringSetIEC61360 src) - { - lss = new List(); - if (src != null && src.Count != 0) - { - foreach (var sourceLangString in src) - { - //Remove ? in the end added by AdminShellV20, to avoid verification error - string lang = sourceLangString.lang; - if (!string.IsNullOrEmpty(sourceLangString.lang) && sourceLangString.lang.EndsWith("?")) - { - lang = sourceLangString.lang.Remove(sourceLangString.lang.Length - 1); - } - var langString = new LangStringShortNameTypeIec61360(lang, sourceLangString.str); - lss.Add(langString); - } - } - else - { - //set default preferred name - lss.Add(new LangStringShortNameTypeIec61360("en", "")); - } - return lss; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendILangStringTextType.cs b/src/AasxCsharpLibrary/Extensions/ExtendILangStringTextType.cs deleted file mode 100644 index bb5dfd3eb..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendILangStringTextType.cs +++ /dev/null @@ -1,35 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Extensions -{ - public static class ExtendILangStringTextType - { - public static string GetDefaultString(this List langStringSet, string defaultLang = null) - { - return ExtendLangString.GetDefaultStringGen(langStringSet, defaultLang); - } - - public static string ToStringExtended(this ILangStringTextType ls, int fmt) - { - if (fmt == 2) - return String.Format("{0}@{1}", ls.Text, ls.Language); - return String.Format("[{0},{1}]", ls.Language, ls.Text); - } - - public static string ToStringExtended(this List elems, - int format = 1, string delimiter = ",") - { - return string.Join(delimiter, elems.Select((k) => k.ToStringExtended(format))); - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendIReferable.cs b/src/AasxCsharpLibrary/Extensions/ExtendIReferable.cs deleted file mode 100644 index 1c0e0597b..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendIReferable.cs +++ /dev/null @@ -1,624 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using AdminShellNS; -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Extensions -{ - public static class ExtendIReferable - { - #region AasxPackageExplorer - - /// - /// Recurses on all Submodel elements of a Submodel or SME, which allows children. - /// The state object will be passed to the lambda function in order to provide - /// stateful approaches. Include this element, as well. - /// - /// State object to be provided to lambda. Could be null. - /// The lambda function as (state, parents, SME) - /// The lambda shall return TRUE in order to deep into recursion. - /// Include this element as well. parents will then - /// include this element as well! - public static void RecurseOnReferables(this IReferable referable, - object state, Func, IReferable, bool> lambda, - bool includeThis = false) - { - // TODO (MIHO, 2023-07-28): not all elements are covered - if (referable is Submodel submodel) - { - submodel.RecurseOnReferables(state, lambda, includeThis); - } - else if (referable is SubmodelElementCollection submodelElementCollection) - { - submodelElementCollection.RecurseOnReferables(state, lambda, includeThis); - } - else if (referable is SubmodelElementList submodelElementList) - { - submodelElementList.RecurseOnReferables(state, lambda, includeThis); - } - else if (includeThis) - lambda(state, null, referable); - } - - public static void Remove(this IReferable referable, ISubmodelElement submodelElement) - { - if (referable is Submodel submodel) - { - submodel.Remove(submodelElement); - } - else if (referable is AnnotatedRelationshipElement annotatedRelationshipElement) - { - annotatedRelationshipElement.Remove(submodelElement); - } - else if (referable is SubmodelElementCollection submodelElementCollection) - { - submodelElementCollection.Remove(submodelElement); - } - else if (referable is SubmodelElementList submodelElementList) - { - submodelElementList.Remove(submodelElement); - } - else if (referable is Entity entity) - { - entity.Remove(submodelElement); - } - } - - public static void Add(this IReferable referable, ISubmodelElement submodelElement) - { - if (referable is Submodel submodel) - { - submodel.Add(submodelElement); - } - else if (referable is AnnotatedRelationshipElement annotatedRelationshipElement) - { - annotatedRelationshipElement.Add(submodelElement); - } - else if (referable is SubmodelElementCollection submodelElementCollection) - { - submodelElementCollection.Add(submodelElement); - } - else if (referable is SubmodelElementList submodelElementList) - { - submodelElementList.Add(submodelElement); - } - else if (referable is Entity entity) - { - entity.Add(submodelElement); - } - } - - #region Display - - public static EnumerationPlacmentBase GetChildrenPlacement(this IReferable referable, ISubmodelElement submodelElement) - { - if (referable is Operation operation) - { - return operation.GetChildrenPlacement(submodelElement); - } - - return null; - } - - #endregion - - public static IIdentifiable FindParentFirstIdentifiable(this IReferable referable) - { - IReferable curr = referable; - while (curr != null) - { - if (curr is IIdentifiable curri) - return curri; - curr = curr.Parent as IReferable; - } - return null; - } - - #endregion - - #region ListOfReferables - public static Reference GetReference(this List referables) - { - return new Reference(ReferenceTypes.ExternalReference, referables.ToKeyList()); - } - - public static List ToKeyList(this List referables) - { - var res = new List(); - foreach (var rf in referables) - res.Add(new Key(rf.GetSelfDescription()?.KeyType ?? KeyTypes.GlobalReference, rf.IdShort)); - return res; - } - #endregion - - public static string ToIdShortString(this IReferable rf) - { - if (rf.IdShort == null || rf.IdShort.Trim().Length < 1) - return (""); - return rf.IdShort.Trim(); - } - - public static IReference GetReference(this IReferable referable) - { - if (referable is IIdentifiable identifiable) - { - return identifiable.GetReference(); - } - else if (referable is ISubmodelElement submodelElement) - { - return submodelElement.GetModelReference(); - } - else - return null; - } - - public static void Validate(this IReferable referable, AasValidationRecordList results) - { - referable.BaseValidation(results); - - if (referable is ConceptDescription conceptDescription) - { - conceptDescription.Validate(results); - } - else if (referable is Submodel submodel) - { - submodel.Validate(results); - } - else if (referable is ISubmodelElement submodelElement) - { - // No further validation for SME - } - } - - public static void BaseValidation(this IReferable referable, AasValidationRecordList results) - { - // access - if (results == null) - return; - - // check - if (string.IsNullOrEmpty(referable.IdShort)) - results.Add(new AasValidationRecord( - AasValidationSeverity.SpecViolation, referable, - "Referable: missing idShort", - () => - { - referable.IdShort = "TO_FIX"; - })); - - if (referable.Description != null && (referable.Description.Count < 1)) - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, referable, - "Referable: existing description with missing langString", - () => - { - referable.Description = null; - })); - } - - /// - /// Tells, if the IReferable is used with an index instead of idShort. - /// - public static bool IsIndexed(this IReferable rf) - { - return rf is SubmodelElementList; - } - - public static AasElementSelfDescription GetSelfDescription(this IReferable referable) - { - if (referable is AssetAdministrationShell) - { - return new AasElementSelfDescription("AssetAdministrationShell", "AAS", - KeyTypes.AssetAdministrationShell, null); - } - else if (referable is ConceptDescription) - { - return new AasElementSelfDescription("ConceptDescription", "CD", - KeyTypes.ConceptDescription, null); - } - else if (referable is Submodel) - { - return new AasElementSelfDescription("Submodel", "SM", - KeyTypes.Submodel, null); - } - else if (referable is Property) - { - return new AasElementSelfDescription("Property", "Prop", - KeyTypes.Property, AasSubmodelElements.Property); - } - else if (referable is MultiLanguageProperty) - { - return new AasElementSelfDescription("MultiLanguageProperty", "MLP", - KeyTypes.MultiLanguageProperty, AasSubmodelElements.MultiLanguageProperty); - } - else if (referable is AasCore.Aas3_0.Range) - { - return new AasElementSelfDescription("Range", "Range", - KeyTypes.Range, AasSubmodelElements.Range); - } - else if (referable is Blob) - { - return new AasElementSelfDescription("Blob", "Blob", - KeyTypes.Blob, AasSubmodelElements.Blob); - } - else if (referable is AasCore.Aas3_0.File) - { - return new AasElementSelfDescription("File", "File", - KeyTypes.File, AasSubmodelElements.File); - } - else if (referable is ReferenceElement) - { - return new AasElementSelfDescription("ReferenceElement", "Ref", - KeyTypes.ReferenceElement, AasSubmodelElements.ReferenceElement); - } - else if (referable is RelationshipElement) - { - return new AasElementSelfDescription("RelationshipElement", "Rel", - KeyTypes.RelationshipElement, AasSubmodelElements.RelationshipElement); - } - else if (referable is AnnotatedRelationshipElement) - { - return new AasElementSelfDescription("AnnotatedRelationshipElement", "RelA", - KeyTypes.AnnotatedRelationshipElement, AasSubmodelElements.AnnotatedRelationshipElement); - } - else if (referable is Capability) - { - return new AasElementSelfDescription("Capability", "Cap", - KeyTypes.Capability, AasSubmodelElements.Capability); - } - else if (referable is SubmodelElementCollection) - { - return new AasElementSelfDescription("SubmodelElementCollection", "SMC", - KeyTypes.SubmodelElementCollection, AasSubmodelElements.SubmodelElementCollection); - } - else if (referable is SubmodelElementList) - { - return new AasElementSelfDescription("SubmodelElementList", "SML", - KeyTypes.SubmodelElementList, AasSubmodelElements.SubmodelElementList); - } - else if (referable is Operation) - { - return new AasElementSelfDescription("Operation", "Opr", - KeyTypes.Operation, AasSubmodelElements.Operation); - } - else if (referable is Entity) - { - return new AasElementSelfDescription("Entity", "Ent", - KeyTypes.Entity, AasSubmodelElements.Entity); - } - else if (referable is BasicEventElement) - { - return new AasElementSelfDescription("BasicEventElement", "Evt", - - KeyTypes.BasicEventElement, AasSubmodelElements.BasicEventElement); - } - else if (referable is IDataElement) - { - return new AasElementSelfDescription("DataElement", "DE", - KeyTypes.DataElement, AasSubmodelElements.DataElement); - } - else if (referable is ISubmodelElement) - { - return new AasElementSelfDescription("SubmodelElement", "SME", - KeyTypes.SubmodelElement, AasSubmodelElements.SubmodelElement); - } - else - { - return new AasElementSelfDescription("Referable", "Ref", - KeyTypes.Referable, null); - } - } - public static void CollectReferencesByParent(this IReferable referable, List refs) - { - // access - if (refs == null) - return; - - // check, if this is identifiable - if (referable is IIdentifiable) - { - var idf = referable as IIdentifiable; - if (idf != null) - { - - var key = new Key((KeyTypes)Stringification.KeyTypesFromString(idf.GetType().Name), idf.Id); - refs.Insert(0, key); - } - } - else - { - var key = new Key((KeyTypes)Stringification.KeyTypesFromString(referable.GetType().Name), referable.IdShort); - refs.Insert(0, key); - // recurse upwards! - if (referable.Parent is IReferable prf) - prf.CollectReferencesByParent(refs); - } - } - public static void SetTimeStamp(this IReferable referable, DateTime timeStamp) - { - IReferable newReferable = referable; - do - { - newReferable.TimeStamp = timeStamp; - if (newReferable != newReferable.Parent) - { - newReferable = (IReferable)newReferable.Parent; - } - else - newReferable = null; - } - while (newReferable != null); - } - - public static bool EnumeratesChildren(this ISubmodelElement elem) - { - var num = elem.EnumerateChildren().Count(); - return (num > 0); - } - - public static IEnumerable EnumerateChildren(this IReferable rf) - { - // the code below was done by Jui - // MIHO: I think, we should now use the methods of AAS core - - if (rf == null) - yield break; - - foreach (var desc in rf.DescendOnce()) - if (desc is ISubmodelElement sme) - yield return sme; - -#if __old - if (referable is Submodel submodel && submodel.SubmodelElements != null) - { - if (submodel.SubmodelElements != null) - { - foreach (var submodelElement in submodel.SubmodelElements) - { - yield return submodelElement; - } - } - } - else if (referable is SubmodelElementCollection submodelElementCollection) - { - if (submodelElementCollection.Value != null) - { - foreach (var submodelElement in submodelElementCollection.Value) - { - yield return submodelElement; - } - } - } - else if (referable is SubmodelElementList submodelElementList) - { - if (submodelElementList.Value != null) - { - foreach (var submodelElement in submodelElementList.Value) - { - yield return submodelElement; - } - } - } - else if (referable is AnnotatedRelationshipElement annotatedRelationshipElement) - { - if (annotatedRelationshipElement.Annotations != null) - { - foreach (var submodelElement in annotatedRelationshipElement.Annotations) - { - yield return submodelElement; - } - } - } - else if (referable is Entity entity) - { - if (entity.Statements != null) - { - foreach (var submodelElement in entity.Statements) - { - yield return submodelElement; - } - } - } - else if (referable is Operation operation) - { - if (operation.InputVariables != null) - foreach (var inputVariable in operation.InputVariables) - { - yield return inputVariable.Value; - } - - if (operation.OutputVariables != null) - foreach (var outputVariable in operation.OutputVariables) - { - yield return outputVariable.Value; - } - - if (operation.InoutputVariables != null) - foreach (var inOutVariable in operation.InoutputVariables) - { - yield return inOutVariable.Value; - } - } - else - { - yield break; - } -#endif - } - - - public static void SetAllParentsAndTimestamps(this IReferable referable, IReferable parent, DateTime timeStamp, DateTime timeStampCreate) - { - if (parent == null) - return; - - referable.Parent = parent; - referable.TimeStamp = timeStamp; - referable.TimeStampCreate = timeStampCreate; - - foreach (var submodelElement in referable.EnumerateChildren()) - { - submodelElement.SetAllParentsAndTimestamps(referable, timeStamp, timeStampCreate); - } - } - - public static Submodel GetParentSubmodel(this IReferable referable) - { - IReferable parent = referable; - while (parent is not Submodel && parent != null) - parent = (IReferable)parent.Parent; - return parent as Submodel; - } - - public static string CollectIdShortByParent(this IReferable referable) - { - // recurse first - var head = ""; - if (referable is not IIdentifiable && referable.Parent is IReferable parentReferable) - // can go up - head = parentReferable.CollectIdShortByParent() + "/"; - // add own - var myid = ""; - if (!string.IsNullOrEmpty(referable.IdShort)) - myid = referable.IdShort.Trim(); - // together - return head + myid; - } - - public static void AddDescription(this IReferable referable, string language, string Text) - { - if (referable.Description == null) - referable.Description = new List(); - referable.Description.Add(new LangStringTextType(language, Text)); - } - - public static List ListOfIReferableFrom( - System.Text.Json.Nodes.JsonNode node) - { - var res = new List(); - if (node == null) - return res; - var array = node.AsArray(); - foreach (var it in array) - { - var ir = Jsonization.Deserialize.IReferableFrom(it); - res.Add(ir); - } - return res; - } - - public static Key ToKey(this IReferable rf) - { - var sd = rf.GetSelfDescription(); - if (sd == null || !sd.KeyType.HasValue) - return null; - if (rf is IIdentifiable rfi) - return new Key(sd.KeyType.Value, rfi.Id); - return new Key(sd.KeyType.Value, rf.IdShort); - } - - public static System.Text.Json.Nodes.JsonNode ToJsonObject(List classes) - { - var jar = new System.Text.Json.Nodes.JsonArray(); - if (classes != null) - foreach (var c in classes) - jar.Add(Jsonization.Serialize.ToJsonObject(c)); - return jar; - } - - public static IEnumerable FindAllQualifierType(this IReferable rf, string qualifierType) - { - if (!(rf is IQualifiable rfq) || rfq.Qualifiers == null || qualifierType == null) - yield break; - foreach (var q in rfq.Qualifiers) - if (q.Type.Trim().ToLower() == qualifierType.Trim().ToLower()) - yield return q; - } - - public static IQualifier HasQualifierOfType(this IReferable rf, string qualifierType) - { - if (!(rf is IQualifiable rfq) || rfq.Qualifiers == null) - return null; - foreach (var q in rfq.Qualifiers) - if (q.Type?.Trim().ToLower() == qualifierType?.Trim().ToLower()) - return q; - return null; - } - - public static Qualifier Add(this IReferable rf, Qualifier q) - { - if (!(rf is IQualifiable rfq)) - return null; - if (rfq.Qualifiers == null) - rfq.Qualifiers = new List(); - rfq.Qualifiers.Add(q); - return q; - } - - public static IEnumerable FindAllExtensionName(this IReferable rf, string extensionName) - { - if (!(rf is IHasExtensions rfe) || rfe.Extensions == null) - yield break; - foreach (var e in rfe.Extensions) - if (e.Name?.Trim().ToLower() == extensionName?.Trim().ToLower()) - yield return e; - } - - - public static IExtension HasExtensionOfName(this IReferable rf, string extensionName) - { - if (!(rf is IHasExtensions rfe) || rfe.Extensions == null) - return null; - foreach (var e in rfe.Extensions) - if (e.Name?.Trim().ToLower() == extensionName?.Trim().ToLower()) - return e; - return null; - } - - public static Extension Add(this IReferable rf, Extension ext) - { - if (rf.Extensions == null) - rf.Extensions = new List(); - rf.Extensions.Add(ext); - return ext; - } - - public static void MigrateV20QualifiersToExtensions(this IReferable rf) - { - // access - if (!(rf is IQualifiable iq) || iq.Qualifiers == null || !(rf is IHasExtensions ihe)) - return; - - // Qualifiers to migrate - var toMigrate = new[] { - "Animate.Args", "Plotting.Args", "TimeSeries.Args", "BOM.Args", "ImageMap.Args" - }; - - List toMove = new List(); - foreach (var q in iq.Qualifiers) - foreach (var tm in toMigrate) - if (q?.Type?.Equals(tm, StringComparison.InvariantCultureIgnoreCase) == true) - toMove.Add(q); - - // now move these - for (int i = 0; i < toMove.Count; i++) - { - var q = toMove[i]; - var ext = new Extension( - name: q.Type, semanticId: q.SemanticId, - valueType: q.ValueType, value: q.Value); - rf.Add(ext); - iq.Qualifiers.Remove(q); - } - } - - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendISubmodelElement.cs b/src/AasxCsharpLibrary/Extensions/ExtendISubmodelElement.cs deleted file mode 100644 index 1d8e9fa37..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendISubmodelElement.cs +++ /dev/null @@ -1,1551 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using AasxCompatibilityModels; -using AdminShellNS; -using AdminShellNS.Extensions; -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Extensions -{ - public static class ExtendISubmodelElement - { - // constants - public static Type[] PROP_MLP = new Type[] { - typeof(MultiLanguageProperty), typeof(Property) }; - - #region AasxPackageExplorer - - public static List Copy(this List original) - { - var res = new List(); - if (original != null) - foreach (var o in original) - res.Add(o.Copy()); - return res; - } - - public static object AddChild(this ISubmodelElement submodelElement, ISubmodelElement childSubmodelElement, EnumerationPlacmentBase placement = null) - { - if (submodelElement is AnnotatedRelationshipElement annotatedRelationshipElement) - { - return annotatedRelationshipElement.AddChild(childSubmodelElement, placement); - } - else if (submodelElement is SubmodelElementCollection submodelElementCollection) - { - return submodelElementCollection.AddChild(childSubmodelElement, placement); - } - else if (submodelElement is SubmodelElementList submodelElementList) - { - return submodelElementList.AddChild(childSubmodelElement, placement); - } - else if (submodelElement is Operation operation) - { - return operation.AddChild(childSubmodelElement, placement); - } - else if (submodelElement is Entity entity) - { - return entity.AddChild(childSubmodelElement, placement); - } - else - return childSubmodelElement; - } - - public static List GetChildsAsList(this ISubmodelElement sme) - { - return sme.DescendOnce().Where((x) => x is ISubmodelElement).Cast().ToList(); - } - - public static Tuple ToCaptionInfo(this ISubmodelElement submodelElement) - { - var caption = AdminShellUtil.EvalToNonNullString("\"{0}\" ", submodelElement.IdShort, ""); - var info = ""; - // TODO (MIHO, 2021-07-08): obvious error .. info should receive semanticId .. but would change - // display presentation .. therefore to be checked again - if (submodelElement.SemanticId != null) - AdminShellUtil.EvalToNonEmptyString("\u21e8 {0}", submodelElement.SemanticId.ToStringExtended(), ""); - return Tuple.Create(caption, info); - } - - public static void ValueFromText(this ISubmodelElement submodelElement, string text, string defaultLang = null) - { - switch (submodelElement) - { - case Property property: - { - property.ValueFromText(text); - break; - } - case MultiLanguageProperty multiLanguageProperty: - { - multiLanguageProperty.ValueFromText(text, defaultLang); - break; - } - default: - { - throw new Exception("Unhandled submodel element type"); - } - } - } - - #endregion - public static IEnumerable FindAllParents(this ISubmodelElement submodelElement, - Predicate p, - bool includeThis = false, bool includeSubmodel = false, - bool passOverMiss = false) - { - // call for this? - if (includeThis) - { - if (p == null || p.Invoke(submodelElement)) - yield return submodelElement; - else - if (!passOverMiss) - yield break; - } - - // daisy chain all parents .. - if (submodelElement.Parent != null) - { - if (submodelElement.Parent is ISubmodelElement psme) - { - foreach (var q in psme.FindAllParents(p, includeThis: true, - passOverMiss: passOverMiss)) - yield return q; - } - else if (includeSubmodel && submodelElement.Parent is Submodel psm) - { - if (p == null || p.Invoke(psm)) - yield return submodelElement; - } - } - } - - public static IEnumerable FindAllParentsWithSemanticId( - this ISubmodelElement submodelElement, IReference semId, - bool includeThis = false, bool includeSubmodel = false, bool passOverMiss = false) - { - return (FindAllParents(submodelElement, - (rf) => (true == (rf as IHasSemantics)?.SemanticId?.Matches(semId, - matchMode: MatchMode.Relaxed)), - includeThis: includeThis, includeSubmodel: includeSubmodel, passOverMiss: passOverMiss)); - } - - public static string ValueAsText(this ISubmodelElement submodelElement, string defaultLang = null) - { - //TODO (??, 0000-00-00): Need to check/test this logic again - if (submodelElement is Property property) - { - return property.ValueAsText(); - } - - if (submodelElement is MultiLanguageProperty multiLanguageProperty) - { - return multiLanguageProperty.ValueAsText(defaultLang); - } - - if (submodelElement is AasCore.Aas3_0.Range range) - { - return range.ValueAsText(); - } - - if (submodelElement is File file) - { - return file.ValueAsText(); - } - - return ""; - } - - public static IQualifier FindQualifierOfType(this ISubmodelElement submodelElement, string qualifierType) - { - if (submodelElement.Qualifiers == null || submodelElement.Qualifiers.Count == 0) - { - return null; - } - - foreach (var qualifier in submodelElement.Qualifiers) - { - if (qualifier.Type.Equals(qualifierType, StringComparison.OrdinalIgnoreCase)) - { - return qualifier; - } - } - - return null; - - } - - public static IReference GetModelReference(this ISubmodelElement sme, bool includeParents = true) - { - // this will be the tail of our chain - var keyList = new List(); - var keyType = ExtensionsUtil.GetKeyType(sme); - var key = new Key(keyType, sme.IdShort); - keyList.Add(key); - - // keys for Parents will be INSERTED in front, iteratively - var currentParent = sme.Parent; - while (includeParents && currentParent != null) - { - if (currentParent is IIdentifiable identifiable) - { - var currentParentKey = new Key(ExtensionsUtil.GetKeyType(identifiable), identifiable.Id); - keyList.Insert(0, currentParentKey); - currentParent = null; - } - else if (currentParent is IReferable referable) - { - var currentParentKey = new Key(ExtensionsUtil.GetKeyType(referable), referable.IdShort); - keyList.Insert(0, currentParentKey); - currentParent = referable.Parent; - } - - } - - var outputReference = new Reference(ReferenceTypes.ModelReference, keyList); - outputReference.ReferredSemanticId = sme.SemanticId; - return outputReference; - } - - public static IEnumerable FindDeep(this ISubmodelElement submodelElement) - { - if (submodelElement is T) - { - yield return (T)submodelElement; - } - - foreach (var x in submodelElement.Descend().OfType()) - yield return x; - } - - public static ISubmodelElement ConvertFromV10(this ISubmodelElement submodelElement, AdminShellV10.SubmodelElement sourceSubmodelElement, bool shallowCopy = false) - { - ISubmodelElement outputSubmodelElement = null; - if (sourceSubmodelElement != null) - { - if (sourceSubmodelElement is AdminShellV10.SubmodelElementCollection collection) - { - var newSmeCollection = new SubmodelElementCollection(); - outputSubmodelElement = newSmeCollection.ConvertFromV10(collection, shallowCopy); - } - else if (sourceSubmodelElement is AdminShellV10.Property sourceProperty) - { - var newProperty = new Property(DataTypeDefXsd.String); - outputSubmodelElement = newProperty.ConvertFromV10(sourceProperty); - } - else if (sourceSubmodelElement is AdminShellV10.File sourceFile) - { - var newFile = new File(""); - outputSubmodelElement = newFile.ConvertFromV10(sourceFile); - } - else if (sourceSubmodelElement is AdminShellV10.Blob blob) - { - var newBlob = new Blob(""); - outputSubmodelElement = newBlob.ConvertFromV10(blob); - } - else if (sourceSubmodelElement is AdminShellV10.ReferenceElement sourceReferenceElement) - { - outputSubmodelElement = new ReferenceElement(); - } - else if (sourceSubmodelElement is AdminShellV10.RelationshipElement sourceRelationshipElement) - { - var newFirst = ExtensionsUtil.ConvertReferenceFromV10(sourceRelationshipElement.first, ReferenceTypes.ModelReference); - var newSecond = ExtensionsUtil.ConvertReferenceFromV10(sourceRelationshipElement.second, ReferenceTypes.ModelReference); - outputSubmodelElement = new RelationshipElement(newFirst, newSecond); - } - else if (sourceSubmodelElement is AdminShellV10.Operation sourceOperation) - { - var newInputVariables = new List(); - var newOutputVariables = new List(); - if (!sourceOperation.valueIn.IsNullOrEmpty()) - { - - foreach (var inputVariable in sourceOperation.valueIn) - { - if (inputVariable.value.submodelElement != null) - { - ISubmodelElement newSubmodelElement = null; - newSubmodelElement = newSubmodelElement.ConvertFromV10(inputVariable.value.submodelElement); - var newOpVariable = new OperationVariable(newSubmodelElement); - newInputVariables.Add(newOpVariable); - } - } - } - - if (!sourceOperation.valueOut.IsNullOrEmpty()) - { - foreach (var outputVariable in sourceOperation.valueOut) - { - if (outputVariable.value.submodelElement != null) - { - ISubmodelElement newSubmodelElement = null; - newSubmodelElement = newSubmodelElement.ConvertFromV10(outputVariable.value.submodelElement); - var newOpVariable = new OperationVariable(newSubmodelElement); - newOutputVariables.Add(newOpVariable); - } - } - } - - outputSubmodelElement = new Operation(inputVariables: newInputVariables, outputVariables: newOutputVariables); - } - - if (outputSubmodelElement != null) - { - outputSubmodelElement.BasicConversionFromV10(sourceSubmodelElement); - } - } - - return outputSubmodelElement; - } - - private static void BasicConversionFromV10(this ISubmodelElement submodelElement, AdminShellV10.SubmodelElement sourceSubmodelElement) - { - if (!string.IsNullOrEmpty(sourceSubmodelElement.idShort)) - { - submodelElement.IdShort = sourceSubmodelElement.idShort; - } - - if (!string.IsNullOrEmpty(sourceSubmodelElement.category)) - { - submodelElement.Category = sourceSubmodelElement.category; - } - - if (sourceSubmodelElement.description != null) - { - submodelElement.Description = ExtensionsUtil.ConvertDescriptionFromV10(sourceSubmodelElement.description); - } - - if (sourceSubmodelElement.semanticId != null && !sourceSubmodelElement.semanticId.IsEmpty) - { - var keyList = new List(); - foreach (var refKey in sourceSubmodelElement.semanticId.Keys) - { - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {refKey.type} not found."); - } - } - submodelElement.SemanticId = new Reference(ReferenceTypes.ExternalReference, keyList); - } - - if (sourceSubmodelElement.kind != null) - { - //SubmodelElement does not have kind anymore - } - - if (!sourceSubmodelElement.qualifiers.IsNullOrEmpty()) - { - if (submodelElement.Qualifiers == null && submodelElement.Qualifiers.Count != 0) - { - submodelElement.Qualifiers = new List(); - } - - foreach (var sourceQualifier in sourceSubmodelElement.qualifiers) - { - var newQualifier = new Qualifier("", DataTypeDefXsd.String); - newQualifier = newQualifier.ConvertFromV10(sourceQualifier); - submodelElement.Qualifiers.Add(newQualifier); - } - } - - if (sourceSubmodelElement.hasDataSpecification != null && !sourceSubmodelElement.hasDataSpecification.reference.IsNullOrEmpty()) - { - //TODO (jtikekar, 0000-00-00): EmbeddedDataSpecification?? (as per old implementation) - submodelElement.EmbeddedDataSpecifications ??= new List(); - foreach (var dataSpecification in sourceSubmodelElement.hasDataSpecification.reference) - { - if (!dataSpecification.IsEmpty) - { - submodelElement.EmbeddedDataSpecifications.Add( - new EmbeddedDataSpecification( - ExtensionsUtil.ConvertReferenceFromV10(dataSpecification, ReferenceTypes.ExternalReference), - null)); - } - } - } - } - - public static ISubmodelElement ConvertFromV20(this ISubmodelElement submodelElement, AdminShellV20.SubmodelElement sourceSubmodelElement, bool shallowCopy = false) - { - ISubmodelElement outputSubmodelElement = null; - if (sourceSubmodelElement != null) - { - if (sourceSubmodelElement is AdminShellV20.SubmodelElementCollection collection) - { - var newSmeCollection = new SubmodelElementCollection(); - outputSubmodelElement = newSmeCollection.ConvertFromV20(collection, shallowCopy); - } - else if (sourceSubmodelElement is AdminShellV20.Property sourceProperty) - { - var newProperty = new Property(DataTypeDefXsd.String); - outputSubmodelElement = newProperty.ConvertFromV20(sourceProperty); - } - else if (sourceSubmodelElement is AdminShellV20.MultiLanguageProperty sourceMultiLangProp) - { - var newMultiLangProperty = new MultiLanguageProperty(); - outputSubmodelElement = newMultiLangProperty.ConvertFromV20(sourceMultiLangProp); - } - else if (sourceSubmodelElement is AdminShellV20.Range sourceRange) - { - var newRange = new AasCore.Aas3_0.Range(DataTypeDefXsd.String); - outputSubmodelElement = newRange.ConvertFromV20(sourceRange); - } - else if (sourceSubmodelElement is AdminShellV20.File sourceFile) - { - var newFile = new File(""); - outputSubmodelElement = newFile.ConvertFromV20(sourceFile); - } - else if (sourceSubmodelElement is AdminShellV20.Blob blob) - { - var newBlob = new Blob(""); - outputSubmodelElement = newBlob.ConvertFromV20(blob); - } - else if (sourceSubmodelElement is AdminShellV20.ReferenceElement sourceReferenceElement) - { - var newReference = ExtensionsUtil.ConvertReferenceFromV20(sourceReferenceElement.value, ReferenceTypes.ModelReference); - outputSubmodelElement = new ReferenceElement(value: newReference); - } - else if (sourceSubmodelElement is AdminShellV20.AnnotatedRelationshipElement sourceAnnotedRelationshipElement) - { - var newFirst = ExtensionsUtil.ConvertReferenceFromV20(sourceAnnotedRelationshipElement.first, ReferenceTypes.ModelReference); - var newSecond = ExtensionsUtil.ConvertReferenceFromV20(sourceAnnotedRelationshipElement.second, ReferenceTypes.ModelReference); - var newAnnotedRelElement = new AnnotatedRelationshipElement(newFirst, newSecond); - outputSubmodelElement = newAnnotedRelElement.ConvertAnnotationsFromV20(sourceAnnotedRelationshipElement); - } - else if (sourceSubmodelElement is AdminShellV20.RelationshipElement sourceRelationshipElement) - { - var newFirst = ExtensionsUtil.ConvertReferenceFromV20(sourceRelationshipElement.first, ReferenceTypes.ModelReference); - var newSecond = ExtensionsUtil.ConvertReferenceFromV20(sourceRelationshipElement.second, ReferenceTypes.ModelReference); - outputSubmodelElement = new RelationshipElement(newFirst, newSecond); - } - else if (sourceSubmodelElement is AdminShellV20.BasicEvent sourceBasicEvent) - { - var newObserved = ExtensionsUtil.ConvertReferenceFromV20(sourceBasicEvent.observed, ReferenceTypes.ModelReference); - - outputSubmodelElement = new BasicEventElement(newObserved, Direction.Input, StateOfEvent.Off); - //TODO (jtikekar, 0000-00-00): default values of enums - } - else if (sourceSubmodelElement is AdminShellV20.Entity sourceEntity) - { - var entityType = Stringification.EntityTypeFromString(sourceEntity.entityType); - var newEntity = new Entity(entityType ?? EntityType.CoManagedEntity); - outputSubmodelElement = newEntity.ConvertFromV20(sourceEntity); - } - else if (sourceSubmodelElement is AdminShellV20.Operation sourceOperation) - { - var newInputVariables = new List(); - var newOutputVariables = new List(); - var newInOutVariables = new List(); - if (!sourceOperation.inputVariable.IsNullOrEmpty()) - { - - foreach (var inputVariable in sourceOperation.inputVariable) - { - if (inputVariable.value.submodelElement != null) - { - ISubmodelElement newSubmodelElement = null; - newSubmodelElement = newSubmodelElement.ConvertFromV20(inputVariable.value.submodelElement); - var newOpVariable = new OperationVariable(newSubmodelElement); - newInputVariables.Add(newOpVariable); - } - } - } - if (!sourceOperation.outputVariable.IsNullOrEmpty()) - { - foreach (var outputVariable in sourceOperation.outputVariable) - { - if (outputVariable.value.submodelElement != null) - { - ISubmodelElement newSubmodelElement = null; - newSubmodelElement = newSubmodelElement.ConvertFromV20(outputVariable.value.submodelElement); - var newOpVariable = new OperationVariable(newSubmodelElement); - newOutputVariables.Add(newOpVariable); - } - } - } - - if (!sourceOperation.inoutputVariable.IsNullOrEmpty()) - { - foreach (var inOutVariable in sourceOperation.inoutputVariable) - { - if (inOutVariable.value.submodelElement != null) - { - ISubmodelElement newSubmodelElement = null; - newSubmodelElement = newSubmodelElement.ConvertFromV20(inOutVariable.value.submodelElement); - var newOpVariable = new OperationVariable(newSubmodelElement); - newInOutVariables.Add(newOpVariable); - } - } - } - - outputSubmodelElement = new Operation(inputVariables: newInputVariables, outputVariables: newOutputVariables, inoutputVariables: newInOutVariables); - } - else if (sourceSubmodelElement is AdminShellV20.Capability) - { - outputSubmodelElement = new Capability(); - } - - if (outputSubmodelElement != null) - { - outputSubmodelElement.BasicConversionFromV20(sourceSubmodelElement); - } - } - - return outputSubmodelElement; - } - - private static void BasicConversionFromV20(this ISubmodelElement submodelElement, AdminShellV20.SubmodelElement sourceSubmodelElement) - { - if (!string.IsNullOrEmpty(sourceSubmodelElement.idShort)) - submodelElement.IdShort = sourceSubmodelElement.idShort; - - if (!string.IsNullOrEmpty(sourceSubmodelElement.category)) - submodelElement.Category = sourceSubmodelElement.category; - - if (sourceSubmodelElement.description != null) - submodelElement.Description = ExtensionsUtil.ConvertDescriptionFromV20(sourceSubmodelElement.description); - - if (sourceSubmodelElement.semanticId != null && !sourceSubmodelElement.semanticId.IsEmpty) - { - var keyList = new List(); - foreach (var refKey in sourceSubmodelElement.semanticId.Keys) - { - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - // DECISION: After phone call with Birgit, set all CD to GlobalReference - // assuming it is always a external concept - if (keyType == KeyTypes.ConceptDescription) - keyType = KeyTypes.GlobalReference; - - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {refKey.type} not found."); - } - } - submodelElement.SemanticId = new Reference(ReferenceTypes.ExternalReference, keyList); - } - - - if (!sourceSubmodelElement.qualifiers.IsNullOrEmpty()) - { - if (submodelElement.Qualifiers == null || submodelElement.Qualifiers.Count == 0) - submodelElement.Qualifiers = new List(); - - foreach (var sourceQualifier in sourceSubmodelElement.qualifiers) - { - var newQualifier = new Qualifier("", DataTypeDefXsd.String); - newQualifier = newQualifier.ConvertFromV20(sourceQualifier); - submodelElement.Qualifiers.Add(newQualifier); - } - } - - if (sourceSubmodelElement.hasDataSpecification != null && sourceSubmodelElement.hasDataSpecification.Count > 0) - { - foreach (var sourceEmbeddedDataSpec in sourceSubmodelElement.hasDataSpecification) - { - var newEmbeddedDataSpec = new EmbeddedDataSpecification (null, null); - newEmbeddedDataSpec.ConvertFromV20(sourceEmbeddedDataSpec); - if(newEmbeddedDataSpec.DataSpecification != null || newEmbeddedDataSpec.DataSpecificationContent != null) - { - submodelElement.EmbeddedDataSpecifications ??= new List(); - submodelElement.EmbeddedDataSpecifications.Add(newEmbeddedDataSpec); - } - } - } - - // move Qualifiers to Extensions - submodelElement.MigrateV20QualifiersToExtensions(); - } - - #region List - - public static IReferable FindReferableByReference( - this List submodelElements, Reference rf, int keyIndex) - { - return FindReferableByReference(submodelElements, rf?.Keys, keyIndex); - } - - public static IReferable FindReferableByReference( - this List submodelElements, List keys, int keyIndex) - { - // first index needs to exist .. - if (submodelElements == null || keys == null || keyIndex >= keys.Count) - return null; - - - // over all wrappers - foreach (var smw in submodelElements) - if (smw != null && smw.IdShort.Equals(keys[keyIndex].Value, StringComparison.OrdinalIgnoreCase)) - { - // match on this level. Did we find a leaf element? - if ((keyIndex + 1) >= keys.Count) - return smw; - - // dive into SMC? - if (smw is SubmodelElementCollection smc) - { - var found = FindReferableByReference(smc.Value, keys, keyIndex + 1); - if (found != null) - return found; - } - // dive into SML? - if (smw is SubmodelElementList submodelElementList) - { - var found = FindReferableByReference(submodelElementList.Value, keys, keyIndex + 1); - if (found != null) - return found; - } - - // dive into AnnotedRelationshipElement? - if (smw is AnnotatedRelationshipElement annotatedRelationshipElement) - { - var annotations = new List(annotatedRelationshipElement.Annotations); - var found = FindReferableByReference(annotations, keys, keyIndex + 1); - if (found != null) - return found; - } - - // dive into Entity statements? - if (smw is Entity ent) - { - var found = FindReferableByReference(ent.Statements, keys, keyIndex + 1); - if (found != null) - return found; - } - - // else: - return null; - } - - // no? - return null; - } - - public static IEnumerable FindDeep(this IEnumerable submodelElements, Predicate match = null) where T : ISubmodelElement - { - foreach (var smw in submodelElements) - { - var current = smw; - if (current == null) - continue; - - // call lambda for this element - if (current is T) - if (match == null || match.Invoke((T)current)) - yield return (T)current; - - // dive into? - // TODO (MIHO, 2020-07-31): would be nice to use IEnumerateChildren for this .. - // TODO (MIHO, 2023-01-01): would be nice to use AasCore.DescendOnce() for this .. -#if __old__ - if (current is SubmodelElementCollection smc && smc.Value != null) - foreach (var x in smc.Value.FindDeep(match)) - yield return x; - - if (current is AnnotatedRelationshipElement are && are.Annotations != null) - { - var annotationsList = new List(are.Annotations); - foreach (var x in annotationsList.FindDeep(match)) - yield return x; - } - - if (current is Entity ent && ent.Statements != null) - foreach (var x in ent.Statements.FindDeep(match)) - yield return x; - - if (current is Operation op) - { - var operationVariables = new List(); - foreach (var opVariable in op.InputVariables) - { - operationVariables.Add(opVariable.Value); - } - - foreach (var opVariable in op.InoutputVariables) - { - operationVariables.Add(opVariable.Value); - } - - foreach (var opVariable in op.OutputVariables) - { - operationVariables.Add(opVariable.Value); - } - - foreach (var x in operationVariables.FindDeep(match)) - yield return x; - } -#else - var smeChilds = current.DescendOnce().Where((ic) => ic is ISubmodelElement) - .Cast(); - foreach (var x in smeChilds.FindDeep(match)) - yield return x; -#endif - } - } - - public static void CopyManySMEbyCopy(this List submodelElements, ConceptDescription destCD, - List sourceSmc, ConceptDescription sourceCD, - bool createDefault = false, Action setDefault = null, - MatchMode matchMode = MatchMode.Relaxed) where T : ISubmodelElement - { - submodelElements.CopyManySMEbyCopy(destCD.GetSingleKey(), sourceSmc, sourceCD.GetSingleKey(), - createDefault ? destCD : null, setDefault, matchMode); - } - - public static void CopyManySMEbyCopy(this List submodelElements, Key destSemanticId, - List sourceSmc, Key sourceSemanticId, - ConceptDescription createDefault = null, Action setDefault = null, - MatchMode matchMode = MatchMode.Relaxed) where T : ISubmodelElement - { - // bool find possible sources - bool foundSrc = false; - if (sourceSmc == null) - return; - foreach (var src in sourceSmc.FindAllSemanticIdAs(sourceSemanticId, matchMode)) - { - // type of found src? - AasSubmodelElements aeSrc = (AasSubmodelElements)Enum.Parse(typeof(AasSubmodelElements), src.GetType().Name); - - // ok? - if (src == null || aeSrc == AasSubmodelElements.SubmodelElement) - continue; - foundSrc = true; - - // ok, create new one - var dst = AdminShellNS.AdminShellUtil.CreateSubmodelElementFromEnum(aeSrc, src); - if (dst != null) - { - // make same things sure - dst.IdShort = src.IdShort; - dst.Category = src.Category; - dst.SemanticId = new Reference(ReferenceTypes.ModelReference, new List() { destSemanticId }); - - // instantanously add it? - submodelElements.Add(dst); - } - } - - // default? - if (createDefault != null && !foundSrc) - { - // ok, default - var dflt = submodelElements.CreateSMEForCD(createDefault, addSme: true); - - // set default? - setDefault?.Invoke(dflt); - } - } - - public static T CopyOneSMEbyCopy(this List submodelElements, ConceptDescription destCD, - List sourceSmc, Key[] sourceKeys, - bool createDefault = false, Action setDefault = null, - MatchMode matchMode = MatchMode.Relaxed, - string idShort = null, bool addSme = false) where T : ISubmodelElement - { - return submodelElements.CopyOneSMEbyCopy(destCD?.GetSingleKey(), sourceSmc, sourceKeys, - createDefault ? destCD : null, setDefault, matchMode, idShort, addSme); - } - - public static T CopyOneSMEbyCopy(this List submodelELements, ConceptDescription destCD, - List sourceSmc, ConceptDescription sourceCD, - bool createDefault = false, Action setDefault = null, - MatchMode matchMode = MatchMode.Relaxed, - string idShort = null, bool addSme = false) where T : ISubmodelElement - { - return submodelELements.CopyOneSMEbyCopy(destCD?.GetSingleKey(), sourceSmc, new[] { sourceCD?.GetSingleKey() }, - createDefault ? destCD : null, setDefault, matchMode, idShort, addSme); - } - - public static T CopyOneSMEbyCopy(this List submodelElements, Key destSemanticId, - List sourceSmc, Key[] sourceSemanticId, - ConceptDescription createDefault = null, Action setDefault = null, - MatchMode matchMode = MatchMode.Relaxed, - string idShort = null, bool addSme = false) where T : ISubmodelElement - { - // get source - var src = sourceSmc.FindFirstAnySemanticIdAs(sourceSemanticId, matchMode); - - // may be make an adaptive conversion - if (src == null) - { - var anySrc = sourceSmc?.FindFirstAnySemanticId(sourceSemanticId, matchMode: matchMode); - src = submodelElements.AdaptiveConvertTo(anySrc, createDefault, - idShort: idShort, addSme: false); - } - - // proceed - AasSubmodelElements aeSrc = (AasSubmodelElements)Enum.Parse(typeof(AasSubmodelElements), src?.GetType().Name); - if (src == null || aeSrc == AasSubmodelElements.SubmodelElement) - { - // create a default? - if (createDefault == null) - return default(T); - - // ok, default - var dflt = submodelElements.CreateSMEForCD(createDefault, idShort: idShort, addSme: addSme); - - // set default? - setDefault?.Invoke(dflt); - - // return - return dflt; - } - - // ok, create new one - var dst = AdminShellNS.AdminShellUtil.CreateSubmodelElementFromEnum(aeSrc, src); - if (dst == null) - return default(T); - - // make same things sure - dst.IdShort = src.IdShort; - dst.Category = src.Category; - dst.SemanticId = new Reference(ReferenceTypes.ModelReference, new List() { destSemanticId }); - - // instantanously add it? - if (addSme) - submodelElements.Add(dst); - - // give back - return (T)dst; - } - - public static T AdaptiveConvertTo(this List submodelElements, - ISubmodelElement anySrc, - ConceptDescription createDefault = null, - string idShort = null, bool addSme = false) where T : ISubmodelElement - { - if (typeof(T) == typeof(MultiLanguageProperty) - && anySrc is Property srcProp) - { - var res = submodelElements.CreateSMEForCD(createDefault, idShort: idShort, addSme: addSme); - if (res is MultiLanguageProperty mlp) - { - mlp.Value = new List() { - new LangStringTextType(AdminShellUtil.GetDefaultLngIso639(), srcProp.Value) }; - mlp.ValueId = srcProp.ValueId; - return res; - } - } - - if (typeof(T) == typeof(Property) - && anySrc is MultiLanguageProperty srcMlp) - { - var res = submodelElements.CreateSMEForCD(createDefault, idShort: idShort, addSme: addSme); - if (res is Property prp) - { - prp.Value = "" + srcMlp.Value?.GetDefaultString(); - prp.ValueId = srcMlp.ValueId; - return res; - } - } - - return default(T); - } - - public static IEnumerable FindAllIdShort(this List submodelElements, - string idShort) - { - foreach (var smw in submodelElements) - if (smw != null) - if (smw.IdShort.Trim().ToLower() == idShort.Trim().ToLower()) - yield return smw; - } - - public static IEnumerable FindAllIdShortAs(this List submodelElements, - string idShort) where T : class, ISubmodelElement - { - foreach (var smw in submodelElements) - if (smw is T) - if (smw.IdShort.Trim().ToLower() == idShort.Trim().ToLower()) - yield return smw as T; - } - - public static ISubmodelElement FindFirstIdShort(this List submodelElements, - string idShort) - { - return submodelElements.FindAllIdShort(idShort)?.FirstOrDefault(); - } - - public static T FindFirstIdShortAs(this List submodelElements, - string idShort) where T : class, ISubmodelElement - { - return submodelElements.FindAllIdShortAs(idShort)?.FirstOrDefault(); - } - - - public static ISubmodelElement FindFirstAnySemanticId(this List submodelElements, - Key[] semId, Type[] allowedTypes = null, MatchMode matchMode = MatchMode.Strict) - { - if (semId == null) - return null; - foreach (var si in semId) - { - var found = submodelElements.FindAllSemanticId(si, allowedTypes, matchMode)? - .FirstOrDefault(); - if (found != null) - return found; - } - return null; - } - - public static T FindFirstAnySemanticIdAs( - this List submodelElements, IKey[] semId, MatchMode matchMode = MatchMode.Strict) - where T : ISubmodelElement - { - if (semId == null) - return default(T); - foreach (var si in semId) - { - var found = submodelElements.FindAllSemanticIdAs(si, matchMode).FirstOrDefault(); - if (found != null) - return found; - } - return default(T); - } - - public static T CreateNew( - string idShort = null, string category = null, IReference semanticId = null) - where T : ISubmodelElement, new() - { - var res = new T(); - if (idShort != null) - res.IdShort = idShort; - if (category != null) - res.Category = category; - if (semanticId != null) - res.SemanticId = semanticId.Copy(); - return res; - } - - public static T CreateSMEForCD(this List submodelELements, IConceptDescription conceptDescription, string category = null, string idShort = null, - string idxTemplate = null, int maxNum = 999, bool addSme = false, bool isTemplate = false) - where T : ISubmodelElement - { - // access - if (conceptDescription == null) - return default(T); - - // fin type enum - var smeType = AdminShellUtil.AasSubmodelElementsFrom(); - if (!smeType.HasValue) - return default(T); - - // try to potentially figure out idShort - var ids = conceptDescription.IdShort; - - //TODO (jtikekar, 0000-00-00): Temporarily removed - if ((ids == null || ids.Trim() == "") && conceptDescription.GetIEC61360() != null) - ids = conceptDescription.GetIEC61360().ShortName? - .GetDefaultString(); - - if (idShort != null) - ids = idShort; - - if (ids == null) - return default(T); - - // unique? - if (idxTemplate != null) - ids = submodelELements.IterateIdShortTemplateToBeUnique(idxTemplate, maxNum); - - // make a new instance - var semanticId = conceptDescription.GetCdReference(); - ISubmodelElement sme = AdminShellUtil.CreateSubmodelElementFromEnum(smeType.Value); - if (sme == null) - return default(T); - sme.IdShort = ids; - sme.SemanticId = semanticId.Copy(); - if (category != null) - sme.Category = category; - - // if its a SMC, make sure its accessible - if (sme is SubmodelElementCollection smc) - smc.Value = new List(); - - // instantanously add it? - if (addSme) - submodelELements.Add(sme); - - // give back - return (T)sme; - } - - public static IEnumerable FindAllSemanticIdAs(this List submodelELements, - IKey semId, MatchMode matchMode = MatchMode.Strict) - where T : ISubmodelElement - { - if (submodelELements.IsNullOrEmpty()) - yield return default(T); - foreach (var submodelElement in submodelELements) - if (submodelElement != null && submodelElement is T - && submodelElement.SemanticId != null) - if (submodelElement.SemanticId.MatchesExactlyOneKey(semId, matchMode)) - yield return (T)submodelElement; - } - - public static IEnumerable FindAllSemanticIdAs(this List submodelELements, - IReference semId, MatchMode matchMode = MatchMode.Strict) - where T : ISubmodelElement - { - foreach (var submodelElement in submodelELements) - if (submodelElement != null && submodelElement is T - && submodelElement.SemanticId != null) - if (submodelElement.SemanticId.Matches(semId, matchMode)) - yield return (T)submodelElement; - } - - public static T FindFirstSemanticIdAs(this List submodelElements, - IKey semId, MatchMode matchMode = MatchMode.Strict) - where T : ISubmodelElement - { - return submodelElements.FindAllSemanticIdAs(semId, matchMode).FirstOrDefault(); - } - - public static T FindFirstSemanticIdAs(this List submodelElements, - IReference semId, MatchMode matchMode = MatchMode.Strict) - where T : ISubmodelElement - { - return submodelElements.FindAllSemanticIdAs(semId, matchMode).FirstOrDefault(); - } - - public static List GetChildListFromFirstSemanticId( - this List submodelElements, - IKey semKey, MatchMode matchMode = MatchMode.Strict) - { - return FindFirstSemanticIdAs(submodelElements, semKey, matchMode)?.GetChildsAsList(); - } - - public static List GetChildListFromFirstSemanticId( - this List submodelElements, - IReference semId, MatchMode matchMode = MatchMode.Strict) - { - return FindFirstSemanticIdAs(submodelElements, semId, matchMode)?.GetChildsAsList(); - } - - public static IEnumerable> GetChildListsFromAllSemanticId( - this List submodelElements, - IKey semKey, MatchMode matchMode = MatchMode.Strict) - { - foreach (var child in FindAllSemanticIdAs(submodelElements, semKey, matchMode)) - yield return child.GetChildsAsList()?.ToList(); - } - - public static IEnumerable> GetChildListsFromAllSemanticId( - this List submodelElements, - IReference semId, MatchMode matchMode = MatchMode.Strict) - { - foreach (var child in FindAllSemanticIdAs(submodelElements, semId, matchMode)) - yield return child.GetChildsAsList()?.ToList(); - } - - public static IEnumerable Join(params IEnumerable[] lists) - { - if (lists == null || lists.Length < 1) - yield break; - foreach (var l in lists) - foreach (var sme in l) - yield return sme; - } - - public static void RecurseOnReferables( - this List submodelElements, object state, List parents, - Func, IReferable, bool> lambda) - { - if (lambda == null) - return; - if (parents == null) - parents = new List(); - - // over all elements - foreach (var submodelElement in submodelElements) - { - var current = submodelElement; - if (current == null) - continue; - - // call lambda for this element - // AND decide, if to recurse! - var goDeeper = lambda(state, parents, current); - - if (goDeeper) - { - // add to parents - parents.Add(current); - - // dive into? - if (current is SubmodelElementCollection smc) - smc.Value?.RecurseOnReferables(state, parents, lambda); - - if (current is Entity ent) - ent.Statements?.RecurseOnReferables(state, parents, lambda); - - if (current is Operation operation) - { - SubmodelElementCollection opVariableCollection = new SubmodelElementCollection(); - opVariableCollection.Value = new List(); - foreach (var inputVariable in operation.InputVariables) - { - opVariableCollection.Value.Add(inputVariable.Value); - } - - foreach (var outputVariable in operation.OutputVariables) - { - opVariableCollection.Value.Add(outputVariable.Value); - } - - foreach (var inOutVariable in operation.InoutputVariables) - { - opVariableCollection.Value.Add(inOutVariable.Value); - } - - opVariableCollection.Value.RecurseOnReferables(state, parents, lambda); - } - - if (current is AnnotatedRelationshipElement annotatedRelationshipElement) - { - var annotationElements = new List(); - if (annotatedRelationshipElement.Annotations != null) - foreach (var annotation in annotatedRelationshipElement.Annotations) - { - annotationElements.Add(annotation); - } - annotationElements.RecurseOnReferables(state, parents, lambda); - } - - // remove from parents - parents.RemoveAt(parents.Count - 1); - } - } - } - - public static void RecurseOnSubmodelElements( - this List submodelElements, object state, - List parents, Action, ISubmodelElement> lambda) - { - // trivial - if (lambda == null) - return; - if (parents == null) - parents = new List(); - - // over all elements - foreach (var smw in submodelElements) - { - var current = smw; - if (current == null) - continue; - - // call lambda for this element - lambda(state, parents, current); - - // add to parents - parents.Add(current); - - // dive into? - if (current is SubmodelElementCollection smc) - smc.Value?.RecurseOnSubmodelElements(state, parents, lambda); - - if (current is Entity ent) - ent.Statements?.RecurseOnSubmodelElements(state, parents, lambda); - - if (current is Operation operation) - { - SubmodelElementCollection opVariableCollection = new SubmodelElementCollection(); - foreach (var inputVariable in operation.InputVariables) - { - opVariableCollection.Value.Add(inputVariable.Value); - } - - foreach (var outputVariable in operation.OutputVariables) - { - opVariableCollection.Value.Add(outputVariable.Value); - } - - foreach (var inOutVariable in operation.InoutputVariables) - { - opVariableCollection.Value.Add(inOutVariable.Value); - } - - opVariableCollection.Value.RecurseOnSubmodelElements(state, parents, lambda); - } - - if (current is AnnotatedRelationshipElement annotatedRelationshipElement) - { - var annotationElements = new List(); - foreach (var annotation in annotatedRelationshipElement.Annotations) - { - annotationElements.Add(annotation); - } - annotationElements.RecurseOnSubmodelElements(state, parents, lambda); - } - - // remove from parents - parents.RemoveAt(parents.Count - 1); - } - } - - public static IEnumerable FindAllSemanticIdAs( - this List submodelELements, string semanticId) where T : ISubmodelElement - { - foreach (var submodelElement in submodelELements) - { - if (submodelElement != null && submodelElement is T && submodelElement.SemanticId != null) - { - if (submodelElement.SemanticId.Matches(semanticId)) - { - yield return (T)submodelElement; - } - } - } - } - - public static T FindFirstSemanticIdAs( - this List submodelELements, string semanticId) where T : ISubmodelElement - { - return submodelELements.FindAllSemanticIdAs(semanticId).FirstOrDefault(); - } - - public static T FindFirstAnySemanticIdAs( - this List submodelELements, string[] semanticIds) where T : ISubmodelElement - { - if (semanticIds == null) - return default; - foreach (var semanticId in semanticIds) - { - var found = submodelELements.FindFirstSemanticIdAs(semanticId); - if (found != null) - return found; - } - return default; - } - - public static IEnumerable FindAllSemanticId( - this List smes, - string[] allowedSemanticIds, - bool invertedAllowed = false) where T : ISubmodelElement - { - if (allowedSemanticIds == null || allowedSemanticIds.Length < 1) - yield break; - - foreach (var sme in smes) - { - if (sme == null || !(sme is T)) - continue; - - if (sme.SemanticId == null || sme.SemanticId.Keys.Count < 1) - { - if (invertedAllowed) - yield return (T)sme; - continue; - } - - var found = false; - foreach (var semanticId in allowedSemanticIds) - if (sme.SemanticId.Matches(semanticId)) - { - found = true; - break; - } - - if (invertedAllowed) - found = !found; - - if (found) - yield return (T)sme; - } - } - - public static T FindFirstAnySemanticId( - this List submodelElements, string[] allowedSemanticIds, - bool invertAllowed = false) where T : ISubmodelElement - { - return submodelElements.FindAllSemanticId(allowedSemanticIds, invertAllowed).FirstOrDefault(); - } - - public static IEnumerable FindAllSemanticId( - this List smes, - IKey[] allowedSemanticIds, MatchMode mm = MatchMode.Strict, - bool invertedAllowed = false) where T : ISubmodelElement - { - if (allowedSemanticIds == null || allowedSemanticIds.Length < 1) - yield break; - - foreach (var sme in smes) - { - if (sme == null || !(sme is T)) - continue; - - if (sme.SemanticId == null || sme.SemanticId.Keys.Count < 1) - { - if (invertedAllowed) - yield return (T)sme; - continue; - } - - var found = false; - foreach (var semanticId in allowedSemanticIds) - if (sme.SemanticId.MatchesExactlyOneKey(semanticId, mm)) - { - found = true; - break; - } - - if (invertedAllowed) - found = !found; - - if (found) - yield return (T)sme; - } - } - - public static T FindFirstAnySemanticId( - this List submodelElements, - IKey[] allowedSemanticIds, MatchMode mm = MatchMode.Strict, - bool invertAllowed = false) where T : ISubmodelElement - { - return submodelElements.FindAllSemanticId(allowedSemanticIds, mm, invertAllowed).FirstOrDefault(); - } - - public static IEnumerable FindAllSemanticId( - this List submodelElements, IKey semId, - Type[] allowedTypes = null, - MatchMode matchMode = MatchMode.Strict) - { - foreach (var smw in submodelElements) - if (smw != null && smw.SemanticId != null) - { - if (smw == null) - continue; - - if (allowedTypes != null) - { - var smwt = smw.GetType(); - if (!allowedTypes.Contains(smwt)) - continue; - } - - if (smw.SemanticId.MatchesExactlyOneKey(semId, matchMode)) - yield return smw; - } - } - - public static ISubmodelElement FindFirstSemanticId( - this List submodelElements, - IKey semId, Type[] allowedTypes = null, MatchMode matchMode = MatchMode.Strict) - { - return submodelElements.FindAllSemanticId(semId, allowedTypes, matchMode)?.FirstOrDefault(); - } - - public static IEnumerable FindAllSemanticIdAs( - this List smes, - ConceptDescription cd, MatchMode matchMode = MatchMode.Strict) - where T : ISubmodelElement - { - foreach (var x in FindAllSemanticIdAs(smes, cd.GetReference(), matchMode)) - yield return x; - } - - public static T FindFirstSemanticIdAs( - this List smes, - ConceptDescription cd, MatchMode matchMode = MatchMode.Strict) - where T : ISubmodelElement - { - return smes.FindAllSemanticIdAs(cd, matchMode).FirstOrDefault(); - } - - public static string IterateIdShortTemplateToBeUnique(this List submodelElements, string idShortTemplate, int maxNum) - { - if (idShortTemplate == null || maxNum < 1 || !idShortTemplate.Contains("{0")) - return null; - - int i = 1; - while (i < maxNum) - { - var ids = string.Format(idShortTemplate, i); - if (submodelElements.CheckIdShortIsUnique(ids)) - return ids; - i++; - } - - return null; - } - - /// - /// Returns false, if there is another element with same idShort in the list - /// - public static bool CheckIdShortIsUnique(this List submodelElements, string idShort) - { - idShort = idShort?.Trim(); - if (idShort == null || idShort.Length < 1) - return false; - - var res = true; - foreach (var smw in submodelElements) - if (smw != null && smw.IdShort != null && smw.IdShort == idShort) - { - res = false; - break; - } - - return res; - } - - #endregion - - public static ISubmodelElement UpdateFrom(this ISubmodelElement elem, ISubmodelElement source) - { - if (source == null) - return elem; - - // IReferable - elem.Category = source.Category; - elem.IdShort = source.IdShort; - elem.DisplayName = source.DisplayName?.Copy(); - elem.Description = source.Description?.Copy(); - - - // IHasSemantics - if (source.SemanticId != null) - elem.SemanticId = source.SemanticId.Copy(); - if (source.SupplementalSemanticIds != null) - elem.SupplementalSemanticIds = source.SupplementalSemanticIds.Copy(); - - // IQualifiable - if (source.Qualifiers != null) - elem.Qualifiers = source.Qualifiers.Copy(); - - // IHasDataSpecification - if (source.EmbeddedDataSpecifications != null) - elem.EmbeddedDataSpecifications = source.EmbeddedDataSpecifications.Copy(); - - return elem; - } - - // - // Factories - // - - private static readonly Dictionary AasSubmodelElementsToAbbrev = ( - new Dictionary() - { - { AasSubmodelElements.AnnotatedRelationshipElement, "RelA" }, - { AasSubmodelElements.BasicEventElement, "BEvt" }, - { AasSubmodelElements.Blob, "Blob" }, - { AasSubmodelElements.Capability, "Cap" }, - { AasSubmodelElements.DataElement, "DE" }, - { AasSubmodelElements.Entity, "Ent" }, - { AasSubmodelElements.EventElement, "Evt" }, - { AasSubmodelElements.File, "File" }, - { AasSubmodelElements.MultiLanguageProperty, "MLP" }, - { AasSubmodelElements.Operation, "Opr" }, - { AasSubmodelElements.Property, "Prop" }, - { AasSubmodelElements.Range, "Range" }, - { AasSubmodelElements.ReferenceElement, "Ref" }, - { AasSubmodelElements.RelationshipElement, "Rel" }, - { AasSubmodelElements.SubmodelElement, "SME" }, - { AasSubmodelElements.SubmodelElementList, "SML" }, - { AasSubmodelElements.SubmodelElementCollection, "SMC" } - }); - - /// - /// Retrieve the string abbreviation of . - /// - /// - /// If is not a valid literal, return null. - /// - public static string? ToString(AasSubmodelElements? that) - { - if (!that.HasValue) - { - return null; - } - else - { - if (AasSubmodelElementsToAbbrev.TryGetValue(that.Value, out string? value)) - { - return value; - } - else - { - return null; - } - } - } - - private static readonly Dictionary _aasSubmodelElementsFromAbbrev = ( - new Dictionary() - { - { "RelA", AasSubmodelElements.AnnotatedRelationshipElement }, - { "BEvt", AasSubmodelElements.BasicEventElement }, - { "Blob", AasSubmodelElements.Blob }, - { "Cap", AasSubmodelElements.Capability }, - { "DE", AasSubmodelElements.DataElement }, - { "Ent", AasSubmodelElements.Entity }, - { "Evt", AasSubmodelElements.EventElement }, - { "File", AasSubmodelElements.File }, - { "MLP", AasSubmodelElements.MultiLanguageProperty }, - { "Opr", AasSubmodelElements.Operation }, - { "Prop", AasSubmodelElements.Property }, - { "Range", AasSubmodelElements.Range }, - { "Ref", AasSubmodelElements.ReferenceElement }, - { "Rel", AasSubmodelElements.RelationshipElement }, - { "SME", AasSubmodelElements.SubmodelElement }, - { "SML", AasSubmodelElements.SubmodelElementList }, - { "SMC", AasSubmodelElements.SubmodelElementCollection } - }); - - /// - /// Parse the string abbreviation of . - /// - /// - /// If is not a valid string representation - /// of a literal of , - /// return null. - /// - public static AasSubmodelElements? AasSubmodelElementsFromAbbrev(string text) - { - if (_aasSubmodelElementsFromAbbrev.TryGetValue(text, out AasSubmodelElements value)) - { - return value; - } - else - { - return null; - } - } - - /// - /// Parse the string representation or the abbreviation of . - /// - /// - /// If is not a valid string representation - /// of a literal of , - /// return null. - /// - public static AasSubmodelElements? AasSubmodelElementsFromStringOrAbbrev(string text) - { - var res = Stringification.AasSubmodelElementsFromString(text); - if (res.HasValue) - return res; - - return AasSubmodelElementsFromAbbrev(text); - } - - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendKey.cs b/src/AasxCsharpLibrary/Extensions/ExtendKey.cs deleted file mode 100644 index f2c09ffa6..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendKey.cs +++ /dev/null @@ -1,268 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using AdminShellNS; -using System; -using System.Collections.Generic; -using System.Runtime.CompilerServices; -using System.Text.RegularExpressions; - -namespace Extensions -{ - public static class ExtendKey - { - public static IKey CreateFrom(Reference r) - { - if (r == null || r.Count() != 1) - return null; - return r.Keys[0].Copy(); - } - - public static bool Matches(this IKey key, - KeyTypes type, string id, MatchMode matchMode = MatchMode.Strict) - { - key.Value = key.Value.Trim(); - id = id.Trim(); - - if (matchMode == MatchMode.Strict) - return key.Type == type && key.Value.Replace("*01", "") == id.Replace("*01", ""); - - if (matchMode == MatchMode.Relaxed) - return (key.Type == type || key.Type == KeyTypes.GlobalReference || type == KeyTypes.GlobalReference) - && key.Value.Replace("*01", "") == id.Replace("*01", ""); - - if (matchMode == MatchMode.Identification) - return key.Value.Replace("*01", "") == id.Replace("*01", ""); - - return false; - } - public static bool Matches(this IKey key, IKey otherKey) - { - key.Value = key.Value.Trim(); - otherKey.Value = otherKey.Value.Trim(); - - if (otherKey == null) - { - return false; - } - - if (key.Type == otherKey.Type && key.Value.Replace("*01", "").Equals(otherKey.Value.Replace("*01", ""))) - { - return true; - } - - return false; - } - - public static bool Matches(this IKey key, IKey otherKey, MatchMode matchMode = MatchMode.Strict) - { - key.Value = key.Value.Trim(); - otherKey.Value = otherKey.Value.Trim(); - - if (matchMode == MatchMode.Strict) - return key.Type == otherKey.Type && key.Value.Replace("*01", "") == otherKey.Value.Replace("*01", ""); - - if (matchMode == MatchMode.Relaxed) - return (key.Type == otherKey.Type || key.Type == KeyTypes.GlobalReference || otherKey.Type == KeyTypes.GlobalReference) - && (key.Value.Replace("*01", "") == otherKey.Value.Replace("*01", "")); - - if (matchMode == MatchMode.Identification) - return key.Value.Replace("*01", "") == otherKey.Value.Replace("*01", ""); - - return false; - } - - public static bool MatchesSetOfTypes(this IKey key, IEnumerable set) - { - foreach (var kt in set) - if (key.Type == kt) - return true; - return false; - } - - public static AasValidationAction Validate(this IKey key, AasValidationRecordList results, IReferable container) - { - // access - if (results == null || container == null) - return AasValidationAction.No; - - var res = AasValidationAction.No; - - // check - if (key == null) - { - // violation case - results.Add(new AasValidationRecord( - AasValidationSeverity.SpecViolation, container, - "Key: is null", - () => - { - res = AasValidationAction.ToBeDeleted; - })); - } - else - { - - // check type - var tf = AdminShellUtil.CheckIfInConstantStringArray(Enum.GetNames(typeof(KeyTypes)), Stringification.ToString(key.Type)); - if (tf == AdminShellUtil.ConstantFoundEnum.No) - // violation case - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, container, - "Key: type is not in allowed enumeration values", - () => - { - key.Type = KeyTypes.GlobalReference; - })); - if (tf == AdminShellUtil.ConstantFoundEnum.AnyCase) - // violation case - // dead-csharp off - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, container, - "Key: type in wrong casing", - () => - { - //NO IdType in V3 - //key.idType = AdminShellUtil.CorrectCasingForConstantStringArray( - // KeyElements, key.type); - })); - // dead-csharp on - } - - // may give result "to be deleted" - return res; - } - - public static string ToStringExtended(this IKey key, int format = 1) - { - if (format == 2) - return "" + key.Value; - return $"[{key.Type}, {key.Value}]"; - } - - public static bool IsAbsolute(this IKey key) - { - return key.Type == KeyTypes.GlobalReference || key.Type == KeyTypes.AssetAdministrationShell || key.Type == KeyTypes.Submodel; - } - - public static Key Parse(string cell, KeyTypes typeIfNotSet = KeyTypes.GlobalReference, - bool allowFmtAll = false, bool allowFmt0 = false, - bool allowFmt1 = false, bool allowFmt2 = false) - { - // access and defaults? - if (cell == null || cell.Trim().Length < 1) - return null; - - // format == 1 - if (allowFmtAll || allowFmt1) - { - var m = Regex.Match(cell, @"\((\w+)\)( ?)(.*)$"); - if (m.Success) - { - return new Key( - Stringification.KeyTypesFromString(m.Groups[1].ToString()) ?? KeyTypes.GlobalReference, - m.Groups[3].ToString()); - } - } - - // format == 2 - if (allowFmtAll || allowFmt2) - { - var m = Regex.Match(cell, @"( ?)(.*)$"); - if (m.Success) - { - return new Key( - typeIfNotSet, m.Groups[2].ToString()); - } - } - - // format == 0 - if (allowFmtAll || allowFmt0) - { - var m = Regex.Match(cell, @"\[(\w+),( ?)(.*)\]"); - if (m.Success) - { - return new Key( - Stringification.KeyTypesFromString(m.Groups[1].ToString()) ?? KeyTypes.GlobalReference, - m.Groups[3].ToString()); - } - } - - // no - return null; - } - - #region Guess identification types - - public enum IdType { Unknown = 0, IRI, IRDI }; - - public static IdType GuessIdType(string id) - { - // start - if (id == null) - return IdType.Unknown; - id = id.Trim().ToLower(); - - // IRDI? - if (Regex.IsMatch(id, @"(\d{3,4})\W+")) - return IdType.IRDI; - - // IRI? - // TODO (??, 0000-00-00): check for escaping - if (Regex.IsMatch(id, @"(\w{3,5})://")) - return IdType.IRI; - - // unsure - return IdType.Unknown; - } - - #endregion - - // dead-csharp off - // ------------------------------------------------------------------------------------------------------------- - #region Handling with enums for KeyTypes - - // see: https://stackoverflow.com/questions/27372816/how-to-read-the-value-for-an-enummember-attribute - //public static string? GetEnumMemberValue(this T value) - // where T : Enum - //{ - // return typeof(T) - // .GetTypeInfo() - // .DeclaredMembers - // .SingleOrDefault(x => x.Name == value.ToString()) - // ?.GetCustomAttribute(false) - // ?.Value; - //} - - //public static KeyTypes? MapFrom(AasReferables input) - //{ - // var st = input.GetEnumMemberValue(); - // var res = Stringification.KeyTypesFromString(st); - // return res; - //} - - //public static List MapFrom(IEnumerable input) - //{ - // List res = new(); - // foreach (var i in input) - // { - // var x = MapFrom(i); - // if (x.HasValue) - // res.Add(x.Value); - // } - // return res; - //} - - //public static List GetAllKeyTypesForAasReferables() - // => ExtendKey.MapFrom(Enum.GetValues(typeof(AasReferables)).OfType()); - - #endregion - // dead-csharp on - - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendKeyList.cs b/src/AasxCsharpLibrary/Extensions/ExtendKeyList.cs deleted file mode 100644 index d33903f44..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendKeyList.cs +++ /dev/null @@ -1,194 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using Extensions; -using System.Collections.Generic; -using System.Linq; -using AdminShellNS; -using Aas = AasCore.Aas3_0; - -namespace Extensions -{ - public static class ExtendKeyList - { - public static bool IsEmpty(this List keys) - { - return keys.Count < 1; - } - - public static bool Matches(this List keys, List other, MatchMode matchMode = MatchMode.Strict) - { - if (other == null || other.Count != keys.Count) - return false; - - var same = true; - for (int i = 0; i < keys.Count; i++) - same = same && keys[i].Matches(other[i], matchMode); - - return same; - } - - public static List ReplaceLastKey(this List keys, List newKeys) - { - var res = new List(keys); - if (res.Count < 1 || newKeys == null || newKeys.Count < 1) - return res; - - res.Remove(res.Last()); - res.AddRange(newKeys); - return res; - } - - public static bool StartsWith(this List keyList, List otherKeyList) - { - if (otherKeyList == null || otherKeyList.Count == 0) - return false; - - // simply test element-wise - for (int i = 0; i < otherKeyList.Count; i++) - { - // does head have more elements than this list? - if (i >= keyList.Count) - return false; - - if (!otherKeyList[i].Matches(keyList[i])) - return false; - } - - // ok! - return true; - } - - public static bool StartsWith(this List keyList, List head, bool emptyIsTrue = false, - MatchMode matchMode = MatchMode.Relaxed) - { - // access - if (head == null) - return false; - if (head.Count == 0) - return emptyIsTrue; - - // simply test element-wise - for (int i = 0; i < head.Count; i++) - { - // does head have more elements than this list? - if (i >= keyList.Count) - return false; - - if (!head[i].Matches(keyList[i], matchMode)) - return false; - } - - // ok! - return true; - } - - public static string ToStringExtended(this List keys, int format = 1, string delimiter = ",") - { - return string.Join(delimiter, keys.Select((k) => k.ToStringExtended(format))); - } - - public static void Validate(this List keys, AasValidationRecordList results, - IReferable container) - { - // access - if (results == null || keys == null || container == null) - return; - - // iterate thru - var idx = 0; - while (idx < keys.Count) - { - var act = keys[idx].Validate(results, container); - if (act == AasValidationAction.ToBeDeleted) - { - keys.RemoveAt(idx); - continue; - } - idx++; - } - } - - public static bool MatchesSetOfTypes(this List key, IEnumerable set) - { - var res = true; - foreach (var kt in key) - if (!key.MatchesSetOfTypes(set)) - res = false; - return res; - } - - public static List Parse(string input) - { - // access - if (input == null) - return null; - - // split - var parts = input.Split(',', ';'); - var kl = new List(); - - foreach (var p in parts) - { - var k = ExtendKey.Parse(p); - if (k != null) - kl.Add(k); - } - - return kl; - } - - /// - /// Take only idShort from Referables, ignore all other key-types and create a '/'-separated list - /// - /// Empty string or list of idShorts - public static string BuildIdShortPath(this List keyList, - int startPos = 0, int count = int.MaxValue) - { - if (keyList == null || startPos >= keyList.Count) - return ""; - int nr = 0; - var res = ""; - for (int i = startPos; i < keyList.Count && nr < count; i++) - { - nr++; - //// if (keyList[i].Type.Trim().ToLower() == Key.IdShort.Trim().ToLower()) - if (Aas.Constants.AasReferableNonIdentifiables.Contains(keyList[i].Type)) - { - if (res != "") - res += "/"; - res += keyList[i].Value; - } - } - return res; - } - - public static List SubList(this List keyList, - int startPos, int count = int.MaxValue) - { - var res = new List(); - if (startPos >= keyList.Count()) - return res; - int nr = 0; - for (int i = startPos; i < keyList.Count() && nr < count; i++) - { - nr++; - res.Add(keyList[i]); - } - return res; - } - - public static List ToKeyList(this List keyList) - { - var res = new List(); - foreach (var ki in keyList) - res.Add(new Key(ki.Type, ki.Value)); - return res; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendKeyTypes.cs b/src/AasxCsharpLibrary/Extensions/ExtendKeyTypes.cs deleted file mode 100644 index c8dc4ae40..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendKeyTypes.cs +++ /dev/null @@ -1,21 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -namespace Extensions -{ - public static class ExtendKeyTypes - { - public static bool IsSME(this KeyTypes keyType) - { - foreach (var kt in Constants.AasSubmodelElementsAsKeys) - if (kt.HasValue && kt.Value == keyType) - return true; - return false; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendLangString.cs b/src/AasxCsharpLibrary/Extensions/ExtendLangString.cs deleted file mode 100644 index 24f54f9af..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendLangString.cs +++ /dev/null @@ -1,66 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System.Collections.Generic; - -namespace Extensions -{ - //TODO (jtikekar, 0000-00-00): remove - public static class ExtendLangString - { - // constants - public static string LANG_DEFAULT = "en"; - - // new version - public static string GetDefaultStringGen(List langStrings, string defaultLang = null) - where T : IAbstractLangString - { - // start - if (defaultLang == null) - defaultLang = "en"; - defaultLang = defaultLang.Trim().ToLower(); - string res = null; - - // search - foreach (var ls in langStrings) - if (ls.Language.Trim().ToLower() == defaultLang) - res = ls.Text; - if (res == null && langStrings.Count > 0) - res = langStrings[0].Text; - - // found? - return res; - } - - public static IAbstractLangString Create(string language, string text) where T : IAbstractLangString - { - if (typeof(T).IsAssignableFrom(typeof(ILangStringTextType))) - { - return new LangStringTextType(language, text); - } - else if (typeof(T).IsAssignableFrom(typeof(ILangStringNameType))) - { - return new LangStringNameType(language, text); - } - else if (typeof(T).IsAssignableFrom(typeof(ILangStringPreferredNameTypeIec61360))) - { - return new LangStringPreferredNameTypeIec61360(language, text); - } - else if (typeof(T).IsAssignableFrom(typeof(ILangStringShortNameTypeIec61360))) - { - return new LangStringShortNameTypeIec61360(language, text); - } - else if (typeof(T).IsAssignableFrom(typeof(ILangStringDefinitionTypeIec61360))) - { - return new LangStringDefinitionTypeIec61360(language, text); - } - else - return null; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendLangStringSet.cs b/src/AasxCsharpLibrary/Extensions/ExtendLangStringSet.cs deleted file mode 100644 index de4477e3f..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendLangStringSet.cs +++ /dev/null @@ -1,199 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System; -using System.Collections.Generic; -using System.Text.RegularExpressions; - -namespace Extensions -{ - //TODO (jtikekar, 0000-00-00): remove or seperate - public static class ExtendLangStringSet - { - #region AasxPackageExplorer - - public static bool IsValid(this List langStringSet) - { - if (langStringSet != null && langStringSet.Count >= 1) - { - return true; - } - - return false; - } - - #endregion - public static bool IsEmpty(this List langStringSet) - { - if (langStringSet == null || langStringSet.Count == 0) - { - return true; - } - - return false; - } - // dead-csharp off - //public static string GetDefaultString(this List langStringSet, string defaultLang = null) - //{ - // return ExtendLangString.GetDefaultStringGen(langStringSet, defaultLang); - //// start - //if (defaultLang == null) - // defaultLang = "en"; //Default Lang in old implementation is en - - //string res = null; - - //// search - //foreach (var langString in langStringSet) - // if (langString.Language.Equals(defaultLang, StringComparison.OrdinalIgnoreCase)) - // res = langString.Text; - - //if (res == null && langStringSet.Count > 0) - // res = langStringSet[0].Text; - - //// found? - //return res; - //} - // dead-csharp on - public static List Create(string language, string text) where T : IAbstractLangString, new() - { - return new List { new T { Language = language, Text = text } }; - } - - public static List CreateLangStringNameType(string language, string text) - { - return new List { new LangStringNameType(language, text) }; - } - - public static List CreateLangStringTextType(string language, string text) - { - return new List { new LangStringTextType(language, text) }; - } - - public static List CreateManyPreferredNamesFromStringArray(string[] s) - { - if (s == null) - return null; - var r = new List(); - var i = 0; - while ((i + 1) < s.Length) - { - r.Add(new LangStringPreferredNameTypeIec61360(s[i], s[i + 1])); - i += 2; - } - return r; - } - public static List CreateManyDefinitionFromStringArray(string[] s) - { - if (s == null) - return null; - var r = new List(); - var i = 0; - while ((i + 1) < s.Length) - { - r.Add(new LangStringDefinitionTypeIec61360(s[i], s[i + 1])); - i += 2; - } - return r; - } - - public static List Set(this List lss, string lang, string text) - { - foreach (var ls in lss) - if (ls.Language.Trim().ToLower() == lang?.Trim().ToLower()) - { - ls.Text = text; - return lss; - } - lss.Add(new LangStringTextType(lang, text)); - return lss; - } - - public static List ConvertFromV20( - this List langStringSet, - AasxCompatibilityModels.AdminShellV20.LangStringSet sourceLangStrings) - { - - if (sourceLangStrings.langString != null && sourceLangStrings.langString.Count != 0) - { - langStringSet = new List(); - foreach (var sourceLangString in sourceLangStrings.langString) - { - var langString = new LangStringTextType(sourceLangString.lang, sourceLangString.str); - langStringSet.Add(langString); - } - } - return langStringSet; - } - - public static List Parse(string cell, - Func createLs) where T : class - { - // access - if (cell == null || createLs == null) - return null; - - // iterative approach - var res = new List(); - while (true) - { - // trivial case and finite end - if (!cell.Contains("@")) - { - if (cell.Trim() != "") - { - res.Add(createLs(ExtendLangString.LANG_DEFAULT, cell)); - } - break; - } - - // OK, pick the next couple - var m = Regex.Match(cell, @"(.*?)@(\w+)", RegexOptions.Singleline); - if (!m.Success) - { - // take emergency exit? - res.Add(createLs("??", cell)); - } - - // use the match and shorten cell .. - res.Add(createLs(m.Groups[2].ToString(), m.Groups[1].ToString().Trim())); - cell = cell.Substring(m.Index + m.Length); - } - - return res; - } - - public static void Add(this List list, string language, string text) where T : IAbstractLangString - { - if (typeof(T).IsAssignableFrom(typeof(ILangStringTextType))) - { - (list as List) - .Add(new LangStringTextType(language, text)); - } - else if (typeof(T).IsAssignableFrom(typeof(ILangStringNameType))) - { - (list as List) - .Add(new LangStringNameType(language, text)); - } - else if (typeof(T).IsAssignableFrom(typeof(ILangStringPreferredNameTypeIec61360))) - { - (list as List) - .Add(new LangStringPreferredNameTypeIec61360(language, text)); - } - else if (typeof(T).IsAssignableFrom(typeof(ILangStringShortNameTypeIec61360))) - { - (list as List) - .Add(new LangStringShortNameTypeIec61360(language, text)); - } - else if (typeof(T).IsAssignableFrom(typeof(ILangStringDefinitionTypeIec61360))) - { - (list as List) - .Add(new LangStringDefinitionTypeIec61360(language, text)); - } - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendModelKind.cs b/src/AasxCsharpLibrary/Extensions/ExtendModelKind.cs deleted file mode 100644 index 75ad82fba..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendModelKind.cs +++ /dev/null @@ -1,35 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using AdminShellNS; - -namespace Extensions -{ - public static class ExtendModelKind - { - public static void Validate(this ModellingKind modelingKind, AasValidationRecordList results, IReferable container) - { - // access - if (results == null || container == null) - return; - - // check - if (modelingKind != ModellingKind.Template && modelingKind != ModellingKind.Instance) - { - // violation case - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, container, - $"ModelingKind: enumeration value neither Template nor Instance", - () => - { - modelingKind = ModellingKind.Instance; - })); - } - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendMultiLanguageProperty.cs b/src/AasxCsharpLibrary/Extensions/ExtendMultiLanguageProperty.cs deleted file mode 100644 index 4d0c9f65b..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendMultiLanguageProperty.cs +++ /dev/null @@ -1,140 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using AdminShellNS; -using System; -using System.Collections.Generic; - -namespace Extensions -{ - public static class ExtendMultiLanguageProperty - { - #region AasxPackageExplorer - - public static void ValueFromText(this MultiLanguageProperty multiLanguageProperty, string text, string defaultLang) - { - multiLanguageProperty.Value ??= new List(); - - multiLanguageProperty.Value.Add(new LangStringTextType(defaultLang == null ? "en" : defaultLang, text)); - } - - #endregion - - public static string ValueAsText(this MultiLanguageProperty multiLanguageProperty, string defaultLang = null) - { - // dead-csharp off - //TODO (jtikekar, 0000-00-00): need to check/test again - //return "" + multiLanguageProperty.Value?.LangStrings.FirstOrDefault().Text; - // dead-csharp on - return "" + multiLanguageProperty.Value?.GetDefaultString(defaultLang); - } - - public static MultiLanguageProperty ConvertFromV20(this MultiLanguageProperty property, AasxCompatibilityModels.AdminShellV20.MultiLanguageProperty sourceProperty) - { - if (sourceProperty == null) - { - return null; - } - - if (sourceProperty.valueId != null) - { - var keyList = new List(); - foreach (var refKey in sourceProperty.valueId.Keys) - { - - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value not found for property {property.IdShort}"); - } - } - property.ValueId = new Reference(ReferenceTypes.ExternalReference, keyList); - } - - if (sourceProperty.value != null && !sourceProperty.value.IsEmpty) - { - var newLangStrings = new List(); - - List newLangStringSet = new(newLangStrings); - - property.Value = newLangStringSet.ConvertFromV20(sourceProperty.value); - } - - return property; - - } - - public static MultiLanguageProperty UpdateFrom( - this MultiLanguageProperty elem, ISubmodelElement source) - { - if (source == null) - return elem; - - ((ISubmodelElement)elem).UpdateFrom(source); - - if (source is Property srcProp) - { - elem.Value = new List { - new LangStringTextType(AdminShellUtil.GetDefaultLngIso639(), srcProp.Value) }; - if (srcProp.ValueId != null) - elem.ValueId = srcProp.ValueId.Copy(); - } - - if (source is MultiLanguageProperty srcMlp) - { - if (srcMlp.Value != null) - elem.Value = srcMlp.Value.Copy(); - if (srcMlp.ValueId != null) - elem.ValueId = srcMlp.ValueId.Copy(); - } - - if (source is AasCore.Aas3_0.Range srcRng) - { - if (srcRng.Min != null) - elem.Value = new List { - new LangStringTextType(AdminShellUtil.GetDefaultLngIso639(), srcRng.Min) }; - } - - if (source is File srcFile) - { - elem.Value = new List { - new LangStringTextType(AdminShellUtil.GetDefaultLngIso639(), srcFile.Value) }; - } - - return elem; - } - - public static MultiLanguageProperty Set(this MultiLanguageProperty mlp, - List ls) - { - mlp.Value = ls; - return mlp; - } - - public static MultiLanguageProperty Set(this MultiLanguageProperty mlp, - LangStringTextType ls) - { - if (ls == null) - return mlp; - if (mlp.Value == null) - mlp.Value = new List(); - mlp.Value.Set(ls.Language, ls.Text); - return mlp; - } - - public static MultiLanguageProperty Set(this MultiLanguageProperty mlp, - string lang, string str) - { - return mlp.Set(new LangStringTextType(lang, str)); - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendObject.cs b/src/AasxCsharpLibrary/Extensions/ExtendObject.cs deleted file mode 100644 index ccc968476..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendObject.cs +++ /dev/null @@ -1,144 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System; -using System.Collections.Generic; -using System.Reflection; -using Extensions.ArrayExtensions; - -namespace Extensions -{ - public static class ExtendObject - { - private static readonly MethodInfo CloneMethod = typeof(Object).GetMethod("MemberwiseClone", BindingFlags.NonPublic | BindingFlags.Instance); - - public static bool IsPrimitive(this Type type) - { - if (type == typeof(String)) return true; - return (type.IsValueType & type.IsPrimitive); - } - - public static Object Copy(this Object originalObject) - { - return InternalCopy(originalObject, new Dictionary(new ReferenceEqualityComparer())); - } - - private static Object InternalCopy(Object originalObject, IDictionary visited) - { - if (originalObject == null) return null; - var typeToReflect = originalObject.GetType(); - if (IsPrimitive(typeToReflect)) return originalObject; - if (visited.ContainsKey(originalObject)) return visited[originalObject]; - if (typeof(Delegate).IsAssignableFrom(typeToReflect)) return null; - var cloneObject = CloneMethod.Invoke(originalObject, null); - if (typeToReflect.IsArray) - { - var arrayType = typeToReflect.GetElementType(); - if (IsPrimitive(arrayType) == false) - { - Array clonedArray = (Array)cloneObject; - clonedArray.ForEach((array, indices) => array.SetValue(InternalCopy(clonedArray.GetValue(indices), visited), indices)); - } - - } - visited.Add(originalObject, cloneObject); - CopyFields(originalObject, visited, cloneObject, typeToReflect); - RecursiveCopyBaseTypePrivateFields(originalObject, visited, cloneObject, typeToReflect); - return cloneObject; - } - - private static void RecursiveCopyBaseTypePrivateFields(object originalObject, IDictionary visited, object cloneObject, Type typeToReflect) - { - if (typeToReflect.BaseType != null) - { - RecursiveCopyBaseTypePrivateFields(originalObject, visited, cloneObject, typeToReflect.BaseType); - CopyFields(originalObject, visited, cloneObject, typeToReflect.BaseType, BindingFlags.Instance | BindingFlags.NonPublic, info => info.IsPrivate); - } - } - - private static void CopyFields(object originalObject, IDictionary visited, object cloneObject, Type typeToReflect, - BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.FlattenHierarchy, - Func filter = null) - { - foreach (FieldInfo fieldInfo in typeToReflect.GetFields(bindingFlags)) - { - if (filter != null && filter(fieldInfo) == false) continue; - if (IsPrimitive(fieldInfo.FieldType)) continue; - var originalFieldValue = fieldInfo.GetValue(originalObject); - var clonedFieldValue = InternalCopy(originalFieldValue, visited); - fieldInfo.SetValue(cloneObject, clonedFieldValue); - } - } - public static T Copy(this T original) - { - return (T)Copy((Object)original); - } - } - - public class ReferenceEqualityComparer : EqualityComparer - { - public override bool Equals(object x, object y) - { - return ReferenceEquals(x, y); - } - public override int GetHashCode(object obj) - { - if (obj == null) return 0; - return obj.GetHashCode(); - } - } - - namespace ArrayExtensions - { - public static class ArrayExtensions - { - public static void ForEach(this Array array, Action action) - { - if (array.LongLength == 0) return; - ArrayTraverse walker = new ArrayTraverse(array); - do action(array, walker.Position); - while (walker.Step()); - } - } - - internal class ArrayTraverse - { - public int[] Position; - private int[] maxLengths; - - public ArrayTraverse(Array array) - { - maxLengths = new int[array.Rank]; - for (int i = 0; i < array.Rank; ++i) - { - maxLengths[i] = array.GetLength(i) - 1; - } - Position = new int[array.Rank]; - } - - public bool Step() - { - for (int i = 0; i < Position.Length; ++i) - { - if (Position[i] < maxLengths[i]) - { - Position[i]++; - for (int j = 0; j < i; j++) - { - Position[j] = 0; - } - return true; - } - } - return false; - } - } - } - -} - diff --git a/src/AasxCsharpLibrary/Extensions/ExtendOperation.cs b/src/AasxCsharpLibrary/Extensions/ExtendOperation.cs deleted file mode 100644 index d6ff4e2c1..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendOperation.cs +++ /dev/null @@ -1,157 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using AdminShellNS; -using System.Collections.Generic; -using System.Linq; - -namespace Extensions -{ - public static class ExtendOperation - { - #region AasxPackageExplorer - - public static object AddChild(this IOperation operation, ISubmodelElement childSubmodelElement, EnumerationPlacmentBase placement = null) - { - // not enough information to select list of children? - var pl = placement as EnumerationPlacmentOperationVariable; - if (childSubmodelElement == null || pl == null) - return null; - - // ok, use information - var ov = new OperationVariable(childSubmodelElement); - - if (childSubmodelElement != null) - childSubmodelElement.Parent = operation; - - if (pl.Direction == OperationVariableDirection.In) - { - operation.InputVariables ??= new List(); - operation.InputVariables.Add(ov); - } - - if (pl.Direction == OperationVariableDirection.Out) - { - operation.OutputVariables ??= new List(); - operation.OutputVariables.Add(ov); - } - - if (pl.Direction == OperationVariableDirection.InOut) - { - operation.InoutputVariables ??= new List(); - operation.InoutputVariables.Add(ov); - } - - return ov; - } - - public static EnumerationPlacmentBase GetChildrenPlacement(this IOperation operation, ISubmodelElement child) - { - // trivial - if (child == null) - return null; - - // search - OperationVariableDirection? dir = null; - IOperationVariable opvar = null; - if (operation.InputVariables != null) - foreach (var ov in operation.InputVariables) - if (ov?.Value == child) - { - dir = OperationVariableDirection.In; - opvar = ov; - } - - if (operation.OutputVariables != null) - foreach (var ov in operation.OutputVariables) - if (ov?.Value == child) - { - dir = OperationVariableDirection.Out; - opvar = ov; - } - - if (operation.InoutputVariables != null) - foreach (var ov in operation.InoutputVariables) - if (ov?.Value == child) - { - dir = OperationVariableDirection.InOut; - opvar = ov; - } - - // found - if (!dir.HasValue) - return null; - return new EnumerationPlacmentOperationVariable() - { - Direction = dir.Value, - OperationVariable = opvar as OperationVariable - }; - } - - public static List GetVars(this IOperation op, OperationVariableDirection dir) - { - if (dir == OperationVariableDirection.In) - return op.InputVariables; - if (dir == OperationVariableDirection.Out) - return op.OutputVariables; - return op.InoutputVariables; - } - - public static List SetVars( - this IOperation op, OperationVariableDirection dir, List value) - { - if (dir == OperationVariableDirection.In) - { - op.InputVariables = value; - return op.InputVariables; - } - if (dir == OperationVariableDirection.Out) - { - op.OutputVariables = value; - return op.OutputVariables; - } - - op.InoutputVariables = value; - return op.InoutputVariables; - } - - #endregion - - public static IOperation UpdateFrom( - this IOperation elem, ISubmodelElement source) - { - if (source == null) - return elem; - - ((ISubmodelElement)elem).UpdateFrom(source); - - if (source is SubmodelElementCollection srcColl) - { - if (srcColl.Value != null) - { - List operationVariables = srcColl.Value.Copy().Select( - (isme) => new OperationVariable(isme)).ToList(); - elem.InputVariables = operationVariables.ConvertAll(op => (IOperationVariable)op); - } - - } - - if (source is SubmodelElementCollection srcList) - { - if (srcList.Value != null) - { - List operationVariables = srcList.Value.Copy().Select( - (isme) => new OperationVariable(isme)).ToList(); - elem.InputVariables = operationVariables.ConvertAll(op => (IOperationVariable)op); - } - } - - return elem; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendProperty.cs b/src/AasxCsharpLibrary/Extensions/ExtendProperty.cs deleted file mode 100644 index f77a3765f..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendProperty.cs +++ /dev/null @@ -1,269 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; - -namespace Extensions -{ - public static class ExtendProperty - { - #region AasxPackageExplorer - - public static void ValueFromText(this Property property, string text) - { - property.Value = text; - } - - #endregion - public static bool IsValueTrue(this Property property) - { - if (property.ValueType == DataTypeDefXsd.Boolean) - { - if (property.Value.Equals("true", StringComparison.OrdinalIgnoreCase)) - { - return true; - } - } - - return false; - } - - public static string ValueAsText(this Property property) - { - return "" + property.Value; - } - - public static double? ValueAsDouble(this Property prop) - { - // pointless - if (prop.Value == null || prop.Value.Trim() == "") - return null; - - // type? - if (!ExtendDataElement.ValueTypes_Number.Contains(prop.ValueType)) - return null; - - // try convert - if (double.TryParse(prop.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out double dbl)) - return dbl; - - // no - return null; - } - public static Property ConvertFromV10(this Property property, AasxCompatibilityModels.AdminShellV10.Property sourceProperty) - { - if (sourceProperty == null) - { - return null; - } - var propertyType = Stringification.DataTypeDefXsdFromString("xs:" + sourceProperty.valueType); - if (propertyType != null) - { - property.ValueType = (DataTypeDefXsd)propertyType; - } - else - { - Console.WriteLine($"ValueType {sourceProperty.valueType} not found for property {sourceProperty.idShort}"); - } - property.Value = sourceProperty.value; - if (sourceProperty.valueId != null && !sourceProperty.valueId.IsEmpty) - { - var keyList = new List(); - foreach (var refKey in sourceProperty.valueId.Keys) - { - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {sourceProperty.valueType} not found for property {property.IdShort}"); - } - } - property.ValueId = new Reference(ReferenceTypes.ExternalReference, keyList); - } - - return property; - } - - public static Property ConvertFromV20(this Property property, AasxCompatibilityModels.AdminShellV20.Property sourceProperty) - { - if (sourceProperty == null) - { - return null; - } - - var propertyType = Stringification.DataTypeDefXsdFromString("xs:" + sourceProperty.valueType); - if (propertyType != null) - { - property.ValueType = (DataTypeDefXsd)propertyType; - } - else - { - Console.WriteLine($"ValueType {sourceProperty.valueType} not found for property {sourceProperty.idShort}"); - } - property.Value = sourceProperty.value; - if (sourceProperty.valueId != null && !sourceProperty.valueId.IsEmpty) - { - var keyList = new List(); - foreach (var refKey in sourceProperty.valueId.Keys) - { - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {sourceProperty.valueType} not found for property {property.IdShort}"); - } - } - property.ValueId = new Reference(ReferenceTypes.ExternalReference, keyList); - } - - return property; - } - - public static Property UpdateFrom(this Property elem, ISubmodelElement source) - { - if (source == null) - return elem; - - ((ISubmodelElement)elem).UpdateFrom(source); - - if (source is Property srcProp) - { - elem.ValueType = srcProp.ValueType; - elem.Value = srcProp.Value; - if (srcProp.ValueId != null) - elem.ValueId = srcProp.ValueId.Copy(); - } - - if (source is AasCore.Aas3_0.Range srcRng) - { - elem.ValueType = srcRng.ValueType; - elem.Value = srcRng.Min; - } - - if (source is MultiLanguageProperty srcMlp) - { - elem.ValueType = DataTypeDefXsd.String; - elem.Value = "" + srcMlp.Value?.GetDefaultString(); - if (srcMlp.ValueId != null) - elem.ValueId = srcMlp.ValueId.Copy(); - } - - if (source is File srcFile) - { - elem.ValueType = DataTypeDefXsd.String; - elem.Value = "" + srcFile.Value; - } - - return elem; - } - - // MIHO: Jui, why was this required? -#if OLD - - public static void UpdatePropertyFrom(this Property property, Property sourceProperty) - { - if (sourceProperty.Extensions != null) - { - property.Extensions = sourceProperty.Extensions; - } - if (sourceProperty.Category != null) - { - property.Category = sourceProperty.Category; - } - if (sourceProperty.IdShort != null) - { - property.IdShort = sourceProperty.IdShort; - } - if (sourceProperty.DisplayName != null) - { - property.DisplayName = sourceProperty.DisplayName; - } - if (sourceProperty.Description != null) - { - property.Description = sourceProperty.Description; - } - if (sourceProperty.Checksum != null) - { - property.Checksum = sourceProperty.Checksum; - } - if (sourceProperty.Kind != null) - { - property.Kind = sourceProperty.Kind; - } - if (sourceProperty.SemanticId != null) - { - property.SemanticId = sourceProperty.SemanticId; - } - if (sourceProperty.SupplementalSemanticIds != null) - { - property.SupplementalSemanticIds = sourceProperty.SupplementalSemanticIds; - } - if (sourceProperty.Qualifiers != null) - { - property.Qualifiers = sourceProperty.Qualifiers; - } - if (sourceProperty.EmbeddedDataSpecifications != null) - { - property.EmbeddedDataSpecifications = sourceProperty.EmbeddedDataSpecifications; - } - if (true) - { - property.ValueType = sourceProperty.ValueType; - } - if (sourceProperty.ValueId != null) - { - property.ValueId = sourceProperty.ValueId; - } - if (sourceProperty.Value != null) - { - property.Value = sourceProperty.Value; - } - } -#endif - - public static Property Set(this Property prop, - DataTypeDefXsd valueType = DataTypeDefXsd.String, string value = "") - { - prop.ValueType = valueType; - prop.Value = value; - return prop; - } - - public static Property Set(this Property prop, - KeyTypes type, string value) - { - prop.ValueId = ExtendReference.CreateFromKey(new Key(type, value)); - return prop; - } - - public static Property Set(this Property prop, - Qualifier q) - { - if (q != null) - prop.Add(q); - return prop; - } - - public static Property Set(this Property prop, - Extension ext) - { - if (ext != null) - prop.Add(ext); - return prop; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendQualifier.cs b/src/AasxCsharpLibrary/Extensions/ExtendQualifier.cs deleted file mode 100644 index 1851d4f06..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendQualifier.cs +++ /dev/null @@ -1,195 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System; -using System.Collections.Generic; -using System.Text.RegularExpressions; - -namespace Extensions -{ - public static class ExtendQualifier - { - public static Qualifier ConvertFromV10(this Qualifier qualifier, AasxCompatibilityModels.AdminShellV10.Qualifier sourceQualifier) - { - if (sourceQualifier.semanticId != null && !sourceQualifier.semanticId.IsEmpty) - { - var keyList = new List(); - foreach (var refKey in sourceQualifier.semanticId.Keys) - { - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {refKey.type} not found."); - } - } - qualifier.SemanticId = new Reference(ReferenceTypes.ExternalReference, keyList); - } - - qualifier.Type = sourceQualifier.qualifierType; - qualifier.Value = sourceQualifier.qualifierValue; - - if (sourceQualifier.qualifierValueId != null && !sourceQualifier.qualifierValueId.IsEmpty) - { - var keyList = new List(); - foreach (var refKey in sourceQualifier.qualifierValueId.Keys) - { - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {refKey.type} not found."); - } - } - qualifier.ValueId = new Reference(ReferenceTypes.ExternalReference, keyList); - } - - return qualifier; - } - - public static Qualifier ConvertFromV20(this Qualifier qualifier, AasxCompatibilityModels.AdminShellV20.Qualifier sourceQualifier) - { - if (sourceQualifier.semanticId != null && !sourceQualifier.semanticId.IsEmpty) - { - var keyList = new List(); - foreach (var refKey in sourceQualifier.semanticId.Keys) - { - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {refKey.type} not found."); - } - - } - qualifier.SemanticId = new Reference(ReferenceTypes.ExternalReference, keyList); - } - - qualifier.Type = sourceQualifier.type; - qualifier.Value = sourceQualifier.value; - - if (sourceQualifier.valueId != null && !sourceQualifier.valueId.IsEmpty) - { - var keyList = new List(); - foreach (var refKey in sourceQualifier.valueId.Keys) - { - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {refKey.type} not found."); - } - } - qualifier.ValueId = new Reference(ReferenceTypes.ExternalReference, keyList); - } - - return qualifier; - } - - // ReSharper disable MethodOverloadWithOptionalParameter .. this seems to work, anyhow - // ReSharper disable RedundantArgumentDefaultValue - public static string ToStringExtended(this IQualifier q, - int format = 0, string delimiter = ",") - { - var res = "" + q.Type; - if (res == "") - res += "" + q.SemanticId?.ToStringExtended(format, delimiter); - - if (q.Value != null) - res += " = " + q.Value; - else if (q.ValueId != null) - res += " = " + q.ValueId?.ToStringExtended(format, delimiter); - - return res; - } - // ReSharper enable MethodOverloadWithOptionalParameter - // ReSharper enable RedundantArgumentDefaultValue - - // - // - // List - // - // - - #region QualifierCollection - - public static IQualifier FindQualifierOfType(this List qualifiers, string qualifierType) - { - if (qualifierType == null) - { - return null; - } - - foreach (var qualifier in qualifiers) - { - if (qualifier != null && qualifierType.Equals(qualifier.Type)) - { - return qualifier; - } - } - - return null; - } - - // ReSharper disable MethodOverloadWithOptionalParameter .. this seems to work, anyhow - // ReSharper disable RedundantArgumentDefaultValue - public static string ToStringExtended(this List qualifiers, - int format = 0, string delimiter = ";", string referencesDelimiter = ",") - { - var res = ""; - foreach (var q in qualifiers) - { - if (res != "") - res += delimiter; - res += q.ToStringExtended(format, referencesDelimiter); - } - return res; - } - // ReSharper enable MethodOverloadWithOptionalParameter - // ReSharper enable RedundantArgumentDefaultValue - - public static IQualifier FindType(this List qualifiers, string type) - { - if (type == null || qualifiers == null) - return null; - foreach (var q in qualifiers) - if (q != null && q.Type != null && q.Type.Trim() == type.Trim()) - return q; - return null; - } - - public static Qualifier Parse(string input) - { - var m = Regex.Match(input, @"\s*([^,]*)(,[^=]+){0,1}\s*=\s*([^,]*)(,.+){0,1}\s*"); - if (!m.Success) - return null; - - return new Qualifier( - valueType: DataTypeDefXsd.String, - type: m.Groups[1].ToString().Trim(), - semanticId: ExtendReference.Parse(m.Groups[1].ToString().Trim()), - value: m.Groups[3].ToString().Trim(), - valueId: ExtendReference.Parse(m.Groups[1].ToString().Trim()) - ); - } - - #endregion - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendRange.cs b/src/AasxCsharpLibrary/Extensions/ExtendRange.cs deleted file mode 100644 index e3317b77a..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendRange.cs +++ /dev/null @@ -1,75 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System; -using AAS = AasCore.Aas3_0; - -namespace Extensions -{ - public static class ExtendRange - { - public static string ValueAsText(this AasCore.Aas3_0.Range range) - { - return "" + range.Min + " .. " + range.Max; - } - - public static AasCore.Aas3_0.Range ConvertFromV20(this AasCore.Aas3_0.Range range, AasxCompatibilityModels.AdminShellV20.Range sourceRange) - { - if (sourceRange == null) - { - return null; - } - - var propertyType = AAS.Stringification.DataTypeDefXsdFromString("xs:" + sourceRange.valueType); - if (propertyType != null) - { - range.ValueType = (AAS.DataTypeDefXsd)propertyType; - } - else - { - Console.WriteLine($"ValueType {sourceRange.valueType} not found for property {range.IdShort}"); - } - - range.Max = sourceRange.max; - range.Min = sourceRange.min; - - return range; - } - - public static AAS.Range UpdateFrom(this AAS.Range elem, AAS.ISubmodelElement source) - { - if (source == null) - return elem; - - ((AAS.ISubmodelElement)elem).UpdateFrom(source); - - if (source is AAS.Property srcProp) - { - elem.ValueType = srcProp.ValueType; - elem.Min = srcProp.Value; - elem.Max = elem.Min; - } - - if (source is AAS.MultiLanguageProperty srcMlp) - { - elem.ValueType = AAS.DataTypeDefXsd.String; - elem.Min = "" + srcMlp.Value?.GetDefaultString(); - elem.Max = elem.Min; - } - - if (source is AAS.File srcFile) - { - elem.ValueType = AAS.DataTypeDefXsd.String; - elem.Min = "" + srcFile.Value; - elem.Max = elem.Min; - } - - return elem; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendReference.cs b/src/AasxCsharpLibrary/Extensions/ExtendReference.cs deleted file mode 100644 index 61bb53df6..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendReference.cs +++ /dev/null @@ -1,309 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using AdminShellNS.Exceptions; -using System.Collections.Generic; -using System.Linq; - -namespace Extensions -{ - public static class ExtendReference - { - #region AasxPackageExplorer - - public static AasElementSelfDescription GetSelfDescription(this Reference reference) - { - return new AasElementSelfDescription("Reference", "Rfc", null, null); - } - - public static bool IsValid(this IReference reference) - { - return reference.Keys != null && !reference.Keys.IsEmpty(); - } - - public static bool IsValid(this List references) - { - bool isValid = false; - foreach (var reference in references) - { - isValid = IsValid(reference); - if (!isValid) - { - return false; - } - } - return isValid; - } - - /// - /// Formaly a static constructor. - /// Creates a Reference from a key, guessing Reference.Type. - /// - /// Given single Key - /// Reference with guessed type - public static Reference CreateFromKey(IKey k) - { - var res = new Reference(ReferenceTypes.ExternalReference, new List { k }); - res.Type = res.GuessType(); - return res; - } - - /// - /// Formaly a static constructor. - /// Creates a Reference from a key, guessing Reference.Type. - /// - public static Reference CreateFromKey(KeyTypes type, - string value) - { - var res = new Reference(ReferenceTypes.ExternalReference, - new List { new Key(type, value) }); - res.Type = res.GuessType(); - return res; - } - - /// - /// Formaly a static constructor. - /// Creates a Reference from a list of keys, guessing Reference.Type. - /// - /// - /// - public static Reference CreateNew(List lk) - { - var res = new Reference(ReferenceTypes.ExternalReference, new List()); - if (lk == null) - return res; - res.Keys.AddRange(lk.Copy()); - res.Type = res.GuessType(); - return res; - } - - // TODO (Jui, 2023-01-05): Check why the generic Copy does not apply here?! - public static Reference Copy(this Reference original) - { - var res = new Reference(original.Type, new List()); - if (original != null) - foreach (var o in original.Keys) - res.Add(o.Copy()); - return res; - } - - - public static Reference Parse(string input) - { - var res = new Reference(ReferenceTypes.ExternalReference, new List()); - if (input == null) - return res; - - res.Keys = ExtendKeyList.Parse(input); - res.Type = res.GuessType(); - return res; - } - - //This is alternative for operator overloding method +, as operator overloading cannot be done in extension classes - public static IReference Add(this IReference a, IReference b) - { - a.Keys?.AddRange(b?.Keys); - return a; - } - - public static IReference Add(this IReference a, IKey k) - { - if (k != null) - a.Keys?.Add(k); - return a; - } - - public static bool IsEmpty(this IReference reference) - { - if (reference == null || reference.Keys == null || reference.Keys.Count < 1) - { - return true; - } - - return false; - } - - #endregion - - public static bool Matches(this IReference reference, KeyTypes keyType, string id, MatchMode matchMode = MatchMode.Strict) - { - if (reference.IsEmpty()) - { - return false; - } - - if (reference.Keys.Count == 1) - { - var key = reference.Keys[0]; - return key.Matches(new Key(keyType, id), matchMode); - } - - return false; - } - - public static bool Matches(this IReference reference, string id) - { - if (string.IsNullOrEmpty(id)) - { - return false; - } - - if (reference.Keys.Count == 1) // As per old implementation - { - if (reference.Keys[0].Value == id) - return true; - } - - return false; - } - - public static bool Matches(this IReference reference, IReference otherReference, MatchMode matchMode = MatchMode.Strict) - { - if (reference.Keys == null || reference.Keys.Count == 0 - || otherReference?.Keys == null || otherReference.Keys.Count == 0 - || reference.Keys.Count != otherReference.Keys.Count) - { - return false; - } - - bool match = true; - for (int i = 0; i < reference.Keys.Count; i++) - { - match = match && reference.Keys[i].Matches(otherReference.Keys[i], matchMode); - } - - return match; - } - - public static bool MatchesExactlyOneKey(this IReference reference, IKey key, MatchMode matchMode = MatchMode.Strict) - { - if (key == null || reference.Keys == null || reference.Keys.Count != 1) - { - return false; - } - - var referenceKey = reference.Keys[0]; - return referenceKey.Matches(key, matchMode); - } - - public static string GetAsIdentifier(this IReference reference) - { - - if (reference != null && reference.Type == ReferenceTypes.ExternalReference) // Applying only to Global Reference, based on older implementation, TODO:Make it Generic - { - if (reference.Keys == null || reference.Keys.Count < 1) - { - return null; - } - - return reference.Keys[0].Value; - } - - //TODO (jtikekar, 2024-03-06): Refactor, added w.r.t. GitHub issue 11 - if(reference.Type == ReferenceTypes.ModelReference) - { - if (reference.Keys == null || reference.Keys.Count < 1) - { - return null; - } - - return reference.Keys[0].Value; - } - - return null; - } - - public static string MostSignificantInfo(this IReference reference) - { - if (reference.Keys.Count < 1) - { - return "-"; - } - - var i = reference.Keys.Count - 1; - var output = reference.Keys[i].Value; - if (reference.Keys[i].Type == KeyTypes.FragmentReference && i > 0) - output += reference.Keys[i - 1].Value; - return output; - } - - public static Key GetAsExactlyOneKey(this IReference reference) - { - if (reference.Keys == null || reference.Keys.Count != 1) - { - return null; - } - - var key = reference.Keys[0]; - return new Key(key.Type, key.Value); - } - - /// - /// Formats: 1 = [key, value] 2 = value - /// - public static string ToStringExtended(this IReference reference, int format = 1, string delimiter = ",") - { - if (reference.Keys == null) - { - throw new NullValueException("Keys"); - } - - return reference.Keys.ToStringExtended(format, delimiter); - } - - public static ReferenceTypes GuessType(this IReference reference) - { - var setAasRefs = Constants.AasReferables.Where((kt) => kt != null).Select(kt => kt.Value).ToArray(); - var allAasRefs = true; - foreach (var k in reference.Keys) - if (!k.MatchesSetOfTypes(setAasRefs)) - allAasRefs = false; - if (allAasRefs) - return ReferenceTypes.ModelReference; - else - return ReferenceTypes.ExternalReference; - } - - public static int Count(this IReference rf) - { - return rf.Keys.Count; - } - // dead-csharp off - //TODO (??, 0000-00-00): check if required - //public static int Count(this Reference rf) - //{ - // return rf.Keys.Count; - //} - // dead-csharp on - public static IKey Last(this IReference rf) - { - return rf.Keys.Last(); - } - // dead-csharp off - //TODO (??, 0000-00-00): check if required - //public static IKey Last(this Reference rf) - //{ - // return rf.Keys.Last(); - //} - // dead-csharp on - public static string ListOfValues(this Reference rf, string delim) - { - string res = ""; - if (rf.Keys != null) - foreach (var x in rf.Keys) - { - if (x == null) - continue; - if (res != "") res += delim; - res += x.Value; - } - return res; - } - } - -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendReferenceElement.cs b/src/AasxCsharpLibrary/Extensions/ExtendReferenceElement.cs deleted file mode 100644 index e68d0065d..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendReferenceElement.cs +++ /dev/null @@ -1,45 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using AAS = AasCore.Aas3_0; - -namespace Extensions -{ - public static class ExtendReferenceElement - { - public static AAS.ReferenceElement Set(this AAS.ReferenceElement elem, - Reference rf) - { - elem.Value = rf; - return elem; - } - - public static AAS.ReferenceElement UpdateFrom( - this AAS.ReferenceElement elem, AAS.ISubmodelElement source) - { - if (source == null) - return elem; - - ((AAS.ISubmodelElement)elem).UpdateFrom(source); - - if (source is AAS.RelationshipElement srcRel) - { - if (srcRel.First != null) - elem.Value = srcRel.First.Copy(); - } - - if (source is AAS.AnnotatedRelationshipElement srcRelA) - { - if (srcRelA.First != null) - elem.Value = srcRelA.First.Copy(); - } - - return elem; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendRelationshipElement.cs b/src/AasxCsharpLibrary/Extensions/ExtendRelationshipElement.cs deleted file mode 100644 index 04634059a..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendRelationshipElement.cs +++ /dev/null @@ -1,46 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using AAS = AasCore.Aas3_0; - -namespace Extensions -{ - public static class ExtendRelationshipElement - { - public static AAS.RelationshipElement Set(this AAS.RelationshipElement elem, - AAS.Reference first, AAS.Reference second) - { - elem.First = first; - elem.Second = second; - return elem; - } - - public static AAS.RelationshipElement UpdateFrom( - this AAS.RelationshipElement elem, AAS.ISubmodelElement source) - { - if (source == null) - return elem; - - ((AAS.ISubmodelElement)elem).UpdateFrom(source); - - if (source is AAS.ReferenceElement srcRef) - { - if (srcRef.Value != null) - elem.First = srcRef.Value.Copy(); - } - - if (source is AAS.AnnotatedRelationshipElement srcRelA) - { - if (srcRelA.First != null) - elem.First = srcRelA.First.Copy(); - } - - return elem; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendSpecificAssetId.cs b/src/AasxCsharpLibrary/Extensions/ExtendSpecificAssetId.cs deleted file mode 100644 index 6aa1552c6..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendSpecificAssetId.cs +++ /dev/null @@ -1,48 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using Extensions; -using System.Collections.Generic; -using System.Linq; - -namespace AdminShellNS.Extensions -{ - public static class ExtendSpecificAssetId - { - public static bool Matches(this ISpecificAssetId specificAssetId, ISpecificAssetId other) - { - if (specificAssetId == null) return false; - if (other == null) return false; - - //check mandatory parameters first - if (specificAssetId.Name != other.Name) return false; - if (specificAssetId.Value != other.Value) return false; - if (!specificAssetId.ExternalSubjectId.Matches(other.ExternalSubjectId)) return false; - - //TODO (jtikekar, 0000-00-00): Check optional parameter i.e., Semantic Id and supplementatry semantic id - - return true; - } - - #region ListOfSpecificAssetIds - - public static bool ContainsSpecificAssetId(this List specificAssetIds, ISpecificAssetId other) - { - if (specificAssetIds == null) return false; - if (other == null) return false; - - var foundIds = specificAssetIds.Where(assetId => assetId.Matches(other)); - if (foundIds.Any()) return true; - - return false; - } - - #endregion - - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendStream.cs b/src/AasxCsharpLibrary/Extensions/ExtendStream.cs deleted file mode 100644 index 09f582d5b..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendStream.cs +++ /dev/null @@ -1,25 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System.IO; - -namespace Extensions -{ - public static class ExtendStream - { - public static byte[] ToByteArray(this Stream stream) - { - using (stream) - { - using MemoryStream memStream = new(); - stream.CopyTo(memStream); - return memStream.ToArray(); - } - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendStringification.cs b/src/AasxCsharpLibrary/Extensions/ExtendStringification.cs deleted file mode 100644 index 0e153f191..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendStringification.cs +++ /dev/null @@ -1,20 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Extensions -{ - public static class ExtendStringification - { - public static IEnumerable DataTypeXsdToStringArray() => - Enum.GetValues(typeof(DataTypeDefXsd)).OfType().Select((dt) => Stringification.ToString(dt)); - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendSubmodel.cs b/src/AasxCsharpLibrary/Extensions/ExtendSubmodel.cs deleted file mode 100644 index d008af091..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendSubmodel.cs +++ /dev/null @@ -1,470 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using AdminShellNS; -using AdminShellNS.Extensions; -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Extensions -{ - public static class ExtendSubmodel - { - #region AasxPackageExplorer - - /// - /// Recurses on all Submodel elements of a Submodel or SME, which allows children. - /// The state object will be passed to the lambda function in order to provide - /// stateful approaches. Include this element, as well. - /// - /// State object to be provided to lambda. Could be null. - /// The lambda function as (state, parents, SME) - /// The lambda shall return TRUE in order to deep into recursion. - /// Include this element as well. parents will then - /// include this element as well! - public static void RecurseOnReferables(this Submodel submodel, - object state, Func, IReferable, bool> lambda, - bool includeThis = false) - { - var parents = new List(); - if (includeThis) - { - lambda(state, null, submodel); - parents.Add(submodel); - } - submodel.SubmodelElements?.RecurseOnReferables(state, parents, lambda); - } - - public static void Remove(this Submodel submodel, ISubmodelElement submodelElement) - { - if (submodel != null) - { - if (submodel.SubmodelElements != null) - { - submodel.SubmodelElements.Remove(submodelElement); - } - } - } - - public static object AddChild( - this ISubmodel submodel, ISubmodelElement childSubmodelElement, - EnumerationPlacmentBase placement = null) - { - if (childSubmodelElement == null) - return null; - submodel.SubmodelElements ??= new(); - if (childSubmodelElement != null) - childSubmodelElement.Parent = submodel; - submodel.SubmodelElements.Add(childSubmodelElement); - return childSubmodelElement; - } - - public static Tuple ToCaptionInfo(this ISubmodel submodel) - { - var caption = AdminShellUtil.EvalToNonNullString("\"{0}\" ", submodel.IdShort, ""); - if (submodel.Administration != null) - caption += "V" + submodel.Administration.Version + "." + submodel.Administration.Revision; - var info = ""; - if (submodel.Id != null) - info = $"[{submodel.Id}]"; - return Tuple.Create(caption, info); - } - - public static IEnumerable FindAllReferences(this ISubmodel submodel) - { - // not nice: use temp list - var temp = new List(); - - // recurse - submodel.RecurseOnSubmodelElements(null, (state, parents, sme) => - { - if (sme is ReferenceElement re) - if (re.Value != null) - temp.Add(re.Value); - if (sme is RelationshipElement rl) - { - if (rl.First != null) - temp.Add(rl.First); - if (rl.Second != null) - temp.Add(rl.Second); - } - // recurse - return true; - }); - - // now, give back - foreach (var r in temp) - yield return new LocatedReference(submodel, r); - } - - #endregion - public static void Validate(this Submodel submodel, AasValidationRecordList results) - { - // access - if (results == null) - return; - - // check - submodel.BaseValidation(results); - submodel.Kind?.Validate(results, submodel); - if (submodel.SemanticId != null && !submodel.SemanticId.IsEmpty()) - { - submodel.SemanticId.Keys.Validate(results, submodel); - } - } - - public static Submodel ConvertFromV10(this Submodel submodel, AasxCompatibilityModels.AdminShellV10.Submodel sourceSubmodel, bool shallowCopy = false) - { - if (sourceSubmodel == null) - { - return null; - } - - if (string.IsNullOrEmpty(sourceSubmodel.idShort)) - { - submodel.IdShort = ""; - } - else - { - submodel.IdShort = sourceSubmodel.idShort; - } - - if (sourceSubmodel.description != null) - { - submodel.Description = ExtensionsUtil.ConvertDescriptionFromV10(sourceSubmodel.description); - } - - if (sourceSubmodel.administration != null) - { - submodel.Administration = new AdministrativeInformation(version: sourceSubmodel.administration.version, revision: sourceSubmodel.administration.revision); - } - - if (sourceSubmodel.semanticId != null && !sourceSubmodel.semanticId.IsEmpty) - { - var keyList = new List(); - foreach (var refKey in sourceSubmodel.semanticId.Keys) - { - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {refKey.type} not found."); - } - } - submodel.SemanticId = new Reference(ReferenceTypes.ExternalReference, keyList); - } - - if (sourceSubmodel.kind != null) - { - if (sourceSubmodel.kind.IsInstance) - { - submodel.Kind = ModellingKind.Instance; - } - else - { - submodel.Kind = ModellingKind.Template; - } - } - - if (!sourceSubmodel.qualifiers.IsNullOrEmpty()) - { - if (submodel.Qualifiers == null && submodel.Qualifiers.Count != 0) - { - submodel.Qualifiers = new List(); - } - - foreach (var sourceQualifier in sourceSubmodel.qualifiers) - { - var newQualifier = new Qualifier("", DataTypeDefXsd.String); - newQualifier = newQualifier.ConvertFromV10(sourceQualifier); - submodel.Qualifiers.Add(newQualifier); - } - } - - if (!shallowCopy && !sourceSubmodel.submodelElements.IsNullOrEmpty()) - { - submodel.SubmodelElements ??= new List(); - - foreach (var submodelElementWrapper in sourceSubmodel.submodelElements) - { - var sourceSubmodelELement = submodelElementWrapper.submodelElement; - ISubmodelElement outputSubmodelElement = null; - if (sourceSubmodelELement != null) - { - outputSubmodelElement = outputSubmodelElement.ConvertFromV10(sourceSubmodelELement, shallowCopy); - submodel.SubmodelElements.Add(outputSubmodelElement); - } - - } - } - - return submodel; - - } - - public static Submodel ConvertFromV20(this Submodel sm, AasxCompatibilityModels.AdminShellV20.Submodel srcSM, bool shallowCopy = false) - { - if (srcSM == null) - return null; - - if (string.IsNullOrEmpty(srcSM.idShort)) - sm.IdShort = ""; - else - sm.IdShort = srcSM.idShort; - - if (srcSM.identification?.id != null) - sm.Id = srcSM.identification.id; - - if (srcSM.description != null) - sm.Description = ExtensionsUtil.ConvertDescriptionFromV20(srcSM.description); - - if (srcSM.administration != null) - sm.Administration = new AdministrativeInformation( - version: srcSM.administration.version, revision: srcSM.administration.revision); - - if (srcSM.semanticId != null && !srcSM.semanticId.IsEmpty) - { - var keyList = new List(); - foreach (var refKey in srcSM.semanticId.Keys) - { - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {refKey.type} not found."); - } - } - sm.SemanticId = new Reference(ReferenceTypes.ExternalReference, keyList); - } - - if (srcSM.kind != null) - { - if (srcSM.kind.IsInstance) - { - sm.Kind = ModellingKind.Instance; - } - else - { - sm.Kind = ModellingKind.Template; - } - } - - if (!srcSM.qualifiers.IsNullOrEmpty()) - { - sm.Qualifiers ??= new List(); - - foreach (var sourceQualifier in srcSM.qualifiers) - { - var newQualifier = new Qualifier("", DataTypeDefXsd.String); - newQualifier = newQualifier.ConvertFromV20(sourceQualifier); - sm.Qualifiers.Add(newQualifier); - } - } - - if (!shallowCopy && !srcSM.submodelElements.IsNullOrEmpty()) - { - sm.SubmodelElements ??= new List(); - - foreach (var submodelElementWrapper in srcSM.submodelElements) - { - var sourceSubmodelELement = submodelElementWrapper.submodelElement; - ISubmodelElement outputSubmodelElement = null; - if (sourceSubmodelELement != null) - { - outputSubmodelElement = outputSubmodelElement.ConvertFromV20(sourceSubmodelELement, shallowCopy); - sm.SubmodelElements.Add(outputSubmodelElement); - } - - } - } - - // move Qualifiers to Extensions - sm.MigrateV20QualifiersToExtensions(); - - return sm; - } - - public static T FindFirstIdShortAs(this ISubmodel submodel, string idShort) where T : ISubmodelElement - { - - var submodelElement = submodel.SubmodelElements.Where(sme => (sme != null) && (sme is T) && sme.IdShort.Equals(idShort, StringComparison.OrdinalIgnoreCase)).FirstOrDefault(); - - return (T)submodelElement; - } - - public static IEnumerable FindDeep(this ISubmodel submodel) - { - if (submodel.SubmodelElements == null || submodel.SubmodelElements.Count == 0) - { - yield break; - } - - foreach (var submodelElement in submodel.SubmodelElements) - { - foreach (var x in submodelElement.FindDeep()) - yield return x; - } - } - - public static Reference GetModelReference(this ISubmodel submodel) - { - var key = new Key(KeyTypes.Submodel, submodel.Id); - var outputReference = new Reference(ReferenceTypes.ModelReference, new List() { key }) - { - ReferredSemanticId = submodel.SemanticId - }; - - return outputReference; - } - - /// - /// If instance, return semanticId as one key. - /// If template, return identification as key. - /// - public static Key GetSemanticKey(this Submodel submodel) - { - if (submodel.Kind == ModellingKind.Instance) - return submodel.SemanticId.GetAsExactlyOneKey(); - else - return new Key(KeyTypes.Submodel, submodel.Id); - } - - /// - /// If instance, return semanticId as one key. - /// If template, return identification as key. - /// - public static IReference GetSemanticRef(this Submodel submodel) - { - if (submodel.Kind == ModellingKind.Instance) - return submodel.SemanticId; - else - return new Reference(ReferenceTypes.ModelReference, new[] { - new Key(KeyTypes.Submodel, submodel.Id) }.Cast().ToList()); - } - - public static List SmeForWrite(this Submodel submodel) - { - if (submodel.SubmodelElements == null) - submodel.SubmodelElements = new(); - return submodel.SubmodelElements; - } - - public static void RecurseOnSubmodelElements(this ISubmodel submodel, object state, Func, ISubmodelElement, bool> lambda) - { - submodel.SubmodelElements?.RecurseOnReferables(state, null, (o, par, rf) => - { - if (rf is ISubmodelElement sme) - return lambda(o, par, sme); - else - return true; - }); - } - - public static ISubmodelElement FindSubmodelElementByIdShort(this ISubmodel submodel, string smeIdShort) - { - if (submodel.SubmodelElements == null || submodel.SubmodelElements.Count == 0) - { - return null; - } - - var submodelElements = submodel.SubmodelElements.Where(sme => (sme != null) && sme.IdShort.Equals(smeIdShort, StringComparison.OrdinalIgnoreCase)); - if (submodelElements.Any()) - { - return submodelElements.First(); - } - else - { - return null; - } - } - - public static void SetAllParents(this ISubmodel submodel, DateTime timestamp) - { - if (submodel.SubmodelElements != null) - foreach (var sme in submodel.SubmodelElements) - SetParentsForSME(submodel, sme, timestamp); - } - - public static void SetParentsForSME(IReferable parent, ISubmodelElement submodelElement, DateTime timestamp) - { - if (submodelElement == null) - return; - - submodelElement.Parent = parent; - submodelElement.TimeStamp = timestamp; - submodelElement.TimeStampCreate = timestamp; - - foreach (var childElement in submodelElement.EnumerateChildren()) - { - SetParentsForSME(submodelElement, childElement, timestamp); - } - } - - public static void SetParentsForSME(IReferable parent, ISubmodelElement submodelElement) - { - if (submodelElement == null) - return; - - submodelElement.Parent = parent; - - foreach (var childElement in submodelElement.EnumerateChildren()) - { - SetParentsForSME(submodelElement, childElement); - } - } - - public static void SetAllParents(this ISubmodel submodel) - { - if (submodel.SubmodelElements != null) - foreach (var sme in submodel.SubmodelElements) - SetParentsForSME(submodel, sme); - } - - public static void Add(this Submodel submodel, ISubmodelElement submodelElement) - { - if (submodel.SubmodelElements == null) - { - submodel.SubmodelElements = new List(); - } - - submodelElement.Parent = submodel; - submodel.SubmodelElements.Add(submodelElement); - } - - public static void Insert(this ISubmodel submodel, int index, ISubmodelElement submodelElement) - { - if (submodel.SubmodelElements == null) - { - submodel.SubmodelElements = new List(); - } - - submodelElement.Parent = submodel; - submodel.SubmodelElements.Insert(index, submodelElement); - } - - public static T CreateSMEForCD( - this Submodel sm, - ConceptDescription conceptDescription, string category = null, string idShort = null, - string idxTemplate = null, int maxNum = 999, bool addSme = false, bool isTemplate = false) - where T : ISubmodelElement - { - if (sm.SubmodelElements == null) - sm.SubmodelElements = new List(); - return sm.SubmodelElements.CreateSMEForCD( - conceptDescription, category, idShort, idxTemplate, maxNum, addSme, isTemplate); - } - - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendSubmodelElementCollection.cs b/src/AasxCsharpLibrary/Extensions/ExtendSubmodelElementCollection.cs deleted file mode 100644 index 628561c52..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendSubmodelElementCollection.cs +++ /dev/null @@ -1,193 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using AdminShellNS; -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Extensions -{ - public static class ExtendSubmodelElementCollection - { - #region AasxPackageExplorer - - /// - /// Recurses on all Submodel elements of a Submodel or SME, which allows children. - /// The state object will be passed to the lambda function in order to provide - /// stateful approaches. Include this element, as well. - /// - /// State object to be provided to lambda. Could be null. - /// The lambda function as (state, parents, SME) - /// The lambda shall return TRUE in order to deep into recursion. - /// Include this element as well. parents will then - /// include this element as well! - public static void RecurseOnReferables(this SubmodelElementCollection submodelElementCollection, - object state, Func, IReferable, bool> lambda, - bool includeThis = false) - { - var parents = new List(); - if (includeThis) - { - lambda(state, null, submodelElementCollection); - parents.Add(submodelElementCollection); - } - submodelElementCollection.Value?.RecurseOnReferables(state, parents, lambda); - } - - public static void Remove(this SubmodelElementCollection submodelElementCollection, ISubmodelElement submodelElement) - { - if (submodelElementCollection != null) - { - if (submodelElementCollection.Value != null) - { - submodelElementCollection.Value.Remove(submodelElement); - } - } - } - - public static object AddChild(this SubmodelElementCollection submodelElementCollection, ISubmodelElement childSubmodelElement, EnumerationPlacmentBase placement = null) - { - if (childSubmodelElement == null) - return null; - if (submodelElementCollection.Value == null) - submodelElementCollection.Value = new(); - if (childSubmodelElement != null) - childSubmodelElement.Parent = submodelElementCollection; - submodelElementCollection.Value.Add(childSubmodelElement); - return childSubmodelElement; - } - - #endregion - public static T FindFirstIdShortAs(this SubmodelElementCollection submodelElementCollection, string idShort) where T : ISubmodelElement - { - - var submodelElement = submodelElementCollection.Value.Where(sme => (sme != null) && (sme is T) && sme.IdShort.Equals(idShort, StringComparison.OrdinalIgnoreCase)).FirstOrDefault(); - - return (T)submodelElement; - } - - public static SubmodelElementCollection ConvertFromV10(this SubmodelElementCollection submodelElementCollection, AasxCompatibilityModels.AdminShellV10.SubmodelElementCollection sourceSmeCollection, bool shallowCopy = false) - { - if (sourceSmeCollection == null) - return null; - - submodelElementCollection.Value ??= new List(); - - if (!shallowCopy) - { - foreach (var submodelElementWrapper in sourceSmeCollection.value) - { - var sourceSubmodelElement = submodelElementWrapper.submodelElement; - ISubmodelElement outputSubmodelElement = null; - if (sourceSubmodelElement != null) - { - outputSubmodelElement = outputSubmodelElement.ConvertFromV10(sourceSubmodelElement, shallowCopy); - } - - submodelElementCollection.Value.Add(outputSubmodelElement); - } - } - - return submodelElementCollection; - } - - public static SubmodelElementCollection ConvertFromV20(this SubmodelElementCollection submodelElementCollection, AasxCompatibilityModels.AdminShellV20.SubmodelElementCollection sourceSmeCollection, bool shallowCopy = false) - { - if (sourceSmeCollection == null) - return null; - - submodelElementCollection.Value ??= new List(); - - if (!shallowCopy) - { - foreach (var submodelElementWrapper in sourceSmeCollection.value) - { - var sourceSubmodelElement = submodelElementWrapper.submodelElement; - ISubmodelElement outputSubmodelElement = null; - if (sourceSubmodelElement != null) - { - outputSubmodelElement = outputSubmodelElement.ConvertFromV20(sourceSubmodelElement, shallowCopy); - } - - submodelElementCollection.Value.Add(outputSubmodelElement); - } - } - - return submodelElementCollection; - } - - public static void Add(this SubmodelElementCollection submodelElementCollection, ISubmodelElement submodelElement) - { - submodelElementCollection.Value ??= new List(); - - submodelElement.Parent = submodelElementCollection; - submodelElementCollection.Value.Add(submodelElement); - } - - public static void Insert(this SubmodelElementCollection submodelElementCollection, int index, ISubmodelElement submodelElement) - { - if (submodelElementCollection.Value == null) - { - submodelElementCollection.Value = new List(); - } - - submodelElement.Parent = submodelElementCollection; - submodelElementCollection.Value.Insert(index, submodelElement); - } - - public static T CreateSMEForCD( - this SubmodelElementCollection smc, - ConceptDescription conceptDescription, string category = null, string idShort = null, - string idxTemplate = null, int maxNum = 999, bool addSme = false, bool isTemplate = false) - where T : ISubmodelElement - { - if (smc.Value == null) - smc.Value = new List(); - return smc.Value.CreateSMEForCD( - conceptDescription, category, idShort, idxTemplate, maxNum, addSme, isTemplate); - } - - public static SubmodelElementCollection UpdateFrom( - this SubmodelElementCollection elem, ISubmodelElement source) - { - if (source == null) - return elem; - - ((ISubmodelElement)elem).UpdateFrom(source); - - if (source is SubmodelElementList srcList) - { - if (srcList.Value != null) - elem.Value = srcList.Value.Copy(); - } - - if (source is Operation srcOp) - { - Action, List> appov = (dst, src) => - { - if (src == null) - return; - foreach (var ov in src) - if (ov.Value != null) - dst.Append(ov.Value.Copy()); - }; - - elem.Value = new(); - appov(elem.Value, srcOp.InputVariables); - appov(elem.Value, srcOp.InoutputVariables); - appov(elem.Value, srcOp.OutputVariables); - if (elem.Value.Count < 1) - elem.Value = null; - } - - return elem; - } - - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendSubmodelElementList.cs b/src/AasxCsharpLibrary/Extensions/ExtendSubmodelElementList.cs deleted file mode 100644 index a3a27c53d..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendSubmodelElementList.cs +++ /dev/null @@ -1,206 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using AdminShellNS; -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Extensions -{ - public static class ExtendSubmodelElementList - { - #region AasxPackageExplorer - - /// - /// Recurses on all Submodel elements of a Submodel or SME, which allows children. - /// The state object will be passed to the lambda function in order to provide - /// stateful approaches. Include this element, as well. - /// - /// State object to be provided to lambda. Could be null. - /// The lambda function as (state, parents, SME) - /// The lambda shall return TRUE in order to deep into recursion. - /// Include this element as well. parents will then - /// include this element as well! - public static void RecurseOnReferables(this SubmodelElementList submodelElementList, - object state, Func, IReferable, bool> lambda, - bool includeThis = false) - { - var parents = new List(); - if (includeThis) - { - lambda(state, null, submodelElementList); - parents.Add(submodelElementList); - } - submodelElementList.Value?.RecurseOnReferables(state, parents, lambda); - } - - public static void Add(this SubmodelElementList submodelElementList, ISubmodelElement submodelElement) - { - if (submodelElementList != null) - { - submodelElementList.Value ??= new(); - - submodelElement.Parent = submodelElementList; - - submodelElementList.Value.Add(submodelElement); - } - } - - public static void Remove(this SubmodelElementList submodelElementList, ISubmodelElement submodelElement) - { - if (submodelElementList != null) - { - if (submodelElementList.Value != null) - { - submodelElementList.Value.Remove(submodelElement); - } - } - } - - public static object AddChild( - this SubmodelElementList submodelElementList, ISubmodelElement childSubmodelElement, - EnumerationPlacmentBase placement = null) - { - if (childSubmodelElement == null) - return null; - if (submodelElementList.Value == null) - submodelElementList.Value = new(); - if (childSubmodelElement != null) - childSubmodelElement.Parent = submodelElementList; - submodelElementList.Value.Add(childSubmodelElement); - return childSubmodelElement; - } - - #endregion - public static T FindFirstIdShortAs(this SubmodelElementList submodelElementList, string idShort) where T : ISubmodelElement - { - - var submodelElements = submodelElementList.Value.Where(sme => sme != null && sme is T && sme.IdShort.Equals(idShort, StringComparison.OrdinalIgnoreCase)); - - if (submodelElements.Any()) - { - return (T)submodelElements.First(); - } - - return default; - } - - public static SubmodelElementList UpdateFrom( - this SubmodelElementList elem, ISubmodelElement source) - { - if (source == null) - return elem; - - ((ISubmodelElement)elem).UpdateFrom(source); - - if (source is SubmodelElementCollection srcColl) - { - if (srcColl.Value != null) - elem.Value = srcColl.Value.Copy(); - } - - if (source is Operation srcOp) - { - Action, List> appov = (dst, src) => - { - if (src == null) - return; - foreach (var ov in src) - if (ov.Value != null) - dst.Append(ov.Value.Copy()); - }; - - elem.Value = new(); - appov(elem.Value, srcOp.InputVariables); - appov(elem.Value, srcOp.InoutputVariables); - appov(elem.Value, srcOp.OutputVariables); - if (elem.Value.Count < 1) - elem.Value = null; - } - - return elem; - } - - // advanced checks - - public class ConstraintStat - { - /// - /// Constraint AASd-107: If a first level child element in a SubmodelElementList has a semanticId - /// it shall be identical to SubmodelElementList/semanticIdListElement. - /// - public bool AllChildSemIdMatch = true; - - /// - /// Constraint AASd-108: All first level child elements in a SubmodelElementList shall have the - /// same submodel element type as specified in SubmodelElementList/typeValueListElement. - /// - public bool AllChildSmeTypeMatch = true; - - /// - /// Constraint AASd-109: If SubmodelElementList/typeValueListElement equal to Property or Range, - /// SubmodelElementList/valueTypeListElement shall be set and all first level child elements in - /// the SubmodelElementList shall have the the value type as specified in - /// SubmodelElementList/valueTypeListElement - /// - public bool AllChildValueTypeMatch = true; - } - - public static ConstraintStat EvalConstraintStat(this SubmodelElementList list) - { - // access - var res = new ConstraintStat(); - if (list.Value == null) - return res; - - // prepare SME type - var smeTypeToCheck = list.TypeValueListElement; - - // prepare value type - var valueTypeToCheck = list.ValueTypeListElement; - - // eval - foreach (var sme in list.Value) - { - // need self description - var smesd = sme.GetSelfDescription(); - if (smesd == null) - continue; - - // sem id? - if (res.AllChildSemIdMatch - && list.SemanticIdListElement?.IsValid() == true - && sme.SemanticId?.IsValid() == true - && !list.SemanticIdListElement.Matches(sme.SemanticId)) - res.AllChildSemIdMatch = false; - - // type of SME? - if (res.AllChildSmeTypeMatch - && smesd.SmeType != smeTypeToCheck) - res.AllChildSmeTypeMatch = false; - - // value type to check - if (valueTypeToCheck.HasValue - && res.AllChildValueTypeMatch - && sme is Property prop - && prop.ValueType != valueTypeToCheck.Value) - res.AllChildValueTypeMatch = false; - - if (valueTypeToCheck.HasValue - && res.AllChildValueTypeMatch - && sme is AasCore.Aas3_0.Range range - && range.ValueType != valueTypeToCheck.Value) - res.AllChildValueTypeMatch = false; - } - - // ok - return res; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtensionsUtil.cs b/src/AasxCsharpLibrary/Extensions/ExtensionsUtil.cs deleted file mode 100644 index 32200d1a7..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtensionsUtil.cs +++ /dev/null @@ -1,120 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using AasxCompatibilityModels; -using System; -using System.Collections.Generic; - -namespace Extensions -{ - public static class ExtensionsUtil - { - - public static Reference ConvertReferenceFromV10(AdminShellV10.Reference sourceReference, ReferenceTypes referenceTypes) - { - Reference outputReference = null; - if (sourceReference != null && !sourceReference.IsEmpty) - { - var keyList = new List(); - foreach (var refKey in sourceReference.Keys) - { - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {refKey.type} not found."); - } - } - outputReference = new Reference(referenceTypes, keyList); - } - - return outputReference; - } - - public static Reference ConvertReferenceFromV20(AdminShellV20.Reference sourceReference, ReferenceTypes referenceTypes) - { - Reference outputReference = null; - if (sourceReference != null && !sourceReference.IsEmpty) - { - var keyList = new List(); - foreach (var refKey in sourceReference.Keys) - { - // Fix, as Asset does not exist anymore - if (refKey.type?.Trim().Equals("Asset", StringComparison.InvariantCultureIgnoreCase) == true) - refKey.type = "GlobalReference"; - - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {refKey.type} not found."); - } - } - outputReference = new Reference(referenceTypes, keyList); - } - - return outputReference; - } - - internal static List ConvertDescriptionFromV10(AdminShellV10.Description sourceDescription) - { - var newLangStrList = new List(); - foreach (var ls in sourceDescription.langString) - { - newLangStrList.Add(new LangStringTextType(ls.lang, ls.str)); - } - - return new List(newLangStrList); - } - - internal static List ConvertDescriptionFromV20(AdminShellV20.Description sourceDescription) - { - var newLangStrList = new List(); - foreach (var ls in sourceDescription.langString) - { - newLangStrList.Add(new LangStringTextType(ls.lang, ls.str)); - } - - return new List(newLangStrList); - } - - internal static KeyTypes GetKeyType(IClass aasElement) - { - return aasElement switch - { - AssetAdministrationShell => KeyTypes.AssetAdministrationShell, - Submodel => KeyTypes.Submodel, - ConceptDescription => KeyTypes.ConceptDescription, - SubmodelElementCollection => KeyTypes.SubmodelElementCollection, - SubmodelElementList => KeyTypes.SubmodelElementList, - BasicEventElement => KeyTypes.BasicEventElement, - Blob => KeyTypes.Blob, - Entity => KeyTypes.Entity, - File => KeyTypes.File, - MultiLanguageProperty => KeyTypes.MultiLanguageProperty, - Property => KeyTypes.Property, - Operation => KeyTypes.Operation, - AasCore.Aas3_0.Range => KeyTypes.Range, - ReferenceElement => KeyTypes.ReferenceElement, - RelationshipElement => KeyTypes.RelationshipElement, - AnnotatedRelationshipElement => KeyTypes.AnnotatedRelationshipElement, - IIdentifiable => KeyTypes.Identifiable, - IReferable => KeyTypes.Referable, - Reference => KeyTypes.GlobalReference, - //TODO (jtikekar, 0000-00-00): what about model reference - _ => KeyTypes.SubmodelElement, // default case - }; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/LocatedReference.cs b/src/AasxCsharpLibrary/Extensions/LocatedReference.cs deleted file mode 100644 index 26916c5b7..000000000 --- a/src/AasxCsharpLibrary/Extensions/LocatedReference.cs +++ /dev/null @@ -1,23 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -namespace Extensions -{ - public class LocatedReference - { - public IIdentifiable Identifiable; - public IReference Reference; - - public LocatedReference() { } - public LocatedReference(IIdentifiable identifiable, IReference reference) - { - Identifiable = identifiable; - Reference = reference; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/MatchMode.cs b/src/AasxCsharpLibrary/Extensions/MatchMode.cs deleted file mode 100644 index 12792aa1a..000000000 --- a/src/AasxCsharpLibrary/Extensions/MatchMode.cs +++ /dev/null @@ -1,17 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -namespace Extensions -{ - public enum MatchMode - { - Strict, //may be not needed in future, as no local flag in V3 - Relaxed, //should be as default - Identification - } -} diff --git a/src/AasxCsharpLibrary/IAasxOnlineConnection.cs b/src/AasxCsharpLibrary/IAasxOnlineConnection.cs deleted file mode 100644 index 550bd7e21..000000000 --- a/src/AasxCsharpLibrary/IAasxOnlineConnection.cs +++ /dev/null @@ -1,26 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System.IO; - -namespace AasxIntegrationBase -{ - /// - /// This interface describes a connection for a server resource of AASX contents, such as OPC UA or REST - /// - public interface IAasxOnlineConnection - { - bool IsValid(); - bool IsConnected(); - string GetInfo(); - Stream GetThumbnailStream(); - string UpdatePropertyValue( - AasCore.Aas3_0.Environment env, Submodel submodel, ISubmodelElement sme); - } -} diff --git a/src/AasxCsharpLibrary/LICENSE.txt b/src/AasxCsharpLibrary/LICENSE.txt deleted file mode 100644 index 01f9cb5eb..000000000 --- a/src/AasxCsharpLibrary/LICENSE.txt +++ /dev/null @@ -1,1475 +0,0 @@ -Copyright (c) 2018-2023 Festo SE & Co. KG -, -author: Michael Hoffmeister - -Copyright (c) 2019-2021 PHOENIX CONTACT GmbH & Co. KG -, -author: Andreas Orzelski - -Copyright (c) 2019-2020 Fraunhofer IOSB-INA Lemgo, - eine rechtlich nicht selbstaendige Einrichtung der Fraunhofer-Gesellschaft - zur Foerderung der angewandten Forschung e.V. - -Copyright (c) 2020 Schneider Electric Automation GmbH -, -author: Marco Mendes - -Copyright (c) 2020 SICK AG - -Copyright (c) 2021 KEB Automation KG - -Copyright (c) 2021 Lenze SE -author: Jonas Grote, Denis Göllner, Sebastian Bischof - -The AASX Package Explorer is licensed under the Apache License 2.0 -(Apache-2.0, see below). - -The AASX Package Explorer is a sample application for demonstration of the -features of the Asset Administration Shell. -The implementation uses the concepts of the document "Details of the Asset -Administration Shell" published on www.plattform-i40.de which is licensed -under Creative Commons CC BY-ND 3.0 DE. - -When using eCl@ss or IEC CDD data, please check the corresponding license -conditions. - -------------------------------------------------------------------------------- - -The components below are used in AASX Package Explorer. -The related licenses are listed for information purposes only. -Some licenses may only apply to their related plugins. - -The browser functionality is licensed under the cefSharp license (see below). - -The Newtonsoft.JSON serialization is licensed under the MIT License -(MIT, see below). - -The QR code generation is licensed under the MIT license (MIT, see below). - -The Zxing.Net Dot Matrix Code (DMC) generation is licensed under -the Apache License 2.0 (Apache-2.0, see below). - -The Grapevine REST server framework is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The AutomationML.Engine is licensed under the MIT license (MIT, see below). - -The MQTT server and client is licensed under the MIT license (MIT, see below). - -The ClosedXML Excel reader/writer is licensed under the MIT license (MIT, -see below). - -The CountryFlag WPF control is licensed under the Code Project Open License -(CPOL, see below). - -The DocumentFormat.OpenXml SDK is licensed under the MIT license (MIT, -see below). - -The ExcelNumberFormat number parser is licensed under the MIT license (MIT, -see below). - -The FastMember reflection access is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The IdentityModel OpenID client is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The jose-jwt object signing and encryption is licensed under the -MIT license (MIT, see below). - -The ExcelDataReader is licensed under the MIT license (MIT, see below). - -Portions copyright (c) by OPC Foundation, Inc. and licensed under the -Reciprocal Community License (RCL, see below) - -The OPC UA Example Code of OPC UA Standard is licensed under the MIT license -(MIT, see below). - -The MSAGL (Microsoft Automatic Graph Layout) is licensed under the MIT license -(MIT, see below) - -Glob (https://www.nuget.org/packages/Glob/) is licensed under the MIT license -(MIT, see below). - -The Magick.NET library is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The SSharp.NET library (https://github.com/PetroProtsyk/SSharp) is licensed -under Apache License 2.0 (Apache-2.0, see below). - -------------------------------------------------------------------------------- - - -With respect to AASX Package Explorer -===================================== - -(http://www.apache.org/licenses/LICENSE-2.0) - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - -With respect to cefSharp -======================== - -(https://raw.githubusercontent.com/cefsharp/CefSharp/master/LICENSE) - -Copyright © The CefSharp Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - - * Neither the name of Google Inc. nor the name Chromium Embedded - Framework nor the name CefSharp nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -With respect to Newtonsoft.Json -=============================== - -(https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md) - -The MIT License (MIT) - -Copyright (c) 2007 James Newton-King - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -With respect to QRcoder -======================= - -(https://github.com/codebude/QRCoder/blob/master/LICENSE.txt) - -The MIT License (MIT) - -Copyright (c) 2013-2018 Raffael Herrmann - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -With respect to ZXing.Net -========================= -With respect to Grapevine -========================= -With respect to FastMember -========================== -With respect to IdentityModel -============================= - -(http://www.apache.org/licenses/LICENSE-2.0) - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - -With respect to AutomationML.Engine -=================================== - -(https://raw.githubusercontent.com/AutomationML/AMLEngine2.1/master/license.txt) - -The MIT License (MIT) - -Copyright 2017 AutomationML e.V. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - - -With respect to MQTTnet -======================= - -(https://github.com/chkr1011/MQTTnet/blob/master/LICENSE) - -MIT License - -MQTTnet Copyright (c) 2016-2019 Christian Kratky - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With resepct to ClosedXML -========================= - -(https://github.com/ClosedXML/ClosedXML/blob/develop/LICENSE) - -MIT License - -Copyright (c) 2016 ClosedXML - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With resepct to CountryFlag -=========================== - -(https://www.codeproject.com/Articles/190722/WPF-CountryFlag-Control) - -The Code Project Open License (CPOL) 1.02 - -Copyright © 2017 Meshack Musundi - -Preamble - -This License governs Your use of the Work. This License is intended to allow -developers to use the Source Code and Executable Files provided as part of -the Work in any application in any form. - -The main points subject to the terms of the License are: - - Source Code and Executable Files can be used in commercial applications; - Source Code and Executable Files can be redistributed; and - Source Code can be modified to create derivative works. - No claim of suitability, guarantee, or any warranty whatsoever is provided. - The software is provided "as-is". - The Article(s) accompanying the Work may not be distributed or republished - without the Author's consent - -This License is entered between You, the individual or other entity reading or -otherwise making use of the Work licensed pursuant to this License and the -individual or other entity which offers the Work under the terms of this -License ("Author"). - -License - -THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS -CODE PROJECT OPEN LICENSE ("LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT -AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED -UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. - -BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HEREIN, YOU ACCEPT AND AGREE -TO BE BOUND BY THE TERMS OF THIS LICENSE. THE AUTHOR GRANTS YOU THE RIGHTS -CONTAINED HEREIN IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND -CONDITIONS. IF YOU DO NOT AGREE TO ACCEPT AND BE BOUND BY THE TERMS OF THIS -LICENSE, YOU CANNOT MAKE ANY USE OF THE WORK. - -Definitions. - "Articles" means, collectively, all articles written by Author which -describes how the Source Code and Executable Files for the Work may -be used by a user. - "Author" means the individual or entity that offers the Work under -the terms of this License. - "Derivative Work" means a work based upon the Work or upon the Work -and other pre-existing works. - "Executable Files" refer to the executables, binary files, -configuration and any required data files included in the Work. - "Publisher" means the provider of the website, magazine, CD-ROM, -DVD or other medium from or by which the Work is obtained by You. - "Source Code" refers to the collection of source code and -configuration files used to create the Executable Files. - "Standard Version" refers to such a Work if it has not been modified, -or has been modified in accordance with the consent of the Author, -such consent being in the full discretion of the Author. - "Work" refers to the collection of files distributed by the Publisher, -including the Source Code, Executable Files, binaries, data files, -documentation, whitepapers and the Articles. - "You" is you, an individual or entity wishing to use the Work and -exercise your rights under this License. - -Fair Use/Fair Use Rights. Nothing in this License is intended to reduce, -limit, or restrict any rights arising from fair use, fair dealing, -first sale or other limitations on the exclusive rights of the -copyright owner under copyright law or other applicable laws. - -License Grant. Subject to the terms and conditions of this License, the -Author hereby grants You a worldwide, royalty-free, non-exclusive, -perpetual (for the duration of the applicable copyright) license -to exercise the rights in the Work as stated below: - You may use the standard version of the Source Code or Executable -Files in Your own applications. - You may apply bug fixes, portability fixes and other modifications -obtained from the Public Domain or from the Author. A Work modified -in such a way shall still be considered the standard version and will -be subject to this License. - You may otherwise modify Your copy of this Work (excluding the Articles) -in any way to create a Derivative Work, provided that You insert a prominent -notice in each changed file stating how, when and where You changed that file. - You may distribute the standard version of the Executable Files and Source -Code or Derivative Work in aggregate with other (possibly commercial) -programs as part of a larger (possibly commercial) software distribution. - The Articles discussing the Work published in any form by the author may -not be distributed or republished without the Author's consent. The author -retains copyright to any such Articles. You may use the Executable Files and -Source Code pursuant to this License but you may not repost or republish or -otherwise distribute or make available the Articles, without the prior written -consent of the Author. - -Any subroutines or modules supplied by You and linked into the Source Code -or Executable Files of this Work shall not be considered part of this Work -and will not be subject to the terms of this License. - -Patent License. Subject to the terms and conditions of this License, each -Author hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, -royalty-free, irrevocable (except as stated in this section) patent license -to make, have made, use, import, and otherwise transfer the Work. - -Restrictions. The license granted in Section 3 above is expressly made subject -to and limited by the following restrictions: - You agree not to remove any of the original copyright, patent, trademark, -and attribution notices and associated disclaimers that may appear in the -Source Code or Executable Files. - You agree not to advertise or in any way imply that this Work is a product -of Your own. - The name of the Author may not be used to endorse or promote products -derived from the Work without the prior written consent of the Author. - You agree not to sell, lease, or rent any part of the Work. This does -not restrict you from including the Work or any part of the Work inside -a larger software distribution that itself is being sold. The Work by itself, -though, cannot be sold, leased or rented. - You may distribute the Executable Files and Source Code only under the terms -of this License, and You must include a copy of, or the Uniform Resource -Identifier for, this License with every copy of the Executable Files or -Source Code You distribute and ensure that anyone receiving such Executable -Files and Source Code agrees that the terms of this License apply to such -Executable Files and/or Source Code. You may not offer or impose any terms -on the Work that alter or restrict the terms of this License or the -recipients' exercise of the rights granted hereunder. You may not sublicense -the Work. You must keep intact all notices that refer to this License and to -the disclaimer of warranties. You may not distribute the Executable Files or -Source Code with any technological measures that control access or use of the -Work in a manner inconsistent with the terms of this License. - You agree not to use the Work for illegal, immoral or improper -purposes, or on pages containing illegal, immoral or improper material. -The Work is subject to applicable export laws. You agree to comply with all -such laws and regulations that may apply to the Work after Your receipt of -the Work. - -Representations, Warranties and Disclaimer. THIS WORK IS PROVIDED "AS IS", -"WHERE IS" AND "AS AVAILABLE", WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES OR -CONDITIONS OR GUARANTEES. YOU, THE USER, ASSUME ALL RISK IN ITS USE, -INCLUDING COPYRIGHT INFRINGEMENT, PATENT INFRINGEMENT, SUITABILITY, ETC. -AUTHOR EXPRESSLY DISCLAIMS ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES -OR CONDITIONS, INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS -OF MERCHANTABILITY, MERCHANTABLE QUALITY OR FITNESS FOR A PARTICULAR -PURPOSE, OR ANY WARRANTY OF TITLE OR NON-INFRINGEMENT, OR THAT THE WORK -(OR ANY PORTION THEREOF) IS CORRECT, USEFUL, BUG-FREE OR FREE OF VIRUSES. -YOU MUST PASS THIS DISCLAIMER ON WHENEVER YOU DISTRIBUTE THE WORK OR DERIVATIVE -WORKS. - -Indemnity. You agree to defend, indemnify and hold harmless the Author and the -Publisher from and against any claims, suits, losses, damages, liabilities, -costs, and expenses (including reasonable legal or attorneys’ fees) -resulting from or relating to any use of the Work by You. - -Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, -IN NO EVENT WILL THE AUTHOR OR THE PUBLISHER BE LIABLE TO YOU ON ANY LEGAL -THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY -DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK OR OTHERWISE, -EVEN IF THE AUTHOR OR THE PUBLISHER HAS BEEN ADVISED OF THE POSSIBILITY -OF SUCH DAMAGES. - -Termination. - This License and the rights granted hereunder will terminate -automatically upon any breach by You of any term of this License. -Individuals or entities who have received Derivative Works from You under -this License, however, will not have their licenses terminated provided such -individuals or entities remain in full compliance with those licenses. -Sections 1, 2, 6, 7, 8, 9, 10 and 11 will survive any termination of -this License. - If You bring a copyright, trademark, patent or any other infringement -claim against any contributor over infringements You claim are made by the -Work, your License from such contributor to the Work ends automatically. - Subject to the above terms and conditions, this License is perpetual -(for the duration of the applicable copyright in the Work). -Notwithstanding the above, the Author reserves the right to release the Work -under different license terms or to stop distributing the Work at any time; -provided, however that any such election will not serve to withdraw this -License (or any other license that has been, or is required to be, -granted under the terms of this License), and this License will continue -in full force and effect unless terminated as stated above. - -Publisher. The parties hereby confirm that the Publisher shall not, under -any circumstances, be responsible for and shall not have any liability -in respect of the subject matter of this License. The Publisher makes no -warranty whatsoever in connection with the Work and shall not be liable -to You or any party on any legal theory for any damages whatsoever, including -without limitation any general, special, incidental or consequential damages -arising in connection to this license. The Publisher reserves the right to -cease making the Work available to You at any time without notice - -Miscellaneous - This License shall be governed by the laws of the location of the head -office of the Author or if the Author is an individual, the laws of -location of the principal place of residence of the Author. - If any provision of this License is invalid or unenforceable under -applicable law, it shall not affect the validity or enforceability of the -remainder of the terms of this License, and without further action by the -parties to this License, such provision shall be reformed to the minimum -extent necessary to make such provision valid and enforceable. - No term or provision of this License shall be deemed waived and no -breach consented to unless such waiver or consent shall be in writing -and signed by the party to be charged with such waiver or consent. - This License constitutes the entire agreement between the parties -with respect to the Work licensed herein. There are no understandings, -agreements or representations with respect to the Work not specified herein. -The Author shall not be bound by any additional provisions that may appear -in any communication from You. This License may not be modified without -the mutual written agreement of the Author and You. - - -With respect to DocumentFormat.OpenXml -====================================== - -(https://github.com/OfficeDev/Open-XML-SDK/blob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) Microsoft Corporation - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With respect to ExcelNumberFormat -================================= - -(https://github.com/andersnm/ExcelNumberFormat/blob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2017 andersnm - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With respect to jose-jwt -======================== - -(https://github.com/dvsekhvalnov/jose-jwt/blob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2014-2019 dvsekhvalnov - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -With resepect to ExcelDataReader -================================ - -(https://github.com/ExcelDataReader/ExcelDataReader/blob/develop/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2014 ExcelDataReader - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With resepect to OPC UA Example Code -==================================== - - * Copyright (c) 2005-2019 The OPC Foundation, Inc. All rights reserved. - * - * OPC Foundation MIT License 1.00 - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - * The complete license agreement can be found here: - * http://opcfoundation.org/License/MIT/1.00/ - - -With respect to OPC Foundation -============================== - -RCL License -Reciprocal Community License 1.00 (RCL1.00) -Version 1.00, June 24, 2009 -Copyright (C) 2008,2009 OPC Foundation, Inc., All Rights Reserved. - -https://opcfoundation.org/license/rcl.html - -Remark: PHOENIX CONTACT GmbH & Co. KG and Festo SE & Co. KG are members -of OPC foundation. - -With respect to MSAGL (Microsoft Automatic Graph Layout) -======================================================== -(see: https://github.com/microsoft/automatic-graph-layout/blob/master/LICENSE) - -Microsoft Automatic Graph Layout, MSAGL - -Copyright (c) Microsoft Corporation - -All rights reserved. - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -""Software""), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -With respect to Glob (https://www.nuget.org/packages/Glob/) -=========================================================== -(see: https://raw.githubusercontent.com/kthompson/glob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2013-2019 Kevin Thompson - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -With respect to Magick.NET -========================== - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - 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. - -With respect to SSharp.NET library -================================== - - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - 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. diff --git a/src/AasxCsharpLibrary/LogInternally.cs b/src/AasxCsharpLibrary/LogInternally.cs deleted file mode 100644 index 5b8061292..000000000 --- a/src/AasxCsharpLibrary/LogInternally.cs +++ /dev/null @@ -1,83 +0,0 @@ -/* -Copyright (c) 2020 ZHAW Zürcher Hochschule für Angewandte Wissenschaften -Author: Marko Ristin - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using Exception = System.Exception; - -namespace AdminShellNS -{ - public static class Logging - { - // see: https://stackoverflow.com/questions/9314172/getting-all-messages-from-innerexceptions - private static string GetExceptionMessages(this Exception e, string msgs = "") - { - if (e == null) return string.Empty; - if (msgs == "") msgs = e.Message; - if (e.InnerException != null) - msgs += "\r\nInnerException: " + GetExceptionMessages(e.InnerException); - return msgs; - } - - public static string FormatError(Exception ex, string where) - { - var res = string.Format("Error: {0}: {1} {2} at {3}.", - where, - ex.Message, - ex.GetExceptionMessages(), - ex.StackTrace); - - var inner = ex.InnerException; - while (inner != null) - { - res += $"Inner message: {inner.Message}" + System.Environment.NewLine; - inner = inner.InnerException; - } - - return res; - } - } - - public class InternalLog - { - /// - /// Logs the exception to STDERR. - /// - public void Error(Exception ex, string where) - { - System.Console.Error.WriteLine(Logging.FormatError(ex, where)); - } - - /// - /// Logs that the exception is silently ignored to STDERR. - /// - public void SilentlyIgnoredError(Exception ex) - { - System.Console.Error.WriteLine("The exception is silently ignored: {0} {1} at {2}.", - ex.Message, - ((ex.InnerException != null) ? ex.InnerException.Message : ""), - ex.StackTrace); - } - - /// - /// Does no logging at all. Allows to have non-empty catch clauses. - /// - public void CompletelyIgnoredError(Exception ex) - { - } - } - - /// - /// Handles logging meant to be read by developers (*i.e*, not by the users of the software). - /// - /// Please see AasxIntegrationBase\LogInstance.cs for how to keep logs intended - /// for the user. - public static class LogInternally - { - public static readonly InternalLog That = new InternalLog(); - } -} \ No newline at end of file diff --git a/src/AasxCsharpLibrary/Properties/AssemblyInfo.cs b/src/AasxCsharpLibrary/Properties/AssemblyInfo.cs deleted file mode 100644 index 1c46e4aa6..000000000 --- a/src/AasxCsharpLibrary/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// Allgemeine Informationen über eine Assembly werden über die folgenden -// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, -// die einer Assembly zugeordnet sind. -[assembly: AssemblyTitle("AasxCsharpLibrary")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("AasxCsharpLibrary")] -[assembly: AssemblyCopyright("Copyright © 2019")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly -// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von -// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen. -[assembly: ComVisible(false)] - -// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird -[assembly: Guid("9863799b-4e44-4da2-9120-c85c7985bc6d")] - -// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: -// -// Hauptversion -// Nebenversion -// Buildnummer -// Revision -// -// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, -// indem Sie "*" wie unten gezeigt eingeben: -//// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/AasxCsharpLibrary/Resources/schemaV201/AAS.xsd b/src/AasxCsharpLibrary/Resources/schemaV201/AAS.xsd deleted file mode 100644 index 2e6c24f6b..000000000 --- a/src/AasxCsharpLibrary/Resources/schemaV201/AAS.xsd +++ /dev/null @@ -1,555 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/AasxCsharpLibrary/Resources/schemaV201/AAS_ABAC.xsd b/src/AasxCsharpLibrary/Resources/schemaV201/AAS_ABAC.xsd deleted file mode 100644 index 4048a5746..000000000 --- a/src/AasxCsharpLibrary/Resources/schemaV201/AAS_ABAC.xsd +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary/Resources/schemaV201/IEC61360.xsd b/src/AasxCsharpLibrary/Resources/schemaV201/IEC61360.xsd deleted file mode 100644 index d52f04f1e..000000000 --- a/src/AasxCsharpLibrary/Resources/schemaV201/IEC61360.xsd +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/AasxCsharpLibrary/Resources/schemaV201/aas.json b/src/AasxCsharpLibrary/Resources/schemaV201/aas.json deleted file mode 100644 index 9583c2b1f..000000000 --- a/src/AasxCsharpLibrary/Resources/schemaV201/aas.json +++ /dev/null @@ -1,1148 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2019-09/schema", - "title": "AssetAdministrationShellEnvironment", - "$id": "http://www.admin-shell.io/schema/json/v2.0.1", - "type": "object", - "required": ["assetAdministrationShells", "submodels", "assets", "conceptDescriptions"], - "properties": { - "assetAdministrationShells": { - "type": "array", - "items": { - "$ref": "#/definitions/AssetAdministrationShell" - } - }, - "submodels": { - "type": "array", - "items": { - "$ref": "#/definitions/Submodel" - } - }, - "assets": { - "type": "array", - "items": { - "$ref": "#/definitions/Asset" - } - }, - "conceptDescriptions": { - "type": "array", - "items": { - "$ref": "#/definitions/ConceptDescription" - } - } - }, - "definitions": { - "Referable": { - "type": "object", - "properties": { - "idShort": { - "type": "string" - }, - "category": { - "type": "string" - }, - "description": { - "type": "array", - "items": { - "$ref": "#/definitions/LangString" - } - }, - "parent": { - "$ref": "#/definitions/Reference" - }, - "modelType": { - "$ref": "#/definitions/ModelType" - } - }, - "required": [ "idShort", "modelType" ] - }, - "Identifiable": { - "allOf": [ - { "$ref": "#/definitions/Referable" }, - { "properties": { - "identification": { - "$ref": "#/definitions/Identifier" - }, - "administration": { - "$ref": "#/definitions/AdministrativeInformation" - } - }, - "required": [ "identification" ] - } - ] - }, - "Qualifiable": { - "type": "object", - "properties": { - "qualifiers": { - "type": "array", - "items": { - "$ref": "#/definitions/Constraint" - } - } - } - }, - "HasSemantics": { - "type": "object", - "properties": { - "semanticId": { - "$ref": "#/definitions/Reference" - } - } - }, - "HasDataSpecification": { - "type": "object", - "properties": { - "embeddedDataSpecifications": { - "type": "array", - "items": { - "$ref": "#/definitions/EmbeddedDataSpecification" - } - } - } - }, - "AssetAdministrationShell": { - "allOf": [ - { "$ref": "#/definitions/Identifiable" }, - { "$ref": "#/definitions/HasDataSpecification" }, - { "properties": { - "derivedFrom": { - "$ref": "#/definitions/Reference" - }, - "asset": { - "$ref": "#/definitions/Reference" - }, - "submodels": { - "type": "array", - "items": { - "$ref": "#/definitions/Reference" - } - }, - "views": { - "type": "array", - "items": { - "$ref": "#/definitions/View" - } - }, - "conceptDictionaries": { - "type": "array", - "items": { - "$ref": "#/definitions/ConceptDictionary" - } - }, - "security": { - "$ref": "#/definitions/Security" - } - }, - "required": [ "asset" ] - } - ] - }, - "Identifier": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "idType": { - "$ref": "#/definitions/KeyType" - } - }, - "required": [ "id", "idType" ] - }, - "KeyType": { - "type": "string", - "enum": ["Custom", "IRDI", "IRI", "IdShort", "FragmentId"] - }, - "AdministrativeInformation": { - "type": "object", - "properties": { - "version": { - "type": "string" - }, - "revision": { - "type": "string" - } - } - }, - "LangString": { - "type": "object", - "properties": { - "language": { - "type": "string" - }, - "text": { - "type": "string" - } - }, - "required": [ "language", "text" ] - }, - "Reference": { - "type": "object", - "properties": { - "keys": { - "type": "array", - "items": { - "$ref": "#/definitions/Key" - } - } - }, - "required": [ "keys" ] - }, - "Key": { - "type": "object", - "properties": { - "type": { - "$ref": "#/definitions/KeyElements" - }, - "idType": { - "$ref": "#/definitions/KeyType" - }, - "value": { - "type": "string" - }, - "local": { - "type": "boolean" - } - }, - "required": [ "type", "idType", "value", "local" ] - }, - "KeyElements": { - "type": "string", - "enum": [ - "Asset", - "AssetAdministrationShell", - "ConceptDescription", - "Submodel", - "AccessPermissionRule", - "AnnotatedRelationshipElement", - "BasicEvent", - "Blob", - "Capability", - "ConceptDictionary", - "DataElement", - "File", - "Entity", - "Event", - "MultiLanguageProperty", - "Operation", - "Property", - "Range", - "ReferenceElement", - "RelationshipElement", - "SubmodelElement", - "SubmodelElementCollection", - "View", - "GlobalReference", - "FragmentReference" - ] - }, - "ModelTypes": { - "type": "string", - "enum": [ - "Asset", - "AssetAdministrationShell", - "ConceptDescription", - "Submodel", - "AccessPermissionRule", - "AnnotatedRelationshipElement", - "BasicEvent", - "Blob", - "Capability", - "ConceptDictionary", - "DataElement", - "File", - "Entity", - "Event", - "MultiLanguageProperty", - "Operation", - "Property", - "Range", - "ReferenceElement", - "RelationshipElement", - "SubmodelElement", - "SubmodelElementCollection", - "View", - "GlobalReference", - "FragmentReference", - "Constraint", - "Formula", - "Qualifier" - ] - }, - "ModelType": { - "type": "object", - "properties": { - "name": { - "$ref": "#/definitions/ModelTypes" - } - }, - "required": [ "name" ] - }, - "EmbeddedDataSpecification": { - "type": "object", - "properties": { - "dataSpecification": { - "$ref": "#/definitions/Reference" - }, - "dataSpecificationContent": { - "$ref": "#/definitions/DataSpecificationContent" - } - }, - "required": [ "dataSpecification", "dataSpecificationContent" ] - }, - "DataSpecificationContent": { - "oneOf": [ - { "$ref": "#/definitions/DataSpecificationIEC61360Content" }, - { "$ref": "#/definitions/DataSpecificationPhysicalUnitContent" } - ] - }, - "DataSpecificationPhysicalUnitContent": { - "type": "object", - "properties": { - "unitName": { - "type": "string" - }, - "unitSymbol": { - "type": "string" - }, - "definition": { - "type": "array", - "items": { - "$ref": "#/definitions/LangString" - } - }, - "siNotation": { - "type": "string" - }, - "siName": { - "type": "string" - }, - "dinNotation": { - "type": "string" - }, - "eceName": { - "type": "string" - }, - "eceCode": { - "type": "string" - }, - "nistName": { - "type": "string" - }, - "sourceOfDefinition": { - "type": "string" - }, - "conversionFactor": { - "type": "string" - }, - "registrationAuthorityId": { - "type": "string" - }, - "supplier": { - "type": "string" - } - }, - "required": [ "unitName", "unitSymbol", "definition" ] - }, - "DataSpecificationIEC61360Content": { - "allOf": [ - { "$ref": "#/definitions/ValueObject" }, - { - "type": "object", - "properties": { - "dataType": { - "enum": [ - "DATE", - "STRING", - "STRING_TRANSLATABLE", - "REAL_MEASURE", - "REAL_COUNT", - "REAL_CURRENCY", - "BOOLEAN", - "URL", - "RATIONAL", - "RATIONAL_MEASURE", - "TIME", - "TIMESTAMP", - "INTEGER_COUNT", - "INTEGER_MEASURE", - "INTEGER_CURRENCY" - ] - }, - "definition": { - "type": "array", - "items": { - "$ref": "#/definitions/LangString" - } - }, - "preferredName": { - "type": "array", - "items": { - "$ref": "#/definitions/LangString" - } - }, - "shortName": { - "type": "array", - "items": { - "$ref": "#/definitions/LangString" - } - }, - "sourceOfDefinition": { - "type": "string" - }, - "symbol": { - "type": "string" - }, - "unit": { - "type": "string" - }, - "unitId": { - "$ref": "#/definitions/Reference" - }, - "valueFormat": { - "type": "string" - }, - "valueList": { - "$ref": "#/definitions/ValueList" - }, - "levelType": { - "type": "array", - "items": { - "$ref": "#/definitions/LevelType" - } - } - }, - "required": [ "preferredName" ] - } - ] - }, - "LevelType": { - "type": "string", - "enum": [ "Min", "Max", "Nom", "Typ" ] - }, - "ValueList": { - "type": "object", - "properties": { - "valueReferencePairTypes": { - "type": "array", - "minItems": 1, - "items": { - "$ref": "#/definitions/ValueReferencePairType" - } - } - }, - "required": [ "valueReferencePairTypes" ] - }, - "ValueReferencePairType": { - "allOf": [ - { "$ref": "#/definitions/ValueObject" } - ] - }, - "ValueObject": { - "type": "object", - "properties": { - "value": { "type": "string" }, - "valueId": { - "$ref": "#/definitions/Reference" - }, - "valueType": { - "type": "string", - "enum": [ - "anyUri", - "base64Binary", - "boolean", - "date", - "dateTime", - "dateTimeStamp", - "decimal", - "integer", - "long", - "int", - "short", - "byte", - "nonNegativeInteger", - "positiveInteger", - "unsignedLong", - "unsignedInt", - "unsignedShort", - "unsignedByte", - "nonPositiveInteger", - "negativeInteger", - "double", - "duration", - "dayTimeDuration", - "yearMonthDuration", - "float", - "gDay", - "gMonth", - "gMonthDay", - "gYear", - "gYearMonth", - "hexBinary", - "NOTATION", - "QName", - "string", - "normalizedString", - "token", - "language", - "Name", - "NCName", - "ENTITY", - "ID", - "IDREF", - "NMTOKEN", - "time" - ]} - } - }, - "Asset": { - "allOf": [ - { "$ref": "#/definitions/Identifiable" }, - { "$ref": "#/definitions/HasDataSpecification" }, - { "properties": { - "kind": { - "$ref": "#/definitions/AssetKind" - }, - "assetIdentificationModel": { - "$ref": "#/definitions/Reference" - }, - "billOfMaterial": { - "$ref": "#/definitions/Reference" - } - }, - "required": [ "kind" ] - } - ] - }, - "AssetKind": { - "type": "string", - "enum": ["Type", "Instance"] - }, - "ModelingKind": { - "type": "string", - "enum": ["Template", "Instance"] - }, - "Submodel": { - "allOf": [ - { "$ref": "#/definitions/Identifiable" }, - { "$ref": "#/definitions/HasDataSpecification" }, - { "$ref": "#/definitions/Qualifiable" }, - { "$ref": "#/definitions/HasSemantics" }, - { "properties": { - "kind": { - "$ref": "#/definitions/ModelingKind" - }, - "submodelElements": { - "type": "array", - "items": { - "$ref": "#/definitions/SubmodelElement" - } - } - } - } - ] - }, - "Constraint": { - "type": "object", - "properties": { - "modelType": { - "$ref": "#/definitions/ModelType" - } - }, - "required": [ "modelType" ] - }, - "Operation": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" }, - { "properties": { - "inputVariable": { - "type": "array", - "items": { - "$ref": "#/definitions/OperationVariable" - } - }, - "outputVariable": { - "type": "array", - "items": { - "$ref": "#/definitions/OperationVariable" - } - }, - "inoutputVariable": { - "type": "array", - "items": { - "$ref": "#/definitions/OperationVariable" - } - } - } - } - ] - }, - "OperationVariable": { - "type": "object", - "properties": { - "value": { - "oneOf": [ - { "$ref": "#/definitions/Blob" }, - { "$ref": "#/definitions/File" }, - { "$ref": "#/definitions/Capability" }, - { "$ref": "#/definitions/Entity" }, - { "$ref": "#/definitions/Event" }, - { "$ref": "#/definitions/BasicEvent" }, - { "$ref": "#/definitions/MultiLanguageProperty" }, - { "$ref": "#/definitions/Operation" }, - { "$ref": "#/definitions/Property" }, - { "$ref": "#/definitions/Range" }, - { "$ref": "#/definitions/ReferenceElement" }, - { "$ref": "#/definitions/RelationshipElement" }, - { "$ref": "#/definitions/SubmodelElementCollection" } - ] - } - }, - "required": [ "value" ] - }, - "SubmodelElement": { - "allOf": [ - { "$ref": "#/definitions/Referable" }, - { "$ref": "#/definitions/HasDataSpecification" }, - { "$ref": "#/definitions/HasSemantics" }, - { "$ref": "#/definitions/Qualifiable" }, - { "properties": { - "kind": { - "$ref": "#/definitions/ModelingKind" - } - } - } - ] - }, - "Event": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" } - ] - }, - "BasicEvent": { - "allOf": [ - { "$ref": "#/definitions/Event" }, - { "properties": { - "observed": { - "$ref": "#/definitions/Reference" - } - }, - "required": [ "observed" ] - } - ] - }, - "EntityType": { - "type": "string", - "enum": ["CoManagedEntity", "SelfManagedEntity"] - }, - "Entity": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" }, - { "properties": { - "statements": { - "type": "array", - "items": { - "$ref": "#/definitions/SubmodelElement" - } - }, - "entityType": { - "$ref": "#/definitions/EntityType" - }, - "asset": { - "$ref": "#/definitions/Reference" - } - }, - "required": [ "entityType" ] - } - ] - }, - "View": { - "allOf": [ - { "$ref": "#/definitions/Referable" }, - { "$ref": "#/definitions/HasDataSpecification" }, - { "$ref": "#/definitions/HasSemantics" }, - { "properties": { - "containedElements": { - "type": "array", - "items": { - "$ref": "#/definitions/Reference" - } - } - } - } - ] - }, - "ConceptDictionary": { - "allOf": [ - { "$ref": "#/definitions/Referable" }, - { "$ref": "#/definitions/HasDataSpecification" }, - { "properties": { - "conceptDescriptions": { - "type": "array", - "items": { - "$ref": "#/definitions/Reference" - } - } - } - } - ] - }, - "ConceptDescription": { - "allOf": [ - { "$ref": "#/definitions/Identifiable" }, - { "$ref": "#/definitions/HasDataSpecification" }, - { "properties": { - "isCaseOf": { - "type": "array", - "items": { - "$ref": "#/definitions/Reference" - } - } - } - } - ] - }, - "Capability": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" } - ] - }, - "Property": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" }, - { "$ref": "#/definitions/ValueObject" } - ] - }, - "Range": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" }, - { "properties": { - "valueType": { - "type": "string", - "enum": [ - "anyUri", - "base64Binary", - "boolean", - "date", - "dateTime", - "dateTimeStamp", - "decimal", - "integer", - "long", - "int", - "short", - "byte", - "nonNegativeInteger", - "positiveInteger", - "unsignedLong", - "unsignedInt", - "unsignedShort", - "unsignedByte", - "nonPositiveInteger", - "negativeInteger", - "double", - "duration", - "dayTimeDuration", - "yearMonthDuration", - "float", - "gDay", - "gMonth", - "gMonthDay", - "gYear", - "gYearMonth", - "hexBinary", - "NOTATION", - "QName", - "string", - "normalizedString", - "token", - "language", - "Name", - "NCName", - "ENTITY", - "ID", - "IDREF", - "NMTOKEN", - "time" - ] - }, - "min": { "type": "string" }, - "max": { "type": "string" } - }, - "required": [ "valueType"] - } - ] - }, - "MultiLanguageProperty": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" }, - { "properties": { - "value": { - "type": "array", - "items": { - "$ref": "#/definitions/LangString" - } - }, - "valueId": { - "$ref": "#/definitions/Reference" - } - } - } - ] - }, - "File": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" }, - { "properties": { - "value": { - "type": "string" - }, - "mimeType": { - "type": "string" - } - }, - "required": [ "mimeType" ] - } - ] - }, - "Blob": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" }, - { "properties": { - "value": { - "type": "string" - }, - "mimeType": { - "type": "string" - } - }, - "required": [ "mimeType" ] - } - ] - }, - "ReferenceElement": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" }, - { "properties": { - "value": { - "$ref": "#/definitions/Reference" - } - } - } - ] - }, - "SubmodelElementCollection": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" }, - { "properties": { - "value": { - "type": "array", - "items": { - "oneOf": [ - { "$ref": "#/definitions/Blob" }, - { "$ref": "#/definitions/File" }, - { "$ref": "#/definitions/Capability" }, - { "$ref": "#/definitions/Entity" }, - { "$ref": "#/definitions/Event" }, - { "$ref": "#/definitions/BasicEvent" }, - { "$ref": "#/definitions/MultiLanguageProperty" }, - { "$ref": "#/definitions/Operation" }, - { "$ref": "#/definitions/Property" }, - { "$ref": "#/definitions/Range" }, - { "$ref": "#/definitions/ReferenceElement" }, - { "$ref": "#/definitions/RelationshipElement" }, - { "$ref": "#/definitions/SubmodelElementCollection" } - ] - } - }, - "allowDuplicates": { - "type": "boolean" - }, - "ordered": { - "type": "boolean" - } - } - } - ] - }, - "RelationshipElement": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" }, - { "properties": { - "first": { - "$ref": "#/definitions/Reference" - }, - "second": { - "$ref": "#/definitions/Reference" - } - }, - "required": [ "first", "second" ] - } - ] - }, - "AnnotatedRelationshipElement": { - "allOf": [ - { "$ref": "#/definitions/RelationshipElement" }, - { "properties": { - "annotation": { - "type": "array", - "items": { - "oneOf": [ - { "$ref": "#/definitions/Blob" }, - { "$ref": "#/definitions/File" }, - { "$ref": "#/definitions/MultiLanguageProperty" }, - { "$ref": "#/definitions/Property" }, - { "$ref": "#/definitions/Range" }, - { "$ref": "#/definitions/ReferenceElement" } - ] - } - } - } - } - ] - }, - "Qualifier": { - "allOf": [ - { "$ref": "#/definitions/Constraint" }, - { "$ref": "#/definitions/HasSemantics" }, - { "$ref": "#/definitions/ValueObject" }, - { "properties": { - "type": { - "type": "string" - } - }, - "required": [ "type" ] - } - ] - }, - "Formula": { - "allOf": [ - { "$ref": "#/definitions/Constraint" }, - { "properties": { - "dependsOn": { - "type": "array", - "items": { - "$ref": "#/definitions/Reference" - } - } - } - } - ] - }, - "Security": { - "type": "object", - "properties": { - "accessControlPolicyPoints": { - "$ref": "#/definitions/AccessControlPolicyPoints" - }, - "certificate": { - "type": "array", - "items": { - "oneOf": [ - { "$ref": "#/definitions/BlobCertificate" } - ] - } - }, - "requiredCertificateExtension": { - "type": "array", - "items": { - "$ref": "#/definitions/Reference" - } - } - }, - "required": [ "accessControlPolicyPoints" ] - }, - "Certificate": { - "type": "object" - }, - "BlobCertificate": { - "allOf": [ - { "$ref": "#/definitions/Certificate" }, - { "properties": { - "blobCertificate": { - "$ref": "#/definitions/Blob" - }, - "containedExtension": { - "type": "array", - "items": { - "$ref": "#/definitions/Reference" - } - }, - "lastCertificate": { - "type": "boolean" - } - } - } - ] - }, - "AccessControlPolicyPoints": { - "type": "object", - "properties": { - "policyAdministrationPoint": { - "$ref": "#/definitions/PolicyAdministrationPoint" - }, - "policyDecisionPoint": { - "$ref": "#/definitions/PolicyDecisionPoint" - }, - "policyEnforcementPoint": { - "$ref": "#/definitions/PolicyEnforcementPoint" - }, - "policyInformationPoints": { - "$ref": "#/definitions/PolicyInformationPoints" - } - }, - "required": [ "policyAdministrationPoint", "policyDecisionPoint", "policyEnforcementPoint" ] - }, - "PolicyAdministrationPoint": { - "type": "object", - "properties": { - "localAccessControl": { - "$ref": "#/definitions/AccessControl" - }, - "externalAccessControl": { - "type": "boolean" - } - }, - "required": [ "externalAccessControl" ] - }, - "PolicyInformationPoints": { - "type": "object", - "properties": { - "internalInformationPoint": { - "type": "array", - "items": { - "$ref": "#/definitions/Reference" - } - }, - "externalInformationPoint": { - "type": "boolean" - } - }, - "required": [ "externalInformationPoint" ] - }, - "PolicyEnforcementPoint": { - "type": "object", - "properties": { - "externalPolicyEnforcementPoint": { - "type": "boolean" - } - }, - "required": [ "externalPolicyEnforcementPoint" ] - }, - "PolicyDecisionPoint": { - "type": "object", - "properties": { - "externalPolicyDecisionPoints": { - "type": "boolean" - } - }, - "required": [ "externalPolicyDecisionPoints" ] - }, - "AccessControl": { - "type": "object", - "properties": { - "selectableSubjectAttributes": { - "$ref": "#/definitions/Reference" - }, - "defaultSubjectAttributes": { - "$ref": "#/definitions/Reference" - }, - "selectablePermissions": { - "$ref": "#/definitions/Reference" - }, - "defaultPermissions": { - "$ref": "#/definitions/Reference" - }, - "selectableEnvironmentAttributes": { - "$ref": "#/definitions/Reference" - }, - "defaultEnvironmentAttributes": { - "$ref": "#/definitions/Reference" - }, - "accessPermissionRule": { - "type": "array", - "items": { - "$ref": "#/definitions/AccessPermissionRule" - } - } - } - }, - "AccessPermissionRule": { - "allOf": [ - { "$ref": "#/definitions/Referable" }, - { "$ref": "#/definitions/Qualifiable" }, - { "properties": { - "targetSubjectAttributes": { - "type": "array", - "items": { - "$ref": "#/definitions/SubjectAttributes" - }, - "minItems": 1 - }, - "permissionsPerObject": { - "type": "array", - "items": { - "$ref": "#/definitions/PermissionsPerObject" - } - } - }, - "required": [ "targetSubjectAttributes" ] - } - ] - }, - "SubjectAttributes": { - "type": "object", - "properties": { - "subjectAttributes": { - "type": "array", - "items": { - "$ref": "#/definitions/Reference" - }, - "minItems": 1 - } - } - }, - "PermissionsPerObject": { - "type": "object", - "properties": { - "object": { - "$ref": "#/definitions/Reference" - }, - "targetObjectAttributes": { - "$ref": "#/definitions/ObjectAttributes" - }, - "permission": { - "type": "array", - "items": { - "$ref": "#/definitions/Permission" - } - } - } - }, - "ObjectAttributes": { - "type": "object", - "properties": { - "objectAttribute": { - "type": "array", - "items": { - "$ref": "#/definitions/Property" - }, - "minItems": 1 - } - } - }, - "Permission": { - "type": "object", - "properties": { - "permission": { - "$ref": "#/definitions/Reference" - }, - "kindOfPermission": { - "type": "string", - "enum": ["Allow", "Deny", "NotApplicable", "Undefined"] - } - }, - "required": [ "permission", "kindOfPermission" ] - } - } -} diff --git a/src/AasxOpenidClient/AasxOpenidClient.csproj b/src/AasxOpenidClient/AasxOpenidClient.csproj deleted file mode 100644 index 9a1817fd1..000000000 --- a/src/AasxOpenidClient/AasxOpenidClient.csproj +++ /dev/null @@ -1,35 +0,0 @@ - - - net6.0-windows - Library - false - true - true - false - - - - Always - - - Always - - - Always - - - Always - - - - - - - - - - - - - - diff --git a/src/AasxOpenidClient/Andreas_Orzelski_Chain.pfx b/src/AasxOpenidClient/Andreas_Orzelski_Chain.pfx deleted file mode 100644 index 390288b42b0c5ca15f275670d2bacb4d8680cf89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4362 zcmY+IWl$81x5k%c=@MxPiA7+k1?difC6$tr5NVJu>0P>6>5?U+rTe9&LFw*BI)o(z zuK$^P?|biuGv_?dnK>Vy`OSeMNU?z!m{7!%F>E|Y7%U7;gn@&BLOkgLA)d7TwVR;` z0^xsG*eC=6`(FzT!~pzl^#5)!pmf;y|9ycF0~<;V!o8x>o6?EP{|E%)0)i0ur#FRH zMn8MR?07FM_aU|HpZrWa_3I?$8Q^a1nnWa9b?LXqjtTh;FJy%Wt*q&C{HK@hD*(%M zSdzk%-aTp}f>GHYkI#UeJXUn8?$V^I3)ua16;F+X1y??mv-r8$7<|wZVxHjGb(2UX z6?+!T;G(Mp?lv;q3=>(HwIiv*_v^%u`?(EWJHjI~22;|EaA{G|GkuEx)|#k)qbThHgB^J=MO`n%~@?K%5j4n`4Y2(wq-oz*7H zF=qXwp=g=`Q6fE8q3SIm$PqF8QQfI%Tyur;JBLhM-eKp72`g!AAK_02XH#ik%H+;# zyR-KZ;tw(60p$+H!gVagNS-AhNINhjorhPfpg36P6$y(*V2luM$>es2X=NlXj@+w; zsbP(TBq;E{Z(1Z%B!E1g%#oq6L>ap;OnPZ~*!)%rHLzBUVZ}u`On$F$&8Yi!Le);o zsqxsFkmUN_JRYk%mN-g~%3$}du_?;m|K^N#i_)VZV82&if zp^i4ni1)I1cdJH+p(On5aTywKv2Y8Uwoe3FT@A_!Aa$rQaXky3LFN7fbgLVL^ntziEKuAR@n0t=A8Ywy3>mMTTpbGl+$cLyYmDx4CA_k)MrpQW+76%QQ4(n%^@0CEheD z4m?K>FZh7teD=1?m`8VUKUOdj<51tKq$hfwhOLpvAaJ*5K7UFKRY#Qm60b)lkkv!S zn0>jX0!Zf(CzzD9ZX&DWnCq6mulQ#APe+KPg&NT~%|(=p*2WiZv!-X!yn)Obc`)p8 ziei)g^@cW8cTqObB;xANepu4f2}a5SF>IpDrItLYz92h|u>B&B@s~@3K)8E@bs(c1 zXP-cK3|#s&i{HP0FoS&oE=HOY7Ww%!LJuuP`8#j#_DkHV(MuH@R_s3{Y0Ld)*+t)M zHxGvY2m~TCdnK#k3JG7|*Jo7S@VSc>=X?8RcL(Y>59p=OjgdjVtgK_M8;f-RFbqbe zjb5*+8(DTJX0$vN8eY1tW8^X9NGB`j6e9MWNz-kT;|yztlvSJrZZ&-HjtpxSVbpyb z)zuaa54HWLWc1c|5j{dnHGH&iNKQGE)Gw*Si+CleBR@hQGF2OalDGZ`=GwV3lk-BJ z9W{=7m@KCObNlv8+SQp*uBq$vs7FZ0tkT&joo`D}f0V8X0acP;5j744DZjT@)jW9P zbwWt=f>}2uUwMsGA%eFE-qY3;`}$|DPrJ0t+j{~vO~ZvPGZ2}j$CtmUG=L_Ie~UMeinWC@?A(E+=7&V`v$DH`y5DJkGi=0*(_7W$ z_3@IPfyv3f+uJm9)kr-f@>s4AZwt9ny&#_tZ5dibV{c?$jx(%7#Z%)q@J;S9Pr^G$ z2~17>2{tf&DCu1W!%y$5E3f)vuda?=eJn-B@skmkoeKU~-LSC=lqQ?80*SzG7h69E zXGqDp!U_^qNNCQGWxK|Bg$@|kf&?g1`sQ$+gwz5qg=68agI|%x?}Nu&93i>`!Tr`T z+BrU~wMeD+T%-v6Y z2bOjM#N>8!wKH;#X^wQCIsEulr;^#yP~>nq0Qf2DZ+yeEvLyeqFL9|}#75z9u%Vjj zc4FQnc?{oKWnQAJcjY|W{Y-d8X*%C1+*C_KhsT2EWJFVtRO~_qI!VFL4rAah)BF&m z*mZ}8`zok3GHEgtKdgQ)^7^*Lo02DV00u0aAOUpi}|}VoRH1 zN=Di~y2fzp?LUaLe0zZ7@DesH3U~y1OIC4g^)kE5(Fcc-O=jxg5W`kT|1kGyRdGZ~ zz9aUyV#LE7*S})3OR}zgk2}~5Q5rxFvZRwsX=*Ad+yXuiHQM9;dI|A3N9}AU;dtT> zH7B)x2C0Dg9L|loy%Iz0IIQz>oyq87_v!6T;T7~C`>0#`oJtP#>~^Dq+|15XY8J7J zI>mCiYyRkSschQnq5HJ@9o+DyL+>AaDg*68L`-=z5BEp$DqO06d~eo?H)iV-=zCi~ zd*V?`&=6g}y0g3_nknx=hO3vT-Ex!rWVV$6HzRc)(pcZg?j}?jf^)6e1jjP7SOK<& z(W3g?mzwI!sKHMb1npkM5mcMLjPm!C`#ZXC4g?iFpNY!yv1Q!%b0l(`3FDAHW0ZLLZ{6J(P$D>9nX-6ojYir47=TqLQqW;G{LxaR_@ykqG6z-r-d&c`vP zFZ1d-AGUb^yOTG_`!jKu()$X+>Lw92y5mUBt;WMX;WVB zCH=g(d?@WAx4?jEDA42{_3JSgK|fPUo_bH5;ydsdc%zR4Z0W^2`!wF`=W z=!n{^?m)eKSf7fco;3CmNTEYOLy9pLY(M?(p=3+dK4)R<16l+h$XMKB7{w68a)zMz zK4sSq^oD>c5z5DzKYrIP&-xIOGJ*sKp;-bpj1rwL;J)w1MUP@3YiX--+I@REm}}WX zOiQ~YeNTkLj1*og4~TFa694Eq7;vLby?`8#`2S(a6N%24$(o<1^4(qot<6q<_E?pn zwODp8ah3L#sgk!PykyGT6B_zts<%OSm02U7o43glYW8O^eCM^y&q$**daeLqU5+)W zhI&o3{elb9_6BcGHiosBdsnbmb9=i1>;323M%rD9^Ar_Ek%L$1bmFK^03cpZHPxwb zf7XGw&I|3YYP)r^lJRQjVo~tmJ=b{ka7V~vboyzI=?dS+62txkCb&b)^Tb-LjNTpn z=@xRTQ`EtOuK<_^vrxV=C|Rl@QYWIA-T=DXAC?1|FWz2&*vBgW)2c?qr|Hv3_~j#p z%d$JWnjiehkM@h)>K5SV6D&QQ@I&N?YQ7CwF5aWs{CeA_nWcX&lN1zz<@0|48HK>I z2O+Sm|Jon^mMJ#D|KKt{1`ve+9YYbI{r^YNnE#>Z;D)n^Ol0EQ|4=jt0U8L(720p| zJkGDQ(x?1V!Duj7w70DrewU04)ejfEUz=lgH|ro1#<5?LcxMqvX0&7_6IswiJZdxF zmoYI)UZBeh?S_xxsrSW77~Ry-_(+^#JH6*JzuCKR|7W*8?7`@8M~W>VYKQ`p_527< zR-Ehr383ZtKF687B~KMYlD#y0wH5NRLbH!oI(uZwOu3B}!4R(HwZ_F2Gm#ALO`j{; z^a9L+y*oQp((RNxIHyN56uwJWX2TnUT^9;U!zXp{GIIPhtJa3$`(st2^XL7u!(ATfu0#T<*;k?8%x@l~C`ag6D^)t#6atuZy5S(iPgQ8a^ z+Mn`_!AodNvdZm1T6d?aTT}tHmklw?zEohXtX<1b0Q$l!lU%VSBYL&-?rNU;)`aeH z^Em>Yw0{(+e$fr_egOjqiBj;Wd75q2Elyj+K&OsXbNmQIwagfv3I6W-F7d|jj_fgE z!zcV!@NC$!@bhz>JGCPFQ~tX`de_#VfveUaWuBSpMa&;(K5;oEY{DzO)BoIFFPANk zLyg}_q#s4k&G67^757Fyc)VWPA;-@v0P@^f=+{O4AOH=cd$|O1WH4lCL5}5eV83+y z%<~8PeBjM!k)t6_{y&o$H#BK9-m?ugN$lHqsRXaXC)i2I?6T?{;ILYedxlGfCkv8u z;gEpyvPGd65GJ8M(4lx`r4?{)mo*z!Y5ws{d-u{T!_QMMf|r!1eN5-ItZZdNC;~45 z`Ct;uZM>Mw4Jw}I%blky%4DDE!sQ>&^67r_G9%R1bE#9LDVwrWd8y_^zDm@HFR``t z7Ced9bKC?ZtTopu3b-8^sK?A~LCUqE4KUnWEsQ;`CzyA4)PfE5zwgQNWRJy7Xv|u} z%vVk7a2muC6vkZ;G$?-$&4rtvk>D~i$K@4XR$)!)s3yTDlw%ex!)Tcp+EcC2~hrV3LY-6FjeRmWN+h3cynpBj+-@gk)y zV7K{2%CZa*%Tjh3tSGCrPlonMZX{NmMQzQj+?l} zYv!eeD(lE&Ve+oh@G_37$ITioJ`*U*|E41z1s^4dTwONuo0aB-OfgBcW-n+JTd-g) z7W(h^0gs#y!oUtt1_%J407if;z!6{pa0OTb-UHnJ>eqi~pTElCud)Z&Lb;(#P&{lb rPGU^pGb{jzTuKN6RpPx^IbWDDYFaJC4jH~71L1BAofh^I&r|&uZ$~P& diff --git a/src/AasxOpenidClient/ConsoleExtensions.cs b/src/AasxOpenidClient/ConsoleExtensions.cs deleted file mode 100644 index 568c2b6a6..000000000 --- a/src/AasxOpenidClient/ConsoleExtensions.cs +++ /dev/null @@ -1,59 +0,0 @@ -/* -Copyright (c) 2020 see https://github.com/IdentityServer/IdentityServer4 - -We adapted the code marginally and removed the parts that we do not use. -*/ - -using System; -using System.Diagnostics; - -// ReSharper disable All .. as this is code from others (adapted from IdentityServer4). - -namespace AasxOpenIdClient -{ - public static class ConsoleExtensions - { - /// - /// Writes green text to the console. - /// - /// The text. - [DebuggerStepThrough] - public static void ConsoleGreen(this string text) - { - text.ColoredWriteLine(ConsoleColor.Green); - } - - /// - /// Writes red text to the console. - /// - /// The text. - [DebuggerStepThrough] - public static void ConsoleRed(this string text) - { - text.ColoredWriteLine(ConsoleColor.Red); - } - - /// - /// Writes yellow text to the console. - /// - /// The text. - [DebuggerStepThrough] - public static void ConsoleYellow(this string text) - { - text.ColoredWriteLine(ConsoleColor.Yellow); - } - - /// - /// Writes out text with the specified ConsoleColor. - /// - /// The text. - /// The color. - [DebuggerStepThrough] - public static void ColoredWriteLine(this string text, ConsoleColor color) - { - Console.ForegroundColor = color; - Console.WriteLine(text); - Console.ResetColor(); - } - } -} diff --git a/src/AasxOpenidClient/Constants.cs b/src/AasxOpenidClient/Constants.cs deleted file mode 100644 index 677110848..000000000 --- a/src/AasxOpenidClient/Constants.cs +++ /dev/null @@ -1,19 +0,0 @@ -/* -Copyright (c) 2020 see https://github.com/IdentityServer/IdentityServer4 - -We adapted the code marginally and removed the parts that we do not use. -*/ - -// ReSharper disable All .. as this is code from others (adapted from IdentityServer4). - -namespace AasxOpenIdClient -{ - public class Constants - { - public const string Authority = "https://localhost:5001"; - public const string AuthorityMtls = "https://identityserver.local"; - - public const string SampleApi = "https://localhost:5005/"; - public const string SampleApiMtls = "https://api.identityserver.local/"; - } -} diff --git a/src/AasxOpenidClient/LICENSE.txt b/src/AasxOpenidClient/LICENSE.txt deleted file mode 100644 index 01f9cb5eb..000000000 --- a/src/AasxOpenidClient/LICENSE.txt +++ /dev/null @@ -1,1475 +0,0 @@ -Copyright (c) 2018-2023 Festo SE & Co. KG -, -author: Michael Hoffmeister - -Copyright (c) 2019-2021 PHOENIX CONTACT GmbH & Co. KG -, -author: Andreas Orzelski - -Copyright (c) 2019-2020 Fraunhofer IOSB-INA Lemgo, - eine rechtlich nicht selbstaendige Einrichtung der Fraunhofer-Gesellschaft - zur Foerderung der angewandten Forschung e.V. - -Copyright (c) 2020 Schneider Electric Automation GmbH -, -author: Marco Mendes - -Copyright (c) 2020 SICK AG - -Copyright (c) 2021 KEB Automation KG - -Copyright (c) 2021 Lenze SE -author: Jonas Grote, Denis Göllner, Sebastian Bischof - -The AASX Package Explorer is licensed under the Apache License 2.0 -(Apache-2.0, see below). - -The AASX Package Explorer is a sample application for demonstration of the -features of the Asset Administration Shell. -The implementation uses the concepts of the document "Details of the Asset -Administration Shell" published on www.plattform-i40.de which is licensed -under Creative Commons CC BY-ND 3.0 DE. - -When using eCl@ss or IEC CDD data, please check the corresponding license -conditions. - -------------------------------------------------------------------------------- - -The components below are used in AASX Package Explorer. -The related licenses are listed for information purposes only. -Some licenses may only apply to their related plugins. - -The browser functionality is licensed under the cefSharp license (see below). - -The Newtonsoft.JSON serialization is licensed under the MIT License -(MIT, see below). - -The QR code generation is licensed under the MIT license (MIT, see below). - -The Zxing.Net Dot Matrix Code (DMC) generation is licensed under -the Apache License 2.0 (Apache-2.0, see below). - -The Grapevine REST server framework is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The AutomationML.Engine is licensed under the MIT license (MIT, see below). - -The MQTT server and client is licensed under the MIT license (MIT, see below). - -The ClosedXML Excel reader/writer is licensed under the MIT license (MIT, -see below). - -The CountryFlag WPF control is licensed under the Code Project Open License -(CPOL, see below). - -The DocumentFormat.OpenXml SDK is licensed under the MIT license (MIT, -see below). - -The ExcelNumberFormat number parser is licensed under the MIT license (MIT, -see below). - -The FastMember reflection access is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The IdentityModel OpenID client is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The jose-jwt object signing and encryption is licensed under the -MIT license (MIT, see below). - -The ExcelDataReader is licensed under the MIT license (MIT, see below). - -Portions copyright (c) by OPC Foundation, Inc. and licensed under the -Reciprocal Community License (RCL, see below) - -The OPC UA Example Code of OPC UA Standard is licensed under the MIT license -(MIT, see below). - -The MSAGL (Microsoft Automatic Graph Layout) is licensed under the MIT license -(MIT, see below) - -Glob (https://www.nuget.org/packages/Glob/) is licensed under the MIT license -(MIT, see below). - -The Magick.NET library is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The SSharp.NET library (https://github.com/PetroProtsyk/SSharp) is licensed -under Apache License 2.0 (Apache-2.0, see below). - -------------------------------------------------------------------------------- - - -With respect to AASX Package Explorer -===================================== - -(http://www.apache.org/licenses/LICENSE-2.0) - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - -With respect to cefSharp -======================== - -(https://raw.githubusercontent.com/cefsharp/CefSharp/master/LICENSE) - -Copyright © The CefSharp Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - - * Neither the name of Google Inc. nor the name Chromium Embedded - Framework nor the name CefSharp nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -With respect to Newtonsoft.Json -=============================== - -(https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md) - -The MIT License (MIT) - -Copyright (c) 2007 James Newton-King - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -With respect to QRcoder -======================= - -(https://github.com/codebude/QRCoder/blob/master/LICENSE.txt) - -The MIT License (MIT) - -Copyright (c) 2013-2018 Raffael Herrmann - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -With respect to ZXing.Net -========================= -With respect to Grapevine -========================= -With respect to FastMember -========================== -With respect to IdentityModel -============================= - -(http://www.apache.org/licenses/LICENSE-2.0) - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - -With respect to AutomationML.Engine -=================================== - -(https://raw.githubusercontent.com/AutomationML/AMLEngine2.1/master/license.txt) - -The MIT License (MIT) - -Copyright 2017 AutomationML e.V. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - - -With respect to MQTTnet -======================= - -(https://github.com/chkr1011/MQTTnet/blob/master/LICENSE) - -MIT License - -MQTTnet Copyright (c) 2016-2019 Christian Kratky - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With resepct to ClosedXML -========================= - -(https://github.com/ClosedXML/ClosedXML/blob/develop/LICENSE) - -MIT License - -Copyright (c) 2016 ClosedXML - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With resepct to CountryFlag -=========================== - -(https://www.codeproject.com/Articles/190722/WPF-CountryFlag-Control) - -The Code Project Open License (CPOL) 1.02 - -Copyright © 2017 Meshack Musundi - -Preamble - -This License governs Your use of the Work. This License is intended to allow -developers to use the Source Code and Executable Files provided as part of -the Work in any application in any form. - -The main points subject to the terms of the License are: - - Source Code and Executable Files can be used in commercial applications; - Source Code and Executable Files can be redistributed; and - Source Code can be modified to create derivative works. - No claim of suitability, guarantee, or any warranty whatsoever is provided. - The software is provided "as-is". - The Article(s) accompanying the Work may not be distributed or republished - without the Author's consent - -This License is entered between You, the individual or other entity reading or -otherwise making use of the Work licensed pursuant to this License and the -individual or other entity which offers the Work under the terms of this -License ("Author"). - -License - -THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS -CODE PROJECT OPEN LICENSE ("LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT -AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED -UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. - -BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HEREIN, YOU ACCEPT AND AGREE -TO BE BOUND BY THE TERMS OF THIS LICENSE. THE AUTHOR GRANTS YOU THE RIGHTS -CONTAINED HEREIN IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND -CONDITIONS. IF YOU DO NOT AGREE TO ACCEPT AND BE BOUND BY THE TERMS OF THIS -LICENSE, YOU CANNOT MAKE ANY USE OF THE WORK. - -Definitions. - "Articles" means, collectively, all articles written by Author which -describes how the Source Code and Executable Files for the Work may -be used by a user. - "Author" means the individual or entity that offers the Work under -the terms of this License. - "Derivative Work" means a work based upon the Work or upon the Work -and other pre-existing works. - "Executable Files" refer to the executables, binary files, -configuration and any required data files included in the Work. - "Publisher" means the provider of the website, magazine, CD-ROM, -DVD or other medium from or by which the Work is obtained by You. - "Source Code" refers to the collection of source code and -configuration files used to create the Executable Files. - "Standard Version" refers to such a Work if it has not been modified, -or has been modified in accordance with the consent of the Author, -such consent being in the full discretion of the Author. - "Work" refers to the collection of files distributed by the Publisher, -including the Source Code, Executable Files, binaries, data files, -documentation, whitepapers and the Articles. - "You" is you, an individual or entity wishing to use the Work and -exercise your rights under this License. - -Fair Use/Fair Use Rights. Nothing in this License is intended to reduce, -limit, or restrict any rights arising from fair use, fair dealing, -first sale or other limitations on the exclusive rights of the -copyright owner under copyright law or other applicable laws. - -License Grant. Subject to the terms and conditions of this License, the -Author hereby grants You a worldwide, royalty-free, non-exclusive, -perpetual (for the duration of the applicable copyright) license -to exercise the rights in the Work as stated below: - You may use the standard version of the Source Code or Executable -Files in Your own applications. - You may apply bug fixes, portability fixes and other modifications -obtained from the Public Domain or from the Author. A Work modified -in such a way shall still be considered the standard version and will -be subject to this License. - You may otherwise modify Your copy of this Work (excluding the Articles) -in any way to create a Derivative Work, provided that You insert a prominent -notice in each changed file stating how, when and where You changed that file. - You may distribute the standard version of the Executable Files and Source -Code or Derivative Work in aggregate with other (possibly commercial) -programs as part of a larger (possibly commercial) software distribution. - The Articles discussing the Work published in any form by the author may -not be distributed or republished without the Author's consent. The author -retains copyright to any such Articles. You may use the Executable Files and -Source Code pursuant to this License but you may not repost or republish or -otherwise distribute or make available the Articles, without the prior written -consent of the Author. - -Any subroutines or modules supplied by You and linked into the Source Code -or Executable Files of this Work shall not be considered part of this Work -and will not be subject to the terms of this License. - -Patent License. Subject to the terms and conditions of this License, each -Author hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, -royalty-free, irrevocable (except as stated in this section) patent license -to make, have made, use, import, and otherwise transfer the Work. - -Restrictions. The license granted in Section 3 above is expressly made subject -to and limited by the following restrictions: - You agree not to remove any of the original copyright, patent, trademark, -and attribution notices and associated disclaimers that may appear in the -Source Code or Executable Files. - You agree not to advertise or in any way imply that this Work is a product -of Your own. - The name of the Author may not be used to endorse or promote products -derived from the Work without the prior written consent of the Author. - You agree not to sell, lease, or rent any part of the Work. This does -not restrict you from including the Work or any part of the Work inside -a larger software distribution that itself is being sold. The Work by itself, -though, cannot be sold, leased or rented. - You may distribute the Executable Files and Source Code only under the terms -of this License, and You must include a copy of, or the Uniform Resource -Identifier for, this License with every copy of the Executable Files or -Source Code You distribute and ensure that anyone receiving such Executable -Files and Source Code agrees that the terms of this License apply to such -Executable Files and/or Source Code. You may not offer or impose any terms -on the Work that alter or restrict the terms of this License or the -recipients' exercise of the rights granted hereunder. You may not sublicense -the Work. You must keep intact all notices that refer to this License and to -the disclaimer of warranties. You may not distribute the Executable Files or -Source Code with any technological measures that control access or use of the -Work in a manner inconsistent with the terms of this License. - You agree not to use the Work for illegal, immoral or improper -purposes, or on pages containing illegal, immoral or improper material. -The Work is subject to applicable export laws. You agree to comply with all -such laws and regulations that may apply to the Work after Your receipt of -the Work. - -Representations, Warranties and Disclaimer. THIS WORK IS PROVIDED "AS IS", -"WHERE IS" AND "AS AVAILABLE", WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES OR -CONDITIONS OR GUARANTEES. YOU, THE USER, ASSUME ALL RISK IN ITS USE, -INCLUDING COPYRIGHT INFRINGEMENT, PATENT INFRINGEMENT, SUITABILITY, ETC. -AUTHOR EXPRESSLY DISCLAIMS ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES -OR CONDITIONS, INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS -OF MERCHANTABILITY, MERCHANTABLE QUALITY OR FITNESS FOR A PARTICULAR -PURPOSE, OR ANY WARRANTY OF TITLE OR NON-INFRINGEMENT, OR THAT THE WORK -(OR ANY PORTION THEREOF) IS CORRECT, USEFUL, BUG-FREE OR FREE OF VIRUSES. -YOU MUST PASS THIS DISCLAIMER ON WHENEVER YOU DISTRIBUTE THE WORK OR DERIVATIVE -WORKS. - -Indemnity. You agree to defend, indemnify and hold harmless the Author and the -Publisher from and against any claims, suits, losses, damages, liabilities, -costs, and expenses (including reasonable legal or attorneys’ fees) -resulting from or relating to any use of the Work by You. - -Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, -IN NO EVENT WILL THE AUTHOR OR THE PUBLISHER BE LIABLE TO YOU ON ANY LEGAL -THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY -DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK OR OTHERWISE, -EVEN IF THE AUTHOR OR THE PUBLISHER HAS BEEN ADVISED OF THE POSSIBILITY -OF SUCH DAMAGES. - -Termination. - This License and the rights granted hereunder will terminate -automatically upon any breach by You of any term of this License. -Individuals or entities who have received Derivative Works from You under -this License, however, will not have their licenses terminated provided such -individuals or entities remain in full compliance with those licenses. -Sections 1, 2, 6, 7, 8, 9, 10 and 11 will survive any termination of -this License. - If You bring a copyright, trademark, patent or any other infringement -claim against any contributor over infringements You claim are made by the -Work, your License from such contributor to the Work ends automatically. - Subject to the above terms and conditions, this License is perpetual -(for the duration of the applicable copyright in the Work). -Notwithstanding the above, the Author reserves the right to release the Work -under different license terms or to stop distributing the Work at any time; -provided, however that any such election will not serve to withdraw this -License (or any other license that has been, or is required to be, -granted under the terms of this License), and this License will continue -in full force and effect unless terminated as stated above. - -Publisher. The parties hereby confirm that the Publisher shall not, under -any circumstances, be responsible for and shall not have any liability -in respect of the subject matter of this License. The Publisher makes no -warranty whatsoever in connection with the Work and shall not be liable -to You or any party on any legal theory for any damages whatsoever, including -without limitation any general, special, incidental or consequential damages -arising in connection to this license. The Publisher reserves the right to -cease making the Work available to You at any time without notice - -Miscellaneous - This License shall be governed by the laws of the location of the head -office of the Author or if the Author is an individual, the laws of -location of the principal place of residence of the Author. - If any provision of this License is invalid or unenforceable under -applicable law, it shall not affect the validity or enforceability of the -remainder of the terms of this License, and without further action by the -parties to this License, such provision shall be reformed to the minimum -extent necessary to make such provision valid and enforceable. - No term or provision of this License shall be deemed waived and no -breach consented to unless such waiver or consent shall be in writing -and signed by the party to be charged with such waiver or consent. - This License constitutes the entire agreement between the parties -with respect to the Work licensed herein. There are no understandings, -agreements or representations with respect to the Work not specified herein. -The Author shall not be bound by any additional provisions that may appear -in any communication from You. This License may not be modified without -the mutual written agreement of the Author and You. - - -With respect to DocumentFormat.OpenXml -====================================== - -(https://github.com/OfficeDev/Open-XML-SDK/blob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) Microsoft Corporation - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With respect to ExcelNumberFormat -================================= - -(https://github.com/andersnm/ExcelNumberFormat/blob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2017 andersnm - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With respect to jose-jwt -======================== - -(https://github.com/dvsekhvalnov/jose-jwt/blob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2014-2019 dvsekhvalnov - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -With resepect to ExcelDataReader -================================ - -(https://github.com/ExcelDataReader/ExcelDataReader/blob/develop/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2014 ExcelDataReader - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With resepect to OPC UA Example Code -==================================== - - * Copyright (c) 2005-2019 The OPC Foundation, Inc. All rights reserved. - * - * OPC Foundation MIT License 1.00 - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - * The complete license agreement can be found here: - * http://opcfoundation.org/License/MIT/1.00/ - - -With respect to OPC Foundation -============================== - -RCL License -Reciprocal Community License 1.00 (RCL1.00) -Version 1.00, June 24, 2009 -Copyright (C) 2008,2009 OPC Foundation, Inc., All Rights Reserved. - -https://opcfoundation.org/license/rcl.html - -Remark: PHOENIX CONTACT GmbH & Co. KG and Festo SE & Co. KG are members -of OPC foundation. - -With respect to MSAGL (Microsoft Automatic Graph Layout) -======================================================== -(see: https://github.com/microsoft/automatic-graph-layout/blob/master/LICENSE) - -Microsoft Automatic Graph Layout, MSAGL - -Copyright (c) Microsoft Corporation - -All rights reserved. - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -""Software""), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -With respect to Glob (https://www.nuget.org/packages/Glob/) -=========================================================== -(see: https://raw.githubusercontent.com/kthompson/glob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2013-2019 Kevin Thompson - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -With respect to Magick.NET -========================== - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - 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. - -With respect to SSharp.NET library -================================== - - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - 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. diff --git a/src/AasxOpenidClient/OpenIDCLient.cs b/src/AasxOpenidClient/OpenIDCLient.cs deleted file mode 100644 index 94e24bea4..000000000 --- a/src/AasxOpenidClient/OpenIDCLient.cs +++ /dev/null @@ -1,522 +0,0 @@ -using IdentityModel; -using IdentityModel.Client; -using Jose; -using Microsoft.IdentityModel.Tokens; -using Newtonsoft.Json.Linq; -using SSIExtension; -using System; -using System.Collections.Generic; -using System.IdentityModel.Tokens.Jwt; -using System.IO; -using System.Net; -using System.Net.Http; -using System.Security.Claims; -using System.Security.Cryptography.X509Certificates; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Forms; - -/* -Copyright (c) 2020 see https://github.com/IdentityServer/IdentityServer4 - -We adapted the code marginally and removed the parts that we do not use. -*/ - -// ReSharper disable All .. as this is code from others (adapted from IdentityServer4). - -namespace AasxOpenIdClient -{ - public class OpenIDClient - { - static public bool AcceptAllCertifications( - object sender, System.Security.Cryptography.X509Certificates.X509Certificate certification, - System.Security.Cryptography.X509Certificates.X509Chain chain, - System.Net.Security.SslPolicyErrors sslPolicyErrors) - { - return true; - } - - public class UiLambdaSet - { - public delegate DialogResult ShowMessageDelegate( - string content, string text, string caption, MessageBoxButtons buttons = 0); - public ShowMessageDelegate MesssageBox; - - public static DialogResult MesssageBoxShow( - UiLambdaSet lambdaSet, - string content, string text, string caption, MessageBoxButtons buttons = 0) - { - if (lambdaSet?.MesssageBox != null) - return lambdaSet.MesssageBox(content, text, caption, buttons); - return System.Windows.Forms.MessageBox.Show(content + text, caption, buttons); - } - } - - public static string authServer = "https://localhost:50001"; - public static string dataServer = "http://localhost:51310"; - public static string certPfx = "Andreas_Orzelski_Chain.pfx"; - public static string certPfxPW = "i40"; - public static string outputDir = "."; - - public static bool auth = false; - public static string ssiURL = ""; - public static string keycloak = ""; - public static string email = ""; - public static string token = ""; - public static async Task Run(string tag, string value, UiLambdaSet uiLambda = null) - { - ServicePointManager.ServerCertificateValidationCallback = - new System.Net.Security.RemoteCertificateValidationCallback(AcceptAllCertifications); - - // Initializes the variables to pass to the MessageBox.Show method. - string caption = "Connect with " + tag + ".dat"; - string message = ""; - - bool withOpenidFile = false; - if (value != "") - { - dataServer = value; - authServer = ""; - certPfx = ""; - certPfxPW = ""; - value = ""; - } - else - { - // read openx.dat - try - { - using (StreamReader sr = new StreamReader(tag + ".dat")) - { - authServer = sr.ReadLine(); - dataServer = sr.ReadLine(); - certPfx = sr.ReadLine(); - certPfxPW = sr.ReadLine(); - outputDir = sr.ReadLine(); - } - } - catch (Exception ex) - { - AdminShellNS.LogInternally.That.Error(ex, $"The file {tag}.dat can not be read."); - return; - } - withOpenidFile = true; - } - - message = - "authServer: " + authServer + "\n" + - "dataServer: " + dataServer + "\n" + - "certPfx: " + certPfx + "\n" + - "certPfxPW: " + certPfxPW + "\n" + - "outputDir: " + outputDir + "\n" + - "\nConinue?"; - - // Displays the MessageBox. - var result = UiLambdaSet.MesssageBoxShow( - uiLambda, message, "", caption, MessageBoxButtons.YesNo); - if (result != System.Windows.Forms.DialogResult.Yes) - { - // Closes the parent form. - return; - } - - UiLambdaSet.MesssageBoxShow(uiLambda, "", "Access Aasx Server at " + dataServer, - "Data Server", MessageBoxButtons.OK); - - var handler = new HttpClientHandler(); - handler.DefaultProxyCredentials = CredentialCache.DefaultCredentials; - handler.AllowAutoRedirect = false; - var client = new HttpClient(handler) - { - BaseAddress = new Uri(dataServer) - }; - if (token != "") - client.SetBearerToken(token); - - string operation = ""; - string lastOperation = ""; - if (withOpenidFile) - { - operation = "authenticate"; - lastOperation = "/server/listaas/"; - } - else - { - operation = "/server/listaas/"; - } - - while (operation != "") - { - UiLambdaSet.MesssageBoxShow(uiLambda, "", "operation: " + operation + value + "\ntoken: " + token, - "Operation", MessageBoxButtons.OK); - - switch (operation) - { - case "/server/listaas/": - case "/server/getaasx2/": - try - { - HttpResponseMessage response2 = null; - switch (operation) - { - case "/server/listaas/": - response2 = await client.GetAsync(operation); - break; - case "/server/getaasx2/": - response2 = await client.GetAsync(operation + value); - break; - } - - if (response2.StatusCode == System.Net.HttpStatusCode.TemporaryRedirect) - { - string redirectUrl = response2.Headers.Location.ToString(); - string[] splitResult = redirectUrl.Split(new string[] { "?" }, - StringSplitOptions.RemoveEmptyEntries); - Console.WriteLine("Redirect to:" + splitResult[0]); - authServer = splitResult[0]; - UiLambdaSet.MesssageBoxShow( - uiLambda, authServer, "", "Redirect to", MessageBoxButtons.OK); - lastOperation = operation; - operation = "authenticate"; - continue; - } - if (!response2.IsSuccessStatusCode) - { - lastOperation = operation; - operation = "error"; - continue; - } - String urlContents = await response2.Content.ReadAsStringAsync(); - switch (operation) - { - case "/server/listaas/": - UiLambdaSet.MesssageBoxShow(uiLambda, - "", "SelectFromListFlyoutItem missing", "SelectFromListFlyoutItem missing", - MessageBoxButtons.OK); - value = "0"; - operation = "/server/getaasx2/"; - break; - //// return; - case "/server/getaasx2/": - try - { - var parsed3 = JObject.Parse(urlContents); - - string fileName = parsed3.SelectToken("fileName").Value(); - string fileData = parsed3.SelectToken("fileData").Value(); - - var enc = new System.Text.ASCIIEncoding(); - var fileString4 = Jose.JWT.Decode(fileData, enc.GetBytes(secretString), - JwsAlgorithm.HS256); - var parsed4 = JObject.Parse(fileString4); - - string binaryBase64_4 = parsed4.SelectToken("file").Value(); - Byte[] fileBytes4 = Convert.FromBase64String(binaryBase64_4); - - Console.WriteLine("Writing file: " + outputDir + "\\" + "download.aasx"); - File.WriteAllBytes(outputDir + "\\" + "download.aasx", fileBytes4); - } - catch (Exception ex) - { - AdminShellNS.LogInternally.That.Error(ex, $"Failed at operation: {operation}"); - lastOperation = operation; - operation = "error"; - } - operation = ""; - break; - } - } - catch (Exception ex) - { - AdminShellNS.LogInternally.That.Error(ex, $"Failed at operation: {operation}"); - lastOperation = operation; - operation = "error"; - } - break; - case "authenticate": - try - { - X509SigningCredentials x509Credential = null; - if (withOpenidFile) - { - x509Credential = new X509SigningCredentials(new X509Certificate2(certPfx, certPfxPW)); - } - - var response = await RequestTokenAsync(x509Credential, uiLambda); - token = response.AccessToken; - client.SetBearerToken(token); - - response.Show(); - UiLambdaSet.MesssageBoxShow(uiLambda, response.AccessToken, "", - "Access Token", MessageBoxButtons.OK); - - operation = lastOperation; - lastOperation = ""; - } - catch (Exception ex) - { - AdminShellNS.LogInternally.That.Error(ex, $"Failed at operation: {operation}"); - lastOperation = operation; - operation = "error"; - } - break; - case "error": - UiLambdaSet.MesssageBoxShow(uiLambda, "", $"Can not perform: {lastOperation}", - "Error", MessageBoxButtons.OK); - operation = ""; - break; - } - } - } - - public static async Task RequestTokenAsync( - SigningCredentials credential, - UiLambdaSet uiLambda = null) - { - var handler = new HttpClientHandler(); - handler.DefaultProxyCredentials = CredentialCache.DefaultCredentials; - var client = new HttpClient(handler); - - var disco = await client.GetDiscoveryDocumentAsync(authServer); - if (disco.IsError) throw new Exception(disco.Error); - - UiLambdaSet.MesssageBoxShow(uiLambda, disco.Raw, "", "Discovery JSON", MessageBoxButtons.OK); - - List rootCertSubject = new List(); - dynamic discoObject = null; - if (discoObject.rootCertSubjects != null) - { - int i = 0; - while (i < discoObject.rootCertSubjects.Length) - { - rootCertSubject.Add(discoObject.rootCertSubjects[i++]); - } - } - - var clientToken = CreateClientToken(credential, "client.jwt", - disco.TokenEndpoint, rootCertSubject, uiLambda); - - Console.ForegroundColor = ConsoleColor.Green; - Console.WriteLine("\nClientToken with x5c in header: \n"); - Console.ResetColor(); - Console.WriteLine(clientToken + "\n"); - - UiLambdaSet.MesssageBoxShow(uiLambda, clientToken, "", "Client Token", MessageBoxButtons.OK); - - var response = await client.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest - { - Address = disco.TokenEndpoint, - // Scope = "feature1", - // Scope = "scope1", - Scope = "resource1.scope1", - - ClientAssertion = - { - Type = OidcConstants.ClientAssertionTypes.JwtBearer, - Value = clientToken - } - }); - - if (response.IsError) - { - throw new Exception(response.Error); - } - - return response; - } - - public static string secretString = "Industrie4.0-Asset-Administration-Shell"; - static async Task CallServiceAsync(string token, string value) - { - var handler = new HttpClientHandler(); - handler.DefaultProxyCredentials = CredentialCache.DefaultCredentials; - var client = new HttpClient(handler) - { - BaseAddress = new Uri(dataServer) - }; - - client.SetBearerToken(token); - - try - { - var response = await client.GetStringAsync("/server/getaasx2/" + value); - - var parsed3 = JObject.Parse(response); - - string fileName = parsed3.SelectToken("fileName").Value(); - string fileData = parsed3.SelectToken("fileData").Value(); - - var enc = new System.Text.ASCIIEncoding(); - var fileString4 = Jose.JWT.Decode(fileData, enc.GetBytes(secretString), JwsAlgorithm.HS256); - var parsed4 = JObject.Parse(fileString4); - - string binaryBase64_4 = parsed4.SelectToken("file").Value(); - Byte[] fileBytes4 = Convert.FromBase64String(binaryBase64_4); - - Console.WriteLine("Writing file: " + outputDir + "\\" + "download.aasx"); - File.WriteAllBytes(outputDir + "\\" + "download.aasx", fileBytes4); - } - catch (Exception ex) - { - AdminShellNS.LogInternally.That.Error(ex, $"Can not get .AASX."); - return; - } - } - - private static string CreateClientToken(SigningCredentials credential, string clientId, string audience, - List rootCertSubject, - UiLambdaSet uiLambda = null) - { - // oz - // dead-csharp off - // string x5c = ""; - // dead-csharp on - string[] x5c = null; - string certFileName = certPfx; - string password = certPfxPW; - X509Certificate2 certificate = null; - - if (credential == null) - { - var res = UiLambdaSet.MesssageBoxShow(uiLambda, "", - "Select certificate chain from certificate store? \n" + - "(otherwise use file Andreas_Orzelski_Chain.pfx)", - "Select certificate chain", MessageBoxButtons.YesNo); - - if (res == DialogResult.No) - { - certFileName = "Andreas_Orzelski_Chain.pfx"; - password = "i40"; - credential = new X509SigningCredentials(new X509Certificate2(certFileName, password)); - } - } - - if (credential == null) - { - X509Store store = new X509Store("MY", StoreLocation.CurrentUser); - store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly); - - X509Certificate2Collection collection = (X509Certificate2Collection)store.Certificates; - X509Certificate2Collection fcollection = (X509Certificate2Collection)collection.Find( - X509FindType.FindByTimeValid, DateTime.Now, false); - - Boolean rootCertFound = false; - X509Certificate2Collection fcollection2 = new X509Certificate2Collection(); - foreach (X509Certificate2 fc in fcollection) - { - X509Chain fch = new X509Chain(); - fch.Build(fc); - foreach (X509ChainElement element in fch.ChainElements) - { - if (rootCertSubject.Contains(element.Certificate.Subject)) - { - rootCertFound = true; - fcollection2.Add(fc); - } - } - } - if (rootCertFound) - fcollection = fcollection2; - - X509Certificate2Collection scollection = X509Certificate2UI.SelectFromCollection(fcollection, - "Test Certificate Select", - "Select a certificate from the following list to get information on that certificate", - X509SelectionFlag.SingleSelection); - if (scollection.Count != 0) - { - certificate = scollection[0]; - X509Chain ch = new X509Chain(); - ch.Build(certificate); - - string[] X509Base64 = new string[ch.ChainElements.Count]; - - int j = 0; - foreach (X509ChainElement element in ch.ChainElements) - { - X509Base64[j++] = Convert.ToBase64String(element.Certificate.GetRawCertData()); - } - - x5c = X509Base64; - } - } - else - { - // use old fixed certificate chain - X509Certificate2Collection xc = new X509Certificate2Collection(); - xc.Import(certFileName, password, X509KeyStorageFlags.PersistKeySet); - - string[] X509Base64 = new string[xc.Count]; - - int j = xc.Count; - var xce = xc.GetEnumerator(); - for (int i = 0; i < xc.Count; i++) - { - xce.MoveNext(); - X509Base64[--j] = Convert.ToBase64String(xce.Current.GetRawCertData()); - } - x5c = X509Base64; - - certificate = new X509Certificate2(certFileName, password); - } - - string email = ""; - string subject = certificate.Subject; - var split = subject.Split(new Char[] { ',' }); - if (split[0] != "") - { - var split2 = split[0].Split(new Char[] { '=' }); - if (split2[0] == "E") - { - email = split2[1]; - } - } - Console.WriteLine("email: " + email); - - // - StringBuilder builder = new StringBuilder(); - builder.AppendLine("-----BEGIN CERTIFICATE-----"); - builder.AppendLine( - Convert.ToBase64String(certificate.RawData, Base64FormattingOptions.InsertLineBreaks)); - builder.AppendLine("-----END CERTIFICATE-----"); - - UiLambdaSet.MesssageBoxShow(uiLambda, builder.ToString(), "", "Client Certificate", MessageBoxButtons.OK); - - credential = new X509SigningCredentials(certificate); - // oz end - - var now = DateTime.UtcNow; - - var token = new JwtSecurityToken( - clientId, - audience, - new List() - { - new Claim(JwtClaimTypes.JwtId, Guid.NewGuid().ToString()), - new Claim(JwtClaimTypes.Subject, clientId), - new Claim(JwtClaimTypes.IssuedAt, now.ToEpochTime().ToString(), ClaimValueTypes.Integer64), - // OZ - new Claim(JwtClaimTypes.Email, email) - // new Claim("x5c", x5c) - }, - now, - now.AddMinutes(1), - credential) - ; - - token.Header.Add("x5c", x5c); - if (ssiURL != "") - { - //// Prover prover = new Prover("http://192.168.178.33:5001"); //AASX Package Explorer - Prover prover = new Prover(ssiURL); //AASX Package Explorer - - string invitation = prover.CreateInvitation(); - - token.Header.Add("ssiInvitation", invitation); - } - // oz - - var tokenHandler = new JwtSecurityTokenHandler(); - return tokenHandler.WriteToken(token); - } - } -} diff --git a/src/AasxOpenidClient/OpenIDClientInstance.cs b/src/AasxOpenidClient/OpenIDClientInstance.cs deleted file mode 100644 index 201222e88..000000000 --- a/src/AasxOpenidClient/OpenIDClientInstance.cs +++ /dev/null @@ -1,609 +0,0 @@ -using AnyUi; -using IdentityModel; -using IdentityModel.Client; -using Jose; -using Microsoft.IdentityModel.Tokens; -using Newtonsoft.Json.Linq; -using SSIExtension; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IdentityModel.Tokens.Jwt; -using System.IO; -using System.Net; -using System.Net.Http; -using System.Net.Http.Headers; -using System.Security.Claims; -using System.Security.Cryptography.X509Certificates; -using System.Text; -using System.Text.Json; -using System.Text.Json.Nodes; -using System.Threading.Tasks; - -/* -Copyright (c) 2020 see https://github.com/IdentityServer/IdentityServer4 - -We adapted the code marginally and removed the parts that we do not use. -*/ - -// ReSharper disable All .. as this is code from others (adapted from IdentityServer4). - -namespace AasxOpenIdClient -{ - /// - /// This class is the new version of the OpenIdClient, which is meant to hold the - /// credentials not globally, but for a specific context, such as the main application - /// or a specific repository. - /// - public class OpenIdClientInstance - { - static public bool AcceptAllCertifications( - object sender, System.Security.Cryptography.X509Certificates.X509Certificate certification, - System.Security.Cryptography.X509Certificates.X509Chain chain, - System.Net.Security.SslPolicyErrors sslPolicyErrors) - { - return true; - } - - public class UiLambdaSet - { - public delegate AnyUiMessageBoxResult ShowMessageDelegate( - string content, string text, string caption, AnyUiMessageBoxButton buttons = 0); - public ShowMessageDelegate MesssageBox; - - public static AnyUiMessageBoxResult MesssageBoxShow( - UiLambdaSet lambdaSet, - string content, string text, string caption, AnyUiMessageBoxButton buttons = 0) - { - if (lambdaSet?.MesssageBox != null) - return lambdaSet.MesssageBox(content, text, caption, buttons); - return AnyUiMessageBoxResult.Cancel; - } - } - - public string authServer = "https://localhost:50001"; - public string dataServer = "http://localhost:51310"; - public string certPfx = "Andreas_Orzelski_Chain.pfx"; - public string certPfxPW = "i40"; - public string outputDir = "."; - - public string token = ""; - public string ssiURL = ""; - public string keycloak = ""; - public string email = ""; - public async Task Run(string tag, string value, UiLambdaSet uiLambda = null) - { - ServicePointManager.ServerCertificateValidationCallback = - new System.Net.Security.RemoteCertificateValidationCallback(AcceptAllCertifications); - - // Initializes the variables to pass to the MessageBox.Show method. - string caption = "Connect with " + tag + ".dat"; - string message = ""; - - bool withOpenidFile = false; - if (value != "") - { - dataServer = value; - authServer = ""; - certPfx = ""; - certPfxPW = ""; - value = ""; - } - else - { - // read openx.dat - try - { - using (StreamReader sr = new StreamReader(tag + ".dat")) - { - authServer = sr.ReadLine(); - dataServer = sr.ReadLine(); - certPfx = sr.ReadLine(); - certPfxPW = sr.ReadLine(); - outputDir = sr.ReadLine(); - } - } - catch (Exception ex) - { - AdminShellNS.LogInternally.That.Error(ex, $"The file {tag}.dat can not be read."); - return; - } - withOpenidFile = true; - } - - message = - "authServer: " + authServer + "\n" + - "dataServer: " + dataServer + "\n" + - "certPfx: " + certPfx + "\n" + - "certPfxPW: " + certPfxPW + "\n" + - "outputDir: " + outputDir + "\n" + - "\nConinue?"; - - // Displays the MessageBox. - var result = UiLambdaSet.MesssageBoxShow(uiLambda, message, "", caption, AnyUiMessageBoxButton.YesNo); - if (result != AnyUiMessageBoxResult.Yes) - { - // Closes the parent form. - return; - } - - UiLambdaSet.MesssageBoxShow(uiLambda, "", "Access Aasx Server at " + dataServer, - "Data Server", AnyUiMessageBoxButton.OK); - - var handler = new HttpClientHandler(); - handler.DefaultProxyCredentials = CredentialCache.DefaultCredentials; - handler.AllowAutoRedirect = false; - var client = new HttpClient(handler) - { - BaseAddress = new Uri(dataServer) - }; - if (token != "") - client.SetBearerToken(token); - - string operation = ""; - string lastOperation = ""; - if (withOpenidFile) - { - operation = "authenticate"; - lastOperation = "/server/listaas/"; - } - else - { - operation = "/server/listaas/"; - } - - while (operation != "" && operation != "error") - { - UiLambdaSet.MesssageBoxShow(uiLambda, "", "operation: " + operation + value + "\ntoken: " + token, - "Operation", AnyUiMessageBoxButton.OK); - - switch (operation) - { - case "/server/listaas/": - case "/server/getaasx2/": - try - { - HttpResponseMessage response2 = null; - switch (operation) - { - case "/server/listaas/": - response2 = await client.GetAsync(operation); - break; - case "/server/getaasx2/": - response2 = await client.GetAsync(operation + value); - break; - } - - if (response2.StatusCode == System.Net.HttpStatusCode.TemporaryRedirect) - { - string redirectUrl = response2.Headers.Location.ToString(); - string[] splitResult = redirectUrl.Split(new string[] { "?" }, - StringSplitOptions.RemoveEmptyEntries); - Console.WriteLine("Redirect to:" + splitResult[0]); - authServer = splitResult[0]; - UiLambdaSet.MesssageBoxShow( - uiLambda, authServer, "", "Redirect to", AnyUiMessageBoxButton.OK); - lastOperation = operation; - operation = "authenticate"; - continue; - } - if (!response2.IsSuccessStatusCode) - { - lastOperation = operation; - operation = "error"; - continue; - } - String urlContents = await response2.Content.ReadAsStringAsync(); - switch (operation) - { - case "/server/listaas/": - UiLambdaSet.MesssageBoxShow(uiLambda, - "", "SelectFromListFlyoutItem missing", "SelectFromListFlyoutItem missing", - AnyUiMessageBoxButton.OK); - return; - case "/server/getaasx2/": - try - { - var parsed3 = JObject.Parse(urlContents); - - string fileName = parsed3.SelectToken("fileName").Value(); - string fileData = parsed3.SelectToken("fileData").Value(); - - var enc = new System.Text.ASCIIEncoding(); - var fileString4 = Jose.JWT.Decode(fileData, enc.GetBytes(secretString), - JwsAlgorithm.HS256); - var parsed4 = JObject.Parse(fileString4); - - string binaryBase64_4 = parsed4.SelectToken("file").Value(); - Byte[] fileBytes4 = Convert.FromBase64String(binaryBase64_4); - - Console.WriteLine("Writing file: " + outputDir + "\\" + "download.aasx"); - File.WriteAllBytes(outputDir + "\\" + "download.aasx", fileBytes4); - } - catch (Exception ex) - { - AdminShellNS.LogInternally.That.Error(ex, $"Failed at operation: {operation}"); - lastOperation = operation; - operation = "error"; - } - operation = ""; - break; - } - } - catch (Exception ex) - { - AdminShellNS.LogInternally.That.Error(ex, $"Failed at operation: {operation}"); - lastOperation = operation; - operation = "error"; - } - break; - case "authenticate": - try - { - X509SigningCredentials x509Credential = null; - if (withOpenidFile) - { - x509Credential = new X509SigningCredentials(new X509Certificate2(certPfx, certPfxPW)); - } - - var response = await RequestTokenAsync(x509Credential, uiLambda); - token = response.AccessToken; - client.SetBearerToken(token); - - response.Show(); - UiLambdaSet.MesssageBoxShow(uiLambda, response.AccessToken, "", - "Access Token", AnyUiMessageBoxButton.OK); - - operation = lastOperation; - lastOperation = ""; - } - catch (Exception ex) - { - AdminShellNS.LogInternally.That.Error(ex, $"Failed at operation: {operation}"); - lastOperation = operation; - operation = "error"; - } - break; - case "error": - UiLambdaSet.MesssageBoxShow(uiLambda, "", $"Can not perform: {lastOperation}", - "Error", AnyUiMessageBoxButton.OK); - break; - } - } - } - - public async Task RequestTokenAsync( - SigningCredentials credential, - UiLambdaSet uiLambda = null) - { - var handler = new HttpClientHandler(); - handler.DefaultProxyCredentials = CredentialCache.DefaultCredentials; - var client = new HttpClient(handler); - - if (keycloak != "") - { - TokenResponse tr = null; - bool error = false; - - string BASE_URL = keycloak; - string client_id = "devicegrant"; // create a client in your keycloak instance - string DEVICE_GRANT_ENDPOINT = BASE_URL + "/auth/realms/test/protocol/openid-connect/auth/device"; - string TOKEN_ENDPOINT = BASE_URL + "/auth/realms/test/protocol/openid-connect/token"; - string USERINFO_ENDPOINT = BASE_URL + "/auth/realms/test/protocol/openid-connect/userinfo"; - string verification_uri_complete = ""; - string device_code = ""; - - HttpContent httpContent = new StringContent("client_id=" + client_id); - httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded"); - - var r = await client.PostAsync(DEVICE_GRANT_ENDPOINT, httpContent); - error = !r.IsSuccessStatusCode; - - if (!error) - { - var result = r.Content.ReadAsStringAsync().Result; - - try - { - var parsed = JObject.Parse(result); - - verification_uri_complete = parsed.SelectToken("verification_uri_complete").Value(); - device_code = parsed.SelectToken("device_code").Value(); - - Process.Start(verification_uri_complete); - } - catch (Exception) - { - - error = true; - } - } - if (!error) - { - string parameter = "grant_type=urn:ietf:params:oauth:grant-type:device_code&" + - "client_id=" + client_id + "&" + - "device_code=" + device_code; - string text = "Please login at " + verification_uri_complete + "\n" + parameter; - - UiLambdaSet.MesssageBoxShow(uiLambda, "Press OK to continue", text, - "Keycloak Authentication", AnyUiMessageBoxButton.OK); - - httpContent = new StringContent(parameter, Encoding.UTF8); - httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded"); - - r = await client.PostAsync(TOKEN_ENDPOINT, httpContent); - if (r.IsSuccessStatusCode) - { - var result = r.Content.ReadAsStringAsync().Result; - - try - { - var parsed = JObject.Parse(result); - - token = parsed.SelectToken("access_token").Value(); - UiLambdaSet.MesssageBoxShow(uiLambda, "Press OK to continue", token, - "Access Token", AnyUiMessageBoxButton.OK); - } - catch (Exception) - { - error = true; - } - } - } - if (error) - keycloak = ""; - return tr; - } - - var disco = client.GetDiscoveryDocumentAsync(authServer).Result; - if (disco.IsError) throw new Exception(disco.Error); - - UiLambdaSet.MesssageBoxShow(uiLambda, disco.Raw, "", "Discovery JSON", AnyUiMessageBoxButton.OK); - - List rootCertSubject = new List(); - var discoObject = JsonSerializer.Deserialize(disco.Raw); - var rootCertSubjects = JsonSerializer.Deserialize>(discoObject["rootCertSubjects"]); - if (rootCertSubjects != null) - { - foreach (var subject in rootCertSubjects) - { - rootCertSubject.Add(subject); - } - } - - var clientToken = CreateClientToken(credential, "client.jwt", - disco.TokenEndpoint, rootCertSubject, uiLambda); - - Console.ForegroundColor = ConsoleColor.Green; - Console.WriteLine("\nClientToken with x5c in header: \n"); - Console.ResetColor(); - Console.WriteLine(clientToken + "\n"); - - if (ssiURL == "") - UiLambdaSet.MesssageBoxShow(uiLambda, clientToken, "", "Client Token", AnyUiMessageBoxButton.OK); - - var response = client.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest - { - Address = disco.TokenEndpoint, - Scope = "resource1.scope1", - - ClientAssertion = - { - Type = OidcConstants.ClientAssertionTypes.JwtBearer, - Value = clientToken - } - }).Result; - - if (response.IsError) - { - throw new Exception(response.Error); - } - - UiLambdaSet.MesssageBoxShow(uiLambda, response.AccessToken, "", - "Access Token", AnyUiMessageBoxButton.OK); - - return response; - } - - public string secretString = "Industrie4.0-Asset-Administration-Shell"; - async Task CallServiceAsync(string token, string value) - { - var handler = new HttpClientHandler(); - handler.DefaultProxyCredentials = CredentialCache.DefaultCredentials; - var client = new HttpClient(handler) - { - BaseAddress = new Uri(dataServer) - }; - - client.SetBearerToken(token); - - try - { - var response = await client.GetStringAsync("/server/getaasx2/" + value); - - var parsed3 = JObject.Parse(response); - - string fileName = parsed3.SelectToken("fileName").Value(); - string fileData = parsed3.SelectToken("fileData").Value(); - - var enc = new System.Text.ASCIIEncoding(); - var fileString4 = Jose.JWT.Decode(fileData, enc.GetBytes(secretString), JwsAlgorithm.HS256); - var parsed4 = JObject.Parse(fileString4); - - string binaryBase64_4 = parsed4.SelectToken("file").Value(); - Byte[] fileBytes4 = Convert.FromBase64String(binaryBase64_4); - - Console.WriteLine("Writing file: " + outputDir + "\\" + "download.aasx"); - File.WriteAllBytes(outputDir + "\\" + "download.aasx", fileBytes4); - } - catch (Exception ex) - { - AdminShellNS.LogInternally.That.Error(ex, $"Can not get .AASX."); - return; - } - } - - private string CreateClientToken(SigningCredentials credential, string clientId, string audience, - List rootCertSubject, - UiLambdaSet uiLambda = null) - { - string[] x5c = null; - string certFileName = certPfx; - string password = certPfxPW; - X509Certificate2 certificate = null; - - if (credential == null) - { - AnyUiMessageBoxResult res = AnyUiMessageBoxResult.No; - - if (ssiURL == "") - res = UiLambdaSet.MesssageBoxShow(uiLambda, "", - "Select certificate chain from certificate store? \n" + - "(otherwise use file Andreas_Orzelski_Chain.pfx)", - "Select certificate chain", AnyUiMessageBoxButton.YesNo); - - if (res == AnyUiMessageBoxResult.No) - credential = new X509SigningCredentials(new X509Certificate2(certPfx, certPfxPW)); - } - - if (credential == null) - { - X509Store store = new X509Store("MY", StoreLocation.CurrentUser); - store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly); - - X509Certificate2Collection collection = (X509Certificate2Collection)store.Certificates; - X509Certificate2Collection fcollection = (X509Certificate2Collection)collection.Find( - X509FindType.FindByTimeValid, DateTime.Now, false); - - Boolean rootCertFound = false; - X509Certificate2Collection fcollection2 = new X509Certificate2Collection(); - foreach (X509Certificate2 fc in fcollection) - { - X509Chain fch = new X509Chain(); - fch.Build(fc); - foreach (X509ChainElement element in fch.ChainElements) - { - if (rootCertSubject.Contains(element.Certificate.Subject)) - { - rootCertFound = true; - fcollection2.Add(fc); - } - } - } - if (rootCertFound) - fcollection = fcollection2; - - X509Certificate2Collection scollection = X509Certificate2UI.SelectFromCollection(fcollection, - "Test Certificate Select", - "Select a certificate from the following list to get information on that certificate", - X509SelectionFlag.SingleSelection); - if (scollection.Count != 0) - { - certificate = scollection[0]; - X509Chain ch = new X509Chain(); - ch.Build(certificate); - - string[] X509Base64 = new string[ch.ChainElements.Count]; - - int j = 0; - foreach (X509ChainElement element in ch.ChainElements) - { - X509Base64[j++] = Convert.ToBase64String(element.Certificate.GetRawCertData()); - } - - x5c = X509Base64; - } - } - else - { - // use old fixed certificate chain - X509Certificate2Collection xc = new X509Certificate2Collection(); - xc.Import(certFileName, password, X509KeyStorageFlags.PersistKeySet); - - string[] X509Base64 = new string[xc.Count]; - - int j = xc.Count; - var xce = xc.GetEnumerator(); - for (int i = 0; i < xc.Count; i++) - { - xce.MoveNext(); - X509Base64[--j] = Convert.ToBase64String(xce.Current.GetRawCertData()); - } - x5c = X509Base64; - - certificate = new X509Certificate2(certFileName, password); - } - - string email = ""; - string subject = certificate.Subject; - var split = subject.Split(new Char[] { ',' }); - if (split[0] != "") - { - var split2 = split[0].Split(new Char[] { '=' }); - if (split2[0] == "E") - { - email = split2[1]; - } - } - Console.WriteLine("email: " + email); - - // - StringBuilder builder = new StringBuilder(); - builder.AppendLine("-----BEGIN CERTIFICATE-----"); - builder.AppendLine( - Convert.ToBase64String(certificate.RawData, Base64FormattingOptions.InsertLineBreaks)); - builder.AppendLine("-----END CERTIFICATE-----"); - - if (ssiURL == "") - UiLambdaSet.MesssageBoxShow(uiLambda, builder.ToString(), "", "Client Certificate", - AnyUiMessageBoxButton.OK); - - credential = new X509SigningCredentials(certificate); - // oz end - - var now = DateTime.UtcNow; - - var token = new JwtSecurityToken( - clientId, - audience, - new List() - { - new Claim(JwtClaimTypes.JwtId, Guid.NewGuid().ToString()), - new Claim(JwtClaimTypes.Subject, clientId), - new Claim(JwtClaimTypes.IssuedAt, now.ToEpochTime().ToString(), ClaimValueTypes.Integer64), - // OZ - new Claim(JwtClaimTypes.Email, email) - // new Claim("x5c", x5c) - }, - now, - now.AddMinutes(1), - credential) - ; - - token.Header.Add("x5c", x5c); - if (ssiURL != "") - { - //// Prover prover = new Prover("http://192.168.178.33:5001"); //AASX Package Explorer - Prover prover = new Prover(ssiURL); //AASX Package Explorer - - string invitation = prover.CreateInvitation(); - - token.Header.Add("ssiInvitation", invitation); - - UiLambdaSet.MesssageBoxShow(uiLambda, "ssiURL = " + ssiURL, "", "SSI Info", - AnyUiMessageBoxButton.OK); - UiLambdaSet.MesssageBoxShow(uiLambda, - "credentialInfo = " + prover.cred_json_asstring, "", "VC for Presentation", - AnyUiMessageBoxButton.OK); - } - - var tokenHandler = new JwtSecurityTokenHandler(); - return tokenHandler.WriteToken(token); - } - - private void Prover_CredentialPresented(object sender, string e) - { - throw new NotImplementedException(); - } - } -} diff --git a/src/AasxOpenidClient/Properties/AssemblyInfo.cs b/src/AasxOpenidClient/Properties/AssemblyInfo.cs deleted file mode 100644 index 2ac45539d..000000000 --- a/src/AasxOpenidClient/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// Allgemeine Informationen über eine Assembly werden über die folgenden -// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, -// die einer Assembly zugeordnet sind. -[assembly: AssemblyTitle("AasxOpenidClient")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("AasxOpenidClient")] -[assembly: AssemblyCopyright("Copyright © 2020")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly -// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von -// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen. -[assembly: ComVisible(false)] - -// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird -[assembly: Guid("7788ac2b-7f97-4755-b343-c4196fa90198")] - -// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: -// -// Hauptversion -// Nebenversion -// Buildnummer -// Revision -// -// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, -// indem Sie "*" wie unten gezeigt eingeben: -//// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/AasxOpenidClient/TokenResponseExtensions.cs b/src/AasxOpenidClient/TokenResponseExtensions.cs deleted file mode 100644 index 39bdbfe0e..000000000 --- a/src/AasxOpenidClient/TokenResponseExtensions.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; -using System.Text; -using IdentityModel; -using IdentityModel.Client; -using Newtonsoft.Json.Linq; - -/* -Copyright (c) 2020 see https://github.com/IdentityServer/IdentityServer4 - -We adapted the code marginally and removed the parts that we do not use. -*/ - -namespace AasxOpenIdClient -{ - public static class TokenResponseExtensions - { - public static void Show(this TokenResponse response) - { - if (!response.IsError) - { - "Token response:".ConsoleGreen(); - Console.WriteLine(response.Json); - - if (response.AccessToken.Contains(".")) - { - "\nAccess Token (decoded):".ConsoleGreen(); - - var parts = response.AccessToken.Split('.'); - var header = parts[0]; - var claims = parts[1]; - - Console.WriteLine(JObject.Parse(Encoding.UTF8.GetString(Base64Url.Decode(header)))); - Console.WriteLine(JObject.Parse(Encoding.UTF8.GetString(Base64Url.Decode(claims)))); - } - } - else - { - if (response.ErrorType == ResponseErrorType.Http) - { - "HTTP error: ".ConsoleGreen(); - Console.WriteLine(response.Error); - "HTTP status code: ".ConsoleGreen(); - Console.WriteLine(response.HttpStatusCode); - } - else - { - "Protocol error response:".ConsoleGreen(); - Console.WriteLine(response.Raw); - } - } - } - } -} diff --git a/src/AasxOpenidClient/openid1.dat b/src/AasxOpenidClient/openid1.dat deleted file mode 100644 index b055b5129..000000000 --- a/src/AasxOpenidClient/openid1.dat +++ /dev/null @@ -1,5 +0,0 @@ - -http://localhost:51310 -Andreas_Orzelski_Chain.pfx -i40 -. diff --git a/src/AasxOpenidClient/openid2.dat b/src/AasxOpenidClient/openid2.dat deleted file mode 100644 index d1ec44fd7..000000000 --- a/src/AasxOpenidClient/openid2.dat +++ /dev/null @@ -1,5 +0,0 @@ -https://h2841345.stratoserver.net:50001 -https://h2841345.stratoserver.net:51311 -Andreas_Orzelski_Chain.pfx -i40 -. diff --git a/src/AasxOpenidClient/openid3.dat b/src/AasxOpenidClient/openid3.dat deleted file mode 100644 index 6be0f0613..000000000 --- a/src/AasxOpenidClient/openid3.dat +++ /dev/null @@ -1,5 +0,0 @@ -https://admin-shell-io.com:50001 -https://admin-shell-io.com:51311 -Andreas_Orzelski_Chain.pfx -i40 -. From 638eec8d1211efa3faf14f0a0f07c85dbd5a61b1 Mon Sep 17 00:00:00 2001 From: martaf Date: Fri, 19 Apr 2024 13:48:22 +0200 Subject: [PATCH 13/16] Revert "Dependency removed from unloaded projects so compiler doesn't get confused" This reverts commit 9736ed2a493b2ddefaba7737a1ea1935ad19c685. --- .../AasxDictionaryImport.Tests.csproj | 1 + .../AasxPackageExplorer.GuiTests.csproj | 1 + .../AasxPackageExplorer.Tests.csproj | 1 + src/AasxPackageExplorer.sln | 69 +++++++++++++++++++ .../AasxToolkit.Tests.csproj | 1 + 5 files changed, 73 insertions(+) diff --git a/src/AasxDictionaryImport.Tests/AasxDictionaryImport.Tests.csproj b/src/AasxDictionaryImport.Tests/AasxDictionaryImport.Tests.csproj index c34438d6c..2e1a8a594 100644 --- a/src/AasxDictionaryImport.Tests/AasxDictionaryImport.Tests.csproj +++ b/src/AasxDictionaryImport.Tests/AasxDictionaryImport.Tests.csproj @@ -14,6 +14,7 @@ UseAasxCompatibilityModels + diff --git a/src/AasxPackageExplorer.GuiTests/AasxPackageExplorer.GuiTests.csproj b/src/AasxPackageExplorer.GuiTests/AasxPackageExplorer.GuiTests.csproj index ea4c001c4..4ca0422df 100644 --- a/src/AasxPackageExplorer.GuiTests/AasxPackageExplorer.GuiTests.csproj +++ b/src/AasxPackageExplorer.GuiTests/AasxPackageExplorer.GuiTests.csproj @@ -10,6 +10,7 @@ false + diff --git a/src/AasxPackageExplorer.Tests/AasxPackageExplorer.Tests.csproj b/src/AasxPackageExplorer.Tests/AasxPackageExplorer.Tests.csproj index 80cd92b0f..07e166690 100644 --- a/src/AasxPackageExplorer.Tests/AasxPackageExplorer.Tests.csproj +++ b/src/AasxPackageExplorer.Tests/AasxPackageExplorer.Tests.csproj @@ -12,6 +12,7 @@ + diff --git a/src/AasxPackageExplorer.sln b/src/AasxPackageExplorer.sln index 4fe7b9913..38a484804 100644 --- a/src/AasxPackageExplorer.sln +++ b/src/AasxPackageExplorer.sln @@ -56,6 +56,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxSignature", "AasxSignat EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxOpenidClient", "AasxOpenidClient\AasxOpenidClient.csproj", "{7788AC2B-7F97-4755-B343-C4196FA90198}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxCsharpLibrary.Tests", "AasxCsharpLibrary.Tests\AasxCsharpLibrary.Tests.csproj", "{2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}" +EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "BaseCode", "BaseCode", "{DDA9C372-F8ED-4099-A53C-01B9333FD985}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxDictionaryImport.Tests", "AasxDictionaryImport.Tests\AasxDictionaryImport.Tests.csproj", "{B540EBF4-C026-45A4-9721-909AF0CC14C1}" @@ -128,6 +130,10 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Setup", "Setup", "{5BA4D327-1907-4F5A-BC90-5EA939497BFC}" EndProject Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "AasxPackageExplorerSetup", "AASXPackageExplorerSetup\AasxPackageExplorerSetup.wixproj", "{8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}" + ProjectSection(ProjectDependencies) = postProject + {AB60370B-DC87-414D-8A6C-7B095F940A1B} = {AB60370B-DC87-414D-8A6C-7B095F940A1B} + {A713E962-38FB-4FD0-9687-30F530E95E91} = {A713E962-38FB-4FD0-9687-30F530E95E91} + EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Projektmappenelemente", "Projektmappenelemente", "{087C80D2-F815-401C-96ED-3BD61A768FF3}" ProjectSection(SolutionItems) = preProject @@ -140,6 +146,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AasxSchemaExport.Tests", "A EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazorExplorer", "BlazorExplorer\BlazorExplorer.csproj", "{FF0DEFE4-84F7-4DC0-8C65-5ACE5153DD94}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxCsharpLibrary", "AasxCsharpLibrary\AasxCsharpLibrary.csproj", "{D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}" +EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginDigitalNameplate", "AasxPluginDigitalNameplate\AasxPluginDigitalNameplate.csproj", "{DA75828B-E5AC-4E9D-AE1F-398F8FF5AE25}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginContactInformation", "AasxPluginContactInformation\AasxPluginContactInformation.csproj", "{938BB137-DC45-4A84-B0C9-AC46DA321FDB}" @@ -817,6 +825,35 @@ Global {7788AC2B-7F97-4755-B343-C4196FA90198}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU {7788AC2B-7F97-4755-B343-C4196FA90198}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU {7788AC2B-7F97-4755-B343-C4196FA90198}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Debug|x64.ActiveCfg = Debug|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Debug|x64.Build.0 = Debug|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Debug|x86.ActiveCfg = Debug|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Debug|x86.Build.0 = Debug|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugSlow|x64.Build.0 = Debug|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugSlow|x86.Build.0 = Debug|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Release|Any CPU.Build.0 = Release|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Release|x64.ActiveCfg = Release|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Release|x64.Build.0 = Release|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Release|x86.ActiveCfg = Release|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Release|x86.Build.0 = Release|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Debug|Any CPU.Build.0 = Debug|Any CPU {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -1678,6 +1715,36 @@ Global {FF0DEFE4-84F7-4DC0-8C65-5ACE5153DD94}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU {FF0DEFE4-84F7-4DC0-8C65-5ACE5153DD94}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU {FF0DEFE4-84F7-4DC0-8C65-5ACE5153DD94}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU + {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.Debug|x64.ActiveCfg = Debug|Any CPU + {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.Debug|x64.Build.0 = Debug|Any CPU + {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.Debug|x86.ActiveCfg = Debug|Any CPU + {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.Debug|x86.Build.0 = Debug|Any CPU + {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU + {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU + {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.DebugSlow|x64.ActiveCfg = Debug|Any CPU + {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.DebugSlow|x64.Build.0 = Debug|Any CPU + {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.DebugSlow|x86.ActiveCfg = Debug|Any CPU + {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.DebugSlow|x86.Build.0 = Debug|Any CPU + {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU + {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU + {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU + {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU + {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU + {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU + {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.Release|Any CPU.Build.0 = Release|Any CPU + {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.Release|x64.ActiveCfg = Release|Any CPU + {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.Release|x64.Build.0 = Release|Any CPU + {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.Release|x86.ActiveCfg = Release|Any CPU + {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.Release|x86.Build.0 = Release|Any CPU + {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU + {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU + {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU + {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU + {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU + {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU {DA75828B-E5AC-4E9D-AE1F-398F8FF5AE25}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DA75828B-E5AC-4E9D-AE1F-398F8FF5AE25}.Debug|Any CPU.Build.0 = Debug|Any CPU {DA75828B-E5AC-4E9D-AE1F-398F8FF5AE25}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -1765,6 +1832,7 @@ Global {DEC389BC-59BC-48E5-B163-6E44CE782C4A} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} {69824EF3-30F8-4C8A-874E-9B1F5873D25E} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} {7788AC2B-7F97-4755-B343-C4196FA90198} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} + {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9} = {DDA9C372-F8ED-4099-A53C-01B9333FD985} {B540EBF4-C026-45A4-9721-909AF0CC14C1} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} {F6CF3948-C67A-40FC-812A-3733F673EA21} = {C1752DB5-0157-4666-A25D-2666089457BB} {7A612803-BAE2-4FED-BBCE-56079EDB8594} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} @@ -1793,6 +1861,7 @@ Global {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34} = {5BA4D327-1907-4F5A-BC90-5EA939497BFC} {4EB64F40-1A01-46BB-BEED-D1A75313C7F8} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} {BE68E42C-28CB-4298-9F34-A18AF92FC4DE} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} + {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE} = {DDA9C372-F8ED-4099-A53C-01B9333FD985} {DA75828B-E5AC-4E9D-AE1F-398F8FF5AE25} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} {938BB137-DC45-4A84-B0C9-AC46DA321FDB} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} EndGlobalSection diff --git a/src/AasxToolkit.Tests/AasxToolkit.Tests.csproj b/src/AasxToolkit.Tests/AasxToolkit.Tests.csproj index 67294741f..00bef62f6 100644 --- a/src/AasxToolkit.Tests/AasxToolkit.Tests.csproj +++ b/src/AasxToolkit.Tests/AasxToolkit.Tests.csproj @@ -9,6 +9,7 @@ + From e63f4bfabbbac6b472bb7469042fd367b651163a Mon Sep 17 00:00:00 2001 From: martaf Date: Fri, 19 Apr 2024 13:55:52 +0200 Subject: [PATCH 14/16] Reapply "Dependency removed from unloaded projects so compiler doesn't get confused" This reverts commit 638eec8d1211efa3faf14f0a0f07c85dbd5a61b1. --- .../AasxDictionaryImport.Tests.csproj | 1 - .../AasxPackageExplorer.GuiTests.csproj | 1 - .../AasxPackageExplorer.Tests.csproj | 1 - src/AasxPackageExplorer.sln | 69 ------------------- .../AasxToolkit.Tests.csproj | 1 - 5 files changed, 73 deletions(-) diff --git a/src/AasxDictionaryImport.Tests/AasxDictionaryImport.Tests.csproj b/src/AasxDictionaryImport.Tests/AasxDictionaryImport.Tests.csproj index 2e1a8a594..c34438d6c 100644 --- a/src/AasxDictionaryImport.Tests/AasxDictionaryImport.Tests.csproj +++ b/src/AasxDictionaryImport.Tests/AasxDictionaryImport.Tests.csproj @@ -14,7 +14,6 @@ UseAasxCompatibilityModels - diff --git a/src/AasxPackageExplorer.GuiTests/AasxPackageExplorer.GuiTests.csproj b/src/AasxPackageExplorer.GuiTests/AasxPackageExplorer.GuiTests.csproj index 4ca0422df..ea4c001c4 100644 --- a/src/AasxPackageExplorer.GuiTests/AasxPackageExplorer.GuiTests.csproj +++ b/src/AasxPackageExplorer.GuiTests/AasxPackageExplorer.GuiTests.csproj @@ -10,7 +10,6 @@ false - diff --git a/src/AasxPackageExplorer.Tests/AasxPackageExplorer.Tests.csproj b/src/AasxPackageExplorer.Tests/AasxPackageExplorer.Tests.csproj index 07e166690..80cd92b0f 100644 --- a/src/AasxPackageExplorer.Tests/AasxPackageExplorer.Tests.csproj +++ b/src/AasxPackageExplorer.Tests/AasxPackageExplorer.Tests.csproj @@ -12,7 +12,6 @@ - diff --git a/src/AasxPackageExplorer.sln b/src/AasxPackageExplorer.sln index 38a484804..4fe7b9913 100644 --- a/src/AasxPackageExplorer.sln +++ b/src/AasxPackageExplorer.sln @@ -56,8 +56,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxSignature", "AasxSignat EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxOpenidClient", "AasxOpenidClient\AasxOpenidClient.csproj", "{7788AC2B-7F97-4755-B343-C4196FA90198}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxCsharpLibrary.Tests", "AasxCsharpLibrary.Tests\AasxCsharpLibrary.Tests.csproj", "{2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "BaseCode", "BaseCode", "{DDA9C372-F8ED-4099-A53C-01B9333FD985}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxDictionaryImport.Tests", "AasxDictionaryImport.Tests\AasxDictionaryImport.Tests.csproj", "{B540EBF4-C026-45A4-9721-909AF0CC14C1}" @@ -130,10 +128,6 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Setup", "Setup", "{5BA4D327-1907-4F5A-BC90-5EA939497BFC}" EndProject Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "AasxPackageExplorerSetup", "AASXPackageExplorerSetup\AasxPackageExplorerSetup.wixproj", "{8E42C60A-2576-47C2-B0EE-B40BBDDA0F34}" - ProjectSection(ProjectDependencies) = postProject - {AB60370B-DC87-414D-8A6C-7B095F940A1B} = {AB60370B-DC87-414D-8A6C-7B095F940A1B} - {A713E962-38FB-4FD0-9687-30F530E95E91} = {A713E962-38FB-4FD0-9687-30F530E95E91} - EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Projektmappenelemente", "Projektmappenelemente", "{087C80D2-F815-401C-96ED-3BD61A768FF3}" ProjectSection(SolutionItems) = preProject @@ -146,8 +140,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AasxSchemaExport.Tests", "A EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazorExplorer", "BlazorExplorer\BlazorExplorer.csproj", "{FF0DEFE4-84F7-4DC0-8C65-5ACE5153DD94}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxCsharpLibrary", "AasxCsharpLibrary\AasxCsharpLibrary.csproj", "{D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginDigitalNameplate", "AasxPluginDigitalNameplate\AasxPluginDigitalNameplate.csproj", "{DA75828B-E5AC-4E9D-AE1F-398F8FF5AE25}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AasxPluginContactInformation", "AasxPluginContactInformation\AasxPluginContactInformation.csproj", "{938BB137-DC45-4A84-B0C9-AC46DA321FDB}" @@ -825,35 +817,6 @@ Global {7788AC2B-7F97-4755-B343-C4196FA90198}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU {7788AC2B-7F97-4755-B343-C4196FA90198}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU {7788AC2B-7F97-4755-B343-C4196FA90198}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Debug|x64.ActiveCfg = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Debug|x64.Build.0 = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Debug|x86.ActiveCfg = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Debug|x86.Build.0 = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugSlow|x64.ActiveCfg = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugSlow|x64.Build.0 = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugSlow|x86.ActiveCfg = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugSlow|x86.Build.0 = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Release|Any CPU.Build.0 = Release|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Release|x64.ActiveCfg = Release|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Release|x64.Build.0 = Release|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Release|x86.ActiveCfg = Release|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.Release|x86.Build.0 = Release|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Debug|Any CPU.Build.0 = Debug|Any CPU {B540EBF4-C026-45A4-9721-909AF0CC14C1}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -1715,36 +1678,6 @@ Global {FF0DEFE4-84F7-4DC0-8C65-5ACE5153DD94}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU {FF0DEFE4-84F7-4DC0-8C65-5ACE5153DD94}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU {FF0DEFE4-84F7-4DC0-8C65-5ACE5153DD94}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU - {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.Debug|x64.ActiveCfg = Debug|Any CPU - {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.Debug|x64.Build.0 = Debug|Any CPU - {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.Debug|x86.ActiveCfg = Debug|Any CPU - {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.Debug|x86.Build.0 = Debug|Any CPU - {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.DebugSlow|Any CPU.ActiveCfg = Debug|Any CPU - {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.DebugSlow|Any CPU.Build.0 = Debug|Any CPU - {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.DebugSlow|x64.ActiveCfg = Debug|Any CPU - {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.DebugSlow|x64.Build.0 = Debug|Any CPU - {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.DebugSlow|x86.ActiveCfg = Debug|Any CPU - {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.DebugSlow|x86.Build.0 = Debug|Any CPU - {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.DebugWithoutCEF|Any CPU.ActiveCfg = Debug|Any CPU - {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.DebugWithoutCEF|Any CPU.Build.0 = Debug|Any CPU - {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.DebugWithoutCEF|x64.ActiveCfg = Debug|Any CPU - {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.DebugWithoutCEF|x64.Build.0 = Debug|Any CPU - {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.DebugWithoutCEF|x86.ActiveCfg = Debug|Any CPU - {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.DebugWithoutCEF|x86.Build.0 = Debug|Any CPU - {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.Release|Any CPU.Build.0 = Release|Any CPU - {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.Release|x64.ActiveCfg = Release|Any CPU - {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.Release|x64.Build.0 = Release|Any CPU - {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.Release|x86.ActiveCfg = Release|Any CPU - {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.Release|x86.Build.0 = Release|Any CPU - {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.ReleaseWithoutCEF|Any CPU.ActiveCfg = Release|Any CPU - {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.ReleaseWithoutCEF|Any CPU.Build.0 = Release|Any CPU - {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.ReleaseWithoutCEF|x64.ActiveCfg = Release|Any CPU - {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.ReleaseWithoutCEF|x64.Build.0 = Release|Any CPU - {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.ReleaseWithoutCEF|x86.ActiveCfg = Release|Any CPU - {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE}.ReleaseWithoutCEF|x86.Build.0 = Release|Any CPU {DA75828B-E5AC-4E9D-AE1F-398F8FF5AE25}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DA75828B-E5AC-4E9D-AE1F-398F8FF5AE25}.Debug|Any CPU.Build.0 = Debug|Any CPU {DA75828B-E5AC-4E9D-AE1F-398F8FF5AE25}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -1832,7 +1765,6 @@ Global {DEC389BC-59BC-48E5-B163-6E44CE782C4A} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} {69824EF3-30F8-4C8A-874E-9B1F5873D25E} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} {7788AC2B-7F97-4755-B343-C4196FA90198} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} - {2F21FEFF-F0EF-40B5-BA05-09FC9F499AE9} = {DDA9C372-F8ED-4099-A53C-01B9333FD985} {B540EBF4-C026-45A4-9721-909AF0CC14C1} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} {F6CF3948-C67A-40FC-812A-3733F673EA21} = {C1752DB5-0157-4666-A25D-2666089457BB} {7A612803-BAE2-4FED-BBCE-56079EDB8594} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} @@ -1861,7 +1793,6 @@ Global {8E42C60A-2576-47C2-B0EE-B40BBDDA0F34} = {5BA4D327-1907-4F5A-BC90-5EA939497BFC} {4EB64F40-1A01-46BB-BEED-D1A75313C7F8} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} {BE68E42C-28CB-4298-9F34-A18AF92FC4DE} = {F9AE9D23-200C-455B-B14E-2EF20B13432E} - {D39BC0A4-64EA-4C7B-B72C-BF0A80FF29FE} = {DDA9C372-F8ED-4099-A53C-01B9333FD985} {DA75828B-E5AC-4E9D-AE1F-398F8FF5AE25} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} {938BB137-DC45-4A84-B0C9-AC46DA321FDB} = {66D730EB-B9D7-4C3A-8954-0F86240AD612} EndGlobalSection diff --git a/src/AasxToolkit.Tests/AasxToolkit.Tests.csproj b/src/AasxToolkit.Tests/AasxToolkit.Tests.csproj index 00bef62f6..67294741f 100644 --- a/src/AasxToolkit.Tests/AasxToolkit.Tests.csproj +++ b/src/AasxToolkit.Tests/AasxToolkit.Tests.csproj @@ -9,7 +9,6 @@ - From fc3ad13667aa46828782ab9ad34a2540303df76d Mon Sep 17 00:00:00 2001 From: martaf Date: Fri, 19 Apr 2024 13:56:27 +0200 Subject: [PATCH 15/16] Revert "Remaining source code removed" This reverts commit 51cf89e746c0a742ab150e2c6aa9eeed3a3ecf31. --- .../V10/AdminShellV10.cs | 4653 ++++++ .../AasxCompatibilityModels/V20/AdminShell.cs | 8899 ++++++++++ .../V20/AdminShellConverters.cs | 174 + .../V20/AdminShellUtil.cs | 636 + .../V20/AdminShellValidate.cs | 326 + .../AasxCsharpLibrary.csproj | 42 + .../AdminShellCollections.cs | 66 + src/AasxCsharpLib_bkp/AdminShellConverters.cs | 192 + src/AasxCsharpLib_bkp/AdminShellPackageEnv.cs | 1454 ++ src/AasxCsharpLib_bkp/AdminShellUtil.cs | 705 + src/AasxCsharpLib_bkp/AdminShellValidate.cs | 327 + .../Display/EnumerationPlacmentBase.cs | 13 + .../EnumerationPlacmentOperationVariable.cs | 15 + .../Display/OperationVariableDirection.cs | 15 + .../Exceptions/NullValueException.cs | 16 + .../Extensions/AasElementSelfDescription.cs | 29 + .../Extensions/ComparerUtils.cs | 57 + .../ExtendAnnotatedRelationshipElement.cs | 124 + .../ExtendAssetAdministrationShell.cs | 242 + .../Extensions/ExtendAssetInformation.cs | 62 + .../Extensions/ExtendBlob.cs | 69 + .../Extensions/ExtendConceptDescription.cs | 299 + .../Extensions/ExtendDataElement.cs | 19 + .../ExtendDataSpecificationIEC61360.cs | 40 + .../ExtendEmbeddedDataSpecification.cs | 108 + .../Extensions/ExtendEntity.cs | 108 + .../Extensions/ExtendEnvironment.cs | 1052 ++ .../Extensions/ExtendFile.cs | 68 + .../Extensions/ExtendHasDataSpecification.cs | 26 + .../ExtendIDataSpecificationContent.cs | 68 + .../Extensions/ExtendIIdentifiable.cs | 28 + .../Extensions/ExtendIReferable.cs | 600 + .../Extensions/ExtendISubmodelElement.cs | 1513 ++ src/AasxCsharpLib_bkp/Extensions/ExtendKey.cs | 229 + .../Extensions/ExtendKeyList.cs | 183 + .../Extensions/ExtendKeyTypes.cs | 22 + .../Extensions/ExtendLangString.cs | 35 + .../Extensions/ExtendLangStringSet.cs | 165 + .../Extensions/ExtendModelKind.cs | 33 + .../Extensions/ExtendMultiLanguageProperty.cs | 127 + .../Extensions/ExtendObject.cs | 137 + .../Extensions/ExtendOperation.cs | 148 + .../Extensions/ExtendProperty.cs | 266 + .../Extensions/ExtendQualifier.cs | 192 + .../Extensions/ExtendRange.cs | 71 + .../Extensions/ExtendReference.cs | 263 + .../Extensions/ExtendReferenceElement.cs | 43 + .../Extensions/ExtendRelationshipElement.cs | 43 + .../Extensions/ExtendStream.cs | 22 + .../Extensions/ExtendStringification.cs | 15 + .../Extensions/ExtendSubmodel.cs | 455 + .../ExtendSubmodelElementCollection.cs | 194 + .../Extensions/ExtendSubmodelElementList.cs | 200 + .../Extensions/ExtensionsUtil.cs | 115 + .../Extensions/LocatedReference.cs | 22 + src/AasxCsharpLib_bkp/Extensions/MatchMode.cs | 15 + .../IAasxOnlineConnection.cs | 33 + src/AasxCsharpLib_bkp/LICENSE.txt | 1475 ++ src/AasxCsharpLib_bkp/LogInternally.cs | 84 + .../Properties/AssemblyInfo.cs | 36 + .../Resources/schemaV201/AAS.xsd | 555 + .../Resources/schemaV201/AAS_ABAC.xsd | 171 + .../Resources/schemaV201/IEC61360.xsd | 156 + .../Resources/schemaV201/aas.json | 1148 ++ .../AasxCsharpLibrary.Tests.csproj | 24 + .../DocTestAdminShellUtil.cs | 67 + src/AasxCsharpLibrary.Tests/LICENSE.txt | 1475 ++ .../Properties/AssemblyInfo.cs | 36 + .../TemporaryDirectory.cs | 23 + .../TestAdminShellUtil.cs | 28 + .../TestAgainstAasCorePackage.cs | 85 + .../TestLoadSaveChain.cs | 189 + .../expectedOk/01_Festo.aasx.xml | 8384 ++++++++++ .../expectedOk/02_Bosch.aasx.xml | 6811 ++++++++ .../expectedOk/03_Bosch.aasx.xml | 13753 ++++++++++++++++ .../expectedOk/04_Bosch.aasx.xml | 6691 ++++++++ .../expectedOk/05_Bosch.aasx.xml | 6177 +++++++ .../expectedOk/06_Bosch.aasx.xml | 6640 ++++++++ .../expectedOk/07_PhoenixContact.aasx.xml | 3507 ++++ .../expectedOk/08_SchneiderElectric.aasx.xml | 4570 +++++ .../expectedOk/09_SchneiderElectric.aasx.xml | 4570 +++++ .../expectedOk/10_SchneiderElectric.aasx.xml | 4570 +++++ .../expectedOk/11_SchneiderElectric.aasx.xml | 4570 +++++ .../expectedOk/12_Pepperl+Fuchs.aasx.xml | 3973 +++++ .../XmlValidation/expectedOk/13_DKE.aasx.xml | 4210 +++++ .../expectedOk/14_Siemens.aasx.xml | 6015 +++++++ .../expectedOk/15_Siemens.aasx.xml | 5044 ++++++ .../expectedOk/16_Lenze.aasx.xml | 4017 +++++ .../XmlValidation/expectedOk/17_ABB.aasx.xml | 4777 ++++++ .../18_Hitachi_HX_DigTyp40.aasx.xml | 6872 ++++++++ .../TestValidateXml.cs | 56 + .../V10/AdminShellV10.cs | 4649 ++++++ .../AasxCompatibilityModels/V20/AdminShell.cs | 8895 ++++++++++ .../V20/AdminShellConverters.cs | 170 + .../V20/AdminShellUtil.cs | 633 + .../V20/AdminShellValidate.cs | 320 + .../AasxCsharpLibrary.csproj | 43 + .../AdminShellCollections.cs | 92 + src/AasxCsharpLibrary/AdminShellConverters.cs | 327 + src/AasxCsharpLibrary/AdminShellPackageEnv.cs | 1695 ++ src/AasxCsharpLibrary/AdminShellUtil.cs | 1129 ++ src/AasxCsharpLibrary/AdminShellValidate.cs | 320 + .../Display/EnumerationPlacmentBase.cs | 15 + .../EnumerationPlacmentOperationVariable.cs | 16 + .../Display/OperationVariableDirection.cs | 17 + .../MetamodelVerificationException.cs | 26 + .../Exceptions/NullValueException.cs | 20 + .../Extensions/AasElementSelfDescription.cs | 30 + .../Extensions/ComparerUtils.cs | 69 + .../ExtendAnnotatedRelationshipElement.cs | 132 + .../ExtendAssetAdministrationShell.cs | 271 + .../Extensions/ExtendAssetInformation.cs | 65 + .../Extensions/ExtendBlob.cs | 75 + .../Extensions/ExtendCollection.cs | 17 + .../Extensions/ExtendConceptDescription.cs | 320 + .../Extensions/ExtendDataElement.cs | 20 + .../ExtendDataSpecificationIEC61360.cs | 50 + .../ExtendEmbeddedDataSpecification.cs | 118 + .../Extensions/ExtendEntity.cs | 117 + .../Extensions/ExtendEnvironment.cs | 1092 ++ .../Extensions/ExtendFile.cs | 69 + .../Extensions/ExtendHasDataSpecification.cs | 25 + .../ExtendIAdministrativeInformation.cs | 25 + .../Extensions/ExtendIClass.cs | 41 + .../ExtendIDataSpecificationContent.cs | 77 + .../Extensions/ExtendIIdentifiable.cs | 33 + ...ExtendILangStringDefinitionTypeIec61360.cs | 66 + .../Extensions/ExtendILangStringNameType.cs | 30 + ...endILangStringPreferredNameTypeIec61360.cs | 71 + .../ExtendILangStringShortNameTypeIec61360.cs | 71 + .../Extensions/ExtendILangStringTextType.cs | 35 + .../Extensions/ExtendIReferable.cs | 624 + .../Extensions/ExtendISubmodelElement.cs | 1551 ++ src/AasxCsharpLibrary/Extensions/ExtendKey.cs | 268 + .../Extensions/ExtendKeyList.cs | 194 + .../Extensions/ExtendKeyTypes.cs | 21 + .../Extensions/ExtendLangString.cs | 66 + .../Extensions/ExtendLangStringSet.cs | 199 + .../Extensions/ExtendModelKind.cs | 35 + .../Extensions/ExtendMultiLanguageProperty.cs | 140 + .../Extensions/ExtendObject.cs | 144 + .../Extensions/ExtendOperation.cs | 157 + .../Extensions/ExtendProperty.cs | 269 + .../Extensions/ExtendQualifier.cs | 195 + .../Extensions/ExtendRange.cs | 75 + .../Extensions/ExtendReference.cs | 309 + .../Extensions/ExtendReferenceElement.cs | 45 + .../Extensions/ExtendRelationshipElement.cs | 46 + .../Extensions/ExtendSpecificAssetId.cs | 48 + .../Extensions/ExtendStream.cs | 25 + .../Extensions/ExtendStringification.cs | 20 + .../Extensions/ExtendSubmodel.cs | 470 + .../ExtendSubmodelElementCollection.cs | 193 + .../Extensions/ExtendSubmodelElementList.cs | 206 + .../Extensions/ExtensionsUtil.cs | 120 + .../Extensions/LocatedReference.cs | 23 + src/AasxCsharpLibrary/Extensions/MatchMode.cs | 17 + .../IAasxOnlineConnection.cs | 26 + src/AasxCsharpLibrary/LICENSE.txt | 1475 ++ src/AasxCsharpLibrary/LogInternally.cs | 83 + .../Properties/AssemblyInfo.cs | 35 + .../Resources/schemaV201/AAS.xsd | 555 + .../Resources/schemaV201/AAS_ABAC.xsd | 171 + .../Resources/schemaV201/IEC61360.xsd | 156 + .../Resources/schemaV201/aas.json | 1148 ++ src/AasxOpenidClient/AasxOpenidClient.csproj | 35 + .../Andreas_Orzelski_Chain.pfx | Bin 0 -> 4362 bytes src/AasxOpenidClient/ConsoleExtensions.cs | 59 + src/AasxOpenidClient/Constants.cs | 19 + src/AasxOpenidClient/LICENSE.txt | 1475 ++ src/AasxOpenidClient/OpenIDCLient.cs | 522 + src/AasxOpenidClient/OpenIDClientInstance.cs | 609 + .../Properties/AssemblyInfo.cs | 36 + .../TokenResponseExtensions.cs | 53 + src/AasxOpenidClient/openid1.dat | 5 + src/AasxOpenidClient/openid2.dat | 5 + src/AasxOpenidClient/openid3.dat | 5 + 177 files changed, 169050 insertions(+) create mode 100644 src/AasxCsharpLib_bkp/AasxCompatibilityModels/V10/AdminShellV10.cs create mode 100644 src/AasxCsharpLib_bkp/AasxCompatibilityModels/V20/AdminShell.cs create mode 100644 src/AasxCsharpLib_bkp/AasxCompatibilityModels/V20/AdminShellConverters.cs create mode 100644 src/AasxCsharpLib_bkp/AasxCompatibilityModels/V20/AdminShellUtil.cs create mode 100644 src/AasxCsharpLib_bkp/AasxCompatibilityModels/V20/AdminShellValidate.cs create mode 100644 src/AasxCsharpLib_bkp/AasxCsharpLibrary.csproj create mode 100644 src/AasxCsharpLib_bkp/AdminShellCollections.cs create mode 100644 src/AasxCsharpLib_bkp/AdminShellConverters.cs create mode 100644 src/AasxCsharpLib_bkp/AdminShellPackageEnv.cs create mode 100644 src/AasxCsharpLib_bkp/AdminShellUtil.cs create mode 100644 src/AasxCsharpLib_bkp/AdminShellValidate.cs create mode 100644 src/AasxCsharpLib_bkp/Display/EnumerationPlacmentBase.cs create mode 100644 src/AasxCsharpLib_bkp/Display/EnumerationPlacmentOperationVariable.cs create mode 100644 src/AasxCsharpLib_bkp/Display/OperationVariableDirection.cs create mode 100644 src/AasxCsharpLib_bkp/Exceptions/NullValueException.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/AasElementSelfDescription.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/ComparerUtils.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendAnnotatedRelationshipElement.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendAssetAdministrationShell.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendAssetInformation.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendBlob.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendConceptDescription.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendDataElement.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendDataSpecificationIEC61360.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendEmbeddedDataSpecification.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendEntity.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendEnvironment.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendFile.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendHasDataSpecification.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendIDataSpecificationContent.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendIIdentifiable.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendIReferable.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendISubmodelElement.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendKey.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendKeyList.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendKeyTypes.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendLangString.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendLangStringSet.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendModelKind.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendMultiLanguageProperty.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendObject.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendOperation.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendProperty.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendQualifier.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendRange.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendReference.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendReferenceElement.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendRelationshipElement.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendStream.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendStringification.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendSubmodel.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendSubmodelElementCollection.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendSubmodelElementList.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtensionsUtil.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/LocatedReference.cs create mode 100644 src/AasxCsharpLib_bkp/Extensions/MatchMode.cs create mode 100644 src/AasxCsharpLib_bkp/IAasxOnlineConnection.cs create mode 100644 src/AasxCsharpLib_bkp/LICENSE.txt create mode 100644 src/AasxCsharpLib_bkp/LogInternally.cs create mode 100644 src/AasxCsharpLib_bkp/Properties/AssemblyInfo.cs create mode 100644 src/AasxCsharpLib_bkp/Resources/schemaV201/AAS.xsd create mode 100644 src/AasxCsharpLib_bkp/Resources/schemaV201/AAS_ABAC.xsd create mode 100644 src/AasxCsharpLib_bkp/Resources/schemaV201/IEC61360.xsd create mode 100644 src/AasxCsharpLib_bkp/Resources/schemaV201/aas.json create mode 100644 src/AasxCsharpLibrary.Tests/AasxCsharpLibrary.Tests.csproj create mode 100644 src/AasxCsharpLibrary.Tests/DocTestAdminShellUtil.cs create mode 100644 src/AasxCsharpLibrary.Tests/LICENSE.txt create mode 100644 src/AasxCsharpLibrary.Tests/Properties/AssemblyInfo.cs create mode 100644 src/AasxCsharpLibrary.Tests/TemporaryDirectory.cs create mode 100644 src/AasxCsharpLibrary.Tests/TestAdminShellUtil.cs create mode 100644 src/AasxCsharpLibrary.Tests/TestAgainstAasCorePackage.cs create mode 100644 src/AasxCsharpLibrary.Tests/TestLoadSaveChain.cs create mode 100644 src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/01_Festo.aasx.xml create mode 100644 src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/02_Bosch.aasx.xml create mode 100644 src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/03_Bosch.aasx.xml create mode 100644 src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/04_Bosch.aasx.xml create mode 100644 src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/05_Bosch.aasx.xml create mode 100644 src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/06_Bosch.aasx.xml create mode 100644 src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/07_PhoenixContact.aasx.xml create mode 100644 src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/08_SchneiderElectric.aasx.xml create mode 100644 src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/09_SchneiderElectric.aasx.xml create mode 100644 src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/10_SchneiderElectric.aasx.xml create mode 100644 src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/11_SchneiderElectric.aasx.xml create mode 100644 src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/12_Pepperl+Fuchs.aasx.xml create mode 100644 src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/13_DKE.aasx.xml create mode 100644 src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/14_Siemens.aasx.xml create mode 100644 src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/15_Siemens.aasx.xml create mode 100644 src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/16_Lenze.aasx.xml create mode 100644 src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/17_ABB.aasx.xml create mode 100644 src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/18_Hitachi_HX_DigTyp40.aasx.xml create mode 100644 src/AasxCsharpLibrary.Tests/TestValidateXml.cs create mode 100644 src/AasxCsharpLibrary/AasxCompatibilityModels/V10/AdminShellV10.cs create mode 100644 src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShell.cs create mode 100644 src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellConverters.cs create mode 100644 src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellUtil.cs create mode 100644 src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellValidate.cs create mode 100644 src/AasxCsharpLibrary/AasxCsharpLibrary.csproj create mode 100644 src/AasxCsharpLibrary/AdminShellCollections.cs create mode 100644 src/AasxCsharpLibrary/AdminShellConverters.cs create mode 100644 src/AasxCsharpLibrary/AdminShellPackageEnv.cs create mode 100644 src/AasxCsharpLibrary/AdminShellUtil.cs create mode 100644 src/AasxCsharpLibrary/AdminShellValidate.cs create mode 100644 src/AasxCsharpLibrary/Display/EnumerationPlacmentBase.cs create mode 100644 src/AasxCsharpLibrary/Display/EnumerationPlacmentOperationVariable.cs create mode 100644 src/AasxCsharpLibrary/Display/OperationVariableDirection.cs create mode 100644 src/AasxCsharpLibrary/Exceptions/MetamodelVerificationException.cs create mode 100644 src/AasxCsharpLibrary/Exceptions/NullValueException.cs create mode 100644 src/AasxCsharpLibrary/Extensions/AasElementSelfDescription.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ComparerUtils.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendAnnotatedRelationshipElement.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendAssetAdministrationShell.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendAssetInformation.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendBlob.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendCollection.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendConceptDescription.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendDataElement.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendDataSpecificationIEC61360.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendEmbeddedDataSpecification.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendEntity.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendEnvironment.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendFile.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendHasDataSpecification.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendIAdministrativeInformation.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendIClass.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendIDataSpecificationContent.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendIIdentifiable.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendILangStringDefinitionTypeIec61360.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendILangStringNameType.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendILangStringPreferredNameTypeIec61360.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendILangStringShortNameTypeIec61360.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendILangStringTextType.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendIReferable.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendISubmodelElement.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendKey.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendKeyList.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendKeyTypes.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendLangString.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendLangStringSet.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendModelKind.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendMultiLanguageProperty.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendObject.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendOperation.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendProperty.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendQualifier.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendRange.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendReference.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendReferenceElement.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendRelationshipElement.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendSpecificAssetId.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendStream.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendStringification.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendSubmodel.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendSubmodelElementCollection.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtendSubmodelElementList.cs create mode 100644 src/AasxCsharpLibrary/Extensions/ExtensionsUtil.cs create mode 100644 src/AasxCsharpLibrary/Extensions/LocatedReference.cs create mode 100644 src/AasxCsharpLibrary/Extensions/MatchMode.cs create mode 100644 src/AasxCsharpLibrary/IAasxOnlineConnection.cs create mode 100644 src/AasxCsharpLibrary/LICENSE.txt create mode 100644 src/AasxCsharpLibrary/LogInternally.cs create mode 100644 src/AasxCsharpLibrary/Properties/AssemblyInfo.cs create mode 100644 src/AasxCsharpLibrary/Resources/schemaV201/AAS.xsd create mode 100644 src/AasxCsharpLibrary/Resources/schemaV201/AAS_ABAC.xsd create mode 100644 src/AasxCsharpLibrary/Resources/schemaV201/IEC61360.xsd create mode 100644 src/AasxCsharpLibrary/Resources/schemaV201/aas.json create mode 100644 src/AasxOpenidClient/AasxOpenidClient.csproj create mode 100644 src/AasxOpenidClient/Andreas_Orzelski_Chain.pfx create mode 100644 src/AasxOpenidClient/ConsoleExtensions.cs create mode 100644 src/AasxOpenidClient/Constants.cs create mode 100644 src/AasxOpenidClient/LICENSE.txt create mode 100644 src/AasxOpenidClient/OpenIDCLient.cs create mode 100644 src/AasxOpenidClient/OpenIDClientInstance.cs create mode 100644 src/AasxOpenidClient/Properties/AssemblyInfo.cs create mode 100644 src/AasxOpenidClient/TokenResponseExtensions.cs create mode 100644 src/AasxOpenidClient/openid1.dat create mode 100644 src/AasxOpenidClient/openid2.dat create mode 100644 src/AasxOpenidClient/openid3.dat diff --git a/src/AasxCsharpLib_bkp/AasxCompatibilityModels/V10/AdminShellV10.cs b/src/AasxCsharpLib_bkp/AasxCompatibilityModels/V10/AdminShellV10.cs new file mode 100644 index 000000000..18999575b --- /dev/null +++ b/src/AasxCsharpLib_bkp/AasxCompatibilityModels/V10/AdminShellV10.cs @@ -0,0 +1,4653 @@ +/* +Copyright (c) 2018-2021 Festo AG & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ + +using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.IO; +using System.IO.Packaging; +using System.Runtime; +using System.Text; +using System.Text.RegularExpressions; +using System.Xml; +using System.Xml.Serialization; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +// ReSharper disable All .. as this is legacy code! + +#if !DoNotUseAasxCompatibilityModels + +namespace AasxCompatibilityModels +{ + #region Utils + // + // Utils + // + + public class AdminShellUtilV10 + { + public static string EvalToNonNullString(string fmt, object o, string elseString = "") + { + if (o == null) + return elseString; + return string.Format(fmt, o); + } + + public static string EvalToNonEmptyString(string fmt, string o, string elseString = "") + { + if (o == "") + return elseString; + return string.Format(fmt, o); + } + + public static string FilterFriendlyName(string src) + { + if (src == null) + return null; + return Regex.Replace(src, @"[^a-zA-Z0-9\-_]", "_"); + } + + public static bool HasWhitespace(string src) + { + if (src == null) + throw new ArgumentNullException(nameof(src)); + for (var i = 0; i < src.Length; i++) + foreach (var c in src) + if (char.IsWhiteSpace(c)) + return true; + return false; + } + + public static bool ComplyIdShort(string src) + { + if (src == null) + throw new ArgumentNullException(nameof(src)); + var res = true; + foreach (var c in src) + if (!Char.IsLetterOrDigit(c) && c != '_') + res = false; + if (src.Length > 0 && !Char.IsLetter(src[0])) + res = false; + return res; + } + + public static string ShortLocation(Exception ex) + { + if (ex == null || ex.StackTrace == null) + return ""; + string[] lines = ex.StackTrace.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None); + if (lines.Length < 1) + return ""; + // search for " in " + // as the most actual stacktrace might be a built-in function, this might not work and therefore + // go down in the stack + int currLine = 0; + while (true) + { + // nothing found at all + if (currLine >= lines.Length) + return ""; + // access current line + var p = lines[currLine].IndexOf(" in ", StringComparison.Ordinal); + if (p < 0) + { + // advance to next oldest line + currLine++; + continue; + } + // search last "\" or "/", to get only filename portion and position + p = lines[currLine].LastIndexOfAny(new[] { '\\', '/' }); + if (p < 0) + { + // advance to next oldest line + currLine++; + continue; + } + // return this + return lines[currLine].Substring(p); + } + } + + } + + #endregion + + + #region AdminShell_V1_0 + + /// + /// Version of Details of Administration Shell Part 1 V1.0 published Nov/Dec/Jan 2018/19 + /// + public class AdminShellV10 + { + + public class Identification + { + + // members + + [XmlAttribute] + public string idType = ""; + [XmlText] + public string id = ""; + + // constructors + + public Identification() { } + + public Identification(string idType, string id) + { + this.idType = idType; + this.id = id; + } + + public Identification(Identification src) + { + this.idType = src.idType; + this.id = src.id; + } + + // Creator with validation + + public static Identification CreateNew(string idType, string id) + { + if (idType == null || id == null) + return null; + var found = false; + foreach (var x in Key.IdentifierTypeNames) + found = found || idType.ToLower().Trim() == x.ToLower().Trim(); + if (!found) + return null; + return new Identification(idType, id); + } + + // further + + public bool IsEqual(Identification other) + { + return (this.idType.Trim().ToLower() == other.idType.Trim().ToLower() + && this.id.Trim().ToLower() == other.id.Trim().ToLower()); + } + + public override string ToString() + { + return $"[{this.idType}] {this.id}"; + } + } + + public class Administration + { + + // members + + public string version = ""; + public string revision = ""; + + // constructors + + public Administration() { } + + public Administration(Administration src) + { + this.version = src.version; + this.revision = src.revision; + } + + public Administration(string version, string revision) + { + this.version = version; + this.revision = revision; + } + + public override string ToString() + { + return $"R={this.version}, V={this.revision}"; + } + } + + public class Key + { + [XmlAttribute] + public string type = ""; + [XmlAttribute] + public bool local = false; + + [XmlAttribute] + [JsonIgnore] + public string idType = ""; + [XmlIgnore] + [JsonProperty(PropertyName = "idType")] + public string JsonIdType + { + get { return (idType == "idShort") ? "IdShort" : idType; } + set { if (value == "IdShort") idType = "idShort"; else idType = value; } + } + + [XmlText] + public string value = ""; + + [XmlIgnore] + [JsonProperty(PropertyName = "index")] + public int index = 0; + + public Key() + { + } + + public Key(Key src) + { + this.type = src.type; + this.local = src.local; + this.idType = src.idType; + this.value = src.value; + } + + public Key(string type, bool local, string idType, string value) + { + this.type = type; + this.local = local; + this.idType = idType; + this.value = value; + } + + public static Key CreateNew(string type, bool local, string idType, string value) + { + var k = new Key(); + k.type = type; + k.local = local; + k.idType = idType; + k.value = value; + return (k); + } + + public static Key GetFromRef(Reference r) + { + if (r == null || r.Count != 1) + return null; + return r[0]; + } + + public override string ToString() + { + var local = (this.local) ? "Local" : "not Local"; + return $"[{this.type}, {local}, {this.idType}, {this.value}]"; + } + + public static string KeyListToString(List keys) + { + if (keys == null || keys.Count < 1) + return ""; + // normally, exactly one key + if (keys.Count == 1) + return keys[0].ToString(); + // multiple! + var s = "[ "; + foreach (var k in keys) + { + if (s.Length > 0) + s += ", "; + s += k.ToString(); + } + return s + " ]"; + } + + public static string[] KeyElements = new string[] { + "GlobalReference", + "AccessPermissionRule", + "Asset", + "AssetAdministrationShell", + "ConceptDescription", + "Submodel", + "SubmodelRef", // not completely right, but used by Package Explorer + "Blob", + "ConceptDictionary", + "DataElement", + "File", + "Event", + "Operation", + "OperationVariable", + "Property", + "ReferenceElement", + "RelationshipElement", + "SubmodelElement", + "SubmodelElementCollection", + "View" }; + + public static string[] ReferableElements = new string[] { + "AccessPermissionRule", + "Asset", + "AssetAdministrationShell", + "ConceptDescription", + "Submodel", + "Blob", + "ConceptDictionary", + "DataElement", + "File", + "Event", + "Operation", + "OperationVariable", + "Property", + "ReferenceElement", + "RelationshipElement", + "SubmodelElement", + "SubmodelElementCollection", + "View" + }; + + public static string[] SubmodelElements = new string[] { + "DataElement", + "File", + "Event", + "Operation", + "Property", + "ReferenceElement", + "RelationshipElement", + "SubmodelElementCollection"}; + + public static string[] IdentifiableElements = new string[] { + "Asset", + "AssetAdministrationShell", + "ConceptDescription", + "Submodel" }; + + // use this in list to designate all of the above elements + public static string AllElements = "All"; + + // use this in list to designate the GlobalReference + public static string GlobalReference = "GlobalReference"; + public static string ConceptDescription = "ConceptDescription"; + public static string SubmodelRef = "SubmodelRef"; + public static string Submodel = "Submodel"; + public static string Asset = "Asset"; + public static string AAS = "AssetAdministrationShell"; + + public static string[] IdentifierTypeNames = new string[] { "IdShort", "Custom", "IRDI", "URI" }; + + public enum IdentifierType { IdShort = 0, Custom, IRDI, URI }; + + public static string GetIdentifierTypeName(IdentifierType t) + { + return IdentifierTypeNames[(int)t]; + } + + // some helpers + + public static bool IsInKeyElements(string ke) + { + var res = false; + foreach (var s in KeyElements) + if (s.Trim().ToLower() == ke.Trim().ToLower()) + res = true; + return res; + } + + } + + // the whole class shall not be serialized by having it private + public class KeyList + { + // members + + [XmlIgnore] // anyway, as it is privat + private List key = new List(); + + // getters / setters + + [XmlIgnore] + public List Keys { get { return key; } } + [XmlIgnore] + public bool IsEmpty { get { return key == null || key.Count < 1; } } + [XmlIgnore] + public int Count { get { if (key == null) return 0; return key.Count; } } + [XmlIgnore] + public Key this[int index] { get { return key[index]; } } + + // constructors / creators + + public void Add(Key k) + { + key.Add(k); + } + + public static KeyList CreateNew(Key k) + { + var kl = new KeyList(); + kl.Add(k); + return kl; + } + + public static KeyList CreateNew(string type, bool local, string idType, string value) + { + var kl = new KeyList(); + kl.Add(Key.CreateNew(type, local, idType, value)); + return kl; + } + + // other + + public void NumberIndices() + { + if (this.Keys == null) + return; + for (int i = 0; i < this.Keys.Count; i++) + this.Keys[i].index = i; + } + } + + [XmlType(TypeName = "reference")] + public class Reference + { + + // members + + [XmlIgnore] // anyway, as it is privat + [JsonIgnore] + private KeyList keys = new KeyList(); + + // getters / setters + + [XmlArray("keys")] + [XmlArrayItem("key")] + [JsonIgnore] + public List Keys { get { return keys?.Keys; } } + [XmlIgnore] + [JsonProperty(PropertyName = "keys")] + public List JsonKeys + { + get + { + keys?.NumberIndices(); + return keys.Keys; + } + } + + [XmlIgnore] + [JsonIgnore] + public bool IsEmpty { get { return keys == null || keys.Count < 1; } } + [XmlIgnore] + [JsonIgnore] + public int Count { get { if (keys == null) return 0; return keys.Count; } } + [XmlIgnore] + [JsonIgnore] + public Key this[int index] { get { return keys[index]; } } + + // constructors / creators + + public Reference() + { + } + + public Reference(Key k) + { + if (k != null) + keys.Keys.Add(k); + } + + public Reference(Reference src) + { + if (src != null) + foreach (var k in src.Keys) + keys.Add(new Key(k)); + } + + public Reference(SemanticId src) + { + if (src != null) + foreach (var k in src.Keys) + keys.Add(new Key(k)); + } + + public static Reference CreateNew(Key k) + { + if (k == null) + return null; + var r = new Reference(); + r.keys.Keys.Add(k); + return r; + } + + public static Reference CreateNew(List k) + { + if (k == null) + return null; + var r = new Reference(); + r.keys.Keys.AddRange(k); + return r; + } + + public static Reference CreateNew(string type, bool local, string idType, string value) + { + if (type == null || idType == null || value == null) + return null; + var r = new Reference(); + r.keys.Keys.Add(Key.CreateNew(type, local, idType, value)); + return r; + } + + public static Reference CreateIrdiReference(string irdi) + { + if (irdi == null) + return null; + var r = new Reference(); + r.keys.Keys.Add(new Key(Key.GlobalReference, false, "IRDI", irdi)); + return r; + } + + // further + + public bool IsExactlyOneKey(string type, bool local, string idType, string id) + { + if (keys == null || keys.Keys == null || keys.Count != 1) + return false; + var k = keys.Keys[0]; + return k.type == type && k.local == local && k.idType == idType && k.value == id; + } + + public bool MatchesTo(Identification other) + { + return (this.keys != null && this.keys.Count == 1 + && this.keys[0].idType.Trim().ToLower() == other.idType.Trim().ToLower() + && this.keys[0].value.Trim().ToLower() == other.id.Trim().ToLower()); + } + + public bool MatchesTo(Reference other) + { + if (this.keys == null || other == null || other.keys == null || other.Count != this.Count) + return false; + + var same = true; + for (int i = 0; i < this.Count; i++) + same = same + && this.keys[i].type.Trim().ToLower() == other.keys[i].type.Trim().ToLower() + && this.keys[i].local == other.keys[i].local + && this.keys[i].idType.Trim().ToLower() == other.keys[i].idType.Trim().ToLower() + && this.keys[i].value.Trim().ToLower() == other.keys[i].value.Trim().ToLower(); + + return same; + } + + public override string ToString() + { + var res = ""; + if (keys != null && keys.Keys != null) + foreach (var k in keys.Keys) + res += k.ToString() + ","; + return res.TrimEnd(','); + } + + public string ListOfValues(string delim) + { + string res = ""; + if (this.Keys != null) + foreach (var x in this.Keys) + { + if (x == null) + continue; + if (res != "") res += delim; + res += x.value; + } + return res; + } + + public virtual string GetElementName() + { + return "Reference"; + } + } + + [XmlType(TypeName = "derivedFrom")] + public class AssetAdministrationShellRef : Reference + { + // constructors + + public AssetAdministrationShellRef() : base() { } + + public AssetAdministrationShellRef(Key k) : base(k) { } + + public AssetAdministrationShellRef(Reference src) : base(src) { } + + // further methods + + public override string GetElementName() + { + return "AssetAdministrationShellRef"; + } + } + + [XmlType(TypeName = "assetRef")] + public class AssetRef : Reference + { + // constructors + + public AssetRef() : base() { } + + public AssetRef(AssetRef src) : base(src) { } + + // translation + + public static AssetRef CreateNew(Reference r) + { + return (AssetRef)new Reference(r); + } + + // further methods + + public override string GetElementName() + { + return "AssetRef"; + } + } + + [XmlType(TypeName = "submodelRef")] + public class SubmodelRef : Reference + { + // constructors + + public SubmodelRef() : base() { } + + public SubmodelRef(SubmodelRef src) : base(src) { } + + public static new SubmodelRef CreateNew(string type, bool local, string idType, string value) + { + var r = new SubmodelRef(); + r.Keys.Add(Key.CreateNew(type, local, idType, value)); + return r; + } + + public static SubmodelRef CreateNew(Reference src) + { + if (src == null || src.Keys == null) + return null; + var r = new SubmodelRef(); + r.Keys.AddRange(src.Keys); + return r; + } + + // further methods + + public override string GetElementName() + { + return "SubmodelRef"; + } + } + + [XmlType(TypeName = "conceptDescriptionRef")] + public class ConceptDescriptionRef : Reference + { + // constructors + + public ConceptDescriptionRef() : base() { } + + public ConceptDescriptionRef(ConceptDescriptionRef src) : base(src) { } + + // further methods + + public new static ConceptDescriptionRef CreateNew(string type, bool local, string idType, string value) + { + var r = new ConceptDescriptionRef(); + r.Keys.Add(Key.CreateNew(type, local, idType, value)); + return r; + } + + public override string GetElementName() + { + return "ConceptDescriptionRef"; + } + } + + [XmlType(TypeName = "dataSpecificationRef")] + public class DataSpecificationRef : Reference + { + // constructors + + public DataSpecificationRef() : base() { } + + public DataSpecificationRef(DataSpecificationRef src) : base(src) { } + + // further methods + + public static DataSpecificationRef CreateNew(Reference src) + { + if (src == null || src.Keys == null) + return null; + var res = new DataSpecificationRef(); + foreach (var k in src.Keys) + res.Keys.Add(new Key(k)); + return res; + } + + public override string GetElementName() + { + return "DataSpecificationRef"; + } + } + + [XmlType(TypeName = "conceptDescriptions")] + public class ConceptDescriptionRefs + { + [XmlElement(ElementName = "conceptDescriptionRef")] + public List conceptDescriptions = new List(); + + // constructors + + public ConceptDescriptionRefs() { } + + public ConceptDescriptionRefs(ConceptDescriptionRefs src) + { + if (src.conceptDescriptions != null) + foreach (var cdr in src.conceptDescriptions) + this.conceptDescriptions.Add(new ConceptDescriptionRef(cdr)); + } + } + + [XmlType(TypeName = "containedElementRef")] + public class ContainedElementRef : Reference + { + // constructors + + public ContainedElementRef() { } + public ContainedElementRef(ContainedElementRef src) : base(src) { } + + public static ContainedElementRef CreateNew(Reference src) + { + if (src == null || src.Keys == null) + return null; + var r = new ContainedElementRef(); + r.Keys.AddRange(src.Keys); + return r; + } + + // further methods + + public override string GetElementName() + { + return "ContainedElementRef"; + } + } + + [XmlType(TypeName = "hasDataSpecification")] + public class HasDataSpecification + { + [XmlElement(ElementName = "reference")] // make "reference" go away by magic?! + public List reference = new List(); + + public HasDataSpecification() { } + + public HasDataSpecification(HasDataSpecification src) + { + foreach (var r in src.reference) + reference.Add(new Reference(r)); + } + } + + [XmlType(TypeName = "ContainedElements")] + public class ContainedElements + { + + // members + + [XmlElement(ElementName = "containedElementRef")] // make "reference" go away by magic?! + public List reference = new List(); + + // getter / setter + + public bool IsEmpty { get { return reference == null || reference.Count < 1; } } + public int Count { get { if (reference == null) return 0; return reference.Count; } } + public ContainedElementRef this[int index] { get { return reference[index]; } } + + // Creators + + public ContainedElements() { } + + public ContainedElements(ContainedElements src) + { + if (src.reference != null) + foreach (var r in src.reference) + this.reference.Add(new ContainedElementRef(r)); + } + + public static ContainedElements CreateOrSetInner(ContainedElements outer, ContainedElementRef[] inner) + { + var res = outer; + if (res == null) + res = new ContainedElements(); + if (inner == null) + { + res.reference = null; + return res; + } + res.reference = new List(inner); + return res; + } + + } + + [XmlType(TypeName = "langString", Namespace = "http://www.admin-shell.io/1/0")] + public class LangStr + { + + // members + + [XmlAttribute(Namespace = "http://www.admin-shell.io/1/0")] + [JsonProperty(PropertyName = "language")] + public string lang = ""; + [XmlText] + [JsonProperty(PropertyName = "text")] + public string str = ""; + + // constructors + + public LangStr() { } + + public LangStr(LangStr src) + { + this.lang = src.lang; + this.str = src.str; + } + + public static LangStr CreateNew(string lang, string str) + { + var l = new LangStr(); + l.lang = lang; + l.str = str; + return (l); + } + + public static List CreateManyFromStringArray(string[] s) + { + var r = new List(); + var i = 0; + while ((i + 1) < s.Length) + { + r.Add(LangStr.CreateNew(s[i], s[i + 1])); + i += 2; + } + return r; + } + } + + public class Description + { + + // members + + [XmlElement(ElementName = "langString")] + public List langString = new List(); + + // constructors + + public Description() { } + + public Description(Description src) + { + if (src != null) + foreach (var ls in src.langString) + langString.Add(new LangStr(ls)); + } + } + + public class Kind + { + [XmlText] + public string kind = "Instance"; + + // getters / setters + + [XmlIgnore] + [JsonIgnore] + public bool IsInstance { get { return kind == null || kind.Trim().ToLower() == "instance"; } } + + [XmlIgnore] + [JsonIgnore] + public bool IsType { get { return kind != null && kind.Trim().ToLower() == "type"; } } + + // constructors / creators + + public Kind() { } + + public Kind(Kind src) + { + kind = src.kind; + } + + public Kind(string kind) + { + this.kind = kind; + } + + public static Kind CreateFrom(Kind k) + { + var res = new Kind(); + res.kind = k.kind; + return res; + } + + public static Kind CreateAsType() + { + var res = new Kind(); + res.kind = "Type"; + return res; + } + + public static Kind CreateAsInstance() + { + var res = new Kind(); + res.kind = "Instance"; + return res; + } + } + + public class SemanticId + { + + // members + + [XmlIgnore] + [JsonIgnore] + private KeyList keys = new KeyList(); + + // getters / setters + + [XmlArray("keys")] + [XmlArrayItem("key")] + [JsonIgnore] + public List Keys { get { return keys?.Keys; } } + [XmlIgnore] + [JsonProperty(PropertyName = "keys")] + public List JsonKeys + { + get + { + keys?.NumberIndices(); + return keys.Keys; + } + } + + [XmlIgnore] + [JsonIgnore] + public bool IsEmpty { get { return keys == null || keys.IsEmpty; } } + [XmlIgnore] + [JsonIgnore] + public int Count { get { if (keys == null) return 0; return keys.Count; } } + [XmlIgnore] + [JsonIgnore] + public Key this[int index] { get { return keys[index]; } } + + public override string ToString() + { + return Key.KeyListToString(keys.Keys); + } + + // constructors / creators + + public SemanticId() + { + } + + public SemanticId(SemanticId src) + { + if (src != null) + foreach (var k in src.Keys) + keys.Add(k); + } + + public static SemanticId CreateFromKey(Key key) + { + if (key == null) + return null; + var res = new SemanticId(); + res.Keys.Add(key); + return res; + } + + public static SemanticId CreateFromKeys(List keys) + { + if (keys == null) + return null; + var res = new SemanticId(); + res.Keys.AddRange(keys); + return res; + } + + // matching + + public bool Matches(string type, bool local, string idType, string value) + { + if (this.Count == 1 + && this.keys[0].type.ToLower().Trim() == type.ToLower().Trim() + && this.keys[0].local == local + && this.keys[0].idType.ToLower().Trim() == idType.ToLower().Trim() + && this.keys[0].value.ToLower().Trim() == value.ToLower().Trim()) + return true; + return false; + } + } + + public class Referable + { + + // members + + public string idShort = null; + public string category = null; + + [XmlElement(ElementName = "description")] + [JsonIgnore] + public Description description = null; + [XmlIgnore] + [JsonProperty(PropertyName = "descriptions")] + public List JsonDescription + { + get + { + if (description == null) + return null; + return description.langString; + } + set + { + if (description == null) + description = new Description(); + description.langString = value; + } + } + + [XmlIgnore] + [JsonIgnore] + public Referable parent = null; + + public static string[] ReferableCategoryNames = new string[] { "CONSTANT", "PARAMETER", "VARIABLE" }; + + // constructors + + public Referable() { } + + public Referable(Referable src) + { + this.idShort = src.idShort; + this.category = src.category; + if (src.description != null) + this.description = new Description(src.description); + } + + public void AddDescription(string lang, string str) + { + if (description == null) + description = new Description(); + description.langString.Add(LangStr.CreateNew(lang, str)); + } + + public virtual string GetElementName() + { + return "GlobalReference"; // not correct, but this method wasn't overridden correctly + } + + public string GetFriendlyName() + { + return AdminShellUtilV10.FilterFriendlyName(this.idShort); + } + + public void CollectReferencesByParent(List refs) + { + // check, if this is identifiable + if (this is Identifiable) + { + var idf = this as Identifiable; + var k = Key.CreateNew( + idf.GetElementName(), true, idf.identification.idType, idf.identification.id); + refs.Insert(0, k); + } + else + { + var k = Key.CreateNew(this.GetElementName(), true, "idShort", this.idShort); + refs.Insert(0, k); + // recurse upwards! + if (parent != null && parent is Referable) + (this.parent).CollectReferencesByParent(refs); + } + } + + public string CollectIdShortByParent() + { + // recurse first + var head = ""; + if (!(this is Identifiable) && this.parent != null && this.parent is Referable) + // can go up + head = this.parent.CollectIdShortByParent() + "/"; + // add own + var myid = ""; + if (this.idShort != null && this.idShort.Trim() != "") + myid = this.idShort.Trim(); + // together + return head + myid; + } + } + + public class Identifiable : Referable + { + + // members + + public Identification identification = new Identification(); + public Administration administration = null; + + // constructors + + public Identifiable() : base() { } + + public Identifiable(Identifiable src) + : base(src) + { + if (src.identification != null) + this.identification = new Identification(src.identification); + if (src.administration != null) + this.administration = new Administration(src.administration); + } + + public void SetIdentification(string idType, string id, string idShort = null) + { + identification.idType = idType; + identification.id = id; + if (idShort != null) + this.idShort = idShort; + } + + public void SetAdminstration(string version, string revision) + { + if (administration == null) + administration = new Administration(); + administration.version = version; + administration.revision = revision; + } + + public new string GetFriendlyName() + { + if (identification != null && identification.id != "") + return AdminShellUtilV10.FilterFriendlyName(this.identification.id); + return AdminShellUtilV10.FilterFriendlyName(this.idShort); + } + + } + + public class JsonModelTypeWrapper + { + public string name = ""; + + public JsonModelTypeWrapper(string name = "") { this.name = name; } + } + + public class AdministrationShell : Identifiable + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } + + // from hasDataSpecification: + [XmlElement(ElementName = "hasDataSpecification")] + public HasDataSpecification hasDataSpecification = null; + + // from this very class + public AssetAdministrationShellRef derivedFrom = null; + + [JsonProperty(PropertyName = "asset")] + public AssetRef assetRef = new AssetRef(); + + [JsonProperty(PropertyName = "submodels")] + public List submodelRefs = new List(); + + [JsonIgnore] + public Views views = null; + [XmlIgnore] + [JsonProperty(PropertyName = "views")] + public View[] JsonViews + { + get { return views?.views.ToArray(); } + set { views = Views.CreateOrSetInnerViews(views, value); } + } + + [JsonProperty(PropertyName = "conceptDictionaries")] + public List conceptDictionaries = null; + + // constructurs + + public AdministrationShell() { } + + public AdministrationShell(AdministrationShell src) + : base(src) + { + if (src.hasDataSpecification != null) + this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); + + if (src.derivedFrom != null) + this.derivedFrom = new AssetAdministrationShellRef(src.derivedFrom); + + if (src.assetRef != null) + this.assetRef = new AssetRef(src.assetRef); + + if (src.submodelRefs != null) + foreach (var smr in src.submodelRefs) + this.submodelRefs.Add(new SubmodelRef(smr)); + + if (src.views != null) + this.views = new Views(src.views); + + if (src.conceptDictionaries != null) + { + this.conceptDictionaries = new List(); + foreach (var cdd in src.conceptDictionaries) + this.conceptDictionaries.Add(new ConceptDictionary(cdd)); + } + } + + public static AdministrationShell CreateNew( + string idType, string id, string version = null, string revision = null) + { + var s = new AdministrationShell(); + s.identification.idType = idType; + s.identification.id = id; + if (version != null) + s.SetAdminstration(version, revision); + return (s); + } + + // add + + public void AddView(View v) + { + if (views == null) + views = new Views(); + views.views.Add(v); + } + + public void AddConceptDictionary(ConceptDictionary d) + { + if (conceptDictionaries == null) + conceptDictionaries = new List(); + conceptDictionaries.Add(d); + } + + public void AddDataSpecification(Key k) + { + if (hasDataSpecification == null) + hasDataSpecification = new HasDataSpecification(); + var r = new Reference(); + r.Keys.Add(k); + hasDataSpecification.reference.Add(r); + } + + public override string GetElementName() + { + return "AssetAdministrationShell"; + } + + public Tuple ToCaptionInfo() + { + var caption = AdminShellUtilV10.EvalToNonNullString("\"{0}\" ", idShort, "\"AAS\""); + if (administration != null) + caption += "V" + administration.version + "." + administration.revision; + + var info = ""; + if (identification != null) + info = $"[{identification.idType}, {identification.id}]"; + return Tuple.Create(caption, info); + } + + public override string ToString() + { + var ci = ToCaptionInfo(); + return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); + } + + public SubmodelRef FindSubmodelRef(Identification refid) + { + if (this.submodelRefs == null) + return null; + foreach (var r in this.submodelRefs) + if (r.MatchesTo(refid)) + return r; + return null; + } + + public bool HasSubmodelRef(SubmodelRef newref) + { + // check, if existing + if (this.submodelRefs == null) + return false; + var found = false; + foreach (var r in this.submodelRefs) + if (r.MatchesTo(newref)) + found = true; + + return found; + } + + public void AddSubmodelRef(SubmodelRef newref) + { + if (this.submodelRefs == null) + this.submodelRefs = new List(); + this.submodelRefs.Add(newref); + } + } + + public class Asset : Identifiable + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } + + // from hasDataSpecification: + [XmlElement(ElementName = "hasDataSpecification")] + public HasDataSpecification hasDataSpecification = null; + // from HasKind + [XmlElement(ElementName = "kind")] + [JsonIgnore] + public Kind kind = new Kind(); + [XmlIgnore] + [JsonProperty(PropertyName = "kind")] + public string JsonKind + { + get + { + if (kind == null) + return null; + return kind.kind; + } + set + { + if (kind == null) + kind = new Kind(); + kind.kind = value; + } + } + // from this very class + [XmlElement(ElementName = "assetIdentificationModelRef")] + public SubmodelRef assetIdentificationModelRef = null; + + // constructors + + public Asset() { } + + public Asset(Asset src) + : base(src) + { + if (src.hasDataSpecification != null) + this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); + if (src.kind != null) + this.kind = new Kind(src.kind); + if (src.assetIdentificationModelRef != null) + this.assetIdentificationModelRef = new SubmodelRef(src.assetIdentificationModelRef); + } + + // Getter & setters + + public AssetRef GetReference() + { + var r = new AssetRef(); + r.Keys.Add( + Key.CreateNew(this.GetElementName(), true, this.identification.idType, this.identification.id)); + return r; + } + + public override string GetElementName() + { + return "Asset"; + } + + public Tuple ToCaptionInfo() + { + var caption = AdminShellUtilV10.EvalToNonNullString("\"{0}\" ", idShort, ""); + if (administration != null) + caption += "V" + administration.version + "." + administration.revision; + + var info = ""; + if (identification != null) + info = $"[{identification.idType}, {identification.id}]"; + return Tuple.Create(caption, info); + } + + public override string ToString() + { + var ci = ToCaptionInfo(); + return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); + } + + } + + public class View : Referable + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } + + // members + + // from hasSemanticId: + [XmlElement(ElementName = "semanticId")] + public SemanticId semanticId = null; + // from hasDataSpecification + [XmlElement(ElementName = "hasDataSpecification")] + public HasDataSpecification hasDataSpecification = null; + + // from this very class + [JsonIgnore] + public ContainedElements containedElements = null; + [XmlIgnore] + [JsonProperty(PropertyName = "containedElements")] + public ContainedElementRef[] JsonContainedElements + { + get { return containedElements?.reference.ToArray(); } + set { containedElements = ContainedElements.CreateOrSetInner(containedElements, value); } + } + + // getter / setter + + [XmlIgnore] + [JsonIgnore] + public bool IsEmpty { get { return containedElements == null || containedElements.Count < 1; } } + [XmlIgnore] + [JsonIgnore] + public int Count { get { if (containedElements == null) return 0; return containedElements.Count; } } + + public ContainedElementRef this[int index] + { + get + { + if ( +containedElements == null) return null; return containedElements[index]; + } + } + + // constructors / creators + + public View() { } + + public View(View src) + : base(src) + { + if (src.semanticId != null) + this.semanticId = new SemanticId(src.semanticId); + if (src.hasDataSpecification != null) + this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); + if (src.containedElements != null) + this.containedElements = new ContainedElements(src.containedElements); + } + + public static View CreateNew(string idShort) + { + var v = new View(); + v.idShort = idShort; + return (v); + } + + public void AddDataSpecification(Key k) + { + if (hasDataSpecification == null) + hasDataSpecification = new HasDataSpecification(); + var r = new Reference(); + r.Keys.Add(k); + hasDataSpecification.reference.Add(r); + } + + public void AddContainedElement(Key k) + { + if (containedElements == null) + containedElements = new ContainedElements(); + var r = new ContainedElementRef(); + r.Keys.Add(k); + containedElements.reference.Add(r); + } + + public void AddContainedElement(List keys) + { + if (containedElements == null) + containedElements = new ContainedElements(); + var r = new ContainedElementRef(); + foreach (var k in keys) + r.Keys.Add(k); + containedElements.reference.Add(r); + } + + public void AddContainedElement(Reference r) + { + if (containedElements == null) + containedElements = new ContainedElements(); + containedElements.reference.Add(ContainedElementRef.CreateNew(r)); + } + + public void AddContainedElement(List rlist) + { + if (containedElements == null) + containedElements = new ContainedElements(); + foreach (var r in rlist) + containedElements.reference.Add(ContainedElementRef.CreateNew(r)); + } + + public override string GetElementName() + { + return "View"; + } + + public Tuple ToCaptionInfo() + { + var caption = AdminShellUtilV10.EvalToNonNullString("\"{0}\" ", idShort, ""); + var info = ""; + if (this.semanticId != null) + info = Key.KeyListToString(this.semanticId.Keys); + if (this.containedElements != null && this.containedElements.reference != null) + info = + (info + " ").Trim() + String.Format("({0} elements)", this.containedElements.reference.Count); + return Tuple.Create(caption, info); + } + + public override string ToString() + { + var ci = ToCaptionInfo(); + return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); + } + } + + public class Views + { + [XmlElement(ElementName = "view")] + [JsonIgnore] + public List views = new List(); + + // constructors + + public Views() { } + + public Views(Views src) + { + if (src != null && src.views != null) + foreach (var v in src.views) + this.views.Add(new View(v)); + } + + public static Views CreateOrSetInnerViews(Views outer, View[] inner) + { + var res = outer; + if (res == null) + res = new Views(); + if (inner == null) + { + res.views = null; + return res; + } + res.views = new List(inner); + return res; + } + } + + public class LangStringIEC61360 + { + + // members + + [XmlElement(ElementName = "langString", Namespace = "http://www.admin-shell.io/aas/1/0")] + public List langString = new List(); + + // getters / setters + + [XmlIgnore] + [JsonIgnore] + public bool IsEmpty { get { return langString == null || langString.Count < 1; } } + [XmlIgnore] + [JsonIgnore] + public int Count { get { if (langString == null) return 0; return langString.Count; } } + [XmlIgnore] + [JsonIgnore] + public LangStr this[int index] { get { return langString[index]; } } + + // constructors + + public LangStringIEC61360() { } + + public LangStringIEC61360(LangStringIEC61360 src) + { + if (src.langString != null) + foreach (var ls in src.langString) + this.langString.Add(new LangStr(ls)); + } + + // converter + + public static LangStringIEC61360 CreateFrom(List src) + { + var res = new LangStringIEC61360(); + if (src != null) + foreach (var ls in src) + res.langString.Add(new LangStr(ls)); + return res; + } + + } + + public class UnitId + { + + // members + + [XmlIgnore] + [JsonIgnore] + public KeyList keys = new KeyList(); + + // getter / setters + + [XmlArray("keys")] + [XmlArrayItem("key")] + [JsonIgnore] + public List Keys { get { return keys?.Keys; } } + [XmlIgnore] + [JsonProperty(PropertyName = "keys")] + public List JsonKeys + { + get + { + keys?.NumberIndices(); + return keys.Keys; + } + } + + [XmlIgnore] + [JsonIgnore] + public bool IsEmpty { get { return keys == null || keys.IsEmpty; } } + [XmlIgnore] + [JsonIgnore] + public int Count { get { if (keys == null) return 0; return keys.Count; } } + [XmlIgnore] + [JsonIgnore] + public Key this[int index] { get { return keys.Keys[index]; } } + + // constructors / creators + + public UnitId() { } + + public UnitId(UnitId src) + { + if (src.keys != null) + foreach (var k in src.Keys) + this.keys.Add(new Key(k)); + } + + public static UnitId CreateNew(string type, bool local, string idType, string value) + { + var u = new UnitId(); + u.keys.Keys.Add(Key.CreateNew(type, local, idType, value)); + return u; + } + + public static UnitId CreateNew(Reference src) + { + var res = new UnitId(); + if (src != null && src.Keys != null) + foreach (var k in src.Keys) + res.keys.Add(k); + return res; + } + } + + [XmlRoot(Namespace = "http://www.admin-shell.io/IEC61360/1/0")] + public class DataSpecificationIEC61360 + { + // static member + [XmlIgnore] + [JsonIgnore] + public static string[] DataTypeNames = { + "STRING", + "STRING_TRANSLATABLE", + "REAL_MEASURE", + "REAL_COUNT", + "REAL_CURRENCY", + "INTEGER_MEASURE", + "INTEGER_COUNT", + "INTEGER_CURRENCY", + "BOOLEAN", + "URL", + "RATIONAL", + "RATIONAL_MEASURE", + "TIME", + "TIMESTAMP", + "DATE" }; + + // members + public LangStringIEC61360 preferredName = new LangStringIEC61360(); + public string shortName = ""; + public string unit = ""; + public UnitId unitId = null; + public string valueFormat = null; + public List sourceOfDefinition = new List(); + public string symbol = null; + public string dataType = ""; + public LangStringIEC61360 definition = new LangStringIEC61360(); + + // getter / setters + + // constructors + + public DataSpecificationIEC61360() { } + + public DataSpecificationIEC61360(DataSpecificationIEC61360 src) + { + if (src.preferredName != null) + this.preferredName = new LangStringIEC61360(src.preferredName); + this.shortName = src.shortName; + this.unit = src.unit; + if (src.unitId != null) + this.unitId = new UnitId(src.unitId); + this.valueFormat = src.valueFormat; + if (src.sourceOfDefinition != null) + foreach (var sod in src.sourceOfDefinition) + this.sourceOfDefinition.Add(sod); + this.symbol = src.symbol; + this.dataType = src.dataType; + if (src.definition != null) + this.definition = new LangStringIEC61360(src.definition); + } + + public static DataSpecificationIEC61360 CreateNew( + string[] preferredName = null, + string shortName = "", + string unit = "", + UnitId unitId = null, + string valueFormat = null, + string[] sourceOfDefinition = null, + string symbol = null, + string dataType = "", + string[] definition = null + ) + { + var d = new DataSpecificationIEC61360(); + if (preferredName != null) + d.preferredName.langString = LangStr.CreateManyFromStringArray(preferredName); + d.shortName = shortName; + d.unit = unit; + d.unitId = unitId; + d.valueFormat = valueFormat; + if (sourceOfDefinition != null) + d.sourceOfDefinition = LangStr.CreateManyFromStringArray(sourceOfDefinition); + d.symbol = symbol; + d.dataType = dataType; + if (definition != null) + d.definition.langString = LangStr.CreateManyFromStringArray(definition); + return (d); + } + } + + public class DataSpecificationISO99999 + { + } + + public class DataSpecificationContent + { + + // members + + public DataSpecificationIEC61360 dataSpecificationIEC61360 = new DataSpecificationIEC61360(); + public DataSpecificationISO99999 dataSpecificationISO99999 = null; + + // constructors + + public DataSpecificationContent() { } + + public DataSpecificationContent(DataSpecificationContent src) + { + if (src.dataSpecificationIEC61360 != null) + this.dataSpecificationIEC61360 = new DataSpecificationIEC61360(src.dataSpecificationIEC61360); + } + } + + public class EmbeddedDataSpecification + { + // members + + public DataSpecificationRef hasDataSpecification = new DataSpecificationRef(); + public DataSpecificationContent dataSpecificationContent = new DataSpecificationContent(); + + // constructors + + public EmbeddedDataSpecification() { } + + public EmbeddedDataSpecification(EmbeddedDataSpecification src) + { + if (src.hasDataSpecification != null) + this.hasDataSpecification = new DataSpecificationRef(src.hasDataSpecification); + if (src.dataSpecificationContent != null) + this.dataSpecificationContent = new DataSpecificationContent(src.dataSpecificationContent); + } + } + + public class ConceptDescription : Identifiable, System.IDisposable + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } + + // members + + // do this in order to be IDisposable, that is: suitable for (using) + void System.IDisposable.Dispose() { } + public void GetData() { } + // from HasDataSpecification + // TODO (Michael Hoffmeister, 1970-01-01): in V1.0, shall be a list of embeddedDataSpecification + [XmlElement(ElementName = "embeddedDataSpecification")] + [JsonIgnore] + public EmbeddedDataSpecification embeddedDataSpecification = new EmbeddedDataSpecification(); + [XmlIgnore] + [JsonProperty(PropertyName = "embeddedDataSpecifications")] + public EmbeddedDataSpecification[] JsonEmbeddedDataSpecifications + { + get + { + if (embeddedDataSpecification == null) + return null; + return new EmbeddedDataSpecification[] { embeddedDataSpecification }; + } + set + { + if (value == null) + embeddedDataSpecification = null; + else + embeddedDataSpecification = value[0]; + } + } + + // this class + [XmlIgnore] + private List isCaseOf = null; + + // getter / setter + + [XmlElement(ElementName = "isCaseOf")] + [JsonProperty(PropertyName = "isCaseOf")] + public List IsCaseOf + { + get { return isCaseOf; } + set { isCaseOf = value; } + } + + // constructors / creators + + public ConceptDescription() : base() { } + + public ConceptDescription(ConceptDescription src) + : base(src) + { + if (src.embeddedDataSpecification != null) + this.embeddedDataSpecification = new EmbeddedDataSpecification(src.embeddedDataSpecification); + if (src.isCaseOf != null) + foreach (var ico in src.isCaseOf) + { + if (this.isCaseOf == null) + this.isCaseOf = new List(); + this.isCaseOf.Add(new Reference(ico)); + } + } + + public static ConceptDescription CreateNew( + string idType, string id, string version = null, string revision = null) + { + var cd = new ConceptDescription(); + cd.identification.idType = idType; + cd.identification.id = id; + if (version != null) + { + if (cd.administration == null) + cd.administration = new Administration(); + cd.administration.version = version; + cd.administration.revision = revision; + } + return (cd); + } + + public ConceptDescriptionRef GetReference() + { + var r = new ConceptDescriptionRef(); + r.Keys.Add( + Key.CreateNew(this.GetElementName(), true, this.identification.idType, this.identification.id)); + return r; + } + + public Key GetGlobalDataSpecRef() + { + if (embeddedDataSpecification.hasDataSpecification.Count != 1) + return null; + return (embeddedDataSpecification.hasDataSpecification[0]); + } + + public void SetIEC61360Spec( + string[] preferredNames = null, + string shortName = "", + string unit = "", + UnitId unitId = null, + string valueFormat = null, + string[] sourceOfDefinition = null, + string symbol = null, + string dataType = "", + string[] definition = null + ) + { + this.embeddedDataSpecification = new EmbeddedDataSpecification(); + this.embeddedDataSpecification.hasDataSpecification.Keys.Add( + Key.CreateNew("GlobalReference", false, "URI", + "www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360")); + this.embeddedDataSpecification.dataSpecificationContent.dataSpecificationIEC61360 = + AdminShellV10.DataSpecificationIEC61360.CreateNew( + preferredNames, shortName, unit, unitId, valueFormat, sourceOfDefinition, symbol, dataType, + definition); + this.AddIsCaseOf( + Reference.CreateNew(new Key( + "ConceptDescription", false, this.identification.idType, this.identification.id))); + } + + public DataSpecificationIEC61360 GetIEC61360() + { + if (embeddedDataSpecification != null && + embeddedDataSpecification.dataSpecificationContent != null && + embeddedDataSpecification.dataSpecificationContent.dataSpecificationIEC61360 != null) + return embeddedDataSpecification.dataSpecificationContent.dataSpecificationIEC61360; + return null; + } + + public string GetShortName() + { + if (embeddedDataSpecification != null && + embeddedDataSpecification.dataSpecificationContent != null && + embeddedDataSpecification.dataSpecificationContent.dataSpecificationIEC61360 != null) + return embeddedDataSpecification.dataSpecificationContent.dataSpecificationIEC61360.shortName; + return ""; + } + + public override string GetElementName() + { + return "ConceptDescription"; + } + + public Tuple ToCaptionInfo() + { + var caption = ""; + if (this.idShort != null && this.idShort.Trim() != "") + caption = $"\"{this.idShort.Trim()}\""; + if (this.identification != null) + caption = (caption + " " + this.identification).Trim(); + + var info = ""; + if (embeddedDataSpecification != null && + embeddedDataSpecification.dataSpecificationContent != null && + embeddedDataSpecification.dataSpecificationContent.dataSpecificationIEC61360 != null) + info += embeddedDataSpecification.dataSpecificationContent.dataSpecificationIEC61360.shortName; + + return Tuple.Create(caption, info); + } + + public override string ToString() + { + var ci = ToCaptionInfo(); + return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); + } + + public void AddIsCaseOf(Reference ico) + { + if (isCaseOf == null) + isCaseOf = new List(); + isCaseOf.Add(ico); + } + + public static IDisposable CreateNew() + { + throw new NotImplementedException(); + } + } + + public class ConceptDictionary : Referable + { + [XmlElement(ElementName = "conceptDescriptions")] + public ConceptDescriptionRefs conceptDescriptionsRefs = null; + + // constructors + + public ConceptDictionary() { } + + public ConceptDictionary(ConceptDictionary src) + { + if (src.conceptDescriptionsRefs != null) + this.conceptDescriptionsRefs = new ConceptDescriptionRefs(src.conceptDescriptionsRefs); + } + + public static ConceptDictionary CreateNew(string idShort = null) + { + var d = new ConceptDictionary(); + if (idShort != null) + d.idShort = idShort; + return (d); + } + + // add + + public void AddReference(Reference r) + { + var cdr = (ConceptDescriptionRef)(ConceptDescriptionRef.CreateNew(r.Keys)); + if (conceptDescriptionsRefs == null) + conceptDescriptionsRefs = new ConceptDescriptionRefs(); + conceptDescriptionsRefs.conceptDescriptions.Add(cdr); + } + + public override string GetElementName() + { + return "ConceptDictionary"; + } + } + + [XmlRoot(ElementName = "aasenv", Namespace = "http://www.admin-shell.io/aas/1/0")] + public class AdministrationShellEnv + { + [XmlAttribute(Namespace = System.Xml.Schema.XmlSchema.InstanceNamespace)] + public string schemaLocation = + "http://www.admin-shell.io/aas/1/0 AAS.xsd http://www.admin-shell.io/IEC61360/1/0 IEC61360.xsd"; + + /// [XmlElement(ElementName="assetAdministrationShells")] + [XmlIgnore] // will be ignored, anyway + private List administrationShells = new List(); + [XmlIgnore] // will be ignored, anyway + private List assets = new List(); + [XmlIgnore] // will be ignored, anyway + private List submodels = new List(); + [XmlIgnore] // will be ignored, anyway + private List conceptDescriptions = new List(); + + // getter / setters + + [XmlArray("assetAdministrationShells")] + [XmlArrayItem("assetAdministrationShell")] + [JsonProperty(PropertyName = "assetAdministrationShells")] + public List AdministrationShells + { + get { return administrationShells; } + set { administrationShells = value; } + } + + [XmlArray("assets")] + [XmlArrayItem("asset")] + [JsonProperty(PropertyName = "assets")] + public List Assets + { + get { return assets; } + set { assets = value; } + } + + [XmlArray("submodels")] + [XmlArrayItem("submodel")] + [JsonProperty(PropertyName = "submodels")] + public List Submodels + { + get { return submodels; } + set { submodels = value; } + } + + [XmlArray("conceptDescriptions")] + [XmlArrayItem("conceptDescription")] + [JsonProperty(PropertyName = "conceptDescriptions")] + public List ConceptDescriptions + { + get { return conceptDescriptions; } + set { conceptDescriptions = value; } + } + + // finders + + public AdministrationShell FindAAS(Identification id) + { + if (id == null) + return null; + foreach (var aas in this.AdministrationShells) + if (aas.identification != null && aas.identification.IsEqual(id)) + return aas; + return null; + } + + public AdministrationShell FindAAS(string idShort) + { + if (idShort == null) + return null; + foreach (var aas in this.AdministrationShells) + if (aas.idShort != null && aas.idShort.Trim().ToLower() == idShort.Trim().ToLower()) + return aas; + return null; + } + + public AdministrationShell FindAASwithSubmodel(Identification smid) + { + if (smid == null) + return null; + foreach (var aas in this.AdministrationShells) + if (aas.submodelRefs != null) + foreach (var smref in aas.submodelRefs) + if (smref.MatchesTo(smid)) + return aas; + return null; + } + + public Asset FindAsset(Identification id) + { + if (id == null) + return null; + foreach (var asset in this.Assets) + if (asset.identification != null && asset.identification.IsEqual(id)) + return asset; + return null; + } + + public Asset FindAsset(AssetRef aref) + { + // trivial + if (aref == null) + return null; + // can only refs with 1 key + if (aref.Count != 1) + return null; + // and we're picky + var key = aref[0]; + if (!key.local || key.type.ToLower().Trim() != "asset") + return null; + // brute force + foreach (var a in assets) + if (a.identification.idType.ToLower().Trim() == key.idType.ToLower().Trim() + && a.identification.id.ToLower().Trim() == key.value.ToLower().Trim()) + return a; + // uups + return null; + } + + public Submodel FindSubmodel(Identification id) + { + if (id == null) + return null; + foreach (var sm in this.Submodels) + if (sm.identification != null && sm.identification.IsEqual(id)) + return sm; + return null; + } + + public Submodel FindSubmodel(SubmodelRef smref) + { + // trivial + if (smref == null) + return null; + // can only refs with 1 key + if (smref.Count != 1) + return null; + // and we're picky + var key = smref.Keys[0]; + if (!key.local || key.type.ToLower().Trim() != "submodel") + return null; + // brute force + foreach (var sm in this.Submodels) + if (sm.identification.idType.ToLower().Trim() == key.idType.ToLower().Trim() + && sm.identification.id.ToLower().Trim() == key.value.ToLower().Trim()) + return sm; + // uups + return null; + } + + public Referable FindReferableByReference(Reference rf, int keyIndex = 0) + { + // first index needs to exist .. + if (rf == null || keyIndex >= rf.Count) + return null; + + // which type? + var firstType = rf[keyIndex].type.Trim().ToLower(); + var firstIdentification = new Identification(rf[keyIndex].idType, rf[keyIndex].value); + + if (firstType == Key.AAS.Trim().ToLower()) + return this.FindAAS(firstIdentification); + + if (firstType == Key.Asset.Trim().ToLower()) + return this.FindAsset(firstIdentification); + + if (firstType == Key.ConceptDescription.Trim().ToLower()) + return this.FindConceptDescription(firstIdentification); + + if (firstType == Key.Submodel.Trim().ToLower()) + { + // ok, search Submodel + var sm = this.FindSubmodel(new Identification(rf[keyIndex].idType, rf[keyIndex].value)); + if (sm == null) + return null; + + // at our end? + if (keyIndex >= rf.Count - 1) + return sm; + + // go inside + return SubmodelElementWrapper.FindReferableByReference(sm.submodelElements, rf, keyIndex + 1); + } + + // nothing in this Environment + return null; + } + + + public ConceptDescription FindConceptDescription(ConceptDescriptionRef cdr) + { + if (cdr == null) + return null; + return FindConceptDescription(cdr.Keys); + } + + public ConceptDescription FindConceptDescription(Identification id) + { + var cdr = ConceptDescriptionRef.CreateNew("Conceptdescription", true, id.idType, id.id); + return FindConceptDescription(cdr); + } + + public ConceptDescription FindConceptDescription(List keys) + { + // trivial + if (keys == null) + return null; + // can only refs with 1 key + if (keys.Count != 1) + return null; + // and we're picky + var key = keys[0]; + if (!key.local || key.type.ToLower().Trim() != "conceptdescription") + return null; + // brute force + foreach (var cd in conceptDescriptions) + if (cd.identification.idType.ToLower().Trim() == key.idType.ToLower().Trim() + && cd.identification.id.ToLower().Trim() == key.value.ToLower().Trim()) + return cd; + // uups + return null; + } + + public ConceptDescription FindConceptDescription(Key key) + { + if (key == null) + return null; + var l = new List(); + l.Add(key); + return (FindConceptDescription(l)); + } + + // creators + + private void CopyConceptDescriptionsFrom( + AdministrationShellEnv srcEnv, SubmodelElement src, bool shallowCopy = false) + { + // access + if (srcEnv == null || src == null || src.semanticId == null) + return; + // check for this SubmodelElement in Source + var cdSrc = srcEnv.FindConceptDescription(src.semanticId.Keys); + if (cdSrc == null) + return; + // check for this SubmodelElement in Destnation (this!) + var cdDest = this.FindConceptDescription(src.semanticId.Keys); + if (cdDest != null) + return; + // copy new + this.ConceptDescriptions.Add(new ConceptDescription(cdSrc)); + // recurse? + if (!shallowCopy && src is SubmodelElementCollection) + foreach (var m in (src as SubmodelElementCollection).value) + CopyConceptDescriptionsFrom(srcEnv, m.submodelElement, shallowCopy); + + } + + public SubmodelElementWrapper CopySubmodelElementAndCD( + AdministrationShellEnv srcEnv, SubmodelElement srcElem, bool copyCD = false, bool shallowCopy = false) + { + // access + if (srcEnv == null || srcElem == null) + return null; + + // 1st result pretty easy (calling function will add this to the appropriate Submodel) + var res = new SubmodelElementWrapper(srcElem); + + // copy the CDs.. + if (copyCD) + CopyConceptDescriptionsFrom(srcEnv, srcElem, shallowCopy); + + // give back + return res; + } + + public SubmodelRef CopySubmodelRefAndCD( + AdministrationShellEnv srcEnv, SubmodelRef srcSubRef, bool copySubmodel = false, bool copyCD = false, + bool shallowCopy = false) + { + // access + if (srcEnv == null || srcSubRef == null) + return null; + + // need to have the source Submodel + var srcSub = srcEnv.FindSubmodel(srcSubRef); + if (srcSub == null) + return null; + + // 1st result pretty easy (calling function will add this to the appropriate AAS) + var dstSubRef = new SubmodelRef(srcSubRef); + + // get the destination and shall src != dst + var dstSub = this.FindSubmodel(dstSubRef); + if (srcSub == dstSub) + return null; + + // maybe we need the Submodel in our environment, as well + if (dstSub == null && copySubmodel) + { + dstSub = new Submodel(srcSub, shallowCopy); + this.Submodels.Add(dstSub); + } + else + { + // there is already an submodel, just add members + if (!shallowCopy && srcSub.submodelElements != null) + { + if (dstSub.submodelElements == null) + dstSub.submodelElements = new List(); + foreach (var smw in srcSub.submodelElements) + dstSub.submodelElements.Add(new SubmodelElementWrapper(smw.submodelElement, shallowCopy)); + } + } + + // copy the CDs.. + if (copyCD && srcSub.submodelElements != null) + foreach (var smw in srcSub.submodelElements) + CopyConceptDescriptionsFrom(srcEnv, smw.submodelElement, shallowCopy); + + // give back + return dstSubRef; + } + + // serializations + + public void SerializeXmlToStream(StreamWriter s) + { + var serializer = new XmlSerializer(typeof(AdminShellV10.AdministrationShellEnv)); + var nss = new XmlSerializerNamespaces(); + nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace); + nss.Add("aas", "http://www.admin-shell.io/aas/1/0"); + nss.Add("IEC61360", "http://www.admin-shell.io/IEC61360/1/0"); + serializer.Serialize(s, this, nss); + } + + public JsonWriter SerialiazeJsonToStream(StreamWriter sw, bool leaveJsonWriterOpen = false) + { + sw.AutoFlush = true; + + JsonSerializer serializer = new JsonSerializer(); + serializer.NullValueHandling = NullValueHandling.Ignore; + serializer.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; + serializer.Formatting = Newtonsoft.Json.Formatting.Indented; + + JsonWriter writer = new JsonTextWriter(sw); + serializer.Serialize(writer, this); + if (leaveJsonWriterOpen) + return writer; + writer.Close(); + return null; + } + + public AdministrationShellEnv DeserializeFromXmlStream(TextReader reader) + { + XmlSerializer serializer = new XmlSerializer( + typeof(AdminShellV10.AdministrationShellEnv), "http://www.admin-shell.io/aas/1/0"); + var res = serializer.Deserialize(reader) as AdminShellV10.AdministrationShellEnv; + return res; + } + + public AdministrationShellEnv DeserializeFromJsonStream(TextReader reader) + { + JsonSerializer serializer = new JsonSerializer(); + serializer.Converters.Add(new AdminShellV10.JsonAasxConverter("modelType", "name")); + var res = (AdministrationShellEnv)serializer.Deserialize(reader, typeof(AdministrationShellEnv)); + return res; + } + + // special functions + + private static void CreateFromExistingEnvRecurseForCDs( + AdministrationShellEnv src, List wrappers, + ref List filterForCD) + { + if (wrappers == null || filterForCD == null) + return; + + foreach (var w in wrappers) + { + // include in filter .. + if (w.submodelElement.semanticId != null) + { + var cd = src.FindConceptDescription(w.submodelElement.semanticId.Keys); + if (cd != null) + filterForCD.Add(cd); + } + + // recurse? + if (w.submodelElement is SubmodelElementCollection) + CreateFromExistingEnvRecurseForCDs( + src, (w.submodelElement as SubmodelElementCollection).value, ref filterForCD); + + if (w.submodelElement is Operation) + for (int i = 0; i < 2; i++) + { + var w2s = Operation.GetWrappers((w.submodelElement as Operation)[i]); + CreateFromExistingEnvRecurseForCDs(src, w2s, ref filterForCD); + } + + } + } + + public static AdministrationShellEnv CreateFromExistingEnv(AdministrationShellEnv src, + List filterForAas = null, + List filterForAsset = null, + List filterForSubmodel = null, + List filterForCD = null) + { + // prepare defaults + if (filterForAas == null) + filterForAas = new List(); + if (filterForAsset == null) + filterForAsset = new List(); + if (filterForSubmodel == null) + filterForSubmodel = new List(); + if (filterForCD == null) + filterForCD = new List(); + + // make new + var res = new AdministrationShellEnv(); + + // take over AAS + foreach (var aas in src.administrationShells) + if (filterForAas.Contains(aas)) + { + // take over + res.administrationShells.Add(new AdministrationShell(aas)); + + // consequences + if (aas.assetRef != null) + { + var asset = src.FindAsset(aas.assetRef); + if (asset != null) + filterForAsset.Add(asset); + } + + if (aas.submodelRefs != null) + foreach (var smr in aas.submodelRefs) + { + var sm = src.FindSubmodel(smr); + if (sm != null) + filterForSubmodel.Add(sm); + } + + if (aas.conceptDictionaries != null) + foreach (var cdd in aas.conceptDictionaries) + if (cdd.conceptDescriptionsRefs != null && + cdd.conceptDescriptionsRefs.conceptDescriptions != null) + foreach (var cdr in cdd.conceptDescriptionsRefs.conceptDescriptions) + { + var cd = src.FindConceptDescription(cdr); + if (cd != null) + filterForCD.Add(cd); + } + } + + // take over Assets + foreach (var asset in src.assets) + if (filterForAsset.Contains(asset)) + { + // take over + res.assets.Add(new Asset(asset)); + } + + // take over Submodels + foreach (var sm in src.Submodels) + if (filterForSubmodel.Contains(sm)) + { + // take over + res.submodels.Add(new Submodel(sm)); + + // recursion in order to find used CDs + CreateFromExistingEnvRecurseForCDs(src, sm.submodelElements, ref filterForCD); + } + + // ConceptDescriptions + foreach (var cd in src.ConceptDescriptions) + if (filterForCD.Contains(cd)) + { + // take over + res.conceptDescriptions.Add(new ConceptDescription(cd)); + } + + // ok + return res; + } + } + + // + // Submodel + Submodel elements + // + + public interface IGetReference + { + Reference GetReference(); + } + + public class Qualifier + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } + + // member + + // from hasSemantics: + [XmlElement(ElementName = "semanticId")] + // TODO (Michael Hoffmeister, 1970-01-01): Qualifiers not working! + // 190410: test-wise enable them again, everyhing works fine .. + public SemanticId semanticId = null; + + // this class + public string qualifierType = null; + public string qualifierValue = null; + public Reference qualifierValueId = null; + + // constructors + + public Qualifier() { } + + public Qualifier(Qualifier src) + { + if (src.semanticId != null) + this.semanticId = new SemanticId(src.semanticId); + this.qualifierType = src.qualifierType; + this.qualifierValue = src.qualifierValue; + if (src.qualifierValueId != null) + this.qualifierValueId = new Reference(src.qualifierValueId); + } + + public string GetElementName() + { + return "Qualifier"; + } + } + + public class SubmodelElement : Referable, System.IDisposable, IGetReference + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } + + // members + + // do this in order to be IDisposable, that is: suitable for (using) + void System.IDisposable.Dispose() { } + public void GetData() { } + // from hasDataSpecification: + [XmlElement(ElementName = "hasDataSpecification")] + public HasDataSpecification hasDataSpecification = null; + // from hasSemantics: + [XmlElement(ElementName = "semanticId")] + public SemanticId semanticId = null; + // from hasKind: + [XmlElement(ElementName = "kind")] + [JsonIgnore] + public Kind kind = null; + [XmlIgnore] + [JsonProperty(PropertyName = "kind")] + public string JsonKind + { + get + { + if (kind == null) + return null; + return kind.kind; + } + set + { + if (kind == null) + kind = new Kind(); + kind.kind = value; + } + } + // from Qualifiable: + [XmlArray("qualifier")] + [XmlArrayItem("qualifier")] + [JsonProperty(PropertyName = "constraints")] + public List qualifiers = null; + + // getter / setter + + // constructors / creators + + public SubmodelElement() + : base() { } + + public SubmodelElement(SubmodelElement src) + : base(src) + { + if (src.hasDataSpecification != null) + hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); + if (src.semanticId != null) + semanticId = new SemanticId(src.semanticId); + if (src.kind != null) + kind = new Kind(src.kind); + if (src.qualifiers != null) + { + if (qualifiers == null) + qualifiers = new List(); + foreach (var q in src.qualifiers) + qualifiers.Add(new Qualifier(q)); + } + } + + public void CreateNewLogic(string idShort = null, string category = null, Key semanticIdKey = null) + { + if (idShort != null) + this.idShort = idShort; + if (category != null) + this.category = category; + if (semanticIdKey != null) + { + if (this.semanticId == null) + this.semanticId = new SemanticId(); + this.semanticId.Keys.Add(semanticIdKey); + } + } + + public void AddQualifier( + string qualifierType = null, string qualifierValue = null, KeyList semanticKeys = null, + Reference qualifierValueId = null) + { + if (this.qualifiers == null) + this.qualifiers = new List(); + var q = new Qualifier(); + q.qualifierType = qualifierType; + q.qualifierValue = qualifierValue; + q.qualifierValueId = qualifierValueId; + if (semanticKeys != null) + q.semanticId = SemanticId.CreateFromKeys(semanticKeys.Keys); + this.qualifiers.Add(q); + } + + public Qualifier HasQualifierOfType(string qualifierType) + { + if (this.qualifiers == null || qualifierType == null) + return null; + foreach (var q in this.qualifiers) + if (q.qualifierType.Trim().ToLower() == qualifierType.Trim().ToLower()) + return q; + return null; + } + + public override string GetElementName() + { + return "SubmodelElement"; + } + + public Reference GetReference() + { + Reference r = new Reference(); + // this is the tail of our referencing chain .. + r.Keys.Add(Key.CreateNew(GetElementName(), true, "idShort", this.idShort)); + // try to climb up .. + var current = this.parent; + while (current != null) + { + if (current is Identifiable) + { + // add big information set + r.Keys.Insert(0, Key.CreateNew( + current.GetElementName(), + true, + (current as Identifiable).identification.idType, + (current as Identifiable).identification.id)); + } + else + { + // reference via idShort + r.Keys.Insert(0, Key.CreateNew( + current.GetElementName(), + true, + "idShort", this.idShort)); + } + current = current.parent; + } + return r; + } + + public Tuple ToCaptionInfo() + { + var caption = AdminShellUtilV10.EvalToNonNullString("\"{0}\" ", idShort, ""); + var info = ""; + if (semanticId != null) + info = AdminShellUtilV10.EvalToNonEmptyString("\u21e8 {0}", semanticId.ToString(), ""); + return Tuple.Create(caption, info); + } + + public override string ToString() + { + var ci = ToCaptionInfo(); + return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); + } + + + } + + [XmlType(TypeName = "submodelElement")] + public class SubmodelElementWrapper + { + + // members + + [XmlElement(ElementName = "property", Type = typeof(Property))] + [XmlElement(ElementName = "file", Type = typeof(File))] + [XmlElement(ElementName = "blob", Type = typeof(Blob))] + [XmlElement(ElementName = "referenceElement", Type = typeof(ReferenceElement))] + [XmlElement(ElementName = "relationshipElement", Type = typeof(RelationshipElement))] + [XmlElement(ElementName = "submodelElementCollection", Type = typeof(SubmodelElementCollection))] + [XmlElement(ElementName = "operation", Type = typeof(Operation))] + public SubmodelElement submodelElement; + + // element names + public static string[] AdequateElementNames = { + "SubmodelElementCollection", "Property", "File", "Blob", "ReferenceElement", + "RelationshipElement", "Operation", "OperationVariable" }; + + // constructors + + public SubmodelElementWrapper() { } + + // for cloning + public SubmodelElementWrapper(SubmodelElement src, bool shallowCopy = false) + { + if (src is Property) + this.submodelElement = new Property(src as Property); + if (src is File) + this.submodelElement = new File(src as File); + if (src is Blob) + this.submodelElement = new Blob(src as Blob); + if (src is ReferenceElement) + this.submodelElement = new ReferenceElement(src as ReferenceElement); + if (src is RelationshipElement) + this.submodelElement = new RelationshipElement(src as RelationshipElement); + if (src is SubmodelElementCollection) + this.submodelElement = new SubmodelElementCollection( + src as SubmodelElementCollection, shallowCopy: shallowCopy); + if (src is Operation) + this.submodelElement = new Operation(src as Operation); + } + + /// + /// Introduced for JSON serialization, can create SubModelElements based on a string name + /// + /// string name (standard PascalCased) + /// SubmodelElement + public static SubmodelElement CreateAdequateType(string elementName) + { + if (elementName == "Property") + return new Property(); + if (elementName == "File") + return new File(); + if (elementName == "Blob") + return new Blob(); + if (elementName == "ReferenceElement") + return new ReferenceElement(); + if (elementName == "RelationshipElement") + return new RelationshipElement(); + if (elementName == "SubmodelElementCollection") + return new SubmodelElementCollection(); + if (elementName == "Operation") + return new Operation(); + if (elementName == "OperationVariable") + return new OperationVariable(); + return null; + } + + /// + /// Can create SubmodelElements based on a numerical index + /// + /// Index 0..7 (6+7 are Operation..!) + /// SubmodelElement + public static SubmodelElement CreateAdequateType(int index) + { + AdminShellV10.SubmodelElement sme = null; + switch (index) + { + case 0: + sme = new AdminShellV10.Property(); + break; + case 1: + sme = new AdminShellV10.File(); + break; + case 2: + sme = new AdminShellV10.Blob(); + break; + case 3: + sme = new AdminShellV10.ReferenceElement(); + break; + case 4: + sme = new AdminShellV10.SubmodelElementCollection(); + break; + case 5: + sme = new AdminShellV10.RelationshipElement(); + break; + case 6: + sme = new AdminShellV10.Operation(); + break; + case 7: + sme = new AdminShellV10.OperationVariable(); + break; + } + return sme; + } + + public string GetFourDigitCode() + { + if (submodelElement == null) + return ("Null"); + if (submodelElement is AdminShellV10.Property) return ("Prop"); + if (submodelElement is AdminShellV10.File) return ("File"); + if (submodelElement is AdminShellV10.Blob) return ("Blob"); + if (submodelElement is AdminShellV10.ReferenceElement) return ("Ref"); + if (submodelElement is AdminShellV10.RelationshipElement) return ("Rel"); + if (submodelElement is AdminShellV10.SubmodelElementCollection) return ("Coll"); + if (submodelElement is AdminShellV10.Operation) return ("Opr"); + return ("Elem"); + } + + public static List ListOfWrappersToListOfElems(List wrappers) + { + var res = new List(); + if (wrappers == null) + return res; + foreach (var w in wrappers) + if (w.submodelElement != null) + res.Add(w.submodelElement); + return res; + } + + public static SubmodelElementWrapper CreateFor(SubmodelElement sme) + { + var res = new SubmodelElementWrapper(); + res.submodelElement = sme; + return res; + } + + public static Referable FindReferableByReference( + List wrappers, Reference rf, int keyIndex) + { + // first index needs to exist .. + if (wrappers == null || rf == null || keyIndex >= rf.Count) + return null; + + // as SubmodelElements are not Identifiables, the actual key shall be IdSHort + if (rf[keyIndex].idType.Trim().ToLower() != + Key.GetIdentifierTypeName(Key.IdentifierType.IdShort).Trim().ToLower()) + return null; + + // over all wrappers + if (wrappers != null) + foreach (var smw in wrappers) + if (smw.submodelElement != null && + smw.submodelElement.idShort.Trim().ToLower() == rf[keyIndex].value.Trim().ToLower()) + { + // match on this level. Did we find a leaf element? + if ((keyIndex + 1) >= rf.Count) + return smw.submodelElement; + + // ok, not a leaf, must be a recursion + // int SMEC + if (smw.submodelElement is SubmodelElementCollection) + return FindReferableByReference( + (smw.submodelElement as SubmodelElementCollection).value, rf, keyIndex + 1); + + // TODO (Michael Hoffmeister, 1970-01-01): Operation + + // else: + return null; + } + + // no? + return null; + } + } + + public class Submodel : Identifiable, System.IDisposable, IGetReference + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } + + // members + + // do this in order to be IDisposable, that is: suitable for (using) + void System.IDisposable.Dispose() { } + public void GetData() { } + // from hasDataSpecification: + [XmlElement(ElementName = "hasDataSpecification")] + public HasDataSpecification hasDataSpecification = null; + // from hasSemanticId: + [XmlElement(ElementName = "semanticId")] + public SemanticId semanticId = new SemanticId(); + // from Kindable + [XmlElement(ElementName = "kind")] + [JsonIgnore] + public Kind kind = new Kind(); + [XmlIgnore] + [JsonProperty(PropertyName = "kind")] + public string JsonKind + { + get + { + if (kind == null) + return null; + return kind.kind; + } + set + { + if (kind == null) + kind = new Kind(); + kind.kind = value; + } + } + // from Qualifiable: + [XmlArray("qualifier")] + [XmlArrayItem("qualifier")] + public List qualifiers = null; + + // from this very class + [JsonIgnore] + public List submodelElements = null; + [XmlIgnore] + [JsonProperty(PropertyName = "submodelElements")] + public SubmodelElement[] JsonSubmodelElements + { + get + { + var res = new List(); + if (submodelElements != null) + foreach (var smew in submodelElements) + res.Add(smew.submodelElement); + return res.ToArray(); + } + set + { + if (value != null) + { + this.submodelElements = new List(); + foreach (var x in value) + { + var smew = new SubmodelElementWrapper(); + smew.submodelElement = x; + this.submodelElements.Add(smew); + } + } + } + } + + // getter / setter + + // constructors / creators + + public Submodel() : base() { } + + public Submodel(Submodel src, bool shallowCopy = false) + : base(src) + { + if (src.hasDataSpecification != null) + this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); + if (src.semanticId != null) + this.semanticId = new SemanticId(src.semanticId); + if (src.kind != null) + this.kind = new Kind(src.kind); + if (!shallowCopy && src.submodelElements != null) + { + if (this.submodelElements == null) + this.submodelElements = new List(); + foreach (var smw in src.submodelElements) + this.submodelElements.Add(new SubmodelElementWrapper(smw.submodelElement, shallowCopy)); + } + } + + public static Submodel CreateNew(string idType, string id, string version = null, string revision = null) + { + var s = new Submodel(); + s.identification.idType = idType; + s.identification.id = id; + if (version != null) + { + if (s.administration == null) + s.administration = new Administration(); + s.administration.version = version; + s.administration.revision = revision; + } + return (s); + } + + public override string GetElementName() + { + return "Submodel"; + } + + public Reference GetReference() + { + SubmodelRef l = new SubmodelRef(); + l.Keys.Add( + Key.CreateNew(this.GetElementName(), true, this.identification.idType, this.identification.id)); + return l; + } + + public void Add(SubmodelElement se) + { + if (submodelElements == null) + submodelElements = new List(); + var sew = new SubmodelElementWrapper(); + se.parent = this; // track parent here! + sew.submodelElement = se; + submodelElements.Add(sew); + } + + public void AddDataSpecification(Key k) + { + if (hasDataSpecification == null) + hasDataSpecification = new HasDataSpecification(); + var r = new Reference(); + r.Keys.Add(k); + hasDataSpecification.reference.Add(r); + } + + public SubmodelElementWrapper FindSubmodelElementWrapper(string idShort) + { + if (this.submodelElements == null) + return null; + foreach (var smw in this.submodelElements) + if (smw.submodelElement != null) + if (smw.submodelElement.idShort.Trim().ToLower() == idShort.Trim().ToLower()) + return smw; + return null; + } + + public Tuple ToCaptionInfo() + { + var caption = AdminShellUtilV10.EvalToNonNullString("\"{0}\" ", idShort, ""); + if (administration != null) + caption += "V" + administration.version + "." + administration.revision; + var info = ""; + if (identification != null) + info = $"[{identification.idType}, {identification.id}]"; + return Tuple.Create(caption, info); + } + + public override string ToString() + { + var ci = ToCaptionInfo(); + return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); + } + + // Recursing + + private void RecurseOnSubmodelElementsRecurse( + List wrappers, object state, List parents, + Action, SubmodelElement> lambda) + { + // trivial + if (wrappers == null || parents == null || lambda == null) + return; + + // over all elements + foreach (var smw in wrappers) + { + var current = smw.submodelElement; + if (current == null) + continue; + + // call lambda for this element + lambda(state, parents, current); + + // add to parents + parents.Add(current); + + // dive into? + if (current is SubmodelElementCollection) + { + var smc = current as SubmodelElementCollection; + RecurseOnSubmodelElementsRecurse(smc.value, state, parents, lambda); + } + + if (current is Operation) + { + var op = current as Operation; + for (int i = 0; i < 2; i++) + RecurseOnSubmodelElementsRecurse(Operation.GetWrappers(op[i]), state, parents, lambda); + } + + // remove from parents + parents.RemoveAt(parents.Count - 1); + } + } + + public void RecurseOnSubmodelElements( + object state, Action, SubmodelElement> lambda) + { + RecurseOnSubmodelElementsRecurse(this.submodelElements, state, new List(), lambda); + } + + // Parents stuff + + private static void SetParentsForSME(Referable parent, SubmodelElement se) + { + se.parent = parent; + var smc = se as SubmodelElementCollection; + if (smc != null) + foreach (var sme in smc.value) + SetParentsForSME(se, sme.submodelElement); + } + + public void SetAllParents() + { + if (this.submodelElements != null) + foreach (var sme in this.submodelElements) + SetParentsForSME(this, sme.submodelElement); + } + + } + + // + // Derived from SubmodelElements + // + + public class DataElement : SubmodelElement + { + + public DataElement() { } + + public DataElement(DataElement src) + : base(src) + { } + + public override string GetElementName() + { + return "DataElement"; + } + } + + public class JsonValueTypeCast + { + + public class JsonDataObjectType + { + [JsonProperty(PropertyName = "name")] + public string name = ""; + } + + [JsonProperty(PropertyName = "dataObjectType")] + public JsonDataObjectType dataObjectType = new JsonDataObjectType(); + + public JsonValueTypeCast(string name) + { + this.dataObjectType.name = name; + } + } + + public class Property : DataElement + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public new JsonModelTypeWrapper JsonModelType + { + get { return new JsonModelTypeWrapper(GetElementName()); } + } + + // members + + [JsonIgnore] + public string valueType = ""; + [XmlIgnore] + [JsonProperty(PropertyName = "valueType")] + public JsonValueTypeCast JsonValueType + { + get { return new JsonValueTypeCast(this.valueType); } + set { this.valueType = value?.dataObjectType?.name; } + } + + + public string value = ""; + public Reference valueId = null; + + // constructors + + public Property() { } + + public Property(Property src) + : base(src) + { + this.valueType = src.valueType; + this.value = src.value; + if (src.valueId != null) + src.valueId = new Reference(src.valueId); + } + + public static Property CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) + { + var x = new Property(); + x.CreateNewLogic(idShort, category, semanticIdKey); + return (x); + } + + public void Set(string valueType = "", string value = "") + { + this.valueType = valueType; + this.value = value; + } + + public void Set(string type, bool local, string idType, string value) + { + this.valueId = Reference.CreateNew(Key.CreateNew(type, local, idType, value)); + } + + public override string GetElementName() + { + return "Property"; + } + } + + public class Blob : DataElement + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public new JsonModelTypeWrapper JsonModelType + { + get { return new JsonModelTypeWrapper(GetElementName()); } + } + + // members + + public string mimeType = ""; + public string value = ""; + + // constructors + + public Blob() { } + + public Blob(Blob src) + : base(src) + { + this.mimeType = src.mimeType; + this.value = src.value; + } + + public static Blob CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) + { + var x = new Blob(); + x.CreateNewLogic(idShort, category, semanticIdKey); + return (x); + } + + public void Set(string mimeType = "", string value = "") + { + this.mimeType = mimeType; + this.value = value; + } + + public override string GetElementName() + { + return "Blob"; + } + + } + + public class File : DataElement + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public new JsonModelTypeWrapper JsonModelType + { + get { return new JsonModelTypeWrapper(GetElementName()); } + } + + // members + + public string mimeType = ""; + public string value = ""; + + // constructors + + public File() { } + + public File(File src) + : base(src) + { + this.mimeType = src.mimeType; + this.value = src.value; + } + + public static File CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) + { + var x = new File(); + x.CreateNewLogic(idShort, category, semanticIdKey); + return (x); + } + + public void Set(string mimeType = "", string value = "") + { + this.mimeType = mimeType; + this.value = value; + } + + public override string GetElementName() + { + return "File"; + } + + public static string[] GetPopularMimeTypes() + { + return + new string[] { + System.Net.Mime.MediaTypeNames.Text.Plain, + System.Net.Mime.MediaTypeNames.Text.Xml, + System.Net.Mime.MediaTypeNames.Text.Html, + "application/json", + "application/rdf+xml", + System.Net.Mime.MediaTypeNames.Application.Pdf, + System.Net.Mime.MediaTypeNames.Image.Jpeg, + "image/png", + System.Net.Mime.MediaTypeNames.Image.Gif, + "application/iges", + "application/step" + }; + } + } + + public class ReferenceElement : DataElement + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public new JsonModelTypeWrapper JsonModelType + { + get { return new JsonModelTypeWrapper(GetElementName()); } + } + + // members + + public Reference value = new Reference(); + + // constructors + + public ReferenceElement() { } + + public ReferenceElement(ReferenceElement src) + : base(src) + { + if (src.value != null) + this.value = new Reference(src.value); + } + + public static ReferenceElement CreateNew( + string idShort = null, string category = null, Key semanticIdKey = null) + { + var x = new ReferenceElement(); + x.CreateNewLogic(idShort, category, semanticIdKey); + return (x); + } + + public void Set(Reference value = null) + { + this.value = value; + } + + public override string GetElementName() + { + return "ReferenceElement"; + } + + } + + public class RelationshipElement : DataElement + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public new JsonModelTypeWrapper JsonModelType + { + get { return new JsonModelTypeWrapper(GetElementName()); } + } + + // members + + public Reference first = new Reference(); + public Reference second = new Reference(); + + // constructors + + public RelationshipElement() { } + + public RelationshipElement(RelationshipElement src) + : base(src) + { + if (src.first != null) + this.first = new Reference(src.first); + if (src.second != null) + this.second = new Reference(src.second); + } + + public static RelationshipElement CreateNew( + string idShort = null, string category = null, Key semanticIdKey = null) + { + var x = new RelationshipElement(); + x.CreateNewLogic(idShort, category, semanticIdKey); + return (x); + } + + public void Set(Reference first = null, Reference second = null) + { + this.first = first; + this.second = second; + } + + public override string GetElementName() + { + return "RelationshipElement"; + } + } + + public class SubmodelElementCollection : SubmodelElement + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public new JsonModelTypeWrapper JsonModelType + { + get { return new JsonModelTypeWrapper(GetElementName()); } + } + + // members + [JsonIgnore] + public List value = new List(); + + [XmlIgnore] + [JsonProperty(PropertyName = "value")] + public SubmodelElement[] JsonValue + { + get + { + var res = new List(); + if (value != null) + foreach (var smew in value) + res.Add(smew.submodelElement); + return res.ToArray(); + } + set + { + if (value != null) + { + this.value = new List(); + foreach (var x in value) + { + var smew = new SubmodelElementWrapper(); + smew.submodelElement = x; + this.value.Add(smew); + } + } + } + } + + // further members + public bool ordered = false; + public bool allowDuplicates = false; + + // constructors + + public SubmodelElementCollection() { } + + public SubmodelElementCollection(SubmodelElementCollection src, bool shallowCopy = false) + : base(src) + { + this.ordered = src.ordered; + this.allowDuplicates = src.allowDuplicates; + if (!shallowCopy) + foreach (var smw in src.value) + value.Add(new SubmodelElementWrapper(smw.submodelElement)); + } + + public static SubmodelElementCollection CreateNew( + string idShort = null, string category = null, Key semanticIdKey = null) + { + var x = new SubmodelElementCollection(); + x.CreateNewLogic(idShort, category, semanticIdKey); + return (x); + } + + public void Set(bool allowDuplicates = false, bool ordered = false) + { + this.allowDuplicates = allowDuplicates; + this.ordered = ordered; + } + + public void Add(SubmodelElement se) + { + if (value == null) + value = new List(); + var sew = new SubmodelElementWrapper(); + se.parent = this; // track parent here! + sew.submodelElement = se; + value.Add(sew); + } + + public SubmodelElementWrapper FindSubmodelElementWrapper(string idShort) + { + if (this.value == null) + return null; + foreach (var smw in this.value) + if (smw.submodelElement != null) + if (smw.submodelElement.idShort.Trim().ToLower() == idShort.Trim().ToLower()) + return smw; + return null; + } + + public override string GetElementName() + { + return "SubmodelElementCollection"; + } + } + + public class OperationVariable : SubmodelElement + { + public enum Direction { In, Out }; + + // Note: for OperationVariable, the values of the SubmodelElement itself ARE NOT TO BE USED! + // only the SME attributes of "value" are counting + + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public new JsonModelTypeWrapper JsonModelType + { + get { return new JsonModelTypeWrapper(GetElementName()); } + } + + // members + public SubmodelElementWrapper value = null; + + // constructors + + public OperationVariable() + { + this.kind = new Kind("Type"); + } + + public OperationVariable(OperationVariable src, bool shallowCopy = false) + : base(src) + { + this.value = new SubmodelElementWrapper(src.value.submodelElement, shallowCopy); + } + + public OperationVariable(SubmodelElement elem) + : base() + { + this.value = new SubmodelElementWrapper(elem); + } + + public override string GetElementName() + { + return "OperationVariable"; + } + } + + public class Operation : SubmodelElement + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public new JsonModelTypeWrapper JsonModelType + { + get { return new JsonModelTypeWrapper(GetElementName()); } + } + + // members + [JsonIgnore] + [XmlElement(ElementName = "in")] + public List valueIn = new List(); + + [JsonIgnore] + [XmlElement(ElementName = "out")] + public List valueOut = new List(); + + [XmlIgnore] + // MICHA 190504: enabled JSON operation variables! + [JsonProperty(PropertyName = "in")] + public OperationVariable[] JsonValueIn + { + get { return valueIn?.ToArray(); } + set { valueIn = (value != null) ? new List(value) : null; } + } + + [XmlIgnore] + [JsonProperty(PropertyName = "out")] + // MICHA 190504: enabled JSON operation variables! + public OperationVariable[] JsonValueOut + { + get { return valueOut?.ToArray(); } + set { valueOut = (value != null) ? new List(value) : null; } + } + + public List this[OperationVariable.Direction dir] + { + get + { + return (dir == OperationVariable.Direction.In) ? valueIn : valueOut; + } + set + { + if (dir == OperationVariable.Direction.In) + valueIn = value; + else + valueOut = value; + } + } + + public List this[int dir] + { + get + { + return (dir == 0) ? valueIn : valueOut; + } + set + { + if (dir == 0) + valueIn = value; + else + valueOut = value; + } + } + + public static List GetWrappers(List ovl) + { + var res = new List(); + foreach (var ov in ovl) + if (ov.value != null) + res.Add(ov.value); + return res; + } + + // constructors + + public Operation() { } + + public Operation(Operation src) + : base(src) + { + for (int i = 0; i < 2; i++) + if (src[i] != null) + { + if (this[i] == null) + this[i] = new List(); + foreach (var ov in src[i]) + this[i].Add(ov); + } + } + + + public override string GetElementName() + { + return "Operation"; + } + } + + // + // Handling of packages + // + + /// + /// This converter is used for reading JSON files; it claims to be responsible for + /// "SubmodelElements" (the base class) + /// and decides, which sub-class of the base class shall be populated. + /// The decision, shich special sub-class to create is done in a factory + /// AdminShell.SubmodelElementWrapper.CreateAdequateType(), + /// in order to have all sub-class specific decisions in one place (SubmodelElementWrapper) + /// Remark: There is a NuGet package JsonSubTypes, which could have done the job, except the fact of having + /// "modelType" being a class property with a contained property "name". + /// + public class JsonAasxConverter : JsonConverter + { + private string UpperClassProperty = "modelType"; + private string LowerClassProperty = "name"; + + public JsonAasxConverter() : base() + { + } + + public JsonAasxConverter(string UpperClassProperty, string LowerClassProperty) : base() + { + this.UpperClassProperty = UpperClassProperty; + this.LowerClassProperty = LowerClassProperty; + } + + public override bool CanConvert(Type objectType) + { + if (typeof(AdminShellV10.SubmodelElement).IsAssignableFrom(objectType)) + return true; + return false; + } + + public override bool CanWrite + { + get { return false; } + } + + public override object ReadJson(JsonReader reader, + Type objectType, + object existingValue, + JsonSerializer serializer) + { + // Load JObject from stream + JObject jObject = JObject.Load(reader); + + // Create target object based on JObject + object target = new AdminShellV10.SubmodelElement(); + + if (jObject.ContainsKey(UpperClassProperty)) + { + var j2 = jObject[UpperClassProperty]; + foreach (var c in j2.Children()) + { + var cprop = c as Newtonsoft.Json.Linq.JProperty; + if (cprop == null) + continue; + if (cprop.Name == LowerClassProperty && + cprop.Value != null && + cprop.Value.Type.ToString() == "String") + { + var cpval = cprop.Value.ToObject(); + if (cpval == null) + continue; + var o = AdminShellV10.SubmodelElementWrapper.CreateAdequateType(cpval); + if (o != null) + target = o; + } + } + } + + // Populate the object properties + serializer.Populate(jObject.CreateReader(), target); + + return target; + } + + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + throw new NotImplementedException(); + } + } + + /// + /// This class lets an outer functionality keep track on the supplementary files, which are in or + /// are pending to be added or deleted to an Package. + /// + public class PackageSupplementaryFile : Referable + { + public enum LocationType { InPackage, AddPending, DeletePending } + + public enum SpecialHandlingType { None, EmbedAsThumbnail } + + public Uri uri = null; + public string sourcePath = null; + public LocationType location = LocationType.InPackage; + public SpecialHandlingType specialHandling = SpecialHandlingType.None; + + public PackageSupplementaryFile( + Uri uri, string sourcePath = null, LocationType location = LocationType.InPackage, + SpecialHandlingType specialHandling = SpecialHandlingType.None) + { + this.uri = uri; + this.sourcePath = sourcePath; + this.location = location; + this.specialHandling = specialHandling; + } + + // class derives from Referable in order to provide GetElementName + public override string GetElementName() + { + return "File"; + } + + } + + /// + /// This class encapsulates an AdminShellEnvironment and supplementary files into an AASX Package. + /// Specifically has the capability to load, update and store .XML, .JSON and .AASX packages. + /// + public class PackageEnv + { + private string fn = "New Package"; + private AdministrationShellEnv aasenv = new AdministrationShellEnv(); + private Package openPackage = null; + private List pendingFilesToAdd = new List(); + private List pendingFilesToDelete = new List(); + + public PackageEnv() + { + } + + public PackageEnv(AdministrationShellEnv env) + { + if (env != null) + this.aasenv = env; + } + + public PackageEnv(string fn) + { + Load(fn); + } + + public bool IsOpen + { + get + { + return openPackage != null; + } + } + + public string Filename + { + get + { + return fn; + } + } + + public AdminShellV10.AdministrationShellEnv AasEnv + { + get + { + return aasenv; + } + } + + public bool Load(string fn) + { + this.fn = fn; + if (this.openPackage != null) + this.openPackage.Close(); + this.openPackage = null; + + if (fn.ToLower().EndsWith(".xml")) + { + // load only XML + try + { + // TODO (Michael Hoffmeister, 1970-01-01): use aasenv serialzers here! + XmlSerializer serializer = new XmlSerializer( + typeof(AdminShellV10.AdministrationShellEnv), "http://www.admin-shell.io/aas/1/0"); + TextReader reader = new StreamReader(fn); + this.aasenv = serializer.Deserialize(reader) as AdminShellV10.AdministrationShellEnv; + if (this.aasenv == null) + throw (new Exception("Type error for XML file!")); + reader.Close(); + } + catch (Exception ex) + { + throw (new Exception( + string.Format("While reading AAS {0} at {1} gave: {2}", fn, + AdminShellUtilV10.ShortLocation(ex), ex.Message))); + } + return true; + } + + if (fn.ToLower().EndsWith(".json")) + { + // load only JSON + try + { + using (StreamReader file = System.IO.File.OpenText(fn)) + { + // TODO (Michael Hoffmeister, 1970-01-01): use aasenv serialzers here! + JsonSerializer serializer = new JsonSerializer(); + serializer.Converters.Add(new AdminShellV10.JsonAasxConverter("modelType", "name")); + this.aasenv = (AdministrationShellEnv)serializer.Deserialize( + file, typeof(AdministrationShellEnv)); + } + } + catch (Exception ex) + { + throw (new Exception( + string.Format("While reading AAS {0} at {1} gave: {2}", + fn, AdminShellUtilV10.ShortLocation(ex), ex.Message))); + } + return true; + } + + if (fn.ToLower().EndsWith(".aasx")) + { + // load package AASX + try + { + var package = Package.Open(fn, FileMode.Open); + + // get the origin from the package + PackagePart originPart = null; + var xs = package.GetRelationshipsByType( + "http://www.admin-shell.io/aasx/relationships/aasx-origin"); + foreach (var x in xs) + if (x.SourceUri.ToString() == "/") + { + originPart = package.GetPart(x.TargetUri); + break; + } + if (originPart == null) + throw (new Exception(string.Format("Unable to find AASX origin. Aborting!"))); + + // get the specs from the package + PackagePart specPart = null; + xs = originPart.GetRelationshipsByType( + "http://www.admin-shell.io/aasx/relationships/aas-spec"); + foreach (var x in xs) + { + specPart = package.GetPart(x.TargetUri); + break; + } + if (specPart == null) + throw (new Exception(string.Format("Unable to find AASX spec(s). Aborting!"))); + + // open spec part to read + try + { + if (specPart.Uri.ToString().ToLower().Trim().EndsWith("json")) + { + using (var s = specPart.GetStream(FileMode.Open)) + { + using (StreamReader file = new StreamReader(s)) + { + JsonSerializer serializer = new JsonSerializer(); + serializer.Converters.Add( + new AdminShellV10.JsonAasxConverter("modelType", "name")); + this.aasenv = (AdministrationShellEnv)serializer.Deserialize( + file, typeof(AdministrationShellEnv)); + } + } + } + else + { + using (var s = specPart.GetStream(FileMode.Open)) + { + // own catch loop to be more specific + XmlSerializer serializer = new XmlSerializer( + typeof(AdminShellV10.AdministrationShellEnv), + "http://www.admin-shell.io/aas/1/0"); + this.aasenv = serializer.Deserialize(s) as AdminShellV10.AdministrationShellEnv; + this.openPackage = package; + if (this.aasenv == null) + throw (new Exception("Type error for XML file!")); + s.Close(); + } + } + } + catch (Exception ex) + { + throw (new Exception( + string.Format("While reading AAS {0} spec at {1} gave: {2}", + fn, AdminShellUtilV10.ShortLocation(ex), ex.Message))); + } + } + catch (Exception ex) + { + throw (new Exception( + string.Format("While reading AASX {0} at {1} gave: {2}", fn, + AdminShellUtilV10.ShortLocation(ex), ex.Message))); + } + return true; + } + + // Don't know to handle + throw (new Exception(string.Format($"Not able to handle {fn}."))); + } + + public bool LoadFromAasEnvString(string content) + { + try + { + using (var file = new StringReader(content)) + { + // TODO (Michael Hoffmeister, 1970-01-01): use aasenv serialzers here! + JsonSerializer serializer = new JsonSerializer(); + serializer.Converters.Add(new AdminShellV10.JsonAasxConverter("modelType", "name")); + this.aasenv = (AdministrationShellEnv)serializer.Deserialize( + file, typeof(AdministrationShellEnv)); + } + } + catch (Exception ex) + { + throw (new Exception( + string.Format("While reading AASENV string {0} gave: {1}", + AdminShellUtilV10.ShortLocation(ex), ex.Message))); + } + return true; + } + + public enum PreferredFormat { None, Xml, Json }; + + public bool SaveAs(string fn, bool writeFreshly = false, PreferredFormat prefFmt = PreferredFormat.None) + { + + if (fn.ToLower().EndsWith(".xml")) + { + // save only XML + this.fn = fn; + try + { + using (var s = new StreamWriter(this.fn)) + { + // TODO (Michael Hoffmeister, 1970-01-01): use aasenv serialzers here! + var serializer = new XmlSerializer(typeof(AdminShellV10.AdministrationShellEnv)); + var nss = new XmlSerializerNamespaces(); + nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace); + nss.Add("aas", "http://www.admin-shell.io/aas/1/0"); + nss.Add("IEC61360", "http://www.admin-shell.io/IEC61360/1/0"); + serializer.Serialize(s, this.aasenv, nss); + } + } + catch (Exception ex) + { + throw (new Exception( + string.Format("While writing AAS {0} at {1} gave: {2}", + fn, AdminShellUtilV10.ShortLocation(ex), ex.Message))); + } + return true; + } + + if (fn.ToLower().EndsWith(".json")) + { + // save only JSON + // this funcitonality is a initial test + this.fn = fn; + try + { + using (var sw = new StreamWriter(fn)) + { + // TODO (Michael Hoffmeister, 1970-01-01): use aasenv serialzers here! + + sw.AutoFlush = true; + + JsonSerializer serializer = new JsonSerializer(); + serializer.NullValueHandling = NullValueHandling.Ignore; + serializer.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; + serializer.Formatting = Newtonsoft.Json.Formatting.Indented; + using (JsonWriter writer = new JsonTextWriter(sw)) + { + serializer.Serialize(writer, this.aasenv); + } + } + } + catch (Exception ex) + { + throw (new Exception( + string.Format("While writing AAS {0} at {1} gave: {2}", + fn, AdminShellUtilV10.ShortLocation(ex), ex.Message))); + } + return true; + } + + if (fn.ToLower().EndsWith(".aasx")) + { + // save package AASX + try + { + // we want existing contents to be preserved, but no possiblity to change file name + // therefore: copy file to new name, re-open! + // fn could be changed, therefore close "old" package first + if (this.openPackage != null) + { + try + { + this.openPackage.Close(); + if (!writeFreshly) + System.IO.File.Copy(this.fn, fn); + } + catch { } + this.openPackage = null; + } + + // approach is to utilize the existing package, if possible. If not, create from scratch + var package = Package.Open(fn, (writeFreshly) ? FileMode.Create : FileMode.OpenOrCreate); + this.fn = fn; + + // get the origin from the package + PackagePart originPart = null; + var xs = package.GetRelationshipsByType( + "http://www.admin-shell.io/aasx/relationships/aasx-origin"); + foreach (var x in xs) + if (x.SourceUri.ToString() == "/") + { + originPart = package.GetPart(x.TargetUri); + break; + } + if (originPart == null) + { + // create, as not existing + originPart = package.CreatePart( + new Uri( + "/aasx/aasx-origin", UriKind.RelativeOrAbsolute), + System.Net.Mime.MediaTypeNames.Text.Plain, CompressionOption.Maximum); + using (var s = originPart.GetStream(FileMode.Create)) + { + var bytes = System.Text.Encoding.ASCII.GetBytes("Intentionally empty."); + s.Write(bytes, 0, bytes.Length); + } + package.CreateRelationship( + originPart.Uri, TargetMode.Internal, + "http://www.admin-shell.io/aasx/relationships/aasx-origin"); + } + + // get the specs from the package + PackagePart specPart = null; + PackageRelationship specRel = null; + xs = originPart.GetRelationshipsByType( + "http://www.admin-shell.io/aasx/relationships/aas-spec"); + foreach (var x in xs) + { + specRel = x; + specPart = package.GetPart(x.TargetUri); + break; + } + + // check, if we have to change the spec part + if (specPart != null && specRel != null) + { + var name = System.IO.Path.GetFileNameWithoutExtension( + specPart.Uri.ToString()).ToLower().Trim(); + var ext = System.IO.Path.GetExtension(specPart.Uri.ToString()).ToLower().Trim(); + if ((ext == ".json" && prefFmt == PreferredFormat.Xml) + || (ext == ".xml" && prefFmt == PreferredFormat.Json) + || (name.StartsWith("aasenv-with-no-id"))) + { + // try kill specpart + try + { + originPart.DeleteRelationship(specRel.Id); + package.DeletePart(specPart.Uri); + } + catch { } + finally { specPart = null; specRel = null; } + } + } + + if (specPart == null) + { + // create, as not existing + var frn = "aasenv-with-no-id"; + if (this.aasenv.AdministrationShells.Count > 0) + frn = this.aasenv.AdministrationShells[0].GetFriendlyName() ?? frn; + var aas_spec_fn = "/aasx/#/#.aas"; + if (prefFmt == PreferredFormat.Json) + aas_spec_fn += ".json"; + else + aas_spec_fn += ".xml"; + aas_spec_fn = aas_spec_fn.Replace("#", "" + frn); + specPart = package.CreatePart( + new Uri( + aas_spec_fn, UriKind.RelativeOrAbsolute), System.Net.Mime.MediaTypeNames.Text.Xml, + CompressionOption.Maximum); + originPart.CreateRelationship( + specPart.Uri, TargetMode.Internal, + "http://www.admin-shell.io/aasx/relationships/aas-spec"); + } + + // now, specPart shall be != null! + if (specPart.Uri.ToString().ToLower().Trim().EndsWith("json")) + { + using (var s = specPart.GetStream(FileMode.Create)) + { + JsonSerializer serializer = new JsonSerializer(); + serializer.NullValueHandling = NullValueHandling.Ignore; + serializer.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; + serializer.Formatting = Newtonsoft.Json.Formatting.Indented; + using (var sw = new StreamWriter(s)) + { + using (JsonWriter writer = new JsonTextWriter(sw)) + { + serializer.Serialize(writer, this.aasenv); + } + } + } + } + else + { + using (var s = specPart.GetStream(FileMode.Create)) + { + var serializer = new XmlSerializer(typeof(AdminShellV10.AdministrationShellEnv)); + var nss = new XmlSerializerNamespaces(); + nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace); + nss.Add("aas", "http://www.admin-shell.io/aas/1/0"); + nss.Add("IEC61360", "http://www.admin-shell.io/IEC61360/1/0"); + serializer.Serialize(s, this.aasenv, nss); + } + } + + // there might be pending files to be deleted (first delete, then add, in case of identical + // files in both categories) + foreach (var psfDel in pendingFilesToDelete) + { + // try find an existing part for that file .. + var found = false; + + // normal files + xs = specPart.GetRelationshipsByType( + "http://www.admin-shell.io/aasx/relationships/aas-suppl"); + foreach (var x in xs) + if (x.TargetUri == psfDel.uri) + { + // try to delete + specPart.DeleteRelationship(x.Id); + package.DeletePart(psfDel.uri); + found = true; + break; + } + + // thumbnails + xs = package.GetRelationshipsByType( + "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); + foreach (var x in xs) + if (x.TargetUri == psfDel.uri) + { + // try to delete + package.DeleteRelationship(x.Id); + package.DeletePart(psfDel.uri); + found = true; + break; + } + + if (!found) + throw (new Exception( + $"Not able to delete pending file {psfDel.uri} in saving package {fn}")); + } + + // after this, there are no more pending for delete files + pendingFilesToDelete.Clear(); + + // write pending supplementary files + foreach (var psfAdd in pendingFilesToAdd) + { + // make sure .. + if (psfAdd.sourcePath == null || + psfAdd.location != PackageSupplementaryFile.LocationType.AddPending) + continue; + + // normal file? + if (psfAdd.specialHandling == PackageSupplementaryFile.SpecialHandlingType.None) + { + + // try find an existing part for that file .. + PackagePart filePart = null; + xs = specPart.GetRelationshipsByType( + "http://www.admin-shell.io/aasx/relationships/aas-suppl"); + foreach (var x in xs) + if (x.TargetUri == psfAdd.uri) + { + filePart = package.GetPart(x.TargetUri); + break; + } + + if (filePart == null) + { + // create new part and link + filePart = package.CreatePart( + psfAdd.uri, AdminShellV10.PackageEnv.GuessMimeType(psfAdd.sourcePath), + CompressionOption.Maximum); + specPart.CreateRelationship( + filePart.Uri, TargetMode.Internal, + "http://www.admin-shell.io/aasx/relationships/aas-suppl"); + } + + // now should be able to write + using (var s = filePart.GetStream(FileMode.Create)) + { + var bytes = System.IO.File.ReadAllBytes(psfAdd.sourcePath); + s.Write(bytes, 0, bytes.Length); + } + } + + // thumbnail file? + if (psfAdd.specialHandling == + PackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail) + { + // try find an existing part for that file .. + PackagePart filePart = null; + xs = package.GetRelationshipsByType( + "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); + foreach (var x in xs) + if (x.SourceUri.ToString() == "/" && x.TargetUri == psfAdd.uri) + { + filePart = package.GetPart(x.TargetUri); + break; + } + + if (filePart == null) + { + // create new part and link + filePart = package.CreatePart( + psfAdd.uri, AdminShellV10.PackageEnv.GuessMimeType(psfAdd.sourcePath), + CompressionOption.Maximum); + package.CreateRelationship( + filePart.Uri, TargetMode.Internal, + "http://schemas.openxmlformats.org/package/2006/" + + "relationships/metadata/thumbnail"); + } + + // now should be able to write + using (var s = filePart.GetStream(FileMode.Create)) + { + var bytes = System.IO.File.ReadAllBytes(psfAdd.sourcePath); + s.Write(bytes, 0, bytes.Length); + } + } + } + + // after this, there are no more pending for add files + pendingFilesToAdd.Clear(); + + // flush, but leave open + package.Flush(); + this.openPackage = package; + } + catch (Exception ex) + { + throw (new Exception( + string.Format("While write AASX {0} at {1} gave: {2}", + fn, AdminShellUtilV10.ShortLocation(ex), ex.Message))); + } + return true; + } + + // Don't know to handle + throw (new Exception(string.Format($"Not able to handle {fn}."))); + } + + private int BackupIndex = 0; + + public void BackupInDir(string backupDir, int maxFiles) + { + // access + if (backupDir == null || maxFiles < 1) + return; + + // we do it not caring on any errors + try + { + // get index in form + if (BackupIndex == 0) + { + // do not always start at 0!! + var rnd = new Random(); + BackupIndex = rnd.Next(maxFiles); + } + var ndx = BackupIndex % maxFiles; + BackupIndex += 1; + + // build a filename + var fn = Path.Combine(backupDir, $"backup{ndx:000}.xml"); + + // raw save + using (var s = new StreamWriter(fn)) + { + var serializer = new XmlSerializer(typeof(AdminShellV10.AdministrationShellEnv)); + var nss = new XmlSerializerNamespaces(); + nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace); + nss.Add("aas", "http://www.admin-shell.io/aas/1/0"); + nss.Add("IEC61360", "http://www.admin-shell.io/IEC61360/1/0"); + serializer.Serialize(s, this.aasenv, nss); + } + } + catch { } + } + + public Stream GetLocalStreamFromPackage(string uriString) + { + // access + if (this.openPackage == null) + throw (new Exception(string.Format($"AASX Package {this.fn} not opened. Aborting!"))); + var part = this.openPackage.GetPart(new Uri(uriString, UriKind.RelativeOrAbsolute)); + if (part == null) + throw (new Exception( + string.Format( + $"Cannot access URI {uriString} in {this.fn} not opened. Aborting!"))); + return part.GetStream(FileMode.Open); + } + + public long GetStreamSizeFromPackage(string uriString) + { + long res = 0; + try + { + if (this.openPackage == null) + return 0; + var part = this.openPackage.GetPart(new Uri(uriString, UriKind.RelativeOrAbsolute)); + if (part == null) + return 0; + using (var s = part.GetStream(FileMode.Open)) + { + res = s.Length; + } + } + catch { return 0; } + return res; + } + + public Stream GetLocalThumbnailStream(ref Uri thumbUri) + { + // access + if (this.openPackage == null) + throw (new Exception(string.Format($"AASX Package {this.fn} not opened. Aborting!"))); + // get the thumbnail over the relationship + PackagePart thumbPart = null; + var xs = this.openPackage.GetRelationshipsByType( + "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); + foreach (var x in xs) + if (x.SourceUri.ToString() == "/") + { + thumbPart = this.openPackage.GetPart(x.TargetUri); + thumbUri = x.TargetUri; + break; + } + if (thumbPart == null) + throw (new Exception(string.Format("Unable to find AASX thumbnail. Aborting!"))); + return thumbPart.GetStream(FileMode.Open); + } + + public Stream GetLocalThumbnailStream() + { + Uri dummy = null; + return GetLocalThumbnailStream(ref dummy); + } + + public List GetListOfSupplementaryFiles() + { + // new result + var result = new List(); + + // access + if (this.openPackage != null) + { + + // get the thumbnail(s) from the package + var xs = this.openPackage.GetRelationshipsByType( + "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); + foreach (var x in xs) + if (x.SourceUri.ToString() == "/") + { + result.Add(new PackageSupplementaryFile( + x.TargetUri, + location: PackageSupplementaryFile.LocationType.InPackage, + specialHandling: PackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail)); + } + + // get the origin from the package + PackagePart originPart = null; + xs = this.openPackage.GetRelationshipsByType( + "http://www.admin-shell.io/aasx/relationships/aasx-origin"); + foreach (var x in xs) + if (x.SourceUri.ToString() == "/") + { + originPart = this.openPackage.GetPart(x.TargetUri); + break; + } + + if (originPart != null) + { + // get the specs from the origin + PackagePart specPart = null; + xs = originPart.GetRelationshipsByType( + "http://www.admin-shell.io/aasx/relationships/aas-spec"); + foreach (var x in xs) + { + specPart = this.openPackage.GetPart(x.TargetUri); + break; + } + + if (specPart != null) + { + // get the supplementaries from the package, derived from spec + xs = specPart.GetRelationshipsByType( + "http://www.admin-shell.io/aasx/relationships/aas-suppl"); + foreach (var x in xs) + { + result.Add( + new PackageSupplementaryFile( + x.TargetUri, location: PackageSupplementaryFile.LocationType.InPackage)); + } + } + } + } + + // add or modify the files to delete + foreach (var psfDel in pendingFilesToDelete) + { + // already in + var found = result.Find(x => { return x.uri == psfDel.uri; }); + if (found != null) + found.location = PackageSupplementaryFile.LocationType.DeletePending; + else + { + psfDel.location = PackageSupplementaryFile.LocationType.DeletePending; + result.Add(psfDel); + } + } + + // add the files to store as well + foreach (var psfAdd in pendingFilesToAdd) + { + // already in (should not happen ?!) + var found = result.Find(x => { return x.uri == psfAdd.uri; }); + if (found != null) + found.location = PackageSupplementaryFile.LocationType.AddPending; + else + { + psfAdd.location = PackageSupplementaryFile.LocationType.AddPending; + result.Add(psfAdd); + } + } + + // done + return result; + } + + public static string GuessMimeType(string fn) + { + var file_ext = System.IO.Path.GetExtension(fn).ToLower().Trim(); + var content_type = System.Net.Mime.MediaTypeNames.Text.Plain; + if (file_ext == ".pdf") content_type = System.Net.Mime.MediaTypeNames.Application.Pdf; + if (file_ext == ".xml") content_type = System.Net.Mime.MediaTypeNames.Text.Xml; + if (file_ext == ".txt") content_type = System.Net.Mime.MediaTypeNames.Text.Plain; + if (file_ext == ".igs") content_type = "application/iges"; + if (file_ext == ".iges") content_type = "application/iges"; + if (file_ext == ".stp") content_type = "application/step"; + if (file_ext == ".step") content_type = "application/step"; + if (file_ext == ".jpg") content_type = System.Net.Mime.MediaTypeNames.Image.Jpeg; + if (file_ext == ".jpeg") content_type = System.Net.Mime.MediaTypeNames.Image.Jpeg; + if (file_ext == ".png") content_type = "image/png"; + if (file_ext == ".gif") content_type = System.Net.Mime.MediaTypeNames.Image.Gif; + return content_type; + } + + public void AddSupplementaryFileToStore( + string sourcePath, string targetDir, string targetFn, bool embedAsThumb) + { + // beautify parameters + sourcePath = sourcePath.Trim(); + targetDir = targetDir.Trim(); + if (!targetDir.EndsWith("/")) + targetDir += "/"; + targetDir = targetDir.Replace(@"\", "/"); + targetFn = targetFn.Trim(); + if (sourcePath == "" || targetDir == "" || targetFn == "") + throw (new Exception(string.Format("Trying add supplementary file with empty name or path!"))); + + var file_fn = "" + targetDir.Trim() + targetFn.Trim(); + + // add record + pendingFilesToAdd.Add( + new PackageSupplementaryFile( + new Uri(file_fn, UriKind.RelativeOrAbsolute), + sourcePath, + location: PackageSupplementaryFile.LocationType.AddPending, + specialHandling: ( + embedAsThumb + ? PackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail + : PackageSupplementaryFile.SpecialHandlingType.None) + )); + } + + public void DeleteSupplementaryFile(PackageSupplementaryFile psf) + { + if (psf == null) + throw (new Exception(string.Format("No supplementary file given!"))); + + if (psf.location == PackageSupplementaryFile.LocationType.AddPending) + { + // is still pending in add list -> remove + pendingFilesToAdd.RemoveAll((x) => { return x.uri == psf.uri; }); + } + + if (psf.location == PackageSupplementaryFile.LocationType.InPackage) + { + // add to pending delete list + pendingFilesToDelete.Add(psf); + } + } + + public void Close() + { + if (this.openPackage != null) + this.openPackage.Close(); + this.openPackage = null; + this.fn = ""; + this.aasenv = null; + } + } + + } + + #endregion +} + +#endif diff --git a/src/AasxCsharpLib_bkp/AasxCompatibilityModels/V20/AdminShell.cs b/src/AasxCsharpLib_bkp/AasxCompatibilityModels/V20/AdminShell.cs new file mode 100644 index 000000000..5aa491279 --- /dev/null +++ b/src/AasxCsharpLib_bkp/AasxCompatibilityModels/V20/AdminShell.cs @@ -0,0 +1,8899 @@ +/* +Copyright (c) 2018-2021 Festo AG & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ + +using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Globalization; +using System.IO; +using System.IO.Packaging; +using System.Linq; +using System.Reflection; +using System.Runtime; +using System.Text; +using System.Text.RegularExpressions; +using System.Xml; +using System.Xml.Serialization; +using AdminShell_V20; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +//namespace AdminShellNS +//namespace AdminShell_V20 +namespace AasxCompatibilityModels +{ + /// + /// This empty class derives always from the current version of the Administration Shell class hierarchy. + /// + public class AdminShell : AdminShellV20 { } + + #region AdminShell_V2_0 + + /// + /// Version of Details of Administration Shell Part 1 V1.0 published Nov/Dec/Jan 2018/19 + /// + public class AdminShellV20 + { + public class Identification + { + + // members + + [XmlAttribute] + [CountForHash] + public string idType = ""; + + [XmlText] + [CountForHash] + public string id = ""; + + // some constants + + public static string IRDI = "IRDI"; + public static string IRI = "IRI"; + public static string IdShort = "IdShort"; + + // constructors + + public Identification() { } + + public Identification(Identification src) + { + this.idType = src.idType; + this.id = src.id; + } + +#if !DoNotUseAasxCompatibilityModels + public Identification(AasxCompatibilityModels.AdminShellV10.Identification src) + { + this.idType = src.idType; + if (this.idType.Trim().ToLower() == "uri") + this.idType = Identification.IRI; + this.id = src.id; + } +#endif + + public Identification(string idType, string id) + { + this.idType = idType; + this.id = id; + } + + public Identification(Key key) + { + this.idType = key.idType; + this.id = key.value; + } + + // Creator with validation + + public static Identification CreateNew(string idType, string id) + { + if (idType == null || id == null) + return null; + var found = false; + foreach (var x in Key.IdentifierTypeNames) + found = found || idType.ToLower().Trim() == x.ToLower().Trim(); + if (!found) + return null; + return new Identification(idType, id); + } + + // further + + public bool IsEqual(Identification other) + { + return (this.idType.Trim().ToLower() == other.idType.Trim().ToLower() + && this.id.Trim().ToLower() == other.id.Trim().ToLower()); + } + + public bool IsIRI() + { + return idType?.Trim().ToUpper() == "URI" + || idType?.Trim().ToUpper() == IRI; + } + + public bool IsIRDI() + { + return idType?.Trim().ToUpper() == IRDI; + } + + public override string ToString() + { + return $"[{this.idType}] {this.id}"; + } + } + + public class Administration + { + + // members + + [MetaModelName("Administration.version")] + [TextSearchable] + [CountForHash] + public string version = ""; + + [MetaModelName("Administration.revision")] + [TextSearchable] + [CountForHash] + public string revision = ""; + + // constructors + + public Administration() { } + + public Administration(Administration src) + { + this.version = src.version; + this.revision = src.revision; + } + +#if !DoNotUseAasxCompatibilityModels + public Administration(AasxCompatibilityModels.AdminShellV10.Administration src) + { + this.version = src.version; + this.revision = src.revision; + } +#endif + + public Administration(string version, string revision) + { + this.version = version; + this.revision = revision; + } + + public override string ToString() + { + return $"R={this.version}, V={this.revision}"; + } + } + + public class Key + { + // Constants + + public enum MatchMode { Strict, Relaxed, Identification }; + + // Members + + [MetaModelName("Key.type")] + [TextSearchable] + [XmlAttribute] + [CountForHash] + public string type = ""; + + [XmlAttribute] + [CountForHash] + public bool local = false; + + [MetaModelName("Key.idType")] + [TextSearchable] + [XmlAttribute] + [JsonIgnore] + [CountForHash] + public string idType = ""; + + [XmlIgnore] + [JsonProperty(PropertyName = "idType")] + public string JsonIdType + { + // adapt idShort <-> IdShort + get => (idType == "idShort") ? "IdShort" : idType; + set => idType = (value == "idShort") ? "IdShort" : value; + } + + [MetaModelName("Key.value")] + [TextSearchable] + [XmlText] + [CountForHash] + public string value = ""; + + [XmlIgnore] + [JsonProperty(PropertyName = "index")] + [CountForHash] + public int index = 0; + + public Key() + { + } + + public Key(Key src) + { + this.type = src.type; + this.local = src.local; + this.idType = src.idType; + this.value = src.value; + } + +#if !DoNotUseAasxCompatibilityModels + public Key(AasxCompatibilityModels.AdminShellV10.Key src) + { + this.type = src.type; + this.local = src.local; + this.idType = src.idType; + if (this.idType.Trim().ToLower() == "uri") + this.idType = Identification.IRI; + if (this.idType.Trim().ToLower() == "idshort") + this.idType = Identification.IdShort; + this.value = src.value; + } +#endif + + public Key(string type, bool local, string idType, string value) + { + this.type = type; + this.local = local; + this.idType = idType; + this.value = value; + } + + public static Key CreateNew(string type, bool local, string idType, string value) + { + var k = new Key() + { + type = type, + local = local, + idType = idType, + value = value + }; + return (k); + } + + public static Key GetFromRef(Reference r) + { + if (r == null || r.Count != 1) + return null; + return r[0]; + } + + public Identification ToId() + { + return new Identification(this); + } + + public string ToString(int format = 0) + { + if (format == 1) + { + return String.Format( + "({0})({1})[{2}]{3}", this.type, this.local ? "local" : "no-local", this.idType, this.value); + } + if (format == 2) + { + return String.Format("[{0}]{1}", this.idType, this.value); + } + + // (old) default + var tlc = (this.local) ? "Local" : "not Local"; + return $"[{this.type}, {tlc}, {this.idType}, {this.value}]"; + } + + public static Key Parse(string cell, string typeIfNotSet = null, + bool allowFmtAll = false, bool allowFmt0 = false, + bool allowFmt1 = false, bool allowFmt2 = false) + { + // access and defaults? + if (cell == null || cell.Trim().Length < 1) + return null; + if (typeIfNotSet == null) + typeIfNotSet = Key.GlobalReference; + + // format == 1 + if (allowFmtAll || allowFmt1) + { + var m = Regex.Match(cell, @"\((\w+)\)\((\S+)\)\[(\w+)\]( ?)(.*)$"); + if (m.Success) + { + return new AdminShell.Key( + m.Groups[1].ToString(), m.Groups[2].ToString() == "local", + m.Groups[3].ToString(), m.Groups[5].ToString()); + } + } + + // format == 2 + if (allowFmtAll || allowFmt2) + { + var m = Regex.Match(cell, @"\[(\w+)\]( ?)(.*)$"); + if (m.Success) + { + return new AdminShell.Key( + typeIfNotSet, true, + m.Groups[1].ToString(), m.Groups[3].ToString()); + } + } + + // format == 0 + if (allowFmtAll || allowFmt0) + { + var m = Regex.Match(cell, @"\[(\w+),( ?)([^,]+),( ?)\[(\w+)\],( ?)(.*)\]"); + if (m.Success) + { + return new AdminShell.Key( + m.Groups[1].ToString(), !m.Groups[3].ToString().Contains("not"), + m.Groups[5].ToString(), m.Groups[7].ToString()); + } + } + + // no + return null; + } + + public static string KeyListToString(List keys) + { + if (keys == null || keys.Count < 1) + return ""; + // normally, exactly one key + if (keys.Count == 1) + return keys[0].ToString(); + // multiple! + var s = "[ "; + foreach (var k in keys) + { + if (s.Length > 0) + s += ", "; + s += k.ToString(); + } + return s + " ]"; + } + + public static string[] KeyElements = new string[] { + "GlobalReference", + "FragmentReference", + "AccessPermissionRule", + "Asset", + "AssetAdministrationShell", + "ConceptDescription", + "Submodel", + "SubmodelRef", // not completely right, but used by Package Explorer + "Blob", + "ConceptDictionary", + "DataElement", + "File", + "Operation", + "OperationVariable", + "BasicEvent", + "Entity", + "Property", + "MultiLanguageProperty", + "Range", + "ReferenceElement", + "RelationshipElement", + "AnnotatedRelationshipElement", + "Capability", + "SubmodelElement", + "SubmodelElementCollection", + "View" }; + + public static string[] ReferableElements = new string[] { + "AccessPermissionRule", + "Asset", + "AssetAdministrationShell", + "ConceptDescription", + "Submodel", + "Blob", + "ConceptDictionary", + "DataElement", + "File", + "Operation", + "OperationVariable", + "Entity", + "BasicEvent", + "Property", + "MultiLanguageProperty", + "Range", + "ReferenceElement", + "RelationshipElement", + "AnnotatedRelationshipElement", + "Capability", + "SubmodelElement", + "SubmodelElementCollection", + "View" }; + + public static string[] SubmodelElements = new string[] { + "DataElement", + "File", + "Event", + "Operation", + "Property", + "MultiLanguageProperty", + "Range", + "ReferenceElement", + "RelationshipElement", + "AnnotatedRelationshipElement", + "Capability", + "BasicEvent", + "Entity", + "SubmodelElementCollection"}; + + public static string[] IdentifiableElements = new string[] { + "Asset", + "AssetAdministrationShell", + "ConceptDescription", + "Submodel" }; + + // use this in list to designate all of the above elements + public static string AllElements = "All"; + + // use this in list to designate the GlobalReference + // Resharper disable MemberHidesStaticFromOuterClass + public static string GlobalReference = "GlobalReference"; + public static string FragmentReference = "FragmentReference"; + public static string ConceptDescription = "ConceptDescription"; + public static string SubmodelRef = "SubmodelRef"; + public static string Submodel = "Submodel"; + public static string SubmodelElement = "SubmodelElement"; + public static string Asset = "Asset"; + public static string AAS = "AssetAdministrationShell"; + public static string Entity = "Entity"; + public static string View = "View"; + // Resharper enable MemberHidesStaticFromOuterClass + + public static string[] IdentifierTypeNames = new string[] { + Identification.IdShort, "FragmentId", "Custom", Identification.IRDI, Identification.IRI }; + + public enum IdentifierType { IdShort = 0, FragmentId, Custom, IRDI, IRI }; + + public static string GetIdentifierTypeName(IdentifierType t) + { + return IdentifierTypeNames[(int)t]; + } + + public static string IdShort = "IdShort"; + public static string FragmentId = "FragmentId"; + public static string Custom = "Custom"; + + // some helpers + + public static bool IsInKeyElements(string ke) + { + var res = false; + foreach (var s in KeyElements) + if (s.Trim().ToLower() == ke.Trim().ToLower()) + res = true; + return res; + } + + public bool IsIdType(string[] value) + { + if (value == null || idType == null || idType.Trim() == "") + return false; + return value.Contains(idType.Trim()); + } + + public bool IsIdType(string value) + { + if (value == null || idType == null || idType.Trim() == "") + return false; + return value.Trim().Equals(idType.Trim()); + } + + public bool IsType(string value) + { + if (value == null || type == null || type.Trim() == "") + return false; + return value.Trim().ToLower().Equals(type.Trim().ToLower()); + } + + public bool IsAbsolute() + { + return IsType(Key.GlobalReference) + || IsType(Key.AAS) + || IsType(Key.Asset) + || IsType(Key.Submodel); + } + + public bool Matches( + string type, bool local, string idType, string id, MatchMode matchMode = MatchMode.Strict) + { + if (matchMode == MatchMode.Strict) + return this.type == type && this.local == local && this.idType == idType && this.value == id; + + if (matchMode == MatchMode.Relaxed) + return (this.type == type || this.type == Key.GlobalReference || type == Key.GlobalReference) + && this.idType == idType && this.value == id; + + if (matchMode == MatchMode.Identification) + return this.idType == idType && this.value == id; + + return false; + } + + public bool Matches(Identification id) + { + if (id == null) + return false; + return this.Matches(Key.GlobalReference, false, id.idType, id.id, MatchMode.Identification); + } + + public bool Matches(Key key, MatchMode matchMode = MatchMode.Strict) + { + if (key == null) + return false; + return this.Matches(key.type, key.local, key.idType, key.value, matchMode); + } + + // validation + + public static AasValidationAction Validate(AasValidationRecordList results, Key k, Referable container) + { + // access + if (results == null || container == null) + return AasValidationAction.No; + + var res = AasValidationAction.No; + + // check + if (k == null) + { + // violation case + results.Add(new AasValidationRecord( + AasValidationSeverity.SpecViolation, container, + "Key: is null", + () => + { + res = AasValidationAction.ToBeDeleted; + })); + } + else + { + // check IdType + var idf = AdminShellUtilV20.CheckIfInConstantStringArray(IdentifierTypeNames, k.idType); + if (idf == AdminShellUtilV20.ConstantFoundEnum.No) + // violation case + results.Add(new AasValidationRecord( + AasValidationSeverity.SchemaViolation, container, + "Key: idType is not in allowed enumeration values", + () => + { + k.idType = Custom; + })); + if (idf == AdminShellUtilV20.ConstantFoundEnum.AnyCase) + // violation case + results.Add(new AasValidationRecord( + AasValidationSeverity.SchemaViolation, container, + "Key: idType in wrong casing", + () => + { + k.idType = AdminShellUtilV20.CorrectCasingForConstantStringArray( + IdentifierTypeNames, k.idType); + })); + + // check type + var tf = AdminShellUtilV20.CheckIfInConstantStringArray(KeyElements, k.type); + if (tf == AdminShellUtilV20.ConstantFoundEnum.No) + // violation case + results.Add(new AasValidationRecord( + AasValidationSeverity.SchemaViolation, container, + "Key: type is not in allowed enumeration values", + () => + { + k.type = GlobalReference; + })); + if (tf == AdminShellUtilV20.ConstantFoundEnum.AnyCase) + // violation case + results.Add(new AasValidationRecord( + AasValidationSeverity.SchemaViolation, container, + "Key: type in wrong casing", + () => + { + k.idType = AdminShellUtilV20.CorrectCasingForConstantStringArray( + KeyElements, k.type); + })); + } + + // may give result "to be deleted" + return res; + } + } + + public class KeyList : List + { + // getters / setters + + [XmlIgnore] + public bool IsEmpty { get { return this.Count < 1; } } + + // constructors / creators + + public KeyList() { } + + public KeyList(KeyList src) + { + if (src != null) + foreach (var k in src) + this.Add(new Key(k)); + } + + public static KeyList CreateNew(Key k) + { + var kl = new KeyList { k }; + return kl; + } + + public static KeyList CreateNew(string type, bool local, string idType, string value) + { + var kl = new KeyList() { + Key.CreateNew(type, local, idType, value) + }; + return kl; + } + + public static KeyList CreateNew(string type, bool local, string idType, string[] valueItems) + { + // access + if (valueItems == null) + return null; + + // prepare + var kl = new AdminShell.KeyList(); + foreach (var x in valueItems) + kl.Add(new AdminShell.Key(type, local, idType, "" + x)); + return kl; + } + + // matches + + public bool Matches(KeyList other, Key.MatchMode matchMode = Key.MatchMode.Strict) + { + if (other == null || other.Count != this.Count) + return false; + + var same = true; + for (int i = 0; i < this.Count; i++) + same = same && this[i].Matches(other[i], matchMode); + + return same; + } + + // other + + public void NumberIndices() + { + for (int i = 0; i < this.Count; i++) + this[i].index = i; + } + + public string ToString(int format = 0, string delimiter = ",") + { + var res = string.Join(delimiter, this.Select((k) => k.ToString(format))); + return res; + } + + public static KeyList Parse(string input) + { + // access + if (input == null) + return null; + + // split + var parts = input.Split(',', ';'); + var kl = new KeyList(); + + foreach (var p in parts) + { + var k = Key.Parse(p); + if (k != null) + kl.Add(k); + } + + return kl; + } + + public string MostSignificantInfo() + { + if (this.Count < 1) + return "-"; + var i = this.Count - 1; + var res = this[i].value; + if (this[i].IsIdType(new[] { Key.FragmentId }) && i > 0) + res += this[i - 1].value; + return res; + } + + // validation + + public static void Validate(AasValidationRecordList results, KeyList kl, + Referable container) + { + // access + if (results == null || kl == null || container == null) + return; + + // iterate thru + var idx = 0; + while (idx < kl.Count) + { + var act = Key.Validate(results, kl[idx], container); + if (act == AasValidationAction.ToBeDeleted) + { + kl.RemoveAt(idx); + continue; + } + idx++; + } + } + + public bool StartsWith(KeyList head, bool emptyIsTrue = false, + Key.MatchMode matchMode = Key.MatchMode.Strict) + { + // access + if (head == null) + return false; + if (head.Count == 0) + return emptyIsTrue; + + // simply test element-wise + for (int i = 0; i < head.Count; i++) + { + // does head have more elements than this list? + if (i >= this.Count) + return false; + + if (!head[i].Matches(this[i], matchMode)) + return false; + } + + // ok! + return true; + } + + // arithmetics + + public static KeyList operator +(KeyList a, Key b) + { + var res = new KeyList(a); + if (b != null) + res.Add(b); + return res; + } + + public static KeyList operator +(KeyList a, KeyList b) + { + var res = new KeyList(a); + if (b != null) + res.AddRange(b); + return res; + } + + public KeyList SubList(int startPos, int count = int.MaxValue) + { + var res = new KeyList(); + if (startPos >= this.Count) + return res; + int nr = 0; + for (int i = startPos; i < this.Count && nr < count; i++) + { + nr++; + res.Add(this[i]); + } + return res; + } + + public KeyList ReplaceLastKey(KeyList newKeys) + { + var res = new KeyList(this); + if (res.Count < 1 || newKeys == null || newKeys.Count < 1) + return res; + + res.Remove(res.Last()); + res = res + newKeys; + + return res; + } + + // other + + /// + /// Take only idShort, ignore all other key-types and create a '/'-separated list + /// + /// Empty string or list of idShorts + public string BuildIdShortPath(int startPos = 0, int count = int.MaxValue) + { + if (startPos >= this.Count) + return ""; + int nr = 0; + var res = ""; + for (int i = startPos; i < this.Count && nr < count; i++) + { + nr++; + if (this[i].idType.Trim().ToLower() == Key.IdShort.Trim().ToLower()) + { + if (res != "") + res += "/"; + res += this[i].value; + } + } + return res; + } + } + + public class AasElementSelfDescription + { + public string ElementName = ""; + public string ElementAbbreviation = ""; + public SubmodelElementWrapper.AdequateElementEnum ElementEnum = + SubmodelElementWrapper.AdequateElementEnum.Unknown; + + public AasElementSelfDescription() { } + + public AasElementSelfDescription( + string ElementName, string ElementAbbreviation, + SubmodelElementWrapper.AdequateElementEnum elementEnum + = SubmodelElementWrapper.AdequateElementEnum.Unknown) + { + this.ElementName = ElementName; + this.ElementAbbreviation = ElementAbbreviation; + this.ElementEnum = elementEnum; + } + } + + /// + /// Extends understanding of Referable to further elements, which can be related to + /// + public interface IAasElement + { + AasElementSelfDescription GetSelfDescription(); + string GetElementName(); + } + + [XmlType(TypeName = "reference")] + public class Reference : IAasElement + { + + // members + + [XmlIgnore] // anyway, as it is private + [JsonIgnore] + private KeyList keys = new KeyList(); + + // getters / setters + + [XmlArray("keys")] + [XmlArrayItem("key")] + [JsonIgnore] + public KeyList Keys { get { return keys; } } + [XmlIgnore] + [JsonProperty(PropertyName = "keys")] + public KeyList JsonKeys + { + get + { + keys?.NumberIndices(); + return keys; + } + } + + [XmlIgnore] + [JsonIgnore] + public bool IsEmpty { get { return keys == null || keys.Count < 1; } } + [XmlIgnore] + [JsonIgnore] + public int Count { get { if (keys == null) return 0; return keys.Count; } } + [XmlIgnore] + [JsonIgnore] + public Key this[int index] { get { return keys[index]; } } + + [XmlIgnore] + [JsonIgnore] + public Key First { get { return this.Count < 1 ? null : this.keys[0]; } } + + [XmlIgnore] + [JsonIgnore] + public Key Last { get { return this.Count < 1 ? null : this.keys[this.keys.Count - 1]; } } + + // constructors / creators + + public Reference() + { + } + + public Reference(Key k) + { + if (k != null) + keys.Add(k); + } + + public Reference(Reference src) + { + if (src != null) + foreach (var k in src.Keys) + keys.Add(new Key(k)); + } + +#if !DoNotUseAasxCompatibilityModels + public Reference(AasxCompatibilityModels.AdminShellV10.Reference src) + { + if (src != null) + foreach (var k in src.Keys) + keys.Add(new Key(k)); + } +#endif + + public Reference(SemanticId src) + { + if (src != null) + foreach (var k in src.Keys) + keys.Add(new Key(k)); + } + +#if !DoNotUseAasxCompatibilityModels + public Reference(AasxCompatibilityModels.AdminShellV10.SemanticId src) + { + if (src != null) + foreach (var k in src.Keys) + keys.Add(new Key(k)); + } +#endif + public static Reference CreateNew(Key k) + { + if (k == null) + return null; + var r = new Reference(); + r.keys.Add(k); + return r; + } + + public static Reference CreateNew(List k) + { + if (k == null) + return null; + var r = new Reference(); + r.keys.AddRange(k); + return r; + } + + public static Reference CreateNew(string type, bool local, string idType, string value) + { + if (type == null || idType == null || value == null) + return null; + var r = new Reference(); + r.keys.Add(Key.CreateNew(type, local, idType, value)); + return r; + } + + public static Reference CreateIrdiReference(string irdi) + { + if (irdi == null) + return null; + var r = new Reference(); + r.keys.Add(new Key(Key.GlobalReference, false, Identification.IRDI, irdi)); + return r; + } + + // additions + + public static Reference operator +(Reference a, Key b) + { + var res = new Reference(a); + res.Keys?.Add(b); + return res; + } + + public static Reference operator +(Reference a, Reference b) + { + var res = new Reference(a); + res.Keys?.AddRange(b?.Keys); + return res; + } + + // further + + public Key GetAsExactlyOneKey() + { + if (keys == null || keys.Count != 1) + return null; + var k = keys[0]; + return new Key(k.type, k.local, k.idType, k.value); + } + + public bool MatchesExactlyOneKey( + string type, bool local, string idType, string id, Key.MatchMode matchMode = Key.MatchMode.Strict) + { + if (keys == null || keys.Count != 1) + return false; + var k = keys[0]; + return k.Matches(type, local, idType, id, matchMode); + } + + public bool MatchesExactlyOneKey(Key key, Key.MatchMode matchMode = Key.MatchMode.Strict) + { + if (key == null) + return false; + return this.MatchesExactlyOneKey(key.type, key.local, key.idType, key.value, matchMode); + } + + public bool Matches( + string type, bool local, string idType, string id, Key.MatchMode matchMode = Key.MatchMode.Strict) + { + if (this.Count == 1) + { + var k = keys[0]; + return k.Matches(type, local, idType, id, matchMode); + } + return false; + } + + public bool Matches(Key key, Key.MatchMode matchMode = Key.MatchMode.Strict) + { + if (this.Count == 1) + { + var k = keys[0]; + return k.Matches(key, matchMode); + } + return false; + } + + public bool Matches(Identification other) + { + if (other == null) + return false; + if (this.Count == 1) + { + var k = keys[0]; + return k.Matches(Key.GlobalReference, false, other.idType, other.id, Key.MatchMode.Identification); + } + return false; + } + + public bool Matches(Reference other, Key.MatchMode matchMode = Key.MatchMode.Strict) + { + if (this.keys == null || other == null || other.keys == null || other.Count != this.Count) + return false; + + var same = true; + for (int i = 0; i < this.Count; i++) + same = same && this.keys[i].Matches(other.keys[i], matchMode); + + return same; + } + + public bool Matches(SemanticId other, Key.MatchMode matchMode = Key.MatchMode.Strict) + { + return Matches(new Reference(other), matchMode); + } + + public bool Matches(ConceptDescription cd, Key.MatchMode matchMode = Key.MatchMode.Strict) + { + return Matches(cd?.GetReference(), matchMode); + } + + public string ToString(int format = 0, string delimiter = ",") + { + return keys?.ToString(format, delimiter); + } + + public static Reference Parse(string input) + { + return CreateNew(KeyList.Parse(input)); + } + + public string ListOfValues(string delim) + { + string res = ""; + if (this.Keys != null) + foreach (var x in this.Keys) + { + if (x == null) + continue; + if (res != "") res += delim; + res += x.value; + } + return res; + } + + // self description + + public virtual AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("Reference", "Rfc"); + } + + public virtual string GetElementName() + { + return this.GetSelfDescription()?.ElementName; + } + } + + [XmlType(TypeName = "derivedFrom")] + public class AssetAdministrationShellRef : Reference + { + // constructors + + public AssetAdministrationShellRef() : base() { } + + public AssetAdministrationShellRef(Key k) : base(k) { } + + public AssetAdministrationShellRef(Reference src) : base(src) { } + +#if !DoNotUseAasxCompatibilityModels + public AssetAdministrationShellRef(AasxCompatibilityModels.AdminShellV10.Reference src) : base(src) { } +#endif + + // further methods + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("AssetAdministrationShellRef", "AasRef"); + } + } + + [XmlType(TypeName = "assetRef")] + public class AssetRef : Reference + { + // constructors + + public AssetRef() : base() { } + + public AssetRef(AssetRef src) : base(src) { } + +#if !DoNotUseAasxCompatibilityModels + public AssetRef(AasxCompatibilityModels.AdminShellV10.AssetRef src) : base(src) { } +#endif + + public AssetRef(Reference r) + : base(r) + { + } + + // further methods + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("AssetRef", "AssetRef"); + } + } + + [XmlType(TypeName = "submodelRef")] + public class SubmodelRef : Reference + { + // constructors + + public SubmodelRef() : base() { } + + public SubmodelRef(SubmodelRef src) : base(src) { } + + public SubmodelRef(Reference src) : base(src) { } + +#if !DoNotUseAasxCompatibilityModels + public SubmodelRef(AasxCompatibilityModels.AdminShellV10.SubmodelRef src) : base(src) { } +#endif + + public new static SubmodelRef CreateNew(string type, bool local, string idType, string value) + { + var r = new SubmodelRef(); + r.Keys.Add(Key.CreateNew(type, local, idType, value)); + return r; + } + + public static SubmodelRef CreateNew(Reference src) + { + if (src == null || src.Keys == null) + return null; + var r = new SubmodelRef(); + r.Keys.AddRange(src.Keys); + return r; + } + + // further methods + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("SubmodelRef", "SMRef"); + } + } + + [XmlType(TypeName = "conceptDescriptionRef")] + public class ConceptDescriptionRef : Reference + { + // constructors + + public ConceptDescriptionRef() : base() { } + + public ConceptDescriptionRef(ConceptDescriptionRef src) : base(src) { } + +#if !DoNotUseAasxCompatibilityModels + public ConceptDescriptionRef( + AasxCompatibilityModels.AdminShellV10.ConceptDescriptionRef src) : base(src) { } +#endif + + // further methods + + public new static ConceptDescriptionRef CreateNew(string type, bool local, string idType, string value) + { + var r = new ConceptDescriptionRef(); + r.Keys.Add(Key.CreateNew(type, local, idType, value)); + return r; + } + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("ConceptDescriptionRef", "CDRef"); + } + + } + + [XmlType(TypeName = "dataSpecificationRef")] + public class DataSpecificationRef : Reference + { + // constructors + + public DataSpecificationRef() : base() { } + + public DataSpecificationRef(DataSpecificationRef src) : base(src) { } + + public DataSpecificationRef(Reference src) : base(src) { } + +#if !DoNotUseAasxCompatibilityModels + public DataSpecificationRef(AasxCompatibilityModels.AdminShellV10.DataSpecificationRef src) : base(src) { } + + public DataSpecificationRef(AasxCompatibilityModels.AdminShellV10.Reference src) : base(src) { } +#endif + + // further methods + + public static DataSpecificationRef CreateNew(Reference src) + { + if (src == null || src.Keys == null) + return null; + var res = new DataSpecificationRef(); + foreach (var k in src.Keys) + res.Keys.Add(new Key(k)); + return res; + } + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("DataSpecificationRef", "DSRef"); + } + + } + + [XmlType(TypeName = "conceptDescriptions")] + public class ConceptDescriptionRefs + { + [XmlElement(ElementName = "conceptDescriptionRef")] + public List conceptDescriptions = new List(); + + // constructors + + public ConceptDescriptionRefs() { } + + public ConceptDescriptionRefs(ConceptDescriptionRefs src) + { + if (src.conceptDescriptions != null) + foreach (var cdr in src.conceptDescriptions) + this.conceptDescriptions.Add(new ConceptDescriptionRef(cdr)); + } + +#if !DoNotUseAasxCompatibilityModels + public ConceptDescriptionRefs(AasxCompatibilityModels.AdminShellV10.ConceptDescriptionRefs src) + { + if (src.conceptDescriptions != null) + foreach (var cdr in src.conceptDescriptions) + this.conceptDescriptions.Add(new ConceptDescriptionRef(cdr)); + } +#endif + } + + [XmlType(TypeName = "containedElementRef")] + public class ContainedElementRef : Reference + { + // constructors + + public ContainedElementRef() { } + + public ContainedElementRef(ContainedElementRef src) : base(src) { } + +#if !DoNotUseAasxCompatibilityModels + public ContainedElementRef(AasxCompatibilityModels.AdminShellV10.ContainedElementRef src) : base(src) { } +#endif + + public static ContainedElementRef CreateNew(Reference src) + { + if (src == null || src.Keys == null) + return null; + var r = new ContainedElementRef(); + r.Keys.AddRange(src.Keys); + return r; + } + + // further methods + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("ContainedElementRef", "CERef"); + } + + } + +#if __not_valid_anymore + [XmlType(TypeName = "hasDataSpecification")] + public class HasDataSpecification + { + [XmlElement(ElementName = "reference")] // make "reference" go away by magic?! + public List reference = new List(); + + public HasDataSpecification() { } + + public HasDataSpecification(HasDataSpecification src) + { + foreach (var r in src.reference) + reference.Add(new Reference(r)); + } + +#if !DoNotUseAasxCompatibilityModels + public HasDataSpecification(AasxCompatibilityModels.AdminShellV10.HasDataSpecification src) + { + foreach (var r in src.reference) + reference.Add(new Reference(r)); + } +#endif + } +#else + // Note: In versions prior to V2.0.1, the SDK has "HasDataSpecification" containing only a Reference. + // Iv 2.0.1, theoretically each entity with HasDataSpecification could also conatin a + // EmbeddedDataSpecification. + + [XmlType(TypeName = "hasDataSpecification")] + public class HasDataSpecification : List + { + public HasDataSpecification() { } + + public HasDataSpecification(HasDataSpecification src) + { + foreach (var r in src) + this.Add(new EmbeddedDataSpecification(r)); + } + + public HasDataSpecification(IEnumerable src) + { + foreach (var r in src) + this.Add(new EmbeddedDataSpecification(r)); + } + +#if !DoNotUseAasxCompatibilityModels + public HasDataSpecification(AasxCompatibilityModels.AdminShellV10.HasDataSpecification src) + { + foreach (var r in src.reference) + this.Add(new EmbeddedDataSpecification(r)); + } +#endif + + // make some explicit and easy to use getter, setters + + [XmlIgnore] + [JsonIgnore] + public EmbeddedDataSpecification IEC61360 + { + get + { + foreach (var eds in this) + if (eds?.dataSpecificationContent?.dataSpecificationIEC61360 != null + || eds?.dataSpecification?.MatchesExactlyOneKey( + DataSpecificationIEC61360.GetKey(), Key.MatchMode.Identification) == true) + return eds; + return null; + } + set + { + // search existing first? + var eds = this.IEC61360; + if (eds != null) + { + // replace this + /* TODO (MIHO, 2020-08-30): this does not prevent the corner case, that we could have + * multiple dataSpecificationIEC61360 in this list, which would be an error */ + this.Remove(eds); + this.Add(value); + return; + } + + // no? .. add! + this.Add(value); + } + } + + [XmlIgnore] + [JsonIgnore] + public DataSpecificationIEC61360 IEC61360Content + { + get + { + return this.IEC61360?.dataSpecificationContent?.dataSpecificationIEC61360; + } + set + { + // search existing first? + var eds = this.IEC61360; + if (eds != null) + { + // replace this + eds.dataSpecificationContent.dataSpecificationIEC61360 = value; + return; + } + // no? .. add! + var edsnew = new EmbeddedDataSpecification(); + edsnew.dataSpecificationContent.dataSpecificationIEC61360 = value; + this.Add(edsnew); + } + } + + } +#endif + + [XmlType(TypeName = "ContainedElements")] + public class ContainedElements + { + + // members + + [XmlElement(ElementName = "containedElementRef")] // make "reference" go away by magic?! + public List reference = new List(); + + // getter / setter + + public bool IsEmpty { get { return reference == null || reference.Count < 1; } } + public int Count { get { if (reference == null) return 0; return reference.Count; } } + public ContainedElementRef this[int index] { get { return reference[index]; } } + + // Creators + + public ContainedElements() { } + + public ContainedElements(ContainedElements src) + { + if (src.reference != null) + foreach (var r in src.reference) + this.reference.Add(new ContainedElementRef(r)); + } + +#if !DoNotUseAasxCompatibilityModels + public ContainedElements(AasxCompatibilityModels.AdminShellV10.ContainedElements src) + { + if (src.reference != null) + foreach (var r in src.reference) + this.reference.Add(new ContainedElementRef(r)); + } +#endif + + public static ContainedElements CreateOrSetInner(ContainedElements outer, ContainedElementRef[] inner) + { + var res = outer; + if (res == null) + res = new ContainedElements(); + if (inner == null) + { + res.reference = null; + return res; + } + res.reference = new List(inner); + return res; + } + + } + + [XmlType(TypeName = "langString", Namespace = "http://www.admin-shell.io/2/0")] + public class LangStr + { + // constants + public static string LANG_DEFAULT = "en"; + + // members + + [MetaModelName("LangStr.lang")] + [TextSearchable] + [XmlAttribute(Namespace = "http://www.admin-shell.io/2/0")] + [JsonProperty(PropertyName = "language")] + [CountForHash] + public string lang = ""; + + [MetaModelName("LangStr.str")] + [TextSearchable] + [XmlText] + [JsonProperty(PropertyName = "text")] + [CountForHash] + public string str = ""; + + // constructors + + public LangStr() { } + + public LangStr(LangStr src) + { + this.lang = src.lang; + this.str = src.str; + } + +#if !DoNotUseAasxCompatibilityModels + public LangStr(AasxCompatibilityModels.AdminShellV10.LangStr src) + { + this.lang = src.lang; + this.str = src.str; + } +#endif + + public LangStr(string lang, string str) + { + this.lang = lang; + this.str = str; + } + + public static ListOfLangStr CreateManyFromStringArray(string[] s) + { + var r = new ListOfLangStr(); + var i = 0; + while ((i + 1) < s.Length) + { + r.Add(new LangStr(s[i], s[i + 1])); + i += 2; + } + return r; + } + + public override string ToString() + { + return $"{str}@{lang}"; + } + } + + public class ListOfLangStr : List + { + public ListOfLangStr() { } + + public ListOfLangStr(LangStr ls) + { + if (ls != null) + this.Add(ls); + } + + public ListOfLangStr(ListOfLangStr src) + { + if (src != null) + foreach (var ls in src) + this.Add(ls); + } + + public string this[string lang] + { + get + { + return GetDefaultStr(lang); + } + set + { + foreach (var ls in this) + if (ls.lang.Trim().ToLower() == lang?.Trim().ToLower()) + { + ls.str = value; + return; + } + this.Add(new LangStr(lang, value)); + } + } + + public string GetDefaultStr(string defaultLang = null) + { + // start + if (defaultLang == null) + defaultLang = LangStr.LANG_DEFAULT; + defaultLang = defaultLang.Trim().ToLower(); + string res = null; + + // search + foreach (var ls in this) + if (ls.lang.Trim().ToLower() == defaultLang) + res = ls.str; + if (res == null && this.Count > 0) + res = this[0].str; + + // found? + return res; + } + + public string GetExactStrForLang(string lang) + { + // start + if (lang == null) + return null; + string res = null; + + // exact search + foreach (var ls in this) + if (ls.lang.Trim().ToLower() == lang) + res = ls.str; + + // found? + return res; + } + + public bool ContainsLang(string lang) + { + return GetExactStrForLang(lang) != null; + } + + public bool AllLangSameString() + { + if (this.Count < 2) + return true; + + for (int i = 1; i < this.Count; i++) + if (this[0]?.str != null && this[0]?.str?.Trim() != this[i]?.str?.Trim()) + return false; + + return true; + } + + public override string ToString() + { + return string.Join(", ", this.Select((ls) => ls.ToString())); + } + + public static ListOfLangStr Parse(string cell) + { + // access + if (cell == null) + return null; + + // iterative approach + var res = new ListOfLangStr(); + while (true) + { + // trivial case and finite end + if (!cell.Contains("@")) + { + if (cell.Trim() != "") + res.Add(new LangStr(LangStr.LANG_DEFAULT, cell)); + break; + } + + // OK, pick the next couple + var m = Regex.Match(cell, @"(.*?)@(\w+)", RegexOptions.Singleline); + if (!m.Success) + { + // take emergency exit? + res.Add(new LangStr("??", cell)); + break; + } + + // use the match and shorten cell .. + res.Add(new LangStr(m.Groups[2].ToString(), m.Groups[1].ToString().Trim())); + cell = cell.Substring(m.Index + m.Length); + } + + return res; + } + } + + public class Description + { + + // members + + [XmlElement(ElementName = "langString")] + public ListOfLangStr langString = new ListOfLangStr(); + + // constructors + + public Description() { } + + public Description(Description src) + { + if (src != null && src.langString != null) + foreach (var ls in src.langString) + langString.Add(new LangStr(ls)); + } + + public Description(LangStringSet src) + { + if (src != null && src.langString != null) + foreach (var ls in src.langString) + langString.Add(new LangStr(ls)); + } + +#if !DoNotUseAasxCompatibilityModels + public Description(AasxCompatibilityModels.AdminShellV10.Description src) + { + if (src != null) + foreach (var ls in src.langString) + langString.Add(new LangStr(ls)); + } +#endif + + // single string representation + public string GetDefaultStr(string defaultLang = null) + { + return this.langString?.GetDefaultStr(defaultLang); + } + + } + + public class AssetKind + { + // constants + public static string Type = "Type"; + public static string Instance = "Instance"; + + [MetaModelName("AssetKind.kind")] + [TextSearchable] + [XmlText] + [CountForHash] + public string kind = "Instance"; + + // getters / setters + + [XmlIgnore] + [JsonIgnore] + public bool IsInstance { get { return kind == null || kind.Trim().ToLower() == "instance"; } } + + [XmlIgnore] + [JsonIgnore] + public bool IsType { get { return kind != null && kind.Trim().ToLower() == "type"; } } + + // constructors / creators + + public AssetKind() { } + + public AssetKind(AssetKind src) + { + kind = src.kind; + } + +#if !DoNotUseAasxCompatibilityModels + public AssetKind(AasxCompatibilityModels.AdminShellV10.Kind src) + { + kind = src.kind; + } +#endif + + public AssetKind(string kind) + { + this.kind = kind; + } + + public static AssetKind CreateAsType() + { + var res = new AssetKind() { kind = AssetKind.Type }; + return res; + } + + public static AssetKind CreateAsInstance() + { + var res = new AssetKind() { kind = AssetKind.Instance }; + return res; + } + } + + public class ModelingKind + { + // constants + public static string Template = "Template"; + public static string Instance = "Instance"; + + [MetaModelName("ModelingKind.kind")] + [TextSearchable] + [XmlText] + [CountForHash] + public string kind = Instance; + + // getters / setters + + [XmlIgnore] + [JsonIgnore] + public bool IsInstance { get { return kind == null || kind.Trim().ToLower() == Instance.ToLower(); } } + + [XmlIgnore] + [JsonIgnore] + public bool IsTemplate { get { return kind != null && kind.Trim().ToLower() == Template.ToLower(); } } + + // constructors / creators + + public ModelingKind() { } + + public ModelingKind(ModelingKind src) + { + kind = src.kind; + } + +#if !DoNotUseAasxCompatibilityModels + public ModelingKind(AasxCompatibilityModels.AdminShellV10.Kind src) + { + kind = src.kind; + } +#endif + + public ModelingKind(string kind) + { + this.kind = kind; + } + + public static ModelingKind CreateAsTemplate() + { + var res = new ModelingKind() { kind = Template }; + return res; + } + + public static ModelingKind CreateAsInstance() + { + var res = new ModelingKind() { kind = Instance }; + return res; + } + + // validation + + public static void Validate(AasValidationRecordList results, ModelingKind mk, Referable container) + { + // access + if (results == null || container == null) + return; + + // check + if (mk == null || mk.kind == null) + { + // warning + results.Add(new AasValidationRecord( + AasValidationSeverity.Warning, container, + "ModelingKind: is null", + () => + { + })); + } + else + { + var k = mk.kind.Trim(); + var kl = k.ToLower(); + if (kl != Template.ToLower() && kl != Instance.ToLower()) + { + // violation case + results.Add(new AasValidationRecord( + AasValidationSeverity.SchemaViolation, container, + $"ModelingKind: enumeration value neither {Template} nor {Instance}", + () => + { + mk.kind = Instance; + })); + } + else if (k != Template && k != Instance) + { + // warning + results.Add(new AasValidationRecord( + AasValidationSeverity.Warning, container, + "ModelingKind: enumeration value in wrong casing", + () => + { + if (kl == Template.ToLower()) + mk.kind = Template; + else + mk.kind = Instance; + })); + } + } + } + } + + public class SemanticId : Reference + { + + // constructors / creators + + public SemanticId() + : base() + { + } + + public SemanticId(SemanticId src) + : base(src) + { + } + + public SemanticId(Reference src) : base(src) { } + +#if !DoNotUseAasxCompatibilityModels + public SemanticId(AasxCompatibilityModels.AdminShellV10.SemanticId src) + : base(src) + { + } +#endif + public SemanticId(Key key) : base(key) { } + + public static SemanticId CreateFromKey(Key key) + { + if (key == null) + return null; + var res = new SemanticId(); + res.Keys.Add(key); + return res; + } + + public static SemanticId CreateFromKeys(List keys) + { + if (keys == null) + return null; + var res = new SemanticId(); + res.Keys.AddRange(keys); + return res; + } + + public new static SemanticId Parse(string input) + { + return (SemanticId)CreateNew(KeyList.Parse(input)); + } + } + + /// + /// This class allows to describe further data (in derived classes) when enumerating Children. + /// + public class EnumerationPlacmentBase + { + } + + public interface IEnumerateChildren + { + IEnumerable EnumerateChildren(); + EnumerationPlacmentBase GetChildrenPlacement(SubmodelElement child); + object AddChild(SubmodelElementWrapper smw, EnumerationPlacmentBase placement = null); + } + + public interface IValidateEntity + { + void Validate(AasValidationRecordList results); + } + + /// + /// This attribute indicates, that it should e.g. serialized in JSON. + /// + [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = true)] + public class CountForHash : System.Attribute + { + } + + /// + /// This attribute indicates, that evaluation shall not count following field or not dive into references. + /// + [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = true)] + public class SkipForHash : System.Attribute + { + } + + /// + /// This attribute indicates, that the field / property is searchable + /// + [System.AttributeUsage(System.AttributeTargets.Field | System.AttributeTargets.Property, AllowMultiple = true)] + public class MetaModelName : System.Attribute + { + public string name; + public MetaModelName(string name) + { + this.name = name; + } + } + + /// + /// This attribute indicates, that the field / property shall be skipped for reflection + /// in order to avoid cycles + /// + [System.AttributeUsage(System.AttributeTargets.Field | System.AttributeTargets.Property, AllowMultiple = true)] + public class SkipForReflection : System.Attribute + { + } + + /// + /// This attribute indicates, that the field / property shall be skipped for searching, because it is not + /// directly displayed in Package Explorer + /// + [System.AttributeUsage(System.AttributeTargets.Field | System.AttributeTargets.Property, AllowMultiple = true)] + public class SkipForSearch : System.Attribute + { + } + + /// + /// This attribute indicates, that the field / property is searchable + /// + [System.AttributeUsage(System.AttributeTargets.Field | System.AttributeTargets.Property, AllowMultiple = true)] + public class TextSearchable : System.Attribute + { + } + + /// + /// Result of FindReferable in Environment + /// + public class ReferableRootInfo + { + public AdministrationShell AAS = null; + public Asset Asset = null; + public Submodel Submodel = null; + + public int NrOfRootKeys = 0; + + public bool IsValid + { + get + { + return NrOfRootKeys > 0 && (AAS != null || Submodel != null || Asset != null); + } + } + } + + /// + /// Marks an object, preferaby a payload item, which might be featured by the diary collection + /// + public interface IAasDiaryEntry + { + } + + public class DiaryDataDef + { + public enum TimeStampKind { Create, Update } + + [XmlIgnore] + [JsonIgnore] + private DateTime[] _timeStamp = new DateTime[2]; + + [XmlIgnore] + [JsonIgnore] + public DateTime[] TimeStamp { get { return _timeStamp; } } + + /// + /// List of entries, timewise one after each other (entries are timestamped). + /// Note: Default is Entries = null, as handling of many many AAS elements does not + /// create additional overhead of creating empty lists. An empty list shall be avoided. + /// + public List Entries = null; + + public static void AddAndSetTimestamps(Referable element, IAasDiaryEntry de, bool isCreate = false) + { + // trivial + if (element == null || de == null || element.DiaryData == null) + return; + + // add entry + if (element.DiaryData.Entries == null) + element.DiaryData.Entries = new List(); + element.DiaryData.Entries.Add(de); + + // figure out which timestamp + var tsk = TimeStampKind.Update; + if (isCreate) + { + tsk = TimeStampKind.Create; + } + + // set this timestamp (and for the parents, as well) + IDiaryData el = element; + while (el?.DiaryData != null) + { + // itself + el.DiaryData.TimeStamp[(int)tsk] = DateTime.UtcNow; + + // go up + el = (el as Referable)?.parent as IDiaryData; + } + } + } + + public interface IDiaryData + { + DiaryDataDef DiaryData { get; } + } + + public class ListOfReferable : List + { + // conversion to other list + + public KeyList ToKeyList() + { + var res = new KeyList(); + foreach (var rf in this) + res.Add(rf.ToKey()); + return res; + } + + public Reference GetReference() + { + return Reference.CreateNew(ToKeyList()); + } + } + + public interface IRecurseOnReferables + { + void RecurseOnReferables( + object state, Func lambda, + bool includeThis = false); + } + + public class Referable : IValidateEntity, IAasElement, IDiaryData, IGetReference, IRecurseOnReferables + { + // diary + + [XmlIgnore] + [JsonIgnore] + [SkipForHash] + [SkipForReflection] + private DiaryDataDef _diaryData = new DiaryDataDef(); + + [XmlIgnore] + [JsonIgnore] + [SkipForReflection] + public DiaryDataDef DiaryData { get { return _diaryData; } } + + // members + + [MetaModelName("Referable.IdShort")] + [TextSearchable] + [CountForHash] + public string idShort = ""; + + [MetaModelName("Referable.category")] + [TextSearchable] + [CountForHash] + public string category = null; + + [XmlElement(ElementName = "description")] + [JsonIgnore] + [CountForHash] + public Description description = null; + + [XmlIgnore] + [JsonProperty(PropertyName = "descriptions")] + public ListOfLangStr JsonDescription + { + get + { + return description?.langString; + } + set + { + if (value == null) + { + description = null; + return; + } + + if (description == null) + description = new Description(); + description.langString = value; + } + } + + [XmlIgnore] + [JsonIgnore] + [SkipForHash] // important to skip, as recursion elsewise will go in cycles! + [SkipForReflection] // important to skip, as recursion elsewise will go in cycles! + public IAasElement parent = null; + + public static string CONSTANT = "CONSTANT"; + public static string Category_PARAMETER = "PARAMETER"; + public static string VARIABLE = "VARIABLE"; + + public static string[] ReferableCategoryNames = new string[] { CONSTANT, Category_PARAMETER, VARIABLE }; + + // constructors + + public Referable() { } + + public Referable(string idShort) + { + this.idShort = idShort; + } + + public Referable(Referable src) + { + if (src == null) + return; + this.idShort = src.idShort; + this.category = src.category; + if (src.description != null) + this.description = new Description(src.description); + } + +#if !DoNotUseAasxCompatibilityModels + public Referable(AasxCompatibilityModels.AdminShellV10.Referable src) + { + if (src == null) + return; + this.idShort = src.idShort; + if (this.idShort == null) + // change in V2.0 -> mandatory + this.idShort = ""; + this.category = src.category; + if (src.description != null) + this.description = new Description(src.description); + } +#endif + + /// + /// Introduced for JSON serialization, can create Referables based on a string name + /// + /// string name (standard PascalCased) + public static Referable CreateAdequateType(string elementName) + { + if (elementName == Key.AAS) + return new AdministrationShell(); + if (elementName == Key.Asset) + return new Asset(); + if (elementName == Key.ConceptDescription) + return new ConceptDescription(); + if (elementName == Key.Submodel) + return new Submodel(); + if (elementName == Key.View) + return new View(); + return SubmodelElementWrapper.CreateAdequateType(elementName); + } + + public void AddDescription(string lang, string str) + { + if (description == null) + description = new Description(); + description.langString.Add(new LangStr(lang, str)); + } + + public virtual AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("Referable", "Ref"); + } + + public virtual string GetElementName() + { + return this.GetSelfDescription()?.ElementName; + } + + public string GetFriendlyName() + { + return AdminShellUtilV20.FilterFriendlyName(this.idShort); + } + + public virtual Reference GetReference(bool includeParents = true) + { + return new Reference( + new AdminShell.Key( + this.GetElementName(), false, Key.IdShort, "" + this.idShort)); + } + + public void CollectReferencesByParent(List refs) + { + // access + if (refs == null) + return; + + // check, if this is identifiable + if (this is Identifiable) + { + var idf = this as Identifiable; + if (idf != null) + { + var k = Key.CreateNew( + idf.GetElementName(), true, idf.identification?.idType, idf.identification?.id); + refs.Insert(0, k); + } + } + else + { + var k = Key.CreateNew(this.GetElementName(), true, "IdShort", this.idShort); + refs.Insert(0, k); + // recurse upwards! + if (this.parent is Referable prf) + prf.CollectReferencesByParent(refs); + } + } + + public string CollectIdShortByParent() + { + // recurse first + var head = ""; + if (!(this is Identifiable) && this.parent is Referable prf) + // can go up + head = prf.CollectIdShortByParent() + "/"; + // add own + var myid = ""; + if (this.idShort != null && this.idShort.Trim() != "") + myid = this.idShort.Trim(); + // together + return head + myid; + } + + // string functions + + public string ToIdShortString() + { + if (this.idShort == null || this.idShort.Trim().Length < 1) + return (""); + return this.idShort.Trim(); + } + + public override string ToString() + { + return "" + this.idShort; + } + + public virtual Key ToKey() + { + return new Key(GetElementName(), true, Key.IdShort, idShort); + } + + // hash functionality + + public class ObjectFieldInfo + { + public object o; + public FieldInfo fi; + public ObjectFieldInfo() { } + public ObjectFieldInfo(object o, FieldInfo fi) + { + this.o = o; + this.fi = fi; + } + } + + public List RecursivelyFindFields(object o, Type countAttribute, Type skipAttribute) + { + // access + var res = new List(); + if (o == null || countAttribute == null) + return res; + + // find fields for this object + var t = o.GetType(); + var l = t.GetFields(BindingFlags.Instance | BindingFlags.Public); + foreach (var f in l) + { + // Skip this field?? + if (skipAttribute != null && f.GetCustomAttribute(skipAttribute) != null) + continue; + + // add directly? + if (f.GetCustomAttribute(countAttribute) != null) + res.Add(new ObjectFieldInfo(o, f)); + + // object + if (f.FieldType.IsClass) + { + var oo = f.GetValue(o); + var r = RecursivelyFindFields(oo, countAttribute, skipAttribute); + res.AddRange(r); + } + + // try cast in IList to check further + var elems = f.GetValue(o) as IList; + if (elems != null) + foreach (var e in elems) + { + var r = RecursivelyFindFields(e, countAttribute, skipAttribute); + res.AddRange(r); + } + + } + // OK + return res; + } + + public byte[] ComputeByteArray() + { + // use memory stream for effcient behaviour + var mems = new MemoryStream(); + + // TEST + var xxx = RecursivelyFindFields(this, typeof(CountForHash), typeof(SkipForHash)); + + foreach (var ofi in xxx) + { + var a = ofi.fi.GetCustomAttribute(); + if (a != null) + { + // found an accountable field, get bytes + var o = ofi.fi.GetValue(ofi.o); + byte[] bs = null; + + // optimize for probabilities + + if (o is string) + bs = System.Text.Encoding.UTF8.GetBytes((string)o); + else if (o is char[]) + bs = System.Text.Encoding.UTF8.GetBytes((char[])o); + else if (o is double) + bs = BitConverter.GetBytes((double)o); + else if (o is float) + bs = BitConverter.GetBytes((float)o); + else if (o is char) + bs = BitConverter.GetBytes((char)o); + else if (o is byte) + bs = BitConverter.GetBytes((byte)o); + else if (o is int) + bs = BitConverter.GetBytes((int)o); + else if (o is long) + bs = BitConverter.GetBytes((long)o); + else if (o is short) + bs = BitConverter.GetBytes((short)o); + else if (o is uint) + bs = BitConverter.GetBytes((uint)o); + else if (o is ulong) + bs = BitConverter.GetBytes((ulong)o); + else if (o is ushort) + bs = BitConverter.GetBytes((ushort)o); + + if (bs != null) + mems.Write(bs, 0, bs.Length); + } + } + + return mems.ToArray(); + } + + private static System.Security.Cryptography.SHA256 HashProvider = + System.Security.Cryptography.SHA256.Create(); + + public string ComputeHashcode() + { + var dataBytes = this.ComputeByteArray(); + var hashBytes = Referable.HashProvider.ComputeHash(dataBytes); + + StringBuilder sb = new StringBuilder(); + foreach (var hb in hashBytes) + sb.Append(hb.ToString("X2")); + return sb.ToString(); + } + + // sorting + + public class ComparerIdShort : IComparer + { + public int Compare(Referable a, Referable b) + { + return String.Compare(a?.idShort, b?.idShort, + CultureInfo.InvariantCulture, CompareOptions.IgnoreCase); + } + } + + public class ComparerIndexed : IComparer + { + public int NullIndex = int.MaxValue; + public Dictionary Index = new Dictionary(); + + public int Compare(Referable a, Referable b) + { + var ca = Index.ContainsKey(a); + var cb = Index.ContainsKey(b); + + if (!ca && !cb) + return 0; + // make CDs without usage to appear at end of list + if (!ca) + return +1; + if (!cb) + return -1; + + var ia = Index[a]; + var ib = Index[b]; + + if (ia == ib) + return 0; + if (ia < ib) + return -1; + return +1; + } + } + + // validation + + public virtual void Validate(AasValidationRecordList results) + { + // access + if (results == null) + return; + + // check + if (this.idShort == null || this.idShort.Trim() == "") + results.Add(new AasValidationRecord( + AasValidationSeverity.SpecViolation, this, + "Referable: missing idShort", + () => + { + this.idShort = "TO_FIX"; + })); + + if (this.description != null && (this.description.langString == null + || this.description.langString.Count < 1)) + results.Add(new AasValidationRecord( + AasValidationSeverity.SchemaViolation, this, + "Referable: existing description with missing langString", + () => + { + this.description = null; + })); + } + + // hierarchy & recursion (by derived elements) + + public virtual void RecurseOnReferables( + object state, Func lambda, + bool includeThis = false) + { + if (includeThis) + lambda(state, null, this); + } + + public Identifiable FindParentFirstIdentifiable() + { + Referable curr = this; + while (curr != null) + { + if (curr is Identifiable curri) + return curri; + curr = curr.parent as Referable; + } + return null; + } + } + + public class Identifiable : Referable, IGetReference + { + + // members + + public Identification identification = new Identification(); + public Administration administration = null; + + // constructors + + public Identifiable() : base() { } + + public Identifiable(string idShort) : base(idShort) { } + + public Identifiable(Identifiable src) + : base(src) + { + if (src == null) + return; + if (src.identification != null) + this.identification = new Identification(src.identification); + if (src.administration != null) + this.administration = new Administration(src.administration); + } + +#if !DoNotUseAasxCompatibilityModels + public Identifiable(AasxCompatibilityModels.AdminShellV10.Identifiable src) + : base(src) + { + if (src.identification != null) + this.identification = new Identification(src.identification); + if (src.administration != null) + this.administration = new Administration(src.administration); + } +#endif + + public void SetIdentification(string idType, string id, string idShort = null) + { + identification.idType = idType; + identification.id = id; + if (idShort != null) + this.idShort = idShort; + } + + public void SetAdminstration(string version, string revision) + { + if (administration == null) + administration = new Administration(); + administration.version = version; + administration.revision = revision; + } + + public new string GetFriendlyName() + { + if (identification != null && identification.id != "") + return AdminShellUtilV20.FilterFriendlyName(this.identification.id); + return AdminShellUtilV20.FilterFriendlyName(this.idShort); + } + + public override string ToString() + { + return ("" + identification?.ToString() + " " + administration?.ToString()).Trim(); + } + + public override Key ToKey() + { + return new Key(GetElementName(), true, "" + identification?.idType, "" + identification?.id); + } + + // self description + + public override Reference GetReference(bool includeParents = true) + { + var r = new Reference(); + r.Keys.Add( + Key.CreateNew( + this.GetElementName(), true, this.identification.idType, this.identification.id)); + return r; + } + + // sorting + + public class ComparerIdentification : IComparer + { + public int Compare(Identifiable a, Identifiable b) + { + if (a?.identification == null && b?.identification == null) + return 0; + if (a?.identification == null) + return +1; + if (b?.identification == null) + return -1; + + var vc = String.Compare(a.identification.idType, b.identification.idType, + CultureInfo.InvariantCulture, CompareOptions.IgnoreCase); + if (vc != 0) + return vc; + + return String.Compare(a.identification.id, b.identification.id, + CultureInfo.InvariantCulture, CompareOptions.IgnoreCase | CompareOptions.IgnoreNonSpace); + } + } + + } + + public class JsonModelTypeWrapper + { + public string name = ""; + + public JsonModelTypeWrapper(string name = "") { this.name = name; } + } + + public interface IFindAllReferences + { + IEnumerable FindAllReferences(); + } + + public interface IGetSemanticId + { + SemanticId GetSemanticId(); + } + + public class AdministrationShell : Identifiable, IFindAllReferences + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } + + // from hasDataSpecification: + [XmlElement(ElementName = "hasDataSpecification")] + public HasDataSpecification hasDataSpecification = null; + + // from this very class + public AssetAdministrationShellRef derivedFrom = null; + + [JsonProperty(PropertyName = "asset")] + public AssetRef assetRef = new AssetRef(); + + [JsonProperty(PropertyName = "submodels")] + [SkipForSearch] + public List submodelRefs = new List(); + + [JsonIgnore] + public Views views = null; + [XmlIgnore] + [JsonProperty(PropertyName = "views")] + public View[] JsonViews + { + get { return views?.views.ToArray(); } + set { views = Views.CreateOrSetInnerViews(views, value); } + } + + [JsonProperty(PropertyName = "conceptDictionaries")] + public List conceptDictionaries = null; + + // constructors + + public AdministrationShell() { } + + public AdministrationShell(string idShort) : base(idShort) { } + + public AdministrationShell(AdministrationShell src) + : base(src) + { + if (src != null) + { + if (src.hasDataSpecification != null) + this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); + + if (src.derivedFrom != null) + this.derivedFrom = new AssetAdministrationShellRef(src.derivedFrom); + + if (src.assetRef != null) + this.assetRef = new AssetRef(src.assetRef); + + if (src.submodelRefs != null) + foreach (var smr in src.submodelRefs) + this.submodelRefs.Add(new SubmodelRef(smr)); + + if (src.views != null) + this.views = new Views(src.views); + + if (src.conceptDictionaries != null) + { + this.conceptDictionaries = new List(); + foreach (var cdd in src.conceptDictionaries) + this.conceptDictionaries.Add(new ConceptDictionary(cdd)); + } + } + } + +#if !DoNotUseAasxCompatibilityModels + public AdministrationShell(AasxCompatibilityModels.AdminShellV10.AdministrationShell src) + : base(src) + { + if (src.hasDataSpecification != null) + this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); + + if (src.derivedFrom != null) + this.derivedFrom = new AssetAdministrationShellRef(src.derivedFrom); + + if (src.assetRef != null) + this.assetRef = new AssetRef(src.assetRef); + + if (src.submodelRefs != null) + foreach (var smr in src.submodelRefs) + this.submodelRefs.Add(new SubmodelRef(smr)); + + if (src.views != null) + this.views = new Views(src.views); + + if (src.conceptDictionaries != null) + { + this.conceptDictionaries = new List(); + foreach (var cdd in src.conceptDictionaries) + this.conceptDictionaries.Add(new ConceptDictionary(cdd)); + } + } +#endif + + public static AdministrationShell CreateNew( + string idShort, string idType, string id, string version = null, string revision = null) + { + var s = new AdministrationShell(); + s.idShort = idShort; + if (version != null) + s.SetAdminstration(version, revision); + s.identification.idType = idType; + s.identification.id = id; + return (s); + } + + // add + + public void AddView(View v) + { + if (views == null) + views = new Views(); + views.views.Add(v); + } + + public void AddConceptDictionary(ConceptDictionary d) + { + if (conceptDictionaries == null) + conceptDictionaries = new List(); + conceptDictionaries.Add(d); + } + + public void AddDataSpecification(Key k) + { + if (hasDataSpecification == null) + hasDataSpecification = new HasDataSpecification(); + var r = new Reference(); + r.Keys.Add(k); + hasDataSpecification.Add(new EmbeddedDataSpecification(r)); + } + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("AssetAdministrationShell", "AAS"); + } + + public Tuple ToCaptionInfo() + { + var caption = AdminShellUtilV20.EvalToNonNullString("\"{0}\" ", idShort, "\"AAS\""); + if (administration != null) + caption += "V" + administration.version + "." + administration.revision; + + var info = ""; + if (identification != null) + info = $"[{identification.idType}, {identification.id}]"; + return Tuple.Create(caption, info); + } + + public override string ToString() + { + var ci = ToCaptionInfo(); + return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); + } + + public SubmodelRef FindSubmodelRef(Identification refid) + { + if (this.submodelRefs == null) + return null; + foreach (var r in this.submodelRefs) + if (r.Matches(refid)) + return r; + return null; + } + + public bool HasSubmodelRef(SubmodelRef newref) + { + // check, if existing + if (this.submodelRefs == null) + return false; + var found = false; + foreach (var r in this.submodelRefs) + if (r.Matches(newref)) + found = true; + + return found; + } + + public void AddSubmodelRef(SubmodelRef newref) + { + if (this.submodelRefs == null) + this.submodelRefs = new List(); + this.submodelRefs.Add(newref); + } + + public IEnumerable FindAllReferences() + { + // Asset + if (this.assetRef != null) + yield return new LocatedReference(this, this.assetRef); + + // Submodel references + if (this.submodelRefs != null) + foreach (var r in this.submodelRefs) + yield return new LocatedReference(this, r); + + // Views + if (this.views?.views != null) + foreach (var vw in this.views.views) + if (vw?.containedElements?.reference != null) + foreach (var r in vw.containedElements.reference) + yield return new LocatedReference(this, r); + } + } + + public class ListOfAdministrationShells : List, IAasElement + { + // self decscription + + public AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("AssetAdministrationShells", "AASs"); + } + + public string GetElementName() + { + return this.GetSelfDescription()?.ElementName; + } + } + + public class Asset : Identifiable + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } + + // from hasDataSpecification: + [XmlElement(ElementName = "hasDataSpecification")] + public HasDataSpecification hasDataSpecification = null; + + // from this very class + [XmlElement(ElementName = "assetIdentificationModelRef")] + public SubmodelRef assetIdentificationModelRef = null; + + [XmlElement(ElementName = "billOfMaterialRef")] + public SubmodelRef billOfMaterialRef = null; + + // from HasKind + [XmlElement(ElementName = "kind")] + [JsonIgnore] + public AssetKind kind = new AssetKind(); + [XmlIgnore] + [JsonProperty(PropertyName = "kind")] + public string JsonKind + { + get + { + if (kind == null) + return null; + return kind.kind; + } + set + { + if (kind == null) + kind = new AssetKind(); + kind.kind = value; + } + } + + // constructors + + public Asset() { } + + public Asset(string idShort) : base(idShort) { } + + public Asset(Asset src) + : base(src) + { + if (src != null) + { + if (src.hasDataSpecification != null) + this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); + if (src.kind != null) + this.kind = new AssetKind(src.kind); + if (src.assetIdentificationModelRef != null) + this.assetIdentificationModelRef = new SubmodelRef(src.assetIdentificationModelRef); + } + } + +#if !DoNotUseAasxCompatibilityModels + public Asset(AasxCompatibilityModels.AdminShellV10.Asset src) + : base(src) + { + if (src != null) + { + if (src.hasDataSpecification != null) + this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); + if (src.kind != null) + this.kind = new AssetKind(src.kind); + if (src.assetIdentificationModelRef != null) + this.assetIdentificationModelRef = new SubmodelRef(src.assetIdentificationModelRef); + } + } +#endif + + // Getter & setters + + public AssetRef GetAssetReference() + { + var r = new AssetRef(); + r.Keys.Add( + Key.CreateNew( + this.GetElementName(), true, this.identification.idType, this.identification.id)); + return r; + } + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("Asset", "Asset"); + } + + public Tuple ToCaptionInfo() + { + var caption = AdminShellUtilV20.EvalToNonNullString("\"{0}\" ", idShort, ""); + if (administration != null) + caption += "V" + administration.version + "." + administration.revision; + + var info = ""; + if (identification != null) + info = $"[{identification.idType}, {identification.id}]"; + return Tuple.Create(caption, info); + } + + public override string ToString() + { + var ci = ToCaptionInfo(); + return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); + } + + public IEnumerable FindAllReferences() + { + if (this.assetIdentificationModelRef != null) + yield return this.assetIdentificationModelRef; + if (this.billOfMaterialRef != null) + yield return this.billOfMaterialRef; + } + } + + public class ListOfAssets : List, IAasElement + { + // self decscription + + public AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("Assets", "Assets"); + } + + public string GetElementName() + { + return this.GetSelfDescription()?.ElementName; + } + + } + + public class View : Referable + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } + + // members + + // from hasSemanticId: + [XmlElement(ElementName = "semanticId")] + public SemanticId semanticId = null; + + // from hasDataSpecification + [XmlElement(ElementName = "hasDataSpecification")] + public HasDataSpecification hasDataSpecification = null; + + // from this very class + [JsonIgnore] + [SkipForSearch] + public ContainedElements containedElements = null; + [XmlIgnore] + [SkipForSearch] + [JsonProperty(PropertyName = "containedElements")] + public ContainedElementRef[] JsonContainedElements + { + get { return containedElements?.reference.ToArray(); } + set { containedElements = ContainedElements.CreateOrSetInner(containedElements, value); } + } + + // getter / setter + + [XmlIgnore] + [JsonIgnore] + public bool IsEmpty { get { return containedElements == null || containedElements.Count < 1; } } + [XmlIgnore] + [JsonIgnore] + public int Count { get { if (containedElements == null) return 0; return containedElements.Count; } } + + public ContainedElementRef this[int index] + { + get { if (containedElements == null) return null; return containedElements[index]; } + } + + // constructors / creators + + public View() { } + + public View(View src) + : base(src) + { + if (src.semanticId != null) + this.semanticId = new SemanticId(src.semanticId); + if (src.hasDataSpecification != null) + this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); + if (src.containedElements != null) + this.containedElements = new ContainedElements(src.containedElements); + } + +#if !DoNotUseAasxCompatibilityModels + public View(AasxCompatibilityModels.AdminShellV10.View src) + : base(src) + { + if (src.semanticId != null) + this.semanticId = new SemanticId(src.semanticId); + if (src.hasDataSpecification != null) + this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); + if (src.containedElements != null) + this.containedElements = new ContainedElements(src.containedElements); + } +#endif + + public static View CreateNew(string idShort) + { + var v = new View() { idShort = idShort }; + return (v); + } + + public void AddDataSpecification(Key k) + { + if (hasDataSpecification == null) + hasDataSpecification = new HasDataSpecification(); + var r = new Reference(); + r.Keys.Add(k); + hasDataSpecification.Add(new EmbeddedDataSpecification(r)); + } + + public void AddContainedElement(Key k) + { + if (containedElements == null) + containedElements = new ContainedElements(); + var r = new ContainedElementRef(); + r.Keys.Add(k); + containedElements.reference.Add(r); + } + + public void AddContainedElement(List keys) + { + if (containedElements == null) + containedElements = new ContainedElements(); + var r = new ContainedElementRef(); + foreach (var k in keys) + r.Keys.Add(k); + containedElements.reference.Add(r); + } + + public void AddContainedElement(Reference r) + { + if (containedElements == null) + containedElements = new ContainedElements(); + containedElements.reference.Add(ContainedElementRef.CreateNew(r)); + } + + public void AddContainedElement(List rlist) + { + if (containedElements == null) + containedElements = new ContainedElements(); + foreach (var r in rlist) + containedElements.reference.Add(ContainedElementRef.CreateNew(r)); + } + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("View", "View"); + } + + public Tuple ToCaptionInfo() + { + var caption = AdminShellUtilV20.EvalToNonNullString("\"{0}\" ", idShort, ""); + var info = ""; + if (this.semanticId != null) + info = Key.KeyListToString(this.semanticId.Keys); + if (this.containedElements != null && this.containedElements.reference != null) + info = (info + " ").Trim() + + String.Format("({0} elements)", this.containedElements.reference.Count); + return Tuple.Create(caption, info); + } + + public override string ToString() + { + var ci = ToCaptionInfo(); + return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); + } + + // validation + + public override void Validate(AasValidationRecordList results) + { + // access + if (results == null) + return; + + // check + base.Validate(results); + KeyList.Validate(results, semanticId?.Keys, this); + } + } + + public class Views + { + [XmlElement(ElementName = "view")] + [JsonIgnore] + public List views = new List(); + + // constructors + + public Views() { } + + public Views(Views src) + { + if (src != null && src.views != null) + foreach (var v in src.views) + this.views.Add(new View(v)); + } + +#if !DoNotUseAasxCompatibilityModels + public Views(AasxCompatibilityModels.AdminShellV10.Views src) + { + if (src != null && src.views != null) + foreach (var v in src.views) + this.views.Add(new View(v)); + } +#endif + + public static Views CreateOrSetInnerViews(Views outer, View[] inner) + { + var res = outer; + if (res == null) + res = new Views(); + if (inner == null) + { + res.views = null; + return res; + } + res.views = new List(inner); + return res; + } + } + + /// + /// Multiple lang string for the AAS namespace + /// + public class LangStringSet + { + + // members + + [XmlElement(ElementName = "langString", Namespace = "http://www.admin-shell.io/aas/2/0")] + public ListOfLangStr langString = new ListOfLangStr(); + + // getters / setters + + [XmlIgnore] + [JsonIgnore] + public bool IsEmpty { get { return langString == null || langString.Count < 1; } } + [XmlIgnore] + [JsonIgnore] + public int Count { get { if (langString == null) return 0; return langString.Count; } } + [XmlIgnore] + [JsonIgnore] + public LangStr this[int index] { get { return langString[index]; } } + + // constructors + + public LangStringSet() { } + + public LangStringSet(LangStringSet src) + { + if (src.langString != null) + foreach (var ls in src.langString) + this.langString.Add(new LangStr(ls)); + } + + public LangStringSet(ListOfLangStr src) + { + if (src != null) + foreach (var ls in src) + this.langString.Add(new LangStr(ls)); + } + +#if !DoNotUseAasxCompatibilityModels + // not available in V1.0 +#endif + public LangStringSet(string lang, string str) + { + if (str == null || str.Trim() == "") + return; + this.langString.Add(new LangStr(lang, str)); + } + + // converter + + public static LangStringSet CreateFrom(List src) + { + var res = new LangStringSet(); + if (src != null) + foreach (var ls in src) + res.langString.Add(new LangStr(ls)); + return res; + } + + // add + + public LangStr Add(LangStr ls) + { + this.langString.Add(ls); + return ls; + } + + public LangStr Add(string lang, string str) + { + var ls = new LangStr(lang, str); + this.langString.Add(ls); + return ls; + } + + // single string representation + public string GetDefaultStr(string defaultLang = null) + { + return this.langString?.GetDefaultStr(defaultLang); + } + } + + /// + /// Multiple lang string for the IEC61360 namespace + /// + public class LangStringSetIEC61360 : ListOfLangStr + { + + // getters / setters + + [XmlIgnore] + [JsonIgnore] + public bool IsEmpty { get { return this.Count < 1; } } + + // constructors + + public LangStringSetIEC61360() { } + + public LangStringSetIEC61360(ListOfLangStr lol) : base(lol) { } + + public LangStringSetIEC61360(LangStringSetIEC61360 src) + { + foreach (var ls in src) + this.Add(new LangStr(ls)); + } + +#if !DoNotUseAasxCompatibilityModels + public LangStringSetIEC61360(AasxCompatibilityModels.AdminShellV10.LangStringIEC61360 src) + { + if (src.langString != null) + foreach (var ls in src.langString) + this.Add(new LangStr(ls)); + } +#endif + public LangStringSetIEC61360(string lang, string str) + { + if (str == null || str.Trim() == "") + return; + this.Add(new LangStr(lang, str)); + } + + // converter + + public static LangStringSetIEC61360 CreateFrom(List src) + { + var res = new LangStringSetIEC61360(); + if (src != null) + foreach (var ls in src) + res.Add(new LangStr(ls)); + return res; + } + + } + + public class UnitId + { + + // members + + [XmlIgnore] + [JsonIgnore] + public KeyList keys = new KeyList(); + + // getter / setters + + [XmlArray("keys")] + [XmlArrayItem("key")] + [JsonIgnore] + public KeyList Keys { get { return keys; } } + [XmlIgnore] + [JsonProperty(PropertyName = "keys")] + public KeyList JsonKeys + { + get + { + keys?.NumberIndices(); + return keys; + } + } + + [XmlIgnore] + [JsonIgnore] + public bool IsEmpty { get { return keys == null || keys.IsEmpty; } } + [XmlIgnore] + [JsonIgnore] + public int Count { get { if (keys == null) return 0; return keys.Count; } } + [XmlIgnore] + [JsonIgnore] + public Key this[int index] { get { return keys[index]; } } + + // constructors / creators + + public UnitId() { } + + public UnitId(UnitId src) + { + if (src.keys != null) + foreach (var k in src.Keys) + this.keys.Add(new Key(k)); + } + +#if !DoNotUseAasxCompatibilityModels + public UnitId(AasxCompatibilityModels.AdminShellV10.UnitId src) + { + if (src.keys != null) + foreach (var k in src.Keys) + this.keys.Add(new Key(k)); + } +#endif + + public static UnitId CreateNew(string type, bool local, string idType, string value) + { + var u = new UnitId(); + u.keys.Add(Key.CreateNew(type, local, idType, value)); + return u; + } + + public static UnitId CreateNew(Reference src) + { + if (src == null) + return null; + var res = new UnitId(); + if (src.Keys != null) + foreach (var k in src.Keys) + res.keys.Add(k); + return res; + } + } + + [XmlRoot(Namespace = "http://www.admin-shell.io/IEC61360/2/0")] + public class DataSpecificationIEC61360 + { + // static member + [XmlIgnore] + [JsonIgnore] + public static string[] DataTypeNames = { + "STRING", + "STRING_TRANSLATABLE", + "REAL_MEASURE", + "REAL_COUNT", + "REAL_CURRENCY", + "INTEGER_MEASURE", + "INTEGER_COUNT", + "INTEGER_CURRENCY", + "BOOLEAN", + "URL", + "RATIONAL", + "RATIONAL_MEASURE", + "TIME", + "TIMESTAMP", + "DATE" }; + + // members + // TODO (MIHO, 2020-08-27): According to spec, cardinality is [1..1][1..n] + // these cardinalities are NOT MAINTAINED in ANY WAY by the system + public LangStringSetIEC61360 preferredName = new LangStringSetIEC61360(); + + // TODO (MIHO, 2020-08-27): According to spec, cardinality is [0..1][1..n] + // these cardinalities are NOT MAINTAINED in ANY WAY by the system + public LangStringSetIEC61360 shortName = null; + + [MetaModelName("DataSpecificationIEC61360.unit")] + [TextSearchable] + [CountForHash] + public string unit = ""; + + public UnitId unitId = null; + + [MetaModelName("DataSpecificationIEC61360.valueFormat")] + [TextSearchable] + [CountForHash] + public string valueFormat = null; + + [MetaModelName("DataSpecificationIEC61360.sourceOfDefinition")] + [TextSearchable] + [CountForHash] + public string sourceOfDefinition = null; + + [MetaModelName("DataSpecificationIEC61360.symbol")] + [TextSearchable] + [CountForHash] + public string symbol = null; + + [MetaModelName("DataSpecificationIEC61360.dataType")] + [TextSearchable] + [CountForHash] + public string dataType = ""; + + // TODO (MIHO, 2020-08-27): According to spec, cardinality is [0..1][1..n] + // these cardinalities are NOT MAINTAINED in ANY WAY by the system + public LangStringSetIEC61360 definition = null; + + // getter / setters + + // constructors + + public DataSpecificationIEC61360() { } + + public DataSpecificationIEC61360(DataSpecificationIEC61360 src) + { + if (src.preferredName != null) + this.preferredName = new LangStringSetIEC61360(src.preferredName); + this.shortName = src.shortName; + this.unit = src.unit; + if (src.unitId != null) + this.unitId = new UnitId(src.unitId); + this.valueFormat = src.valueFormat; + this.sourceOfDefinition = src.sourceOfDefinition; + this.symbol = src.symbol; + this.dataType = src.dataType; + if (src.definition != null) + this.definition = new LangStringSetIEC61360(src.definition); + } + +#if !DoNotUseAasxCompatibilityModels + public DataSpecificationIEC61360(AasxCompatibilityModels.AdminShellV10.DataSpecificationIEC61360 src) + { + if (src.preferredName != null) + this.preferredName = new LangStringSetIEC61360(src.preferredName); + this.shortName = new LangStringSetIEC61360("EN?", src.shortName); + this.unit = src.unit; + if (src.unitId != null) + this.unitId = new UnitId(src.unitId); + this.valueFormat = src.valueFormat; + if (src.sourceOfDefinition != null && src.sourceOfDefinition.Count > 0) + this.sourceOfDefinition = src.sourceOfDefinition[0].str; + this.symbol = src.symbol; + this.dataType = src.dataType; + if (src.definition != null) + this.definition = new LangStringSetIEC61360(src.definition); + } +#endif + + public static DataSpecificationIEC61360 CreateNew( + string[] preferredName = null, + string shortName = "", + string unit = "", + UnitId unitId = null, + string valueFormat = null, + string sourceOfDefinition = null, + string symbol = null, + string dataType = "", + string[] definition = null + ) + { + var d = new DataSpecificationIEC61360(); + if (preferredName != null) + { + d.preferredName = new LangStringSetIEC61360(LangStr.CreateManyFromStringArray(preferredName)); + } + d.shortName = new LangStringSetIEC61360("EN?", shortName); + d.unit = unit; + d.unitId = unitId; + d.valueFormat = valueFormat; + d.sourceOfDefinition = sourceOfDefinition; + d.symbol = symbol; + d.dataType = dataType; + if (definition != null) + { + if (d.definition == null) + d.definition = new LangStringSetIEC61360(); + d.definition = new LangStringSetIEC61360(LangStr.CreateManyFromStringArray(definition)); + } + return (d); + } + + // "constants" + + public static Key GetKey() + { + return Key.CreateNew( + "GlobalReference", false, "IRI", + "http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/2/0"); + } + + // validation + + public void Validate(AasValidationRecordList results, ConceptDescription cd) + { + // access + if (results == null || cd == null) + return; + + // check IEC61360 spec + if (this.preferredName == null || this.preferredName.Count < 1) + results.Add(new AasValidationRecord( + AasValidationSeverity.SchemaViolation, cd, + "ConceptDescription: missing preferredName", + () => + { + this.preferredName = new AdminShell.LangStringSetIEC61360("EN?", + AdminShellUtilV20.EvalToNonEmptyString("{0}", cd.idShort, "UNKNOWN")); + })); + + if (this.shortName != null && this.shortName.Count < 1) + results.Add(new AasValidationRecord( + AasValidationSeverity.SchemaViolation, cd, + "ConceptDescription: existing shortName with missing langString", + () => + { + this.shortName = null; + })); + + if (this.definition != null && this.definition.Count < 1) + results.Add(new AasValidationRecord( + AasValidationSeverity.SchemaViolation, cd, + "ConceptDescription: existing definition with missing langString", + () => + { + this.definition = null; + })); + + // check data type + string foundDataType = null; + if (this.dataType != null) + foreach (var dtn in DataTypeNames) + if (this.dataType.Trim() == dtn.Trim()) + foundDataType = this.dataType; + if (foundDataType == null) + results.Add(new AasValidationRecord( + AasValidationSeverity.SchemaViolation, cd, + "ConceptDescription: dataType does not match allowed enumeration values", + () => + { + this.dataType = "STRING"; + })); + } + } + + // ReSharper disable ClassNeverInstantiated.Global .. class is important to show potential for ISO! + + public class DataSpecificationISO99999 + { + } + + // ReSharper enable ClassNeverInstantiated.Global + + public class DataSpecificationContent + { + + // members + + public DataSpecificationIEC61360 dataSpecificationIEC61360 = null; + public DataSpecificationISO99999 dataSpecificationISO99999 = null; + + // constructors + + public DataSpecificationContent() { } + + public DataSpecificationContent(DataSpecificationContent src) + { + if (src.dataSpecificationIEC61360 != null) + this.dataSpecificationIEC61360 = new DataSpecificationIEC61360(src.dataSpecificationIEC61360); + } + +#if !DoNotUseAasxCompatibilityModels + public DataSpecificationContent(AasxCompatibilityModels.AdminShellV10.DataSpecificationContent src) + { + if (src.dataSpecificationIEC61360 != null) + this.dataSpecificationIEC61360 = new DataSpecificationIEC61360(src.dataSpecificationIEC61360); + } +#endif + } + + public class EmbeddedDataSpecification + { + // members + + [JsonIgnore] + public DataSpecificationContent dataSpecificationContent = null; + + [XmlIgnore] + [JsonProperty("dataSpecificationContent")] + public DataSpecificationIEC61360 JsonWrongDataSpec61360 + { + get { return dataSpecificationContent?.dataSpecificationIEC61360; } + set + { + if (dataSpecificationContent == null) + dataSpecificationContent = new DataSpecificationContent(); + dataSpecificationContent.dataSpecificationIEC61360 = value; + } + } + + public DataSpecificationRef dataSpecification = null; + + // constructors + + public EmbeddedDataSpecification() { } + + public EmbeddedDataSpecification( + DataSpecificationRef dataSpecification, + DataSpecificationContent dataSpecificationContent) + { + this.dataSpecification = dataSpecification; + this.dataSpecificationContent = dataSpecificationContent; + } + + public EmbeddedDataSpecification(EmbeddedDataSpecification src) + { + if (src.dataSpecification != null) + this.dataSpecification = new DataSpecificationRef(src.dataSpecification); + if (src.dataSpecificationContent != null) + this.dataSpecificationContent = new DataSpecificationContent(src.dataSpecificationContent); + } + + public EmbeddedDataSpecification(Reference src) + { + if (src != null) + this.dataSpecification = new DataSpecificationRef(src); + } + +#if !DoNotUseAasxCompatibilityModels + public EmbeddedDataSpecification(AasxCompatibilityModels.AdminShellV10.EmbeddedDataSpecification src) + { + if (src.hasDataSpecification != null) + this.dataSpecification = new DataSpecificationRef(src.hasDataSpecification); + if (src.dataSpecificationContent != null) + this.dataSpecificationContent = new DataSpecificationContent(src.dataSpecificationContent); + } + + public EmbeddedDataSpecification(AasxCompatibilityModels.AdminShellV10.Reference src) + { + if (src != null) + this.dataSpecification = new DataSpecificationRef(src); + } +#endif + + public static EmbeddedDataSpecification CreateIEC61360WithContent() + { + var eds = new EmbeddedDataSpecification(new DataSpecificationRef(), new DataSpecificationContent()); + + eds.dataSpecification.Keys.Add(DataSpecificationIEC61360.GetKey()); + + eds.dataSpecificationContent.dataSpecificationIEC61360 = + AdminShell.DataSpecificationIEC61360.CreateNew(); + + return eds; + } + + public DataSpecificationIEC61360 GetIEC61360() + { + return this.dataSpecificationContent?.dataSpecificationIEC61360; + } + } + + public class ConceptDescription : Identifiable, System.IDisposable + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } + + // members + + // do this in order to be IDisposable, that is: suitable for (using) + void System.IDisposable.Dispose() { } + public void GetData() { } + // from HasDataSpecification + +#if __not_anymore + + [XmlElement(ElementName = "embeddedDataSpecification")] + [JsonIgnore] + public EmbeddedDataSpecification embeddedDataSpecification = new EmbeddedDataSpecification(); +#else + // According to Spec V2.0.1, a ConceptDescription might feature alos multiple data specifications + /* TODO (MIHO, 2020-08-30): align wording of the member ("embeddedDataSpecification") with the + * wording of the other entities ("hasDataSpecification") */ + [XmlElement(ElementName = "embeddedDataSpecification")] + [JsonIgnore] + public HasDataSpecification embeddedDataSpecification = null; +#endif + + [XmlIgnore] + [JsonProperty(PropertyName = "embeddedDataSpecifications")] + public EmbeddedDataSpecification[] JsonEmbeddedDataSpecifications + { + get + { + return this.embeddedDataSpecification?.ToArray(); + } + set + { + embeddedDataSpecification = new HasDataSpecification(value); + } + } + + // old + + // this class + [XmlIgnore] + private List isCaseOf = null; + + // getter / setter + + [XmlElement(ElementName = "isCaseOf")] + [JsonProperty(PropertyName = "isCaseOf")] + public List IsCaseOf + { + get { return isCaseOf; } + set { isCaseOf = value; } + } + + // constructors / creators + + public ConceptDescription() : base() { } + + public ConceptDescription(ConceptDescription src) + : base(src) + { + if (src.embeddedDataSpecification != null) + this.embeddedDataSpecification = new HasDataSpecification(src.embeddedDataSpecification); + if (src.isCaseOf != null) + foreach (var ico in src.isCaseOf) + { + if (this.isCaseOf == null) + this.isCaseOf = new List(); + this.isCaseOf.Add(new Reference(ico)); + } + } + +#if !DoNotUseAasxCompatibilityModels + public ConceptDescription(AasxCompatibilityModels.AdminShellV10.ConceptDescription src) + : base(src) + { + if (src.embeddedDataSpecification != null) + { + this.embeddedDataSpecification = new HasDataSpecification(); + this.embeddedDataSpecification.Add(new EmbeddedDataSpecification(src.embeddedDataSpecification)); + } + if (src.IsCaseOf != null) + foreach (var ico in src.IsCaseOf) + { + if (this.isCaseOf == null) + this.isCaseOf = new List(); + this.isCaseOf.Add(new Reference(ico)); + } + } +#endif + + public static ConceptDescription CreateNew( + string idShort, string idType, string id, string version = null, string revision = null) + { + var cd = new ConceptDescription(); + cd.idShort = idShort; + cd.identification.idType = idType; + cd.identification.id = id; + if (version != null) + { + if (cd.administration == null) + cd.administration = new Administration(); + cd.administration.version = version; + cd.administration.revision = revision; + } + return (cd); + } + + public Key GetSingleKey() + { + return Key.CreateNew(this.GetElementName(), true, this.identification.idType, this.identification.id); + } + + public ConceptDescriptionRef GetCdReference() + { + var r = new ConceptDescriptionRef(); + r.Keys.Add( + Key.CreateNew( + this.GetElementName(), true, this.identification.idType, this.identification.id)); + return r; + } + + public void SetIEC61360Spec( + string[] preferredNames = null, + string shortName = "", + string unit = "", + UnitId unitId = null, + string valueFormat = null, + string sourceOfDefinition = null, + string symbol = null, + string dataType = "", + string[] definition = null + ) + { + var eds = new EmbeddedDataSpecification(new DataSpecificationRef(), new DataSpecificationContent()); + eds.dataSpecification.Keys.Add( + DataSpecificationIEC61360.GetKey()); + eds.dataSpecificationContent.dataSpecificationIEC61360 = + AdminShell.DataSpecificationIEC61360.CreateNew( + preferredNames, shortName, unit, unitId, valueFormat, sourceOfDefinition, symbol, + dataType, definition); + + this.embeddedDataSpecification = new HasDataSpecification(); + this.embeddedDataSpecification.Add(eds); + + this.AddIsCaseOf( + Reference.CreateNew( + new Key("ConceptDescription", false, this.identification.idType, this.identification.id))); + } + + public DataSpecificationIEC61360 GetIEC61360() + { + return this.embeddedDataSpecification?.IEC61360Content; + } + + // as experimental approach, forward the IEC getter/sett of hasDataSpec directly + + [XmlIgnore] + [JsonIgnore] + public EmbeddedDataSpecification IEC61360DataSpec + { + get + { + return this.embeddedDataSpecification?.IEC61360; + } + set + { + // add embeddedDataSpecification first? + if (this.embeddedDataSpecification == null) + this.embeddedDataSpecification = new HasDataSpecification(); + this.embeddedDataSpecification.IEC61360 = value; + } + } + + [XmlIgnore] + [JsonIgnore] + public DataSpecificationIEC61360 IEC61360Content + { + get + { + return this.embeddedDataSpecification?.IEC61360Content; + } + set + { + // add embeddedDataSpecification first? + if (this.embeddedDataSpecification == null) + this.embeddedDataSpecification = new HasDataSpecification(); + + // check, if e IEC61360 can be found + var eds = this.embeddedDataSpecification.IEC61360; + + // if already there, update + if (eds != null) + { + eds.dataSpecificationContent = new DataSpecificationContent(); + eds.dataSpecificationContent.dataSpecificationIEC61360 = value; + return; + } + + // no: add a full record + eds = EmbeddedDataSpecification.CreateIEC61360WithContent(); + eds.dataSpecificationContent.dataSpecificationIEC61360 = value; + this.embeddedDataSpecification.Add(eds); + } + } + + public DataSpecificationIEC61360 CreateDataSpecWithContentIec61360() + { + var eds = AdminShell.EmbeddedDataSpecification.CreateIEC61360WithContent(); + if (this.embeddedDataSpecification == null) + this.embeddedDataSpecification = new HasDataSpecification(); + this.embeddedDataSpecification.Add(eds); + return eds.dataSpecificationContent?.dataSpecificationIEC61360; + } + + public string GetDefaultPreferredName(string defaultLang = null) + { + return "" + + GetIEC61360()? + .preferredName?.GetDefaultStr(defaultLang); + } + + public string GetDefaultShortName(string defaultLang = null) + { + return "" + + GetIEC61360()? + .shortName?.GetDefaultStr(defaultLang); + } + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("ConceptDescription", "CD"); + } + + public Tuple ToCaptionInfo() + { + var caption = ""; + if (this.idShort != null && this.idShort.Trim() != "") + caption = $"\"{this.idShort.Trim()}\""; + if (this.identification != null) + caption = (caption + " " + this.identification).Trim(); + + var info = "" + GetDefaultShortName(); + + return Tuple.Create(caption, info); + } + + public override string ToString() + { + var ci = ToCaptionInfo(); + return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); + } + + public void AddIsCaseOf(Reference ico) + { + if (isCaseOf == null) + isCaseOf = new List(); + isCaseOf.Add(ico); + } + + public static IDisposable CreateNew() + { + throw new NotImplementedException(); + } + + // validation + + public override void Validate(AasValidationRecordList results) + { + // access + if (results == null) + return; + + // check CD itself + base.Validate(results); + + // check IEC61360 spec + var eds61360 = this.IEC61360DataSpec; + if (eds61360 != null) + { + // check data spec + if (eds61360.dataSpecification == null || + !(eds61360.dataSpecification.MatchesExactlyOneKey(DataSpecificationIEC61360.GetKey()))) + results.Add(new AasValidationRecord( + AasValidationSeverity.SpecViolation, this, + "HasDataSpecification: data specification content set to IEC61360, but no " + + "data specification reference set!", + () => + { + eds61360.dataSpecification = new DataSpecificationRef( + new Reference( + DataSpecificationIEC61360.GetKey())); + })); + + // validate content + if (eds61360.dataSpecificationContent?.dataSpecificationIEC61360 == null) + { + results.Add(new AasValidationRecord( + AasValidationSeverity.SpecViolation, this, + "HasDataSpecification: data specification reference set to IEC61360, but no " + + "data specification content set!", + () => + { + eds61360.dataSpecificationContent = new DataSpecificationContent(); + eds61360.dataSpecificationContent.dataSpecificationIEC61360 = + new DataSpecificationIEC61360(); + })); + } + else + { + // validate + eds61360.dataSpecificationContent.dataSpecificationIEC61360.Validate(results, this); + } + } + } + + // more find + + public IEnumerable FindAllReferences() + { + yield break; + } + } + + public class ListOfConceptDescriptions : List, IAasElement + { + // finding + + public ConceptDescription Find(ConceptDescriptionRef cdr) + { + if (cdr == null) + return null; + return Find(cdr.Keys); + } + + public ConceptDescription Find(Identification id) + { + var cdr = ConceptDescriptionRef.CreateNew("Conceptdescription", true, id.idType, id.id); + return Find(cdr); + } + + public ConceptDescription Find(List keys) + { + // trivial + if (keys == null) + return null; + // can only refs with 1 key + if (keys.Count != 1) + return null; + // and we're picky + var key = keys[0]; + if (!key.local || key.type.ToLower().Trim() != "conceptdescription") + return null; + // brute force + foreach (var cd in this) + if (cd.identification.idType.ToLower().Trim() == key.idType.ToLower().Trim() + && cd.identification.id.ToLower().Trim() == key.value.ToLower().Trim()) + return cd; + // uups + return null; + } + + // item management + + public ConceptDescription AddIfNew(ConceptDescription cd) + { + if (cd == null) + return null; + + var exist = this.Find(cd.identification); + if (exist != null) + return exist; + + this.Add(cd); + return cd; + } + + // self decscription + + public AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("ConceptDescriptions", "CDS"); + } + + public string GetElementName() + { + return this.GetSelfDescription()?.ElementName; + } + + // sorting + + + } + + public class ConceptDictionary : Referable + { + [XmlElement(ElementName = "conceptDescriptions")] + public ConceptDescriptionRefs conceptDescriptionsRefs = null; + + // constructors + + public ConceptDictionary() { } + + public ConceptDictionary(ConceptDictionary src) + { + if (src.conceptDescriptionsRefs != null) + this.conceptDescriptionsRefs = new ConceptDescriptionRefs(src.conceptDescriptionsRefs); + } + +#if !DoNotUseAasxCompatibilityModels + public ConceptDictionary(AasxCompatibilityModels.AdminShellV10.ConceptDictionary src) + { + if (src.conceptDescriptionsRefs != null) + this.conceptDescriptionsRefs = new ConceptDescriptionRefs(src.conceptDescriptionsRefs); + } +#endif + + public static ConceptDictionary CreateNew(string idShort = null) + { + var d = new ConceptDictionary(); + if (idShort != null) + d.idShort = idShort; + return (d); + } + + // add + + public void AddReference(Reference r) + { + var cdr = (ConceptDescriptionRef)(ConceptDescriptionRef.CreateNew(r.Keys)); + if (conceptDescriptionsRefs == null) + conceptDescriptionsRefs = new ConceptDescriptionRefs(); + conceptDescriptionsRefs.conceptDescriptions.Add(cdr); + } + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("ConceptDictionary", "CDic"); + } + } + + /// + /// Use by FindAllReference to provide a enumeration of referenced with location + /// info, where they are contained + /// + public class LocatedReference + { + public Identifiable Identifiable; + public Reference Reference; + + public LocatedReference() { } + public LocatedReference(Identifiable identifiable, Reference reference) + { + Identifiable = identifiable; + Reference = reference; + } + } + + [XmlRoot(ElementName = "aasenv", Namespace = "http://www.admin-shell.io/aas/2/0")] + public class AdministrationShellEnv : IFindAllReferences, IAasElement, IDiaryData, IRecurseOnReferables + { + + // diary (as e.g. deleted AASes need to be listed somewhere) + + [XmlIgnore] + [JsonIgnore] + [SkipForHash] + [SkipForReflection] + private DiaryDataDef _diaryData = new DiaryDataDef(); + + [XmlIgnore] + [JsonIgnore] + [SkipForReflection] + public DiaryDataDef DiaryData { get { return _diaryData; } } + + // members + + [XmlAttribute(Namespace = System.Xml.Schema.XmlSchema.InstanceNamespace)] + [JsonIgnore] + public string schemaLocation = + "http://www.admin-shell.io/aas/2/0 AAS.xsd http://www.admin-shell.io/IEC61360/2/0 IEC61360.xsd"; + + [XmlIgnore] // will be ignored, anyway + private ListOfAdministrationShells administrationShells = new ListOfAdministrationShells(); + [XmlIgnore] // will be ignored, anyway + private ListOfAssets assets = new ListOfAssets(); + [XmlIgnore] // will be ignored, anyway + private ListOfSubmodels submodels = new ListOfSubmodels(); + [XmlIgnore] // will be ignored, anyway + private ListOfConceptDescriptions conceptDescriptions = new ListOfConceptDescriptions(); + + // getter / setters + + [XmlArray("assetAdministrationShells")] + [XmlArrayItem("assetAdministrationShell")] + [JsonProperty(PropertyName = "assetAdministrationShells")] + public ListOfAdministrationShells AdministrationShells + { + get { return administrationShells; } + set { administrationShells = value; } + } + + [XmlArray("assets")] + [XmlArrayItem("asset")] + [JsonProperty(PropertyName = "assets")] + public ListOfAssets Assets + { + get { return assets; } + set { assets = value; } + } + + [XmlArray("submodels")] + [XmlArrayItem("submodel")] + [JsonProperty(PropertyName = "submodels")] + public ListOfSubmodels Submodels + { + get { return submodels; } + set { submodels = value; } + } + + [XmlArray("conceptDescriptions")] + [XmlArrayItem("conceptDescription")] + [JsonProperty(PropertyName = "conceptDescriptions")] + public ListOfConceptDescriptions ConceptDescriptions + { + get { return conceptDescriptions; } + set { conceptDescriptions = value; } + } + + // constructors + + public AdministrationShellEnv() { } + +#if !DoNotUseAasxCompatibilityModels + public AdministrationShellEnv(AasxCompatibilityModels.AdminShellV10.AdministrationShellEnv src) + { + if (src.AdministrationShells != null) + foreach (var aas in src.AdministrationShells) + this.administrationShells.Add(new AdministrationShell(aas)); + + if (src.Assets != null) + foreach (var asset in src.Assets) + this.assets.Add(new Asset(asset)); + + if (src.Submodels != null) + foreach (var sm in src.Submodels) + this.submodels.Add(new Submodel(sm)); + + if (src.ConceptDescriptions != null) + foreach (var cd in src.ConceptDescriptions) + this.conceptDescriptions.Add(new ConceptDescription(cd)); + } +#endif + + // to String + + public override string ToString() + { + var res = "AAS-ENV"; + if (AdministrationShells != null) + res += $" {AdministrationShells.Count} AAS"; + if (Assets != null) + res += $" {Assets.Count} Assets"; + if (Submodels != null) + res += $" {Submodels.Count} Submodels"; + if (ConceptDescriptions != null) + res += $" {ConceptDescriptions.Count} CDs"; + return res; + } + + // self decscription + + public AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("AdministrationShellEnv", "Env"); + } + + public string GetElementName() + { + return this.GetSelfDescription()?.ElementName; + } + + // finders + + public AdministrationShell FindAAS(Identification id) + { + if (id == null) + return null; + foreach (var aas in this.AdministrationShells) + if (aas.identification != null && aas.identification.IsEqual(id)) + return aas; + return null; + } + + public AdministrationShell FindAAS(string idShort) + { + if (idShort == null) + return null; + foreach (var aas in this.AdministrationShells) + if (aas.idShort != null && aas.idShort.Trim().ToLower() == idShort.Trim().ToLower()) + return aas; + return null; + } + + public AdministrationShell FindAASwithSubmodel(Identification smid) + { + if (smid == null) + return null; + foreach (var aas in this.AdministrationShells) + if (aas.submodelRefs != null) + foreach (var smref in aas.submodelRefs) + if (smref.Matches(smid)) + return aas; + return null; + } + + public IEnumerable FindAllAAS( + Predicate p = null) + { + if (this.administrationShells == null) + yield break; + foreach (var x in this.administrationShells) + if (p == null || p(x)) + yield return x; + } + + public IEnumerable FindAllSubmodelGroupedByAAS( + Func p = null) + { + if (this.administrationShells == null || this.submodels == null) + yield break; + foreach (var aas in this.administrationShells) + { + if (aas?.submodelRefs == null) + continue; + foreach (var smref in aas.submodelRefs) + { + var sm = this.FindSubmodel(smref); + if (sm != null && (p == null || p(aas, sm))) + yield return sm; + } + } + } + + public Asset FindAsset(Identification id) + { + if (id == null) + return null; + foreach (var asset in this.Assets) + if (asset.identification != null && asset.identification.IsEqual(id)) + return asset; + return null; + } + + public Asset FindAsset(AssetRef aref) + { + // trivial + if (aref == null) + return null; + // can only refs with 1 key + if (aref.Count != 1) + return null; + // and we're picky + var key = aref[0]; + if (!key.local || key.type.ToLower().Trim() != "asset") + return null; + // brute force + foreach (var a in assets) + if (a.identification.idType.ToLower().Trim() == key.idType.ToLower().Trim() + && a.identification.id.ToLower().Trim() == key.value.ToLower().Trim()) + return a; + // uups + return null; + } + + public Submodel FindSubmodel(Identification id) + { + if (id == null) + return null; + foreach (var sm in this.Submodels) + if (sm.identification != null && sm.identification.IsEqual(id)) + return sm; + return null; + } + + public Submodel FindSubmodel(SubmodelRef smref) + { + // trivial + if (smref == null) + return null; + // can only refs with 1 key + if (smref.Count != 1) + return null; + // and we're picky + var key = smref.Keys[0]; + if (!key.local || key.type.ToLower().Trim() != "submodel") + return null; + // brute force + foreach (var sm in this.Submodels) + if (sm.identification.idType.ToLower().Trim() == key.idType.ToLower().Trim() + && sm.identification.id.ToLower().Trim() == key.value.ToLower().Trim()) + return sm; + // uups + return null; + } + + public Submodel FindFirstSubmodelBySemanticId(Key semId) + { + // access + if (semId == null) + return null; + + // brute force + foreach (var sm in this.Submodels) + if (true == sm.semanticId?.MatchesExactlyOneKey(semId)) + return sm; + + return null; + } + + public IEnumerable FindAllSubmodelBySemanticId( + Key semId, Key.MatchMode matchMode = Key.MatchMode.Strict) + { + // access + if (semId == null) + yield break; + + // brute force + foreach (var sm in this.Submodels) + if (true == sm.semanticId?.MatchesExactlyOneKey(semId, matchMode)) + yield return sm; + } + + public IEnumerable FindAllReferable(Predicate p) + { + if (p == null) + yield break; + + foreach (var r in this.FindAllReferable()) + if (r != null && p(r)) + yield return r; + } + + public IEnumerable FindAllReferable(bool onlyIdentifiables = false) + { + if (this.AdministrationShells != null) + foreach (var aas in this.AdministrationShells) + if (aas != null) + { + // AAS itself + yield return aas; + + if (!onlyIdentifiables) + { + // Views + if (aas.views?.views != null) + foreach (var view in aas.views.views) + yield return view; + } + } + + if (this.Assets != null) + foreach (var asset in this.Assets) + if (asset != null) + yield return asset; + + if (this.Submodels != null) + foreach (var sm in this.Submodels) + if (sm != null) + { + yield return sm; + + if (!onlyIdentifiables) + { + // TODO (MIHO, 2020-08-26): not very elegant, yet. Avoid temporary collection + var allsme = new ListOfSubmodelElement(); + sm.RecurseOnSubmodelElements(null, (state, parents, sme) => + { + allsme.Add(sme); return true; + }); + foreach (var sme in allsme) + yield return sme; + } + } + + if (this.ConceptDescriptions != null) + foreach (var cd in this.ConceptDescriptions) + if (cd != null) + yield return cd; + } + + // + // Reference handling + // + + public Referable FindReferableByReference(Reference rf, int keyIndex = 0, bool exactMatch = false) + { + return FindReferableByReference(rf?.Keys); + } + + public Referable FindReferableByReference(KeyList kl, int keyIndex = 0, bool exactMatch = false, + ReferableRootInfo rootInfo = null) + { + // first index needs to exist .. + if (kl == null || keyIndex >= kl.Count) + return null; + + // which type? + var firstType = kl[keyIndex].type.Trim().ToLower(); + var firstIdentification = new Identification(kl[keyIndex].idType, kl[keyIndex].value); + AdministrationShell aasToFollow = null; + + if (firstType == Key.AAS.Trim().ToLower()) + { + // search aas + var aas = this.FindAAS(firstIdentification); + + // not found or already at end with our search? + if (aas == null || keyIndex >= kl.Count - 1) + return aas; + + // side info? + if (rootInfo != null) + { + rootInfo.AAS = aas; + rootInfo.NrOfRootKeys = 1 + keyIndex; + } + + // follow up + aasToFollow = aas; + } + + if (firstType == Key.Asset.Trim().ToLower()) + { + // search asset + var asset = this.FindAsset(firstIdentification); + + // not found or already at end with our search? + if (asset == null || keyIndex >= kl.Count - 1) + return exactMatch ? null : asset; + + // try find aas for it + var aas = this.FindAllAAS((a) => + { + return a?.assetRef?.Matches(asset.identification) == true; + }).FirstOrDefault(); + if (aas == null) + return exactMatch ? null : asset; + + // side info? + if (rootInfo != null) + { + rootInfo.Asset = asset; + rootInfo.NrOfRootKeys = 1 + keyIndex; + } + + // follow up + aasToFollow = aas; + } + + // try + if (aasToFollow != null) + { + // search different entities + if (kl[keyIndex + 1].type.Trim().ToLower() == Key.Submodel.ToLower() + || kl[keyIndex + 1].type.Trim().ToLower() == Key.SubmodelRef.ToLower()) + { + // ok, search SubmodelRef + var smref = aasToFollow.FindSubmodelRef(kl[keyIndex + 1].ToId()); + if (smref == null) + return exactMatch ? null : aasToFollow; + + // validate matching submodel + var sm = this.FindSubmodel(smref); + if (sm == null) + return exactMatch ? null : aasToFollow; + + // side info + // side info? + if (rootInfo != null) + { + rootInfo.Submodel = sm; + rootInfo.NrOfRootKeys = 2 + keyIndex; + } + + // at our end? + if (keyIndex >= kl.Count - 2) + return sm; + + // go inside + return SubmodelElementWrapper.FindReferableByReference(sm.submodelElements, kl, keyIndex + 2); + } + } + + if (firstType == Key.ConceptDescription.Trim().ToLower()) + return this.FindConceptDescription(firstIdentification); + + if (firstType == Key.Submodel.Trim().ToLower()) + { + // ok, search Submodel + var sm = this.FindSubmodel(new Identification(kl[keyIndex].idType, kl[keyIndex].value)); + if (sm == null) + return null; + + // notice in side info + if (rootInfo != null) + { + rootInfo.Submodel = sm; + rootInfo.NrOfRootKeys = 1 + keyIndex; + + // add even more info + if (rootInfo.AAS == null) + { + foreach (var aas2 in this.AdministrationShells) + { + var smref2 = aas2.FindSubmodelRef(sm.identification); + if (smref2 != null) + { + rootInfo.AAS = aas2; + break; + } + } + } + } + + // at our end? + if (keyIndex >= kl.Count - 1) + return sm; + + // go inside + return SubmodelElementWrapper.FindReferableByReference(sm.submodelElements, kl, keyIndex + 1); + } + + // nothing in this Environment + return null; + } + + // + // Handling of CDs + // + + public ConceptDescription FindConceptDescription(ConceptDescriptionRef cdr) + { + if (cdr == null) + return null; + return FindConceptDescription(cdr.Keys); + } + + public ConceptDescription FindConceptDescription(SemanticId semId) + { + if (semId == null) + return null; + return FindConceptDescription(semId.Keys); + } + + public ConceptDescription FindConceptDescription(Reference rf) + { + if (rf == null) + return null; + return FindConceptDescription(rf.Keys); + } + + public ConceptDescription FindConceptDescription(Identification id) + { + var cdr = ConceptDescriptionRef.CreateNew("Conceptdescription", true, id.idType, id.id); + return FindConceptDescription(cdr); + } + + public ConceptDescription FindConceptDescription(List keys) + { + // trivial + if (keys == null) + return null; + // can only refs with 1 key + if (keys.Count != 1) + return null; + // and we're picky + var key = keys[0]; + if (!key.local || key.type.ToLower().Trim() != "conceptdescription") + return null; + // brute force + foreach (var cd in conceptDescriptions) + if (cd.identification.idType.ToLower().Trim() == key.idType.ToLower().Trim() + && cd.identification.id.ToLower().Trim() == key.value.ToLower().Trim()) + return cd; + // uups + return null; + } + + public IEnumerable FindAllSubmodelElements( + Predicate match = null, AdministrationShell onlyForAAS = null) where T : SubmodelElement + { + // more or less two different schemes + if (onlyForAAS != null) + { + if (onlyForAAS.submodelRefs == null) + yield break; + foreach (var smr in onlyForAAS.submodelRefs) + { + var sm = this.FindSubmodel(smr); + if (sm?.submodelElements != null) + foreach (var x in sm.submodelElements.FindDeep(match)) + yield return x; + } + } + else + { + if (this.Submodels != null) + foreach (var sm in this.Submodels) + if (sm?.submodelElements != null) + foreach (var x in sm.submodelElements.FindDeep(match)) + yield return x; + } + } + + public ConceptDescription FindConceptDescription(Key key) + { + if (key == null) + return null; + var l = new List { key }; + return (FindConceptDescription(l)); + } + + public IEnumerable FindAllReferences() + { + if (this.AdministrationShells != null) + foreach (var aas in this.AdministrationShells) + if (aas != null) + foreach (var r in aas.FindAllReferences()) + yield return r; + + if (this.Assets != null) + foreach (var asset in this.Assets) + if (asset != null) + foreach (var r in asset.FindAllReferences()) + yield return new LocatedReference(asset, r); + + if (this.Submodels != null) + foreach (var sm in this.Submodels) + if (sm != null) + foreach (var r in sm.FindAllReferences()) + yield return r; + + if (this.ConceptDescriptions != null) + foreach (var cd in this.ConceptDescriptions) + if (cd != null) + foreach (var r in cd.FindAllReferences()) + yield return new LocatedReference(cd, r); + } + + // creators + + private void CopyConceptDescriptionsFrom( + AdministrationShellEnv srcEnv, SubmodelElement src, bool shallowCopy = false) + { + // access + if (srcEnv == null || src == null || src.semanticId == null) + return; + // check for this SubmodelElement in Source + var cdSrc = srcEnv.FindConceptDescription(src.semanticId.Keys); + if (cdSrc == null) + return; + // check for this SubmodelElement in Destnation (this!) + var cdDest = this.FindConceptDescription(src.semanticId.Keys); + if (cdDest != null) + return; + // copy new + this.ConceptDescriptions.Add(new ConceptDescription(cdSrc)); + // recurse? + if (!shallowCopy && src is SubmodelElementCollection) + foreach (var m in (src as SubmodelElementCollection).value) + CopyConceptDescriptionsFrom(srcEnv, m.submodelElement, shallowCopy: false); + + } + + public SubmodelElementWrapper CopySubmodelElementAndCD( + AdministrationShellEnv srcEnv, SubmodelElement srcElem, bool copyCD = false, bool shallowCopy = false) + { + // access + if (srcEnv == null || srcElem == null) + return null; + + // 1st result pretty easy (calling function will add this to the appropriate Submodel) + var res = new SubmodelElementWrapper(srcElem); + + // copy the CDs.. + if (copyCD) + CopyConceptDescriptionsFrom(srcEnv, srcElem, shallowCopy); + + // give back + return res; + } + + public SubmodelRef CopySubmodelRefAndCD( + AdministrationShellEnv srcEnv, SubmodelRef srcSubRef, bool copySubmodel = false, bool copyCD = false, + bool shallowCopy = false) + { + // access + if (srcEnv == null || srcSubRef == null) + return null; + + // need to have the source Submodel + var srcSub = srcEnv.FindSubmodel(srcSubRef); + if (srcSub == null) + return null; + + // 1st result pretty easy (calling function will add this to the appropriate AAS) + var dstSubRef = new SubmodelRef(srcSubRef); + + // get the destination and shall src != dst + var dstSub = this.FindSubmodel(dstSubRef); + if (srcSub == dstSub) + return null; + + // maybe we need the Submodel in our environment, as well + if (dstSub == null && copySubmodel) + { + dstSub = new Submodel(srcSub, shallowCopy); + this.Submodels.Add(dstSub); + } + else + if (dstSub != null) + { + // there is already an submodel, just add members + if (!shallowCopy && srcSub.submodelElements != null) + { + if (dstSub.submodelElements == null) + dstSub.submodelElements = new SubmodelElementWrapperCollection(); + foreach (var smw in srcSub.submodelElements) + dstSub.submodelElements.Add( + new SubmodelElementWrapper( + smw.submodelElement, shallowCopy: false)); + } + } + + // copy the CDs.. + if (copyCD && srcSub.submodelElements != null) + foreach (var smw in srcSub.submodelElements) + CopyConceptDescriptionsFrom(srcEnv, smw.submodelElement, shallowCopy); + + // give back + return dstSubRef; + } + + /// + /// Tries renaming an Identifiable, specifically: the identification of an Identifiable and + /// all references to it. + /// Currently supported: ConceptDescriptions + /// Returns a list of Referables, which were changed or null in case of error + /// + public List RenameIdentifiable(Identification oldId, Identification newId) + where T : Identifiable + { + // access + if (oldId == null || newId == null || oldId.IsEqual(newId)) + return null; + + var res = new List(); + + if (typeof(T) == typeof(ConceptDescription)) + { + // check, if exist or not exist + var cdOld = FindConceptDescription(oldId); + if (cdOld == null || FindConceptDescription(newId) != null) + return null; + + // rename old cd + cdOld.identification = newId; + res.Add(cdOld); + + // search all SMEs referring to this CD + foreach (var sme in this.FindAllSubmodelElements(match: (s) => + { + return (s != null && s.semanticId != null && s.semanticId.Matches(oldId)); + })) + { + sme.semanticId[0].idType = newId.idType; + sme.semanticId[0].value = newId.id; + res.Add(sme); + } + + // seems fine + return res; + } + + if (typeof(T) == typeof(Submodel)) + { + // check, if exist or not exist + var smOld = FindSubmodel(oldId); + if (smOld == null || FindSubmodel(newId) != null) + return null; + + // recurse all possible Referenes in the aas env + foreach (var lr in this.FindAllReferences()) + { + var r = lr?.Reference; + if (r != null) + for (int i = 0; i < r.Count; i++) + if (r[i].Matches(Key.Submodel, false, oldId.idType, oldId.id, Key.MatchMode.Relaxed)) + { + // directly replace + r[i].idType = newId.idType; + r[i].value = newId.id; + if (res.Contains(lr.Identifiable)) + res.Add(lr.Identifiable); + } + } + + // rename old Submodel + smOld.identification = newId; + + // seems fine + return res; + } + + if (typeof(T) == typeof(Asset)) + { + // check, if exist or not exist + var assetOld = FindAsset(oldId); + if (assetOld == null || FindAsset(newId) != null) + return null; + + // recurse all possible Referenes in the aas env + foreach (var lr in this.FindAllReferences()) + { + var r = lr?.Reference; + if (r != null) + for (int i = 0; i < r.Count; i++) + if (r[i].Matches(Key.Asset, false, oldId.idType, oldId.id, Key.MatchMode.Relaxed)) + { + // directly replace + r[i].idType = newId.idType; + r[i].value = newId.id; + if (res.Contains(lr.Identifiable)) + res.Add(lr.Identifiable); + } + } + + // rename old Submodel + assetOld.identification = newId; + + // seems fine + return res; + } + + // no result is false, as well + return null; + } + + // serializations + + public void SerializeXmlToStream(StreamWriter s) + { + var serializer = new XmlSerializer(typeof(AdminShell.AdministrationShellEnv)); + var nss = new XmlSerializerNamespaces(); + nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace); + nss.Add("aas", "http://www.admin-shell.io/aas/2/0"); + nss.Add("IEC61360", "http://www.admin-shell.io/IEC61360/2/0"); + serializer.Serialize(s, this, nss); + } + + public JsonWriter SerialiazeJsonToStream(StreamWriter sw, bool leaveJsonWriterOpen = false) + { + sw.AutoFlush = true; + + JsonSerializer serializer = new JsonSerializer() + { + NullValueHandling = NullValueHandling.Ignore, + ReferenceLoopHandling = ReferenceLoopHandling.Serialize, + Formatting = Newtonsoft.Json.Formatting.Indented + }; + + JsonWriter writer = new JsonTextWriter(sw); + serializer.Serialize(writer, this); + if (leaveJsonWriterOpen) + return writer; + writer.Close(); + return null; + } + + public AdministrationShellEnv DeserializeFromXmlStream(TextReader reader) + { + XmlSerializer serializer = new XmlSerializer( + typeof(AdminShell.AdministrationShellEnv), "http://www.admin-shell.io/aas/2/0"); + var res = serializer.Deserialize(reader) as AdminShell.AdministrationShellEnv; + return res; + } + + public AdministrationShellEnv DeserializeFromJsonStream(TextReader reader) + { + JsonSerializer serializer = new JsonSerializer(); + serializer.Converters.Add(new AdminShellConverters.JsonAasxConverter("modelType", "name")); + var res = (AdministrationShellEnv)serializer.Deserialize(reader, typeof(AdministrationShellEnv)); + return res; + } + + // special functions + + private static void CreateFromExistingEnvRecurseForCDs( + AdministrationShellEnv src, List wrappers, + ref List filterForCD) + { + if (wrappers == null || filterForCD == null) + return; + + foreach (var w in wrappers) + { + // access + if (w == null) + continue; + + // include in filter .. + if (w.submodelElement.semanticId != null) + { + var cd = src.FindConceptDescription(w.submodelElement.semanticId.Keys); + if (cd != null) + filterForCD.Add(cd); + } + + // recurse? + if (w.submodelElement is SubmodelElementCollection smec) + CreateFromExistingEnvRecurseForCDs(src, smec.value, ref filterForCD); + + if (w.submodelElement is Operation op) + for (int i = 0; i < 2; i++) + { + var w2s = Operation.GetWrappers(op[i]); + CreateFromExistingEnvRecurseForCDs(src, w2s, ref filterForCD); + } + + if (w.submodelElement is Entity smee) + CreateFromExistingEnvRecurseForCDs(src, smee.statements, ref filterForCD); + + if (w.submodelElement is AnnotatedRelationshipElement smea) + CreateFromExistingEnvRecurseForCDs(src, smea.annotations, ref filterForCD); + } + } + + public static AdministrationShellEnv CreateFromExistingEnv(AdministrationShellEnv src, + List filterForAas = null, + List filterForAsset = null, + ListOfSubmodels filterForSubmodel = null, + List filterForCD = null) + { + // prepare defaults + if (filterForAas == null) + filterForAas = new List(); + if (filterForAsset == null) + filterForAsset = new List(); + if (filterForSubmodel == null) + filterForSubmodel = new ListOfSubmodels(); + if (filterForCD == null) + filterForCD = new List(); + + // make new + var res = new AdministrationShellEnv(); + + // take over AAS + foreach (var aas in src.administrationShells) + if (filterForAas.Contains(aas)) + { + // take over + res.administrationShells.Add(new AdministrationShell(aas)); + + // consequences + if (aas.assetRef != null) + { + var asset = src.FindAsset(aas.assetRef); + if (asset != null) + filterForAsset.Add(asset); + } + + if (aas.submodelRefs != null) + foreach (var smr in aas.submodelRefs) + { + var sm = src.FindSubmodel(smr); + if (sm != null) + filterForSubmodel.Add(sm); + } + + if (aas.conceptDictionaries != null) + foreach (var cdd in aas.conceptDictionaries) + if (cdd.conceptDescriptionsRefs != null && + cdd.conceptDescriptionsRefs.conceptDescriptions != null) + foreach (var cdr in cdd.conceptDescriptionsRefs.conceptDescriptions) + { + var cd = src.FindConceptDescription(cdr); + if (cd != null) + filterForCD.Add(cd); + } + } + + // take over Assets + foreach (var asset in src.assets) + if (filterForAsset.Contains(asset)) + { + // take over + res.assets.Add(new Asset(asset)); + } + + // take over Submodels + foreach (var sm in src.Submodels) + if (filterForSubmodel.Contains(sm)) + { + // take over + res.submodels.Add(new Submodel(sm)); + + // recursion in order to find used CDs + CreateFromExistingEnvRecurseForCDs(src, sm.submodelElements, ref filterForCD); + } + + // ConceptDescriptions + foreach (var cd in src.ConceptDescriptions) + if (filterForCD.Contains(cd)) + { + // take over + res.conceptDescriptions.Add(new ConceptDescription(cd)); + } + + // ok + return res; + } + + // Sorting + + public Referable.ComparerIndexed CreateIndexedComparerCdsForSmUsage() + { + var cmp = new Referable.ComparerIndexed(); + int nr = 0; + foreach (var sm in FindAllSubmodelGroupedByAAS()) + foreach (var sme in sm.FindDeep()) + { + if (sme.semanticId == null) + continue; + var cd = this.FindConceptDescription(sme.semanticId); + if (cd == null) + continue; + if (cmp.Index.ContainsKey(cd)) + continue; + cmp.Index[cd] = nr++; + } + return cmp; + } + + // Validation + + public AasValidationRecordList ValidateAll() + { + // collect results + var results = new AasValidationRecordList(); + + // all entities + foreach (var rf in this.FindAllReferable()) + rf.Validate(results); + + // give back + return results; + } + + public int AutoFix(IEnumerable records) + { + // access + if (records == null) + return -1; + + // collect Referables (expensive safety measure) + var allowedReferables = this.FindAllReferable().ToList(); + + // go thru records + int res = 0; + foreach (var rec in records) + { + // access + if (rec == null || rec.Fix == null || rec.Source == null) + continue; + + // minimal safety measure + if (!allowedReferables.Contains(rec.Source)) + continue; + + // apply fix + res++; + try + { + rec.Fix.Invoke(); + } + catch + { + res--; + } + } + + // return number of applied fixes + return res; + } + + public void RecurseOnReferables( + object state, Func lambda, bool includeThis = false) + { + // includeThis does not make sense, as no Referable + // just use the others + foreach (var idf in this.FindAllReferable(onlyIdentifiables: true)) + idf?.RecurseOnReferables(state, lambda, includeThis); + } + } + + // + // Submodel + Submodel elements + // + + public interface IGetReference + { + Reference GetReference(bool includeParents = true); + } + + public interface IGetQualifiers + { + QualifierCollection GetQualifiers(); + } + + public class Qualifier : IAasElement + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } + + // member + // from hasSemantics: + [XmlElement(ElementName = "semanticId")] + public SemanticId semanticId = null; + + // this class + // TODO (Michael Hoffmeister, 2020-08-01): check, if Json has Qualifiers or not + + [MetaModelName("Qualifier.type")] + [TextSearchable] + [CountForHash] + public string type = ""; + + [MetaModelName("Qualifier.valueType")] + [TextSearchable] + [CountForHash] + public string valueType = ""; + + [CountForHash] + public Reference valueId = null; + + [MetaModelName("Qualifier.value")] + [TextSearchable] + [CountForHash] + public string value = null; + + // dead-csharp off + // Remark: due to publication of v2.0.1, the order of elements has changed!!! + // from hasSemantics: + // [XmlElement(ElementName = "semanticId")] + // [JsonIgnore] + // public SemanticId semanticId = null; + // dead-csharp on + + // constructors + + public Qualifier() { } + + public Qualifier(Qualifier src) + { + if (src.semanticId != null) + this.semanticId = new SemanticId(src.semanticId); + this.type = src.type; + this.value = src.value; + if (src.valueId != null) + this.valueId = new Reference(src.valueId); + } + + public Qualifier(string type, string value) + { + this.type = type; + this.value = value; + } + +#if !DoNotUseAasxCompatibilityModels + public Qualifier(AasxCompatibilityModels.AdminShellV10.Qualifier src) + { + if (src.semanticId != null) + this.semanticId = new SemanticId(src.semanticId); + this.type = src.qualifierType; + this.value = src.qualifierValue; + if (src.qualifierValueId != null) + this.valueId = new Reference(src.qualifierValueId); + } +#endif + + public AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("Qualifier", "Qfr"); + } + + public string GetElementName() + { + return this.GetSelfDescription()?.ElementName; + } + + // ReSharper disable MethodOverloadWithOptionalParameter .. this seems to work, anyhow + // ReSharper disable RedundantArgumentDefaultValue + public string ToString(int format = 0, string delimiter = ",") + { + var res = "" + type; + if (res == "") + res += "" + semanticId?.ToString(format, delimiter); + + if (value != null) + res += " = " + value; + else if (valueId != null) + res += " = " + valueId?.ToString(format, delimiter); + + return res; + } + + public override string ToString() + { + return this.ToString(0); + } + // ReSharper enable MethodOverloadWithOptionalParameter + // ReSharper enable RedundantArgumentDefaultValue + + public static Qualifier Parse(string input) + { + var m = Regex.Match(input, @"\s*([^,]*)(,[^=]+){0,1}\s*=\s*([^,]*)(,.+){0,1}\s*"); + if (!m.Success) + return null; + + return new Qualifier() + { + type = m.Groups[1].ToString().Trim(), + semanticId = SemanticId.Parse(m.Groups[1].ToString().Trim()), + value = m.Groups[3].ToString().Trim(), + valueId = Reference.Parse(m.Groups[1].ToString().Trim()) + }; + } + } + + /// + /// This class holds some convenience functions for Qualifiers + /// + public class QualifierCollection : List + { + public QualifierCollection() + { + + } + +#if !DoNotUseAasxCompatibilityModels + public QualifierCollection( + List src, bool shallowCopy = false) + + { + if (src != null && src.Count != 0) + { + foreach (var q in src) + { + this.Add(new Qualifier(q)); + } + } + } +#endif + + /// + /// Add qualifier. If null, do nothing + /// + public new void Add(Qualifier q) + { + if (q == null) + return; + base.Add(q); + } + + public Qualifier FindType(string type) + { + if (type == null) + return null; + foreach (var q in this) + if (q != null && q.type != null && q.type.Trim() == type.Trim()) + return q; + return null; + } + + public Qualifier FindSemanticId(SemanticId semId) + { + if (semId == null) + return null; + foreach (var q in this) + if (q != null && q.semanticId != null && q.semanticId.Matches(semId)) + return q; + return null; + } + + // ReSharper disable MethodOverloadWithOptionalParameter .. this seems to work, anyhow + // ReSharper disable RedundantArgumentDefaultValue + public string ToString(int format = 0, string delimiter = ";", string referencesDelimiter = ",") + { + var res = ""; + foreach (var q in this) + { + if (res != "") + res += delimiter; + res += q.ToString(format, referencesDelimiter); + } + return res; + } + + public override string ToString() + { + return this.ToString(0); + } + // ReSharper enable MethodOverloadWithOptionalParameter + // ReSharper enable RedundantArgumentDefaultValue + + // for convenience methods of Submodel, SubmodelElement + + public static void AddQualifier( + ref QualifierCollection qualifiers, + Qualifier q) + { + if (q == null) + return; + if (qualifiers == null) + qualifiers = new QualifierCollection(); + qualifiers.Add(q); + } + + public static void AddQualifier( + ref QualifierCollection qualifiers, + string qualifierType = null, string qualifierValue = null, KeyList semanticKeys = null, + Reference qualifierValueId = null) + { + if (qualifiers == null) + qualifiers = new QualifierCollection(); + var q = new Qualifier() + { + type = qualifierType, + value = qualifierValue, + valueId = qualifierValueId, + }; + if (semanticKeys != null) + q.semanticId = SemanticId.CreateFromKeys(semanticKeys); + qualifiers.Add(q); + } + + public static Qualifier HasQualifierOfType( + QualifierCollection qualifiers, + string qualifierType) + { + if (qualifiers == null || qualifierType == null) + return null; + foreach (var q in qualifiers) + if (q.type.Trim().ToLower() == qualifierType.Trim().ToLower()) + return q; + return null; + } + + public IEnumerable FindAllQualifierType(string qualifierType) + { + if (qualifierType == null) + yield break; + foreach (var q in this) + if (q.type.Trim().ToLower() == qualifierType.Trim().ToLower()) + yield return q; + } + } + + public class ListOfSubmodelElement : List + { + // conversion to other list + + public KeyList ToKeyList() + { + var res = new KeyList(); + foreach (var sme in this) + res.Add(sme.ToKey()); + return res; + } + + public Reference GetReference() + { + return Reference.CreateNew(ToKeyList()); + } + } + + public class SubmodelElement : Referable, System.IDisposable, IGetReference, IGetSemanticId, IGetQualifiers + { + // constants + public static Type[] PROP_MLP = new Type[] { + typeof(AdminShell.MultiLanguageProperty), typeof(AdminShell.Property) }; + + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } + + // members + + // do this in order to be IDisposable, that is: suitable for (using) + void System.IDisposable.Dispose() { } + public void GetData() { } + + // from HasKind + [XmlElement(ElementName = "kind")] + [JsonIgnore] + public ModelingKind kind = new ModelingKind(); + [XmlIgnore] + [JsonProperty(PropertyName = "kind")] + public string JsonKind + { + get + { + if (kind == null) + return null; + return kind.kind; + } + set + { + if (kind == null) + kind = new ModelingKind(); + kind.kind = value; + } + } + + // from hasSemanticId: + [XmlElement(ElementName = "semanticId")] + public SemanticId semanticId = new SemanticId(); + public SemanticId GetSemanticId() { return semanticId; } + + // from Qualifiable: + [XmlArray("qualifier")] + [XmlArrayItem("qualifier")] + [JsonProperty(PropertyName = "constraints")] + public QualifierCollection qualifiers = null; + public QualifierCollection GetQualifiers() => qualifiers; + + // from hasDataSpecification: + [XmlElement(ElementName = "embeddedDataSpecification")] + public HasDataSpecification hasDataSpecification = null; + + // getter / setter + + // constructors / creators + + public SubmodelElement() + : base() { } + + public SubmodelElement(SubmodelElement src) + : base(src) + { + if (src == null) + return; + if (src.hasDataSpecification != null) + hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); + if (src.semanticId != null) + semanticId = new SemanticId(src.semanticId); + if (src.kind != null) + kind = new ModelingKind(src.kind); + if (src.qualifiers != null) + { + if (qualifiers == null) + qualifiers = new QualifierCollection(); + foreach (var q in src.qualifiers) + qualifiers.Add(new Qualifier(q)); + } + } + +#if !DoNotUseAasxCompatibilityModels + public SubmodelElement(AasxCompatibilityModels.AdminShellV10.SubmodelElement src) + : base(src) + { + if (src.hasDataSpecification != null) + hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); + if (src.semanticId != null) + semanticId = new SemanticId(src.semanticId); + if (src.kind != null) + kind = new ModelingKind(src.kind); + if (src.qualifiers != null) + { + if (qualifiers == null) + qualifiers = new QualifierCollection(src.qualifiers); + foreach (var q in src.qualifiers) + qualifiers.Add(new Qualifier(q)); + } + } +#endif + + public static T CreateNew(string idShort = null, string category = null, Reference semanticId = null) + where T : SubmodelElement, new() + { + var res = new T(); + if (idShort != null) + res.idShort = idShort; + if (category != null) + res.category = category; + if (semanticId != null) + res.semanticId = new SemanticId(semanticId); + return res; + } + + public void CreateNewLogic(string idShort = null, string category = null, Key semanticIdKey = null) + { + if (idShort != null) + this.idShort = idShort; + if (category != null) + this.category = category; + if (semanticIdKey != null) + { + if (this.semanticId == null) + this.semanticId = new SemanticId(); + this.semanticId.Keys.Add(semanticIdKey); + } + } + + public void AddQualifier( + Qualifier q) + { + QualifierCollection.AddQualifier( + ref this.qualifiers, q); + } + + public void AddQualifier( + string qualifierType = null, string qualifierValue = null, KeyList semanticKeys = null, + Reference qualifierValueId = null) + { + QualifierCollection.AddQualifier( + ref this.qualifiers, qualifierType, qualifierValue, semanticKeys, qualifierValueId); + } + + public Qualifier HasQualifierOfType(string qualifierType) + { + return QualifierCollection.HasQualifierOfType(this.qualifiers, qualifierType); + } + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("SubmodelElement", "SME"); + } + + public override Reference GetReference(bool includeParents = true) + { + Reference r = new Reference(); + // this is the tail of our referencing chain .. + r.Keys.Add(Key.CreateNew(GetElementName(), true, "IdShort", this.idShort)); + // try to climb up .. + var current = this.parent; + while (includeParents && current != null) + { + if (current is Identifiable cid) + { + // add big information set + r.Keys.Insert(0, Key.CreateNew( + current.GetElementName(), + true, + cid.identification.idType, + cid.identification.id)); + } + else + if (current is Referable crf) + { + // reference via idShort + r.Keys.Insert(0, Key.CreateNew( + current.GetElementName(), + true, + "IdShort", crf.idShort)); + } + + if (current is Referable crf2) + current = crf2.parent; + else + current = null; + } + return r; + } + + public IEnumerable FindAllParents( + Predicate p, + bool includeThis = false, bool includeSubmodel = false, + bool passOverMiss = false) + { + // call for this? + if (includeThis) + { + if (p == null || p.Invoke(this)) + yield return this; + else + if (!passOverMiss) + yield break; + } + + // daisy chain all parents .. + if (this.parent != null) + { + if (this.parent is SubmodelElement psme) + { + foreach (var q in psme.FindAllParents(p, includeThis: true, + passOverMiss: passOverMiss)) + yield return q; + } + else if (includeSubmodel && this.parent is Submodel psm) + { + if (p == null || p.Invoke(psm)) + yield return this; + } + } + } + + public IEnumerable FindAllParentsWithSemanticId( + SemanticId semId, + bool includeThis = false, bool includeSubmodel = false, bool passOverMiss = false) + { + return (FindAllParents( + (rf) => (true == (rf as IGetSemanticId)?.GetSemanticId()?.Matches(semId, + matchMode: Key.MatchMode.Relaxed)), + includeThis: includeThis, includeSubmodel: includeSubmodel, passOverMiss: passOverMiss)); + } + + public Tuple ToCaptionInfo() + { + var caption = AdminShellUtilV20.EvalToNonNullString("\"{0}\" ", idShort, ""); + var info = ""; + // TODO (MIHO, 2021-07-08): obvious error .. info should receive semanticId .. but would change + // display presentation .. therefore to be checked again + if (semanticId != null) + AdminShellUtilV20.EvalToNonEmptyString("\u21e8 {0}", semanticId.ToString(), ""); + return Tuple.Create(caption, info); + } + + public override string ToString() + { + var ci = ToCaptionInfo(); + return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); + } + + public virtual string ValueAsText(string defaultLang = null) + { + return ""; + } + + public virtual double? ValueAsDouble() + { + return null; + } + + public virtual void ValueFromText(string text, string defaultLang = null) + { + } + + // validation + + public override void Validate(AasValidationRecordList results) + { + // access + if (results == null) + return; + + // check + base.Validate(results); + ModelingKind.Validate(results, kind, this); + KeyList.Validate(results, semanticId?.Keys, this); + } + } + + [XmlType(TypeName = "submodelElement")] + public class SubmodelElementWrapper + { + + // members + + [XmlElement(ElementName = "property", Type = typeof(Property))] + [XmlElement(ElementName = "multiLanguageProperty", Type = typeof(MultiLanguageProperty))] + [XmlElement(ElementName = "range", Type = typeof(Range))] + [XmlElement(ElementName = "file", Type = typeof(File))] + [XmlElement(ElementName = "blob", Type = typeof(Blob))] + [XmlElement(ElementName = "referenceElement", Type = typeof(ReferenceElement))] + [XmlElement(ElementName = "relationshipElement", Type = typeof(RelationshipElement))] + [XmlElement(ElementName = "annotatedRelationshipElement", Type = typeof(AnnotatedRelationshipElement))] + [XmlElement(ElementName = "capability", Type = typeof(Capability))] + [XmlElement(ElementName = "submodelElementCollection", Type = typeof(SubmodelElementCollection))] + [XmlElement(ElementName = "operation", Type = typeof(Operation))] + [XmlElement(ElementName = "basicEvent", Type = typeof(BasicEvent))] + [XmlElement(ElementName = "entity", Type = typeof(Entity))] + public SubmodelElement submodelElement; + + // element names + public enum AdequateElementEnum + { + Unknown = 0, SubmodelElementCollection, Property, MultiLanguageProperty, Range, File, Blob, + ReferenceElement, RelationshipElement, AnnotatedRelationshipElement, Capability, Operation, + BasicEvent, Entity + } + + public static AdequateElementEnum[] AdequateElementsDataElement = + { + AdequateElementEnum.SubmodelElementCollection, AdequateElementEnum.RelationshipElement, + AdequateElementEnum.AnnotatedRelationshipElement, AdequateElementEnum.Capability, + AdequateElementEnum.Operation, AdequateElementEnum.BasicEvent, AdequateElementEnum.Entity + }; + + public static string[] AdequateElementNames = { "Unknown", "SubmodelElementCollection", "Property", + "MultiLanguageProperty", "Range", "File", "Blob", "ReferenceElement", "RelationshipElement", + "AnnotatedRelationshipElement", "Capability", "Operation", "BasicEvent", "Entity" }; + + public static string[] AdequateElementShortName = { null, "SMC", null, + "MLP", null, null, null, "Ref", "Rel", + "ARel", null, null, "Event", "Entity" }; + + // constructors + + public SubmodelElementWrapper() { } + + // cloning + + public SubmodelElementWrapper(SubmodelElement src, bool shallowCopy = false) + { + /* TODO (MIHO, 2021-08-12): consider using: + Activator.CreateInstance(pl.GetType(), new object[] { pl }) */ + + if (src is SubmodelElementCollection) + this.submodelElement = new SubmodelElementCollection( + src as SubmodelElementCollection, shallowCopy: shallowCopy); + if (src is Property) + this.submodelElement = new Property(src as Property); + if (src is MultiLanguageProperty) + this.submodelElement = new MultiLanguageProperty(src as MultiLanguageProperty); + if (src is Range) + this.submodelElement = new Range(src as Range); + if (src is File) + this.submodelElement = new File(src as File); + if (src is Blob) + this.submodelElement = new Blob(src as Blob); + if (src is ReferenceElement) + this.submodelElement = new ReferenceElement(src as ReferenceElement); + if (src is RelationshipElement) + this.submodelElement = new RelationshipElement(src as RelationshipElement); + if (src is AnnotatedRelationshipElement) + this.submodelElement = new AnnotatedRelationshipElement(src as AnnotatedRelationshipElement); + if (src is Capability) + this.submodelElement = new Capability(src as Capability); + if (src is Operation) + this.submodelElement = new Operation(src as Operation); + if (src is BasicEvent) + this.submodelElement = new BasicEvent(src as BasicEvent); + if (src is Entity) + this.submodelElement = new Entity(src as Entity); + } + +#if !DoNotUseAasxCompatibilityModels + public SubmodelElementWrapper( + AasxCompatibilityModels.AdminShellV10.SubmodelElement src, bool shallowCopy = false) + { + if (src is AasxCompatibilityModels.AdminShellV10.SubmodelElementCollection) + this.submodelElement = new SubmodelElementCollection( + src as AasxCompatibilityModels.AdminShellV10.SubmodelElementCollection, + shallowCopy: shallowCopy); + if (src is AasxCompatibilityModels.AdminShellV10.Property) + this.submodelElement = new Property(src as AasxCompatibilityModels.AdminShellV10.Property); + if (src is AasxCompatibilityModels.AdminShellV10.File) + this.submodelElement = new File(src as AasxCompatibilityModels.AdminShellV10.File); + if (src is AasxCompatibilityModels.AdminShellV10.Blob) + this.submodelElement = new Blob(src as AasxCompatibilityModels.AdminShellV10.Blob); + if (src is AasxCompatibilityModels.AdminShellV10.ReferenceElement) + this.submodelElement = new ReferenceElement( + src as AasxCompatibilityModels.AdminShellV10.ReferenceElement); + if (src is AasxCompatibilityModels.AdminShellV10.RelationshipElement) + this.submodelElement = new RelationshipElement( + src as AasxCompatibilityModels.AdminShellV10.RelationshipElement); + if (src is AasxCompatibilityModels.AdminShellV10.Operation) + this.submodelElement = new Operation(src as AasxCompatibilityModels.AdminShellV10.Operation); + } +#endif + + public static string GetAdequateName(AdequateElementEnum ae) + { + return AdequateElementNames[(int)ae]; + } + + /// + /// Deprecated. See below. + /// + public static AdequateElementEnum GetAdequateEnum(string adequateName) + { + if (adequateName == null) + return AdequateElementEnum.Unknown; + + foreach (var en in (AdequateElementEnum[])Enum.GetValues(typeof(AdequateElementEnum))) + if (Enum.GetName(typeof(AdequateElementEnum), en)?.Trim().ToLower() == + adequateName.Trim().ToLower()) + return en; + + return AdequateElementEnum.Unknown; + } + + /// + /// This version uses the element name array and allows using ShortName + /// + public static AdequateElementEnum GetAdequateEnum2(string adequateName, bool useShortName = false) + { + if (adequateName == null) + return AdequateElementEnum.Unknown; + + foreach (var en in (AdequateElementEnum[])Enum.GetValues(typeof(AdequateElementEnum))) + if (((int)en < AdequateElementNames.Length + && AdequateElementNames[(int)en].Trim().ToLower() == adequateName.Trim().ToLower()) + || (useShortName + && (int)en < AdequateElementShortName.Length + && AdequateElementShortName[(int)en] != null + && AdequateElementShortName[(int)en].Trim().ToLower() == adequateName.Trim().ToLower())) + return en; + + return AdequateElementEnum.Unknown; + } + + public static IEnumerable GetAdequateEnums( + AdequateElementEnum[] excludeValues = null, AdequateElementEnum[] includeValues = null) + { + if (includeValues != null) + { + foreach (var en in includeValues) + yield return en; + } + else + { + foreach (var en in (AdequateElementEnum[])Enum.GetValues(typeof(AdequateElementEnum))) + { + if (en == AdequateElementEnum.Unknown) + continue; + if (excludeValues != null && excludeValues.Contains(en)) + continue; + yield return en; + } + } + } + + /// + /// Introduced for JSON serialization, can create SubModelElements based on a string name + /// + public static SubmodelElement CreateAdequateType(AdequateElementEnum ae, SubmodelElement src = null) + { + if (ae == AdequateElementEnum.Property) + return new Property(src); + if (ae == AdequateElementEnum.MultiLanguageProperty) + return new MultiLanguageProperty(src); + if (ae == AdequateElementEnum.Range) + return new Range(src); + if (ae == AdequateElementEnum.File) + return new File(src); + if (ae == AdequateElementEnum.Blob) + return new Blob(src); + if (ae == AdequateElementEnum.ReferenceElement) + return new ReferenceElement(src); + if (ae == AdequateElementEnum.RelationshipElement) + return new RelationshipElement(src); + if (ae == AdequateElementEnum.AnnotatedRelationshipElement) + return new AnnotatedRelationshipElement(src); + if (ae == AdequateElementEnum.Capability) + return new Capability(src); + if (ae == AdequateElementEnum.SubmodelElementCollection) + return new SubmodelElementCollection(src); + if (ae == AdequateElementEnum.Operation) + return new Operation(src); + if (ae == AdequateElementEnum.BasicEvent) + return new BasicEvent(src); + if (ae == AdequateElementEnum.Entity) + return new Entity(src); + return null; + } + + /// + /// Introduced for JSON serialization, can create SubModelElements based on a string name + /// + /// string name (standard PascalCased) + public static SubmodelElement CreateAdequateType(string elementName) + { + return CreateAdequateType(GetAdequateEnum(elementName)); + } + + /// + /// Can create SubmodelElements based on a given type information + /// + /// Type of the SME to be created + /// SubmodelElement or null + public static SubmodelElement CreateAdequateType(Type t) + { + if (t == null || !t.IsSubclassOf(typeof(AdminShell.SubmodelElement))) + return null; + var sme = Activator.CreateInstance(t) as SubmodelElement; + return sme; + } + + public string GetElementAbbreviation() + { + if (submodelElement == null) + return ("Null"); + var dsc = submodelElement.GetSelfDescription(); + if (dsc?.ElementAbbreviation == null) + return ("Null"); + return dsc.ElementAbbreviation; + } + + public static string GetElementNameByAdequateType(SubmodelElement sme) + { + // access + var sd = sme.GetSelfDescription(); + if (sd == null || sd.ElementEnum == AdequateElementEnum.Unknown) + return null; + var en = sd.ElementEnum; + + // get the names + string res = null; + if ((int)en < AdequateElementNames.Length) + res = AdequateElementNames[(int)en].Trim(); + if ((int)en < AdequateElementShortName.Length && AdequateElementShortName[(int)en] != null) + res = AdequateElementShortName[(int)en].Trim(); + return res; + } + + public static ListOfSubmodelElement ListOfWrappersToListOfElems(List wrappers) + { + var res = new ListOfSubmodelElement(); + if (wrappers == null) + return res; + foreach (var w in wrappers) + if (w.submodelElement != null) + res.Add(w.submodelElement); + return res; + } + + public static SubmodelElementWrapper CreateFor(SubmodelElement sme) + { + var res = new SubmodelElementWrapper() { submodelElement = sme }; + return res; + } + + public static Referable FindReferableByReference( + List wrappers, Reference rf, int keyIndex) + { + return FindReferableByReference(wrappers, rf?.Keys, keyIndex); + } + + public static Referable FindReferableByReference( + List wrappers, KeyList rf, int keyIndex) + { + // first index needs to exist .. + if (wrappers == null || rf == null || keyIndex >= rf.Count) + return null; + + // as SubmodelElements are not Identifiables, the actual key shall be IdShort + if (rf[keyIndex].idType.Trim().ToLower() != Key.GetIdentifierTypeName( + Key.IdentifierType.IdShort).Trim().ToLower()) + return null; + + // over all wrappers + foreach (var smw in wrappers) + if (smw.submodelElement != null && + smw.submodelElement.idShort.Trim().ToLower() == rf[keyIndex].value.Trim().ToLower()) + { + // match on this level. Did we find a leaf element? + if ((keyIndex + 1) >= rf.Count) + return smw.submodelElement; + + // dive into SMC? + if (smw.submodelElement is SubmodelElementCollection smc) + { + var found = FindReferableByReference(smc.value, rf, keyIndex + 1); + if (found != null) + return found; + } + + // dive into Entity statements? + if (smw.submodelElement is Entity ent) + { + var found = FindReferableByReference(ent.statements, rf, keyIndex + 1); + if (found != null) + return found; + } + + // else: + return null; + } + + // no? + return null; + } + + // typecasting wrapper into specific type + public T GetAs() where T : SubmodelElement + { + var x = (this.submodelElement) as T; + return x; + } + + } + + public class SubmodelElementWrapperCollection : BaseSubmodelElementWrapperCollection + { + public SubmodelElementWrapperCollection() : base() { } + + public SubmodelElementWrapperCollection(SubmodelElementWrapper smw) : base(smw) { } + + public SubmodelElementWrapperCollection(SubmodelElement sme) : base(sme) { } + + public SubmodelElementWrapperCollection(SubmodelElementWrapperCollection other) : base(other) { } + } + + public class DataElementWrapperCollection : BaseSubmodelElementWrapperCollection + { + public DataElementWrapperCollection() : base() { } + + public DataElementWrapperCollection(SubmodelElementWrapperCollection other) + : base(other) + { + } + + public DataElementWrapperCollection(DataElementWrapperCollection other) + : base() + { + foreach (var wo in other) + this.Add(wo); + } + } + + /// + /// Provides some more functionalities for searching specific elements, e.g. in a SMEC + /// + // OZ + // Resharper disable UnusedTypeParameter + public class BaseSubmodelElementWrapperCollection : List + where ELEMT : SubmodelElement + { + // Resharper enable UnusedTypeParameter + + // member: Parent + // will be held correctly by the containing class + public Referable Parent = null; + + // constructors + + public BaseSubmodelElementWrapperCollection() : base() { } + + public BaseSubmodelElementWrapperCollection(SubmodelElementWrapperCollection other) + : base() + { + if (other == null) + return; + + foreach (var smw in other) + this.Add(new SubmodelElementWrapper(smw.submodelElement)); + } + + public BaseSubmodelElementWrapperCollection(SubmodelElementWrapper smw) + : base() + { + if (smw != null) + this.Add(smw); + } + + public BaseSubmodelElementWrapperCollection(SubmodelElement sme) + : base() + { + if (sme != null) + this.Add(new SubmodelElementWrapper(sme)); + } + + // better find functions + + public IEnumerable FindDeep(Predicate match = null) where T : SubmodelElement + { + foreach (var smw in this) + { + var current = smw.submodelElement; + if (current == null) + continue; + + // call lambda for this element + if (current is T) + if (match == null || match.Invoke(current as T)) + yield return current as T; + + // dive into? + // TODO (MIHO, 2020-07-31): would be nice to use IEnumerateChildren for this .. + if (current is SubmodelElementCollection smc && smc.value != null) + foreach (var x in smc.value.FindDeep(match)) + yield return x; + + if (current is AnnotatedRelationshipElement are && are.annotations != null) + foreach (var x in are.annotations.FindDeep(match)) + yield return x; + + if (current is Entity ent && ent.statements != null) + foreach (var x in ent.statements.FindDeep(match)) + yield return x; + + if (current is Operation op) + for (int i = 0; i < 2; i++) + if (Operation.GetWrappers(op[i]) != null) + foreach (var x in Operation.GetWrappers(op[i]).FindDeep(match)) + yield return x; + } + } + + public IEnumerable FindAllIdShort(string idShort) + { + foreach (var smw in this) + if (smw.submodelElement != null) + if (smw.submodelElement.idShort.Trim().ToLower() == idShort.Trim().ToLower()) + yield return smw; + } + + public IEnumerable FindAllIdShortAs(string idShort) where T : SubmodelElement + { + foreach (var smw in this) + if (smw.submodelElement != null && smw.submodelElement is T) + if (smw.submodelElement.idShort.Trim().ToLower() == idShort.Trim().ToLower()) + yield return smw.submodelElement as T; + } + + public SubmodelElementWrapper FindFirstIdShort(string idShort) + { + return FindAllIdShort(idShort)?.FirstOrDefault(); + } + + public T FindFirstIdShortAs(string idShort) where T : SubmodelElement + { + return FindAllIdShortAs(idShort)?.FirstOrDefault(); + } + + public IEnumerable FindAllSemanticId( + Key semId, Type[] allowedTypes = null, Key.MatchMode matchMode = Key.MatchMode.Strict) + { + foreach (var smw in this) + if (smw.submodelElement != null && smw.submodelElement.semanticId != null) + { + if (smw.submodelElement == null) + continue; + + if (allowedTypes != null) + { + var smwt = smw.submodelElement.GetType(); + if (!allowedTypes.Contains(smwt)) + continue; + } + + if (smw.submodelElement.semanticId.MatchesExactlyOneKey(semId, matchMode)) + yield return smw; + } + } + + public IEnumerable FindAllSemanticIdAs(Key semId, Key.MatchMode matchMode = Key.MatchMode.Strict) + where T : SubmodelElement + { + foreach (var smw in this) + if (smw.submodelElement != null && smw.submodelElement is T + && smw.submodelElement.semanticId != null) + if (smw.submodelElement.semanticId.MatchesExactlyOneKey(semId, matchMode)) + yield return smw.submodelElement as T; + } + + public IEnumerable FindAllSemanticIdAs(Reference semId, + Key.MatchMode matchMode = Key.MatchMode.Strict) + where T : SubmodelElement + { + foreach (var smw in this) + if (smw.submodelElement != null && smw.submodelElement is T + && smw.submodelElement.semanticId != null) + if (smw.submodelElement.semanticId.Matches(semId, matchMode)) + yield return smw.submodelElement as T; + } + + public IEnumerable FindAllSemanticIdAs(ConceptDescription cd, + Key.MatchMode matchMode = Key.MatchMode.Strict) + where T : SubmodelElement + { + foreach (var x in FindAllSemanticIdAs(cd.GetReference(), matchMode)) + yield return x; + } + + public SubmodelElementWrapper FindFirstSemanticId( + Key semId, Type[] allowedTypes = null, Key.MatchMode matchMode = Key.MatchMode.Strict) + { + return FindAllSemanticId(semId, allowedTypes, matchMode)?.FirstOrDefault(); + } + + public SubmodelElementWrapper FindFirstAnySemanticId( + Key[] semId, Type[] allowedTypes = null, Key.MatchMode matchMode = Key.MatchMode.Strict) + { + if (semId == null) + return null; + foreach (var si in semId) + { + var found = FindAllSemanticId(si, allowedTypes, matchMode)? + .FirstOrDefault(); + if (found != null) + return found; + } + return null; + } + + public T FindFirstSemanticIdAs(Key semId, Key.MatchMode matchMode = Key.MatchMode.Strict) + where T : SubmodelElement + { + return FindAllSemanticIdAs(semId, matchMode)?.FirstOrDefault(); + } + + public T FindFirstAnySemanticIdAs(Key[] semId, Key.MatchMode matchMode = Key.MatchMode.Strict) + where T : SubmodelElement + { + if (semId == null) + return null; + foreach (var si in semId) + { + var found = FindAllSemanticIdAs(si, matchMode)?.FirstOrDefault(); + if (found != null) + return found; + } + return null; + } + + public T FindFirstSemanticIdAs(Reference semId, Key.MatchMode matchMode = Key.MatchMode.Strict) + where T : SubmodelElement + { + return FindAllSemanticIdAs(semId, matchMode)?.FirstOrDefault(); + } + + /* TODO (MIHO, 2021-10-18): there are overlaps of this new function with + * this old function: FindFirstAnySemanticId(Key[] semId .. + * clarify/ refactor */ + public IEnumerable FindAllSemanticId( + Key[] allowedSemId, Key.MatchMode matchMode = Key.MatchMode.Strict, + bool invertAllowed = false) + where T : SubmodelElement + { + if (allowedSemId == null || allowedSemId.Length < 1) + yield break; + + foreach (var smw in this) + { + if (smw.submodelElement == null || !(smw.submodelElement is T)) + continue; + + if (smw.submodelElement.semanticId == null || smw.submodelElement.semanticId.Count < 1) + { + if (invertAllowed) + yield return smw.submodelElement as T; + continue; + } + + var found = false; + foreach (var semId in allowedSemId) + if (smw.submodelElement.semanticId.MatchesExactlyOneKey(semId, matchMode)) + { + found = true; + break; + } + + if (invertAllowed) + found = !found; + + if (found) + yield return smw.submodelElement as T; + } + } + + public T FindFirstAnySemanticId( + Key[] allowedSemId, Key.MatchMode matchMode = Key.MatchMode.Strict, + bool invertAllowed = false) + where T : SubmodelElement + { + return FindAllSemanticId(allowedSemId, matchMode, invertAllowed)?.FirstOrDefault(); + } + + // recursion + + /// + /// Recurses on all Submodel elements of a Submodel or SME, which allows children. + /// The state object will be passed to the lambda function in order to provide + /// stateful approaches. Also a list of parents will be provided to + /// the lambda. This list of parents can be initialized or simply set to null + /// in order to be created automatically. + /// + /// State object to be provided to lambda. Could be null. + /// List of already existing parents to be provided to lambda. + /// Could be null. + /// The lambda function as (state, parents, SME) + /// The lambda shall return TRUE in order to deep into recursion. + /// + public void RecurseOnReferables( + object state, ListOfReferable parents, + Func lambda) + { + // trivial + if (lambda == null) + return; + if (parents == null) + parents = new ListOfReferable(); + + // over all elements + foreach (var smw in this) + { + var current = smw.submodelElement; + if (current == null) + continue; + + // call lambda for this element + // AND decide, if to recurse! + var goDeeper = lambda(state, parents, current); + + if (goDeeper) + { + // add to parents + parents.Add(current); + + // dive into? + if (current is SubmodelElementCollection smc) + smc.value?.RecurseOnReferables(state, parents, lambda); + + if (current is Entity ent) + ent.statements?.RecurseOnReferables(state, parents, lambda); + + if (current is Operation op) + for (int i = 0; i < 2; i++) + Operation.GetWrappers(op[i])?.RecurseOnReferables(state, parents, lambda); + + if (current is AnnotatedRelationshipElement arel) + arel.annotations?.RecurseOnReferables(state, parents, lambda); + + // remove from parents + parents.RemoveAt(parents.Count - 1); + } + } + } + + // idShort management + + /// + /// Checks, if given idShort is already existing in the collection of SubmodelElements. + /// Trims the string, but does not ignore upper/ lowercase. An empty idShort returns false. + /// + public bool CheckIdShortIsUnique(string idShort) + { + idShort = idShort?.Trim(); + if (idShort == null || idShort.Length < 1) + return false; + + var res = true; + foreach (var smw in this) + if (smw.submodelElement != null && smw.submodelElement.idShort != null && + smw.submodelElement.idShort == idShort) + { + res = false; + break; + } + + return res; + } + + /// + /// The string idShortTemplate shall contain Format.String partt such as {0}. + /// A int-Parameter is as long incremented, until the resulting idShort proves + /// to be unique in the collection of SubmodelElements or maxNum is reached. + /// Returns null in case of any error. + /// + public string IterateIdShortTemplateToBeUnique(string idShortTemplate, int maxNum) + { + if (idShortTemplate == null || maxNum < 1 || !idShortTemplate.Contains("{0")) + return null; + + int i = 1; + while (i < maxNum) + { + var ids = String.Format(idShortTemplate, i); + if (this.CheckIdShortIsUnique(ids)) + return ids; + i++; + } + + return null; + } + + // give more direct access to SMEs + + /// + /// Add sme by creating a SubmodelElementWrapper for it and adding to this collection. + /// + public void Add(SubmodelElement sme) + { + if (sme == null) + return; + sme.parent = this.Parent; + this.Add(SubmodelElementWrapper.CreateFor(sme)); + } + + /// + /// Add sme by creating a SubmodelElementWrapper for it and adding to this collection. + /// + public void Insert(int index, SubmodelElement sme) + { + if (sme == null || index < 0 || index >= this.Count) + return; + sme.parent = this.Parent; + this.Insert(index, SubmodelElementWrapper.CreateFor(sme)); + } + + /// + /// Finds the first (shall be only 1!) SubmodelElementWrapper with SubmodelElement sme. + /// + public SubmodelElementWrapper FindSubModelElement(SubmodelElement sme) + { + if (sme != null) + foreach (var smw in this) + if (smw?.submodelElement == sme) + return smw; + return null; + } + + /// + /// Removes the first (shall be only 1!) SubmodelElementWrapper with SubmodelElement sme. + /// + public void Remove(SubmodelElement sme) + { + if (sme == null) + return; + var found = FindSubModelElement(sme); + if (found != null) + this.Remove(found); + } + + // a little more business logic + + public T CreateSMEForCD(ConceptDescription cd, string category = null, string idShort = null, + string idxTemplate = null, int maxNum = 999, bool addSme = false, bool isTemplate = false) + where T : SubmodelElement, new() + { + // access + if (cd == null) + return null; + + // try to potentially figure out idShort + var ids = cd.idShort; + if ((ids == null || ids.Trim() == "") && cd.GetIEC61360() != null) + ids = cd.GetIEC61360().shortName? + .GetDefaultStr(); + if (idShort != null) + ids = idShort; + if (ids == null) + return null; + + // unique? + if (idxTemplate != null) + ids = this.IterateIdShortTemplateToBeUnique(idxTemplate, maxNum); + + // make a new instance + var sme = new T() + { + idShort = ids, + semanticId = new SemanticId(cd.GetCdReference()) + }; + if (category != null) + sme.category = category; + if (isTemplate) + sme.kind = ModelingKind.CreateAsTemplate(); + + // if its a SMC, make sure its accessible + if (sme is SubmodelElementCollection smc) + smc.value = new SubmodelElementWrapperCollection(); + + // instantanously add it? + if (addSme) + this.Add(sme); + + // give back + return sme; + } + + public T CreateSMEForIdShort(string idShort, string category = null, + string idxTemplate = null, int maxNum = 999, bool addSme = false) where T : SubmodelElement, new() + { + // access + if (idShort == null) + return null; + + // try to potentially figure out idShort + var ids = idShort; + + // unique? + if (idxTemplate != null) + ids = this.IterateIdShortTemplateToBeUnique(idxTemplate, maxNum); + + // make a new instance + var sme = new T() { idShort = ids }; + if (category != null) + sme.category = category; + + // instantanously add it? + if (addSme) + this.Add(sme); + + // give back + return sme; + } + + // for conversion + + public T AdaptiveConvertTo( + SubmodelElement anySrc, + ConceptDescription createDefault = null, + string idShort = null, bool addSme = false) where T : SubmodelElement, new() + { + if (typeof(T) == typeof(MultiLanguageProperty) + && anySrc is Property srcProp) + { + var res = this.CreateSMEForCD(createDefault, idShort: idShort, addSme: addSme); + if (res is MultiLanguageProperty mlp) + { + mlp.value = new LangStringSet("EN?", srcProp.value); + mlp.valueId = srcProp.valueId; + return res; + } + } + + if (typeof(T) == typeof(Property) + && anySrc is MultiLanguageProperty srcMlp) + { + var res = this.CreateSMEForCD(createDefault, idShort: idShort, addSme: addSme); + if (res is Property prp) + { + prp.value = "" + srcMlp.value?.GetDefaultStr(); + prp.valueId = srcMlp.valueId; + return res; + } + } + + return null; + } + + public T CopyOneSMEbyCopy(Key destSemanticId, + SubmodelElementWrapperCollection sourceSmc, Key[] sourceSemanticId, + ConceptDescription createDefault = null, Action setDefault = null, + Key.MatchMode matchMode = Key.MatchMode.Relaxed, + string idShort = null, bool addSme = false) where T : SubmodelElement, new() + { + // get source + var src = sourceSmc?.FindFirstAnySemanticIdAs(sourceSemanticId, matchMode); + + // may be make an adaptive conversion + if (src == null) + { + var anySrc = sourceSmc?.FindFirstAnySemanticId(sourceSemanticId, matchMode: matchMode); + src = AdaptiveConvertTo(anySrc?.submodelElement, createDefault, + idShort: idShort, addSme: false); + } + + // proceed + var aeSrc = SubmodelElementWrapper.GetAdequateEnum(src?.GetElementName()); + if (src == null || aeSrc == SubmodelElementWrapper.AdequateElementEnum.Unknown) + { + // create a default? + if (createDefault == null) + return null; + + // ok, default + var dflt = this.CreateSMEForCD(createDefault, idShort: idShort, addSme: addSme); + + // set default? + setDefault?.Invoke(dflt); + + // return + return dflt; + } + + // ok, create new one + var dst = SubmodelElementWrapper.CreateAdequateType(aeSrc, src) as T; + if (dst == null) + return null; + + // make same things sure + dst.idShort = src.idShort; + dst.category = src.category; + dst.semanticId = new SemanticId(destSemanticId); + + // instantanously add it? + if (addSme) + this.Add(dst); + + // give back + return dst; + } + + public T CopyOneSMEbyCopy(ConceptDescription destCD, + SubmodelElementWrapperCollection sourceSmc, ConceptDescription sourceCD, + bool createDefault = false, Action setDefault = null, + Key.MatchMode matchMode = Key.MatchMode.Relaxed, + string idShort = null, bool addSme = false) where T : SubmodelElement, new() + { + return this.CopyOneSMEbyCopy(destCD?.GetSingleKey(), sourceSmc, new[] { sourceCD?.GetSingleKey() }, + createDefault ? destCD : null, setDefault, matchMode, idShort, addSme); + } + + public T CopyOneSMEbyCopy(ConceptDescription destCD, + SubmodelElementWrapperCollection sourceSmc, Key[] sourceKeys, + bool createDefault = false, Action setDefault = null, + Key.MatchMode matchMode = Key.MatchMode.Relaxed, + string idShort = null, bool addSme = false) where T : SubmodelElement, new() + { + return this.CopyOneSMEbyCopy(destCD?.GetSingleKey(), sourceSmc, sourceKeys, + createDefault ? destCD : null, setDefault, matchMode, idShort, addSme); + } + + public void CopyManySMEbyCopy(Key destSemanticId, + SubmodelElementWrapperCollection sourceSmc, Key sourceSemanticId, + ConceptDescription createDefault = null, Action setDefault = null, + Key.MatchMode matchMode = Key.MatchMode.Relaxed) where T : SubmodelElement, new() + { + // bool find possible sources + bool foundSrc = false; + if (sourceSmc == null) + return; + foreach (var src in sourceSmc.FindAllSemanticIdAs(sourceSemanticId, matchMode)) + { + // type of found src? + var aeSrc = SubmodelElementWrapper.GetAdequateEnum(src?.GetElementName()); + + // ok? + if (src == null || aeSrc == SubmodelElementWrapper.AdequateElementEnum.Unknown) + continue; + foundSrc = true; + + // ok, create new one + var dst = SubmodelElementWrapper.CreateAdequateType(aeSrc, src) as T; + if (dst != null) + { + // make same things sure + dst.idShort = src.idShort; + dst.category = src.category; + dst.semanticId = new SemanticId(destSemanticId); + + // instantanously add it? + this.Add(dst); + } + } + + // default? + if (createDefault != null && !foundSrc) + { + // ok, default + var dflt = this.CreateSMEForCD(createDefault, addSme: true); + + // set default? + setDefault?.Invoke(dflt); + } + } + + public void CopyManySMEbyCopy(ConceptDescription destCD, + SubmodelElementWrapperCollection sourceSmc, ConceptDescription sourceCD, + bool createDefault = false, Action setDefault = null, + Key.MatchMode matchMode = Key.MatchMode.Relaxed) where T : SubmodelElement, new() + { + CopyManySMEbyCopy(destCD.GetSingleKey(), sourceSmc, sourceCD.GetSingleKey(), + createDefault ? destCD : null, setDefault, matchMode); + } + } + + public interface IManageSubmodelElements + { + void Add(SubmodelElement sme); + void Insert(int index, SubmodelElement sme); + void Remove(SubmodelElement sme); + } + + public class Submodel : Identifiable, IManageSubmodelElements, + System.IDisposable, IEnumerateChildren, IFindAllReferences, + IGetSemanticId, IGetQualifiers + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } + + // members + + // do this in order to be IDisposable, that is: suitable for (using) + void System.IDisposable.Dispose() { } + public void GetData() { } + + // from HasKind + [XmlElement(ElementName = "kind")] + [JsonIgnore] + public ModelingKind kind = new ModelingKind(); + [XmlIgnore] + [JsonProperty(PropertyName = "kind")] + public string JsonKind + { + get + { + if (kind == null) + return null; + return kind.kind; + } + set + { + if (kind == null) + kind = new ModelingKind(); + kind.kind = value; + } + } + + // from hasSemanticId: + [XmlElement(ElementName = "semanticId")] + public SemanticId semanticId = new SemanticId(); + public SemanticId GetSemanticId() { return semanticId; } + + // from Qualifiable: + [XmlArray("qualifier")] + [XmlArrayItem("qualifier")] + public QualifierCollection qualifiers = null; + public QualifierCollection GetQualifiers() => qualifiers; + + // from hasDataSpecification: + [XmlElement(ElementName = "embeddedDataSpecification")] + public HasDataSpecification hasDataSpecification = null; + + // from this very class + [XmlIgnore] + [JsonIgnore] + private SubmodelElementWrapperCollection _submodelElements = null; + + [JsonIgnore] + public SubmodelElementWrapperCollection submodelElements + { + get { return _submodelElements; } + set { _submodelElements = value; _submodelElements.Parent = this; } + } + + [XmlIgnore] + [JsonProperty(PropertyName = "submodelElements")] + public SubmodelElement[] JsonSubmodelElements + { + get + { + var res = new ListOfSubmodelElement(); + if (submodelElements != null) + foreach (var smew in submodelElements) + res.Add(smew.submodelElement); + return res.ToArray(); + } + set + { + if (value != null) + { + this.submodelElements = new SubmodelElementWrapperCollection(); + foreach (var x in value) + { + var smew = new SubmodelElementWrapper() { submodelElement = x }; + this.submodelElements.Add(smew); + } + } + } + } + + // getter / setter + + // constructors / creators + + public Submodel() : base() { } + + public Submodel(Submodel src, bool shallowCopy = false) + : base(src) + { + if (src == null) + return; + if (src.hasDataSpecification != null) + this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); + if (src.semanticId != null) + this.semanticId = new SemanticId(src.semanticId); + if (src.kind != null) + this.kind = new ModelingKind(src.kind); + if (!shallowCopy && src.submodelElements != null) + { + if (this.submodelElements == null) + this.submodelElements = new SubmodelElementWrapperCollection(); + foreach (var smw in src.submodelElements) + this.submodelElements.Add(new SubmodelElementWrapper(smw.submodelElement, shallowCopy: false)); + } + } + +#if !DoNotUseAasxCompatibilityModels + public Submodel(AasxCompatibilityModels.AdminShellV10.Submodel src, bool shallowCopy = false) + : base(src) + { + if (src.hasDataSpecification != null) + this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); + if (src.semanticId != null) + this.semanticId = new SemanticId(src.semanticId); + if (src.kind != null) + this.kind = new ModelingKind(src.kind); + if (src.qualifiers != null) + this.qualifiers = new QualifierCollection(src.qualifiers); + if (!shallowCopy && src.submodelElements != null) + { + if (this.submodelElements == null) + this.submodelElements = new SubmodelElementWrapperCollection(); + foreach (var smw in src.submodelElements) + this.submodelElements.Add(new SubmodelElementWrapper(smw.submodelElement, shallowCopy: false)); + } + } +#endif + + public static Submodel CreateNew(string idType, string id, string version = null, string revision = null) + { + var s = new Submodel() { identification = new Identification(idType, id) }; + if (version != null) + { + if (s.administration == null) + s.administration = new Administration(); + s.administration.version = version; + s.administration.revision = revision; + } + return (s); + } + + [JsonIgnore] + [XmlIgnore] + public SubmodelElementWrapperCollection SmeForWrite + { + get + { + if (this.submodelElements == null) + this.submodelElements = new SubmodelElementWrapperCollection(); + return this.submodelElements; + } + } + + // from IEnumarateChildren + public IEnumerable EnumerateChildren() + { + if (this.submodelElements != null) + foreach (var smw in this.submodelElements) + yield return smw; + } + + public EnumerationPlacmentBase GetChildrenPlacement(SubmodelElement child) + { + return null; + } + + public object AddChild(SubmodelElementWrapper smw, EnumerationPlacmentBase placement = null) + { + if (smw == null) + return null; + if (this.submodelElements == null) + this.submodelElements = new SubmodelElementWrapperCollection(); + if (smw.submodelElement != null) + smw.submodelElement.parent = this; + this.submodelElements.Add(smw); + return smw; + } + + // from IManageSubmodelElements + public void Add(SubmodelElement sme) + { + if (submodelElements == null) + submodelElements = new SubmodelElementWrapperCollection(); + var sew = new SubmodelElementWrapper(); + sme.parent = this; // track parent here! + sew.submodelElement = sme; + submodelElements.Add(sew); + } + + public void Insert(int index, SubmodelElement sme) + { + if (submodelElements == null) + submodelElements = new SubmodelElementWrapperCollection(); + var sew = new SubmodelElementWrapper(); + sme.parent = this; // track parent here! + sew.submodelElement = sme; + if (index < 0 || index >= submodelElements.Count) + return; + submodelElements.Insert(index, sew); + } + + public void Remove(SubmodelElement sme) + { + if (submodelElements != null) + submodelElements.Remove(sme); + } + + // further + + public void AddQualifier( + string qualifierType = null, string qualifierValue = null, KeyList semanticKeys = null, + Reference qualifierValueId = null) + { + QualifierCollection.AddQualifier( + ref this.qualifiers, qualifierType, qualifierValue, semanticKeys, qualifierValueId); + } + + public Qualifier HasQualifierOfType(string qualifierType) + { + return QualifierCollection.HasQualifierOfType(this.qualifiers, qualifierType); + } + + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("Submodel", "SM"); + } + + public SubmodelRef GetSubmodelRef() + { + SubmodelRef l = new SubmodelRef(); + l.Keys.Add( + Key.CreateNew( + this.GetElementName(), true, this.identification.idType, this.identification.id)); + return l; + } + + /// + /// If instance, return semanticId as on key. + /// If template, return identification as key. + /// + /// + public Key GetSemanticKey() + { + if (true == this.kind?.IsTemplate) + return new Key(this.GetElementName(), true, this.identification?.idType, this.identification?.id); + else + return this.semanticId?.GetAsExactlyOneKey(); + } + + public void AddDataSpecification(Key k) + { + if (hasDataSpecification == null) + hasDataSpecification = new HasDataSpecification(); + var r = new Reference(); + r.Keys.Add(k); + hasDataSpecification.Add(new EmbeddedDataSpecification(r)); + } + + public SubmodelElementWrapper FindSubmodelElementWrapper(string idShort) + { + if (this.submodelElements == null) + return null; + foreach (var smw in this.submodelElements) + if (smw.submodelElement != null) + if (smw.submodelElement.idShort.Trim().ToLower() == idShort.Trim().ToLower()) + return smw; + return null; + } + + public IEnumerable FindDeep(Predicate match = null) where T : SubmodelElement + { + if (this.submodelElements == null) + yield break; + foreach (var x in this.submodelElements.FindDeep(match)) + yield return x; + } + + public Tuple ToCaptionInfo() + { + var caption = AdminShellUtilV20.EvalToNonNullString("\"{0}\" ", idShort, ""); + if (administration != null) + caption += "V" + administration.version + "." + administration.revision; + var info = ""; + if (identification != null) + info = $"[{identification.idType}, {identification.id}]"; + return Tuple.Create(caption, info); + } + + public override string ToString() + { + var ci = ToCaptionInfo(); + return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); + } + + // Recursing + + /// + /// Recurses on all Submodel elements of a Submodel or SME, which allows children. + /// The state object will be passed to the lambda function in order to provide + /// stateful approaches. + /// + /// State object to be provided to lambda. Could be null. + /// The lambda function as (state, parents, SME) + /// The lambda shall return TRUE in order to deep into recursion. + /// + public void RecurseOnSubmodelElements( + object state, Func lambda) + { + this.submodelElements?.RecurseOnReferables(state, null, (o, par, rf) => + { + if (rf is SubmodelElement sme) + return lambda(o, par, sme); + else + return true; + }); + } + + /// + /// Recurses on all Submodel elements of a Submodel or SME, which allows children. + /// The state object will be passed to the lambda function in order to provide + /// stateful approaches. Include this element, as well. + /// + /// State object to be provided to lambda. Could be null. + /// The lambda function as (state, parents, SME) + /// The lambda shall return TRUE in order to deep into recursion. + /// Include this element as well. parents will then + /// include this element as well! + public override void RecurseOnReferables( + object state, Func lambda, + bool includeThis = false) + { + var parents = new ListOfReferable(); + if (includeThis) + { + lambda(state, null, this); + parents.Add(this); + } + this.submodelElements?.RecurseOnReferables(state, parents, lambda); + } + + // Parents stuff + + public static void SetParentsForSME(Referable parent, SubmodelElement se) + { + if (se == null) + return; + + se.parent = parent; + + // via interface enumaration + if (se is IEnumerateChildren) + { + var childs = (se as IEnumerateChildren).EnumerateChildren(); + if (childs != null) + foreach (var c in childs) + SetParentsForSME(se, c.submodelElement); + } + } + + public void SetAllParents() + { + if (this.submodelElements != null) + foreach (var sme in this.submodelElements) + SetParentsForSME(this, sme.submodelElement); + } + + public T CreateSMEForCD(ConceptDescription cd, string category = null, string idShort = null, + string idxTemplate = null, int maxNum = 999, bool addSme = false) where T : SubmodelElement, new() + { + if (this.submodelElements == null) + this.submodelElements = new SubmodelElementWrapperCollection(); + return this.submodelElements.CreateSMEForCD(cd, category, idShort, idxTemplate, maxNum, addSme); + } + + public T CreateSMEForIdShort(string idShort, string category = null, + string idxTemplate = null, int maxNum = 999, bool addSme = false) where T : SubmodelElement, new() + { + if (this.submodelElements == null) + this.submodelElements = new SubmodelElementWrapperCollection(); + return this.submodelElements.CreateSMEForIdShort(idShort, category, idxTemplate, maxNum, addSme); + } + + // validation + + public override void Validate(AasValidationRecordList results) + { + // access + if (results == null) + return; + + // check + base.Validate(results); + ModelingKind.Validate(results, kind, this); + KeyList.Validate(results, semanticId?.Keys, this); + } + + // find + + public IEnumerable FindAllReferences() + { + // not nice: use temp list + var temp = new List(); + + // recurse + this.RecurseOnSubmodelElements(null, (state, parents, sme) => + { + if (sme is ReferenceElement re) + if (re.value != null) + temp.Add(re.value); + if (sme is RelationshipElement rl) + { + if (rl.first != null) + temp.Add(rl.first); + if (rl.second != null) + temp.Add(rl.second); + } + // recurse + return true; + }); + + // now, give back + foreach (var r in temp) + yield return new LocatedReference(this, r); + } + } + + public class ListOfSubmodels : List, IAasElement + { + // self decscription + + public AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("Submodels", "SMS"); + } + + public string GetElementName() + { + return this.GetSelfDescription()?.ElementName; + } + } + + // + // Derived from SubmodelElements + // + + public class DataElement : SubmodelElement + { + public static string ValueType_STRING = "string"; + public static string ValueType_DATE = "date"; + public static string ValueType_BOOLEAN = "boolean"; + + public static string[] ValueTypeItems = new string[] { + "anyType", "complexType", "anySimpleType", "anyAtomicType", "anyURI", "base64Binary", + "boolean", "date", "dateTime", + "dateTimeStamp", "decimal", "integer", "long", "int", "short", "byte", "nonNegativeInteger", + "positiveInteger", + "unsignedLong", "unsignedInt", "unsignedShort", "unsignedByte", "nonPositiveInteger", + "negativeInteger", "double", "duration", + "dayTimeDuration", "yearMonthDuration", "float", "hexBinary", "string", "langString", "time" }; + + public static string[] ValueTypes_Number = new[] { + "decimal", "integer", "long", "int", "short", "byte", "nonNegativeInteger", + "positiveInteger", + "unsignedLong", "unsignedInt", "unsignedShort", "unsignedByte", "nonPositiveInteger", + "negativeInteger", "double", "float" }; + + public DataElement() { } + + public DataElement(SubmodelElement src) : base(src) { } + + public DataElement(DataElement src) : base(src) { } + +#if !DoNotUseAasxCompatibilityModels + public DataElement(AasxCompatibilityModels.AdminShellV10.DataElement src) + : base(src) + { } +#endif + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("DataElement", "DE"); + } + } + + public class JsonValueTypeCast + { + + public class JsonDataObjectType + { + [JsonProperty(PropertyName = "name")] + public string name = ""; + } + + [JsonProperty(PropertyName = "dataObjectType")] + public JsonDataObjectType dataObjectType = new JsonDataObjectType(); + + public JsonValueTypeCast(string name) + { + this.dataObjectType.name = name; + } + } + + public class Property : DataElement + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public new JsonModelTypeWrapper JsonModelType + { + get { return new JsonModelTypeWrapper(GetElementName()); } + } + + // members + + [MetaModelName("Property.valueType")] + [TextSearchable] + [JsonIgnore] + public string valueType = ""; + [XmlIgnore] + [JsonProperty(PropertyName = "valueType")] + public JsonValueTypeCast JsonValueType + { + get { return new JsonValueTypeCast(this.valueType); } + set { this.valueType = value?.dataObjectType?.name; } + } + + + [MetaModelName("Property.value")] + [TextSearchable] + public string value = ""; + public Reference valueId = null; + + // constructors + + public Property() { } + + public Property(SubmodelElement src) + : base(src) + { + if (!(src is Property p)) + return; + this.valueType = p.valueType; + this.value = p.value; + if (p.valueId != null) + valueId = new Reference(p.valueId); + } + +#if !DoNotUseAasxCompatibilityModels + public Property(AasxCompatibilityModels.AdminShellV10.Property src) + : base(src) + { + if (src == null) + return; + + this.valueType = src.valueType; + this.value = src.value; + if (src.valueId != null) + this.valueId = new Reference(src.valueId); + } +#endif + + public static Property CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) + { + var x = new Property(); + x.CreateNewLogic(idShort, category, semanticIdKey); + return (x); + } + + public Property Set(string valueType = "", string value = "") + { + this.valueType = valueType; + this.value = value; + return this; + } + + public Property Set(string type, bool local, string idType, string value) + { + this.valueId = Reference.CreateNew(Key.CreateNew(type, local, idType, value)); + return this; + } + + public Property Set(Qualifier q) + { + if (q != null) + this.AddQualifier(q); + return this; + } + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("Property", "Prop", + SubmodelElementWrapper.AdequateElementEnum.Property); + } + + public override string ValueAsText(string defaultLang = null) + { + return "" + value; + } + + public override void ValueFromText(string text, string defaultLang = null) + { + value = "" + text; + } + + public bool IsTrue() + { + if (this.valueType?.Trim().ToLower() == "boolean") + { + var v = "" + this.value?.Trim().ToLower(); + if (v == "true" || v == "1") + return true; + } + return false; + } + + public override double? ValueAsDouble() + { + // pointless + if (this.value == null || this.value.Trim() == "" || this.valueType == null) + return null; + + // type? + var vt = this.valueType.Trim().ToLower(); + if (!DataElement.ValueTypes_Number.Contains(vt)) + return null; + + // try convert + if (double.TryParse(this.value, NumberStyles.Any, CultureInfo.InvariantCulture, out double dbl)) + return dbl; + + // no + return null; + } + + } + + public class MultiLanguageProperty : DataElement + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public new JsonModelTypeWrapper JsonModelType + { + get { return new JsonModelTypeWrapper(GetElementName()); } + } + + // members + + public LangStringSet value = new LangStringSet(); + public Reference valueId = null; + + // constructors + + public MultiLanguageProperty() { } + + public MultiLanguageProperty(SubmodelElement src) + : base(src) + { + if (!(src is MultiLanguageProperty mlp)) + return; + + this.value = new LangStringSet(mlp.value); + if (mlp.valueId != null) + valueId = new Reference(mlp.valueId); + } + +#if !DoNotUseAasxCompatibilityModels + // not available in V1.0 +#endif + + public static MultiLanguageProperty CreateNew( + string idShort = null, string category = null, Key semanticIdKey = null) + { + var x = new MultiLanguageProperty(); + x.CreateNewLogic(idShort, category, semanticIdKey); + return (x); + } + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("MultiLanguageProperty", "MLP", + SubmodelElementWrapper.AdequateElementEnum.MultiLanguageProperty); + } + + public MultiLanguageProperty Set(LangStringSet ls) + { + this.value = ls; + return this; + } + + public MultiLanguageProperty Set(ListOfLangStr ls) + { + this.value = new LangStringSet(ls); + return this; + } + + public MultiLanguageProperty Set(LangStr ls) + { + if (ls == null) + return this; + if (this.value?.langString == null) + this.value = new LangStringSet(); + this.value.langString[ls.lang] = ls.str; + return this; + } + + public MultiLanguageProperty Set(string lang, string str) + { + return this.Set(new LangStr(lang, str)); + } + + public override string ValueAsText(string defaultLang = null) + { + return "" + value?.GetDefaultStr(defaultLang); + } + + public override void ValueFromText(string text, string defaultLang = null) + { + Set(defaultLang, text); + } + + } + + public class Range : DataElement + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public new JsonModelTypeWrapper JsonModelType + { + get { return new JsonModelTypeWrapper(GetElementName()); } + } + + // members + + [MetaModelName("Range.valueType")] + [TextSearchable] + [JsonIgnore] + [CountForHash] + public string valueType = ""; + + [XmlIgnore] + [JsonProperty(PropertyName = "valueType")] + public JsonValueTypeCast JsonValueType + { + get { return new JsonValueTypeCast(this.valueType); } + set { this.valueType = value?.dataObjectType?.name; } + } + + [MetaModelName("Range.min")] + [TextSearchable] + [CountForHash] + public string min = ""; + + [MetaModelName("Range.max")] + [TextSearchable] + [CountForHash] + public string max = ""; + + // constructors + + public Range() { } + + public Range(SubmodelElement src) + : base(src) + { + if (!(src is Range rng)) + return; + + this.valueType = rng.valueType; + this.min = rng.min; + this.max = rng.max; + } + +#if !DoNotUseAasxCompatibilityModels + // not available in V1.0 +#endif + + public static Range CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) + { + var x = new Range(); + x.CreateNewLogic(idShort, category, semanticIdKey); + return (x); + } + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("Range", "Range", + SubmodelElementWrapper.AdequateElementEnum.Range); + } + + public override string ValueAsText(string defaultLang = null) + { + return "" + min + " .. " + max; + } + + } + + public class Blob : DataElement + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public new JsonModelTypeWrapper JsonModelType + { + get { return new JsonModelTypeWrapper(GetElementName()); } + } + + // members + + [MetaModelName("Blob.mimeType")] + [TextSearchable] + [CountForHash] + public string mimeType = ""; + + [MetaModelName("Blob.value")] + [TextSearchable] + [CountForHash] + public string value = ""; + + // constructors + + public Blob() { } + + public Blob(SubmodelElement src) + : base(src) + { + if (!(src is Blob blb)) + return; + + this.mimeType = blb.mimeType; + this.value = blb.value; + } + +#if !DoNotUseAasxCompatibilityModels + public Blob(AasxCompatibilityModels.AdminShellV10.Blob src) + : base(src) + { + if (src == null) + return; + + this.mimeType = src.mimeType; + this.value = src.value; + } +#endif + + public static Blob CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) + { + var x = new Blob(); + x.CreateNewLogic(idShort, category, semanticIdKey); + return (x); + } + + public void Set(string mimeType = "", string value = "") + { + this.mimeType = mimeType; + this.value = value; + } + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("Blob", "Blob", + SubmodelElementWrapper.AdequateElementEnum.Blob); + } + + } + + public class File : DataElement + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public new JsonModelTypeWrapper JsonModelType + { + get { return new JsonModelTypeWrapper(GetElementName()); } + } + + // members + + [MetaModelName("File.mimeType")] + [TextSearchable] + [CountForHash] + public string mimeType = ""; + + [MetaModelName("File.value")] + [TextSearchable] + [CountForHash] + public string value = ""; + + // constructors + + public File() { } + + public File(SubmodelElement src) + : base(src) + { + if (!(src is File fil)) + return; + + this.mimeType = fil.mimeType; + this.value = fil.value; + } + +#if !DoNotUseAasxCompatibilityModels + public File(AasxCompatibilityModels.AdminShellV10.File src) + : base(src) + { + if (src == null) + return; + + this.mimeType = src.mimeType; + this.value = src.value; + } +#endif + + public static File CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) + { + var x = new File(); + x.CreateNewLogic(idShort, category, semanticIdKey); + return (x); + } + + public void Set(string mimeType = "", string value = "") + { + this.mimeType = mimeType; + this.value = value; + } + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("File", "File", + SubmodelElementWrapper.AdequateElementEnum.File); + } + + public static string[] GetPopularMimeTypes() + { + return + new[] { + System.Net.Mime.MediaTypeNames.Text.Plain, + System.Net.Mime.MediaTypeNames.Text.Xml, + System.Net.Mime.MediaTypeNames.Text.Html, + "application/json", + "application/rdf+xml", + System.Net.Mime.MediaTypeNames.Application.Pdf, + System.Net.Mime.MediaTypeNames.Image.Jpeg, + "image/png", + System.Net.Mime.MediaTypeNames.Image.Gif, + "application/iges", + "application/step" + }; + } + + public override string ValueAsText(string defaultLang = null) + { + return "" + value; + } + } + + public class ReferenceElement : DataElement + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public new JsonModelTypeWrapper JsonModelType + { + get { return new JsonModelTypeWrapper(GetElementName()); } + } + + // members + + public Reference value = new Reference(); + + // constructors + + public ReferenceElement() { } + + public ReferenceElement(SubmodelElement src) + : base(src) + { + if (!(src is ReferenceElement re)) + return; + + if (re.value != null) + this.value = new Reference(re.value); + } + +#if !DoNotUseAasxCompatibilityModels + public ReferenceElement(AasxCompatibilityModels.AdminShellV10.ReferenceElement src) + : base(src) + { + if (src == null) + return; + + if (src.value != null) + this.value = new Reference(src.value); + } +#endif + + public static ReferenceElement CreateNew( + string idShort = null, string category = null, Key semanticIdKey = null) + { + var x = new ReferenceElement(); + x.CreateNewLogic(idShort, category, semanticIdKey); + return (x); + } + + public void Set(Reference value = null) + { + this.value = value; + } + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("ReferenceElement", "Ref", + SubmodelElementWrapper.AdequateElementEnum.ReferenceElement); + } + + } + + public class RelationshipElement : DataElement + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public new JsonModelTypeWrapper JsonModelType + { + get { return new JsonModelTypeWrapper(GetElementName()); } + } + + // members + + public Reference first = new Reference(); + public Reference second = new Reference(); + + // constructors + + public RelationshipElement() { } + + public RelationshipElement(SubmodelElement src) + : base(src) + { + if (!(src is RelationshipElement rel)) + return; + + if (rel.first != null) + this.first = new Reference(rel.first); + if (rel.second != null) + this.second = new Reference(rel.second); + } + +#if !DoNotUseAasxCompatibilityModels + public RelationshipElement(AasxCompatibilityModels.AdminShellV10.RelationshipElement src) + : base(src) + { + if (src == null) + return; + + if (src.first != null) + this.first = new Reference(src.first); + if (src.second != null) + this.second = new Reference(src.second); + } +#endif + + public static RelationshipElement CreateNew( + string idShort = null, string category = null, Key semanticIdKey = null, Reference first = null, + Reference second = null) + { + var x = new RelationshipElement(); + x.CreateNewLogic(idShort, category, semanticIdKey); + x.first = first; + x.second = second; + return (x); + } + + public void Set(Reference first = null, Reference second = null) + { + this.first = first; + this.second = second; + } + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("RelationshipElement", "Rel", + SubmodelElementWrapper.AdequateElementEnum.RelationshipElement); + } + } + + public class AnnotatedRelationshipElement : RelationshipElement, IManageSubmodelElements, IEnumerateChildren + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public new JsonModelTypeWrapper JsonModelType + { + get { return new JsonModelTypeWrapper(GetElementName()); } + } + + // members + + // from this very class + + [JsonIgnore] + [SkipForHash] // do NOT count children! + [XmlArray("annotations")] + [XmlArrayItem("dataElement")] + public DataElementWrapperCollection annotations = null; + + [XmlIgnore] + [JsonProperty(PropertyName = "annotations")] + public DataElement[] JsonAnotations + { + get + { + var res = new List(); + if (annotations != null) + foreach (var smew in annotations) + if (smew.submodelElement is DataElement de) + res.Add(de); + return res.ToArray(); + } + set + { + if (value != null) + { + this.annotations = new DataElementWrapperCollection(); + foreach (var x in value) + { + var smew = new SubmodelElementWrapper() { submodelElement = x }; + this.annotations.Add(smew); + } + } + } + } + + // constructors + + public AnnotatedRelationshipElement() { } + + public AnnotatedRelationshipElement(SubmodelElement src) + : base(src) + { + if (!(src is AnnotatedRelationshipElement arel)) + return; + if (arel.first != null) + this.first = new Reference(arel.first); + if (arel.second != null) + this.second = new Reference(arel.second); + if (arel.annotations != null) + this.annotations = new DataElementWrapperCollection(arel.annotations); + } + + public new static AnnotatedRelationshipElement CreateNew( + string idShort = null, string category = null, Key semanticIdKey = null, + Reference first = null, Reference second = null) + { + var x = new AnnotatedRelationshipElement(); + x.CreateNewLogic(idShort, category, semanticIdKey); + x.first = first; + x.second = second; + return (x); + } + + // enumerates its children + + public IEnumerable EnumerateChildren() + { + if (this.annotations != null) + foreach (var smw in this.annotations) + yield return smw; + } + + public EnumerationPlacmentBase GetChildrenPlacement(SubmodelElement child) + { + return null; + } + + public object AddChild(SubmodelElementWrapper smw, EnumerationPlacmentBase placement = null) + { + if (smw == null || !(smw.submodelElement is DataElement)) + return null; + if (this.annotations == null) + this.annotations = new DataElementWrapperCollection(); + if (smw.submodelElement != null) + smw.submodelElement.parent = this; + this.annotations.Add(smw); + return smw; + } + + // from IManageSubmodelElements + public void Add(SubmodelElement sme) + { + if (annotations == null) + annotations = new DataElementWrapperCollection(); + var sew = new SubmodelElementWrapper(); + sme.parent = this; // track parent here! + sew.submodelElement = sme; + annotations.Add(sew); + } + + public void Insert(int index, SubmodelElement sme) + { + if (annotations == null) + annotations = new DataElementWrapperCollection(); + var sew = new SubmodelElementWrapper(); + sme.parent = this; // track parent here! + if (index < 0 || index >= annotations.Count) + return; + annotations.Insert(index, sew); + } + + public void Remove(SubmodelElement sme) + { + if (annotations != null) + annotations.Remove(sme); + } + + // further + + public new void Set(Reference first = null, Reference second = null) + { + this.first = first; + this.second = second; + } + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("AnnotatedRelationshipElement", "RelA", + SubmodelElementWrapper.AdequateElementEnum.AnnotatedRelationshipElement); + } + + + } + + public class Capability : SubmodelElement + { + public Capability() { } + + public Capability(SubmodelElement src) + : base(src) + { } + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("Capability", "Cap", + SubmodelElementWrapper.AdequateElementEnum.Capability); + } + } + + + public class SubmodelElementCollection : SubmodelElement, IManageSubmodelElements, IEnumerateChildren + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public new JsonModelTypeWrapper JsonModelType + { + get { return new JsonModelTypeWrapper(GetElementName()); } + } + + // values == SMEs + [XmlIgnore] + [JsonIgnore] + [SkipForHash] // do NOT count children! + private SubmodelElementWrapperCollection _value = null; + + [JsonIgnore] + public SubmodelElementWrapperCollection value + { + get { return _value; } + set { _value = value; _value.Parent = this; } + } + + [XmlIgnore] + [JsonProperty(PropertyName = "value")] + public SubmodelElement[] JsonValue + { + get + { + var res = new ListOfSubmodelElement(); + if (value != null) + foreach (var smew in value) + res.Add(smew.submodelElement); + return res.ToArray(); + } + set + { + if (value != null) + { + this.value = new SubmodelElementWrapperCollection(); + foreach (var x in value) + { + var smew = new SubmodelElementWrapper() { submodelElement = x }; + this.value.Add(smew); + } + } + } + } + + // constant members + public bool ordered = false; + public bool allowDuplicates = false; + + // enumartes its children + + public IEnumerable EnumerateChildren() + { + if (this.value != null) + foreach (var smw in this.value) + yield return smw; + } + + public EnumerationPlacmentBase GetChildrenPlacement(SubmodelElement child) + { + return null; + } + + public object AddChild(SubmodelElementWrapper smw, EnumerationPlacmentBase placement = null) + { + if (smw == null) + return null; + if (this.value == null) + this.value = new SubmodelElementWrapperCollection(); + if (smw.submodelElement != null) + smw.submodelElement.parent = this; + this.value.Add(smw); + return smw; + } + + // constructors + + public SubmodelElementCollection() { } + + public SubmodelElementCollection(SubmodelElement src, bool shallowCopy = false) + : base(src) + { + if (!(src is SubmodelElementCollection smc)) + return; + + this.ordered = smc.ordered; + this.allowDuplicates = smc.allowDuplicates; + this.value = new SubmodelElementWrapperCollection(); + if (!shallowCopy) + foreach (var smw in smc.value) + value.Add(new SubmodelElementWrapper(smw.submodelElement)); + } + +#if !DoNotUseAasxCompatibilityModels + public SubmodelElementCollection( + AasxCompatibilityModels.AdminShellV10.SubmodelElementCollection src, bool shallowCopy = false) + : base(src) + { + if (src == null) + return; + + this.ordered = src.ordered; + this.allowDuplicates = src.allowDuplicates; + this.value = new SubmodelElementWrapperCollection(); + if (!shallowCopy) + foreach (var smw in src.value) + value.Add(new SubmodelElementWrapper(smw.submodelElement)); + } +#endif + + public static SubmodelElementCollection CreateNew( + string idShort = null, string category = null, Key semanticIdKey = null) + { + var x = new SubmodelElementCollection(); + x.CreateNewLogic(idShort, category, semanticIdKey); + return (x); + } + + // from IManageSubmodelElements + public void Add(SubmodelElement sme) + { + if (value == null) + value = new SubmodelElementWrapperCollection(); + var sew = new SubmodelElementWrapper(); + sme.parent = this; // track parent here! + sew.submodelElement = sme; + value.Add(sew); + } + + public void Insert(int index, SubmodelElement sme) + { + if (value == null) + value = new SubmodelElementWrapperCollection(); + var sew = new SubmodelElementWrapper(); + sme.parent = this; // track parent here! + sew.submodelElement = sme; + if (index < 0 || index >= value.Count) + return; + value.Insert(index, sew); + } + + public void Remove(SubmodelElement sme) + { + if (value != null) + value.Remove(sme); + } + + // further + + public void Set(bool allowDuplicates = false, bool ordered = false) + { + this.allowDuplicates = allowDuplicates; + this.ordered = ordered; + } + + public SubmodelElementWrapper FindFirstIdShort(string idShort) + { + return this.value?.FindFirstIdShort(idShort); + } + + public T CreateSMEForCD(ConceptDescription cd, string category = null, string idShort = null, + string idxTemplate = null, int maxNum = 999, bool addSme = false) where T : SubmodelElement, new() + { + if (this.value == null) + this.value = new SubmodelElementWrapperCollection(); + return this.value.CreateSMEForCD(cd, category, idShort, idxTemplate, maxNum, addSme); + } + + public T CreateSMEForIdShort(string idShort, string category = null, + string idxTemplate = null, int maxNum = 999, bool addSme = false) where T : SubmodelElement, new() + { + if (this.value == null) + this.value = new SubmodelElementWrapperCollection(); + return this.value.CreateSMEForIdShort(idShort, category, idxTemplate, maxNum, addSme); + } + + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("SubmodelElementCollection", "SMC", + SubmodelElementWrapper.AdequateElementEnum.SubmodelElementCollection); + } + + // Recursing + + /// + /// Recurses on all Submodel elements of a Submodel or SME, which allows children. + /// The state object will be passed to the lambda function in order to provide + /// stateful approaches. + /// + /// State object to be provided to lambda. Could be null. + /// The lambda function as (state, parents, SME) + /// The lambda shall return TRUE in order to deep into recursion. + /// + public void RecurseOnSubmodelElements( + object state, Func lambda) + { + this.value?.RecurseOnReferables(state, null, (o, par, rf) => + { + if (rf is SubmodelElement sme) + return lambda(o, par, sme); + else + return true; + }); + } + + /// + /// Recurses on all Submodel elements of a Submodel or SME, which allows children. + /// The state object will be passed to the lambda function in order to provide + /// stateful approaches. Include this element, as well. + /// + /// State object to be provided to lambda. Could be null. + /// The lambda function as (state, parents, SME) + /// The lambda shall return TRUE in order to deep into recursion. + /// Include this element as well. parents will then + /// include this element as well! + public override void RecurseOnReferables( + object state, Func lambda, + bool includeThis = false) + { + var parents = new ListOfReferable(); + if (includeThis) + { + lambda(state, null, this); + parents.Add(this); + } + this.value?.RecurseOnReferables(state, parents, lambda); + } + } + + public class OperationVariable : IAasElement + { + public enum Direction { In, Out, InOut }; + + // Note: for OperationVariable, the values of the SubmodelElement itself ARE NOT TO BE USED! + // only the SME attributes of "value" are counting + + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } + + // members + public SubmodelElementWrapper value = null; + + // constructors + + public OperationVariable() + { + } + + public OperationVariable(OperationVariable src, bool shallowCopy = false) + { + this.value = new SubmodelElementWrapper(src?.value?.submodelElement, shallowCopy); + } + +#if !DoNotUseAasxCompatibilityModels + public OperationVariable( + AasxCompatibilityModels.AdminShellV10.OperationVariable src, bool shallowCopy = false) + { + this.value = new SubmodelElementWrapper(src.value.submodelElement, shallowCopy); + } +#endif + + public OperationVariable(SubmodelElement elem) + : base() + { + this.value = new SubmodelElementWrapper(elem); + } + + public AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("OperationVariable", "OprVar"); + } + + public string GetElementName() + { + return this.GetSelfDescription()?.ElementName; + } + } + + public class Operation : SubmodelElement, IEnumerateChildren + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public new JsonModelTypeWrapper JsonModelType + { + get { return new JsonModelTypeWrapper(GetElementName()); } + } + + // members + [JsonIgnore] + [XmlElement(ElementName = "inputVariable")] + [SkipForHash] // do NOT count children! + public List inputVariable = new List(); + + [JsonIgnore] + [XmlElement(ElementName = "outputVariable")] + [SkipForHash] // do NOT count children! + public List outputVariable = new List(); + + [JsonIgnore] + [XmlElement(ElementName = "inoutputVariable")] + [SkipForHash] // do NOT count children! + public List inoutputVariable = new List(); + + [XmlIgnore] + // MICHA 190504: enabled JSON operation variables! + [JsonProperty(PropertyName = "inputVariable")] + public OperationVariable[] JsonInputVariable + { + get { return inputVariable?.ToArray(); } + set { inputVariable = (value != null) ? new List(value) : null; } + } + + [XmlIgnore] + [JsonProperty(PropertyName = "outputVariable")] + // MICHA 190504: enabled JSON operation variables! + public OperationVariable[] JsonOutputVariable + { + get { return outputVariable?.ToArray(); } + set { outputVariable = (value != null) ? new List(value) : null; } + } + + [XmlIgnore] + [JsonProperty(PropertyName = "inoutputVariable")] + // MICHA 190504: enabled JSON operation variables! + public OperationVariable[] JsonInOutputVariable + { + get { return inoutputVariable?.ToArray(); } + set { inoutputVariable = (value != null) ? new List(value) : null; } + } + + public List this[OperationVariable.Direction dir] + { + get + { + if (dir == OperationVariable.Direction.In) + return inputVariable; + else + if (dir == OperationVariable.Direction.Out) + return outputVariable; + else + return inoutputVariable; + } + set + { + if (dir == OperationVariable.Direction.In) + inputVariable = value; + else + if (dir == OperationVariable.Direction.Out) + outputVariable = value; + else + inoutputVariable = value; + } + } + + public List this[int dir] + { + get + { + if (dir == 0) + return inputVariable; + else + if (dir == 1) + return outputVariable; + else + return inoutputVariable; + } + set + { + if (dir == 0) + inputVariable = value; + else + if (dir == 1) + outputVariable = value; + else + inoutputVariable = value; + } + } + + public static SubmodelElementWrapperCollection GetWrappers(List ovl) + { + var res = new SubmodelElementWrapperCollection(); + foreach (var ov in ovl) + if (ov.value != null) + res.Add(ov.value); + return res; + } + + // enumartes its children + public IEnumerable EnumerateChildren() + { + if (this.inputVariable != null) + foreach (var smw in this.inputVariable) + yield return smw?.value; + + if (this.outputVariable != null) + foreach (var smw in this.outputVariable) + yield return smw?.value; + + if (this.inoutputVariable != null) + foreach (var smw in this.inoutputVariable) + yield return smw?.value; + } + + public class EnumerationPlacmentOperationVariable : EnumerationPlacmentBase + { + public OperationVariable.Direction Direction; + public OperationVariable OperationVariable; + } + + public EnumerationPlacmentBase GetChildrenPlacement(SubmodelElement child) + { + // trivial + if (child == null) + return null; + + // search + OperationVariable.Direction? dir = null; + OperationVariable opvar = null; + if (this.inputVariable != null) + foreach (var ov in this.inputVariable) + if (ov?.value?.submodelElement == child) + { + dir = OperationVariable.Direction.In; + opvar = ov; + } + + if (this.outputVariable != null) + foreach (var ov in this.outputVariable) + if (ov?.value?.submodelElement == child) + { + dir = OperationVariable.Direction.Out; + opvar = ov; + } + + if (this.inoutputVariable != null) + foreach (var ov in this.inoutputVariable) + if (ov?.value?.submodelElement == child) + { + dir = OperationVariable.Direction.InOut; + opvar = ov; + } + + // found + if (!dir.HasValue) + return null; + return new EnumerationPlacmentOperationVariable() + { + Direction = dir.Value, + OperationVariable = opvar + }; + } + + public object AddChild(SubmodelElementWrapper smw, EnumerationPlacmentBase placement = null) + { + // not enough information to select list of children? + var pl = placement as EnumerationPlacmentOperationVariable; + if (smw == null || pl == null) + return null; + + // ok, use information + var ov = new OperationVariable(); + ov.value = smw; + + if (smw.submodelElement != null) + smw.submodelElement.parent = this; + + if (pl.Direction == OperationVariable.Direction.In) + { + if (inputVariable == null) + inputVariable = new List(); + inputVariable.Add(ov); + } + + if (pl.Direction == OperationVariable.Direction.Out) + { + if (outputVariable == null) + outputVariable = new List(); + outputVariable.Add(ov); + } + + if (pl.Direction == OperationVariable.Direction.InOut) + { + if (inoutputVariable == null) + inoutputVariable = new List(); + inoutputVariable.Add(ov); + } + + return ov; + } + + // constructors + + public Operation() { } + + public Operation(SubmodelElement src) + : base(src) + { + if (!(src is Operation op)) + return; + + for (int i = 0; i < 2; i++) + if (op[i] != null) + { + if (this[i] == null) + this[i] = new List(); + foreach (var ov in op[i]) + this[i].Add(new OperationVariable(ov)); + } + } + +#if !DoNotUseAasxCompatibilityModels + public Operation(AasxCompatibilityModels.AdminShellV10.Operation src) + : base(src) + { + for (int i = 0; i < 2; i++) + if (src[i] != null) + { + if (this[i] == null) + this[i] = new List(); + foreach (var ov in src[i]) + this[i].Add(new OperationVariable(ov)); + } + } +#endif + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("Operation", "Opr", + SubmodelElementWrapper.AdequateElementEnum.Operation); + } + } + + public class Entity : SubmodelElement, IManageSubmodelElements, IEnumerateChildren + { + public enum EntityTypeEnum { CoManagedEntity = 0, SelfManagedEntity = 1, Undef = 3 } + public static string[] EntityTypeNames = new string[] { "CoManagedEntity", "SelfManagedEntity" }; + + // for JSON only + + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public new JsonModelTypeWrapper JsonModelType + { + get { return new JsonModelTypeWrapper(GetElementName()); } + } + + // from this very class + [XmlIgnore] + [JsonIgnore] + [SkipForHash] // do NOT count children! + private SubmodelElementWrapperCollection _statements = null; + + [JsonIgnore] + public SubmodelElementWrapperCollection statements + { + get { return _statements; } + set { _statements = value; _statements.Parent = this; } + } + + [XmlIgnore] + [JsonProperty(PropertyName = "statements")] + public SubmodelElement[] JsonStatements + { + get + { + var res = new ListOfSubmodelElement(); + if (statements != null) + foreach (var smew in statements) + res.Add(smew.submodelElement); + return res.ToArray(); + } + set + { + if (value != null) + { + this.statements = new SubmodelElementWrapperCollection(); + foreach (var x in value) + { + var smew = new SubmodelElementWrapper() { submodelElement = x }; + this.statements.Add(smew); + } + } + } + } + + // further members + + [CountForHash] + public string entityType = ""; + + [JsonProperty(PropertyName = "asset")] + public AssetRef assetRef = null; + + // enumerates its children + + public IEnumerable EnumerateChildren() + { + if (this.statements != null) + foreach (var smw in this.statements) + yield return smw; + } + + public EnumerationPlacmentBase GetChildrenPlacement(SubmodelElement child) + { + return null; + } + + public object AddChild(SubmodelElementWrapper smw, EnumerationPlacmentBase placement = null) + { + if (smw == null) + return null; + if (this.statements == null) + this.statements = new SubmodelElementWrapperCollection(); + if (smw.submodelElement != null) + smw.submodelElement.parent = this; + this.statements.Add(smw); + return smw; + } + + // constructors + + public Entity() { } + + public Entity(SubmodelElement src) + : base(src) + { + if (!(src is Entity ent)) + return; + + if (ent.statements != null) + { + this.statements = new SubmodelElementWrapperCollection(); + foreach (var smw in ent.statements) + this.statements.Add(new SubmodelElementWrapper(smw.submodelElement)); + } + this.entityType = ent.entityType; + if (ent.assetRef != null) + this.assetRef = new AssetRef(ent.assetRef); + } + + public Entity(EntityTypeEnum entityType, string idShort = null, AssetRef assetRef = null, + string category = null, Key semanticIdKey = null) + { + CreateNewLogic(idShort, null, semanticIdKey); + + this.entityType = EntityTypeNames[(int)entityType]; + this.assetRef = assetRef; + } + +#if !DoNotUseAasxCompatibilityModels + // not available in V1.0 +#endif + + public static Entity CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) + { + var x = new Entity(); + x.CreateNewLogic(idShort, category, semanticIdKey); + return (x); + } + + // from IManageSubmodelElements + public void Add(SubmodelElement sme) + { + if (statements == null) + statements = new SubmodelElementWrapperCollection(); + var sew = new SubmodelElementWrapper(); + sme.parent = this; // track parent here! + sew.submodelElement = sme; + statements.Add(sew); + } + + public void Insert(int index, SubmodelElement sme) + { + if (statements == null) + statements = new SubmodelElementWrapperCollection(); + var sew = new SubmodelElementWrapper(); + sme.parent = this; // track parent here! + sew.submodelElement = sme; + if (index < 0 || index >= statements.Count) + return; + statements.Insert(index, sew); + } + + public void Remove(SubmodelElement sme) + { + if (statements != null) + statements.Remove(sme); + } + + // management of elememts + + public SubmodelElementWrapper FindSubmodelElementWrapper(string idShort) + { + if (this.statements == null) + return null; + foreach (var smw in this.statements) + if (smw.submodelElement != null) + if (smw.submodelElement.idShort.Trim().ToLower() == idShort.Trim().ToLower()) + return smw; + return null; + } + + public T CreateSMEForCD(ConceptDescription cd, string category = null, string idShort = null, + string idxTemplate = null, int maxNum = 999, bool addSme = false) where T : SubmodelElement, new() + { + if (this.statements == null) + this.statements = new SubmodelElementWrapperCollection(); + return this.statements.CreateSMEForCD(cd, category, idShort, idxTemplate, maxNum, addSme); + } + + public T CreateSMEForIdShort(string idShort, string category = null, + string idxTemplate = null, int maxNum = 999, bool addSme = false) where T : SubmodelElement, new() + { + if (this.statements == null) + this.statements = new SubmodelElementWrapperCollection(); + return this.statements.CreateSMEForIdShort(idShort, category, idxTemplate, maxNum, addSme); + } + + // entity type + + public EntityTypeEnum GetEntityType() + { + EntityTypeEnum res = EntityTypeEnum.Undef; + if (this.entityType != null && this.entityType.Trim().ToLower() == EntityTypeNames[0].ToLower()) + res = EntityTypeEnum.CoManagedEntity; + if (this.entityType != null && this.entityType.Trim().ToLower() == EntityTypeNames[1].ToLower()) + res = EntityTypeEnum.SelfManagedEntity; + return res; + } + + // name + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("Entity", "Ent", + SubmodelElementWrapper.AdequateElementEnum.Entity); + } + } + + public class BasicEvent : SubmodelElement + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public new JsonModelTypeWrapper JsonModelType + { + get { return new JsonModelTypeWrapper(GetElementName()); } + } + + // from this very class + public Reference observed = new Reference(); + + // constructors + + public BasicEvent() { } + + public BasicEvent(SubmodelElement src) + : base(src) + { + if (!(src is BasicEvent be)) + return; + + if (be.observed != null) + this.observed = new Reference(be.observed); + } + +#if !DoNotUseAasxCompatibilityModels + // not available in V1.0 +#endif + + public static BasicEvent CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) + { + var x = new BasicEvent(); + x.CreateNewLogic(idShort, category, semanticIdKey); + return (x); + } + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("BasicEvent", "Evt", + SubmodelElementWrapper.AdequateElementEnum.BasicEvent); + } + } + + // + // Handling of packages + // + } + + #endregion +} + diff --git a/src/AasxCsharpLib_bkp/AasxCompatibilityModels/V20/AdminShellConverters.cs b/src/AasxCsharpLib_bkp/AasxCompatibilityModels/V20/AdminShellConverters.cs new file mode 100644 index 000000000..63dd76d92 --- /dev/null +++ b/src/AasxCsharpLib_bkp/AasxCompatibilityModels/V20/AdminShellConverters.cs @@ -0,0 +1,174 @@ +/* +Copyright (c) 2018-2021 Festo AG & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using AasxCompatibilityModels; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Newtonsoft.Json.Serialization; + +//namespace AdminShellNS +namespace AdminShell_V20 +{ + public static class AdminShellConverters + { + /// + /// This converter is used for reading JSON files; it claims to be responsible for + /// "Referable" (the base class) + /// and decides, which sub-class of the base class shall be populated. + /// If the object is SubmodelElement, the decision, shich special sub-class to create is done in a factory + /// AdminShell.SubmodelElementWrapper.CreateAdequateType(), + /// in order to have all sub-class specific decisions in one place (SubmodelElementWrapper) + /// Remark: There is a NuGet package JsonSubTypes, which could have done the job, except the fact of having + /// "modelType" being a class property with a contained property "name". + /// + public class JsonAasxConverter : JsonConverter + { + private string UpperClassProperty = "modelType"; + private string LowerClassProperty = "name"; + + public JsonAasxConverter() : base() + { + } + + public JsonAasxConverter(string UpperClassProperty, string LowerClassProperty) : base() + { + this.UpperClassProperty = UpperClassProperty; + this.LowerClassProperty = LowerClassProperty; + } + + public override bool CanConvert(Type objectType) + { + // Info MIHO 21 APR 2020: changed this from SubmodelElement to Referable + if (typeof(AdminShell.Referable).IsAssignableFrom(objectType)) + return true; + return false; + } + + public override bool CanWrite + { + get { return false; } + } + + public override object ReadJson(JsonReader reader, + Type objectType, + object existingValue, + JsonSerializer serializer) + { + // Load JObject from stream + JObject jObject = JObject.Load(reader); + + // Create target object based on JObject + object target = new AdminShell.Referable(); + + if (jObject.ContainsKey(UpperClassProperty)) + { + var j2 = jObject[UpperClassProperty]; + if (j2 != null) + foreach (var c in j2.Children()) + { + var cprop = c as Newtonsoft.Json.Linq.JProperty; + if (cprop == null) + continue; + if (cprop.Name == LowerClassProperty && cprop.Value.Type.ToString() == "String") + { + var cpval = cprop.Value.ToObject(); + if (cpval == null) + continue; + // Info MIHO 21 APR 2020: use Referable.CreateAdequateType instead of SMW... + var o = AdminShell.Referable.CreateAdequateType(cpval); + if (o != null) + target = o; + } + } + } + + // Populate the object properties + serializer.Populate(jObject.CreateReader(), target); + + return target; + } + + /// + /// Introduced for JSON serialization, can create Referables based on a string name + /// + /// string name (standard PascalCased) + + + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + throw new NotImplementedException(); + } + } + + /// + /// This converter / contract resolver for Json.NET adaptively filters different levels of depth + /// of nested AASX structures. + /// + public class AdaptiveFilterContractResolver : DefaultContractResolver + { + public bool AasHasViews = true; + public bool BlobHasValue = true; + public bool SubmodelHasElements = true; + public bool SmcHasValue = true; + public bool OpHasVariables = true; + + public AdaptiveFilterContractResolver() { } + + public AdaptiveFilterContractResolver(bool deep = true, bool complete = true) + { + if (!deep) + { + this.SubmodelHasElements = false; + this.SmcHasValue = false; + this.OpHasVariables = false; + } + if (!complete) + { + this.AasHasViews = false; + this.BlobHasValue = false; + } + + } + + protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) + { + JsonProperty property = base.CreateProperty(member, memberSerialization); + + if (!BlobHasValue && property.DeclaringType == typeof(AdminShell.Blob) && + property.PropertyName == "value") + property.ShouldSerialize = instance => { return false; }; + + if (!SubmodelHasElements && property.DeclaringType == typeof(AdminShell.Submodel) && + property.PropertyName == "submodelElements") + property.ShouldSerialize = instance => { return false; }; + + if (!SmcHasValue && property.DeclaringType == typeof(AdminShell.SubmodelElementCollection) && + property.PropertyName == "value") + property.ShouldSerialize = instance => { return false; }; + + if (!OpHasVariables && property.DeclaringType == typeof(AdminShell.Operation) && + (property.PropertyName == "in" || property.PropertyName == "out")) + property.ShouldSerialize = instance => { return false; }; + + if (!AasHasViews && property.DeclaringType == typeof(AdminShell.AdministrationShell) && + property.PropertyName == "views") + property.ShouldSerialize = instance => { return false; }; + + return property; + } + } + + } +} diff --git a/src/AasxCsharpLib_bkp/AasxCompatibilityModels/V20/AdminShellUtil.cs b/src/AasxCsharpLib_bkp/AasxCompatibilityModels/V20/AdminShellUtil.cs new file mode 100644 index 000000000..81b80b9c5 --- /dev/null +++ b/src/AasxCsharpLib_bkp/AasxCompatibilityModels/V20/AdminShellUtil.cs @@ -0,0 +1,636 @@ +/* +Copyright (c) 2018-2021 Festo AG & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ + +using AasxCompatibilityModels; +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +//namespace AdminShellNS +namespace AdminShell_V20 +{ + public static class AdminShellUtilV20 + { + public static string EvalToNonNullString(string fmt, object o, string elseString = "") + { + if (o == null) + return elseString; + return string.Format(fmt, o); + } + + public static string EvalToNonEmptyString(string fmt, string o, string elseString = "") + { + if (o == null || o == "") + return elseString; + return string.Format(fmt, o); + } + + /// Creates a filter-friendly name from the source. + /// + /// Assert.AreEqual("", AdminShellUtil.FilterFriendlyName("")); + /// Assert.AreEqual("someName", AdminShellUtil.FilterFriendlyName("someName")); + /// Assert.AreEqual("some__name", AdminShellUtil.FilterFriendlyName("some!;name")); + /// + public static string FilterFriendlyName(string src) + { + if (src == null) + return null; + return Regex.Replace(src, @"[^a-zA-Z0-9\-_]", "_"); + } + + /// + /// Assert.IsFalse(AdminShellUtil.HasWhitespace("")); + /// Assert.IsTrue(AdminShellUtil.HasWhitespace(" ")); + /// Assert.IsTrue(AdminShellUtil.HasWhitespace("aa bb")); + /// Assert.IsTrue(AdminShellUtil.HasWhitespace(" aabb")); + /// Assert.IsTrue(AdminShellUtil.HasWhitespace("aabb ")); + /// Assert.IsFalse(AdminShellUtil.HasWhitespace("aabb")); + /// + public static bool HasWhitespace(string src) + { + if (src == null) + throw new ArgumentNullException(nameof(src)); + foreach (var s in src) + if (char.IsWhiteSpace(s)) + return true; + return false; + } + + /// Assert.IsTrue(AdminShellUtil.ComplyIdShort("")); + public static bool ComplyIdShort(string src) + { + if (src == null) + throw new ArgumentNullException(nameof(src)); + var res = true; + foreach (var s in src) + if (!Char.IsLetterOrDigit(s) && s != '_') + res = false; + if (src.Length > 0 && !Char.IsLetter(src[0])) + res = false; + return res; + } + + public static string ByteSizeHumanReadable(long len) + { + // see: https://stackoverflow.com/questions/281640/ + // how-do-i-get-a-human-readable-file-size-in-bytes-abbreviation-using-net + string[] sizes = { "B", "KB", "MB", "GB", "TB" }; + int order = 0; + while (len >= 1024 && order < sizes.Length - 1) + { + order++; + len = len / 1024; + } + // Adjust the format string to your preferences. For example "{0:0.#}{1}" would + // show a single decimal place, and no space. + string res = String.Format("{0:0.##} {1}", len, sizes[order]); + return res; + } + + public static string ExtractPascalCasingLetters(string src) + { + // access + src = src?.Trim(); + if (src == null || src.Length < 1) + return null; + + // walk through + var res = ""; + var arm = true; + foreach (var c in src) + { + // take? + if (arm && Char.IsUpper(c)) + res += c; + // state for next iteration + arm = !Char.IsUpper(c); + } + + // result + return res; + } + + public static int CountHeadingSpaces(string line) + { + if (line == null) + return 0; + int j; + for (j = 0; j < line.Length; j++) + if (!Char.IsWhiteSpace(line[j])) + break; + return j; + } + + /// + /// Used to re-reformat a C# here string, which is multiline string introduced by @" ... "; + /// + public static string[] CleanHereStringToArray(string here) + { + if (here == null) + return null; + + // convert all weird breaks to pure new lines + here = here.Replace("\r\n", "\n"); + here = here.Replace("\n\r", "\n"); + + // convert all tabs to spaces + here = here.Replace("\t", " "); + + // split these + var lines = new List(here.Split('\n')); + if (lines.Count < 1) + return lines.ToArray(); + + // the first line could be special + string firstLine = null; + if (lines[0].Trim() != "") + { + firstLine = lines[0].Trim(); + lines.RemoveAt(0); + } + + // detect an constant amount of heading spaces + var headSpaces = int.MaxValue; + foreach (var line in lines) + if (line.Trim() != "") + headSpaces = Math.Min(headSpaces, CountHeadingSpaces(line)); + + // multi line trim possible? + if (headSpaces != int.MaxValue && headSpaces > 0) + for (int i = 0; i < lines.Count; i++) + if (lines[i].Length > headSpaces) + lines[i] = lines[i].Substring(headSpaces); + + // re-compose again + if (firstLine != null) + lines.Insert(0, firstLine); + + // return + return lines.ToArray(); + } + + /// + /// Used to re-reformat a C# here string, which is multiline string introduced by @" ... "; + /// + public static string CleanHereStringWithNewlines(string here, string nl = null) + { + if (nl == null) + nl = Environment.NewLine; + var lines = CleanHereStringToArray(here); + if (lines == null) + return null; + return String.Join(nl, lines); + } + + public static string ShortLocation(Exception ex) + { + if (ex == null || ex.StackTrace == null) + return ""; + string[] lines = ex.StackTrace.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None); + if (lines.Length < 1) + return ""; + // search for " in " + // as the most actual stacktrace might be a built-in function, this might not work and therefore + // go down in the stack + int currLine = 0; + while (true) + { + // nothing found at all + if (currLine >= lines.Length) + return ""; + // access current line + /* TODO (MIHO, 2020-11-12): replace with Regex for multi language. Ideally have Exception messages + always as English. */ + var p = lines[currLine].IndexOf(" in ", StringComparison.Ordinal); + if (p < 0) + p = lines[currLine].IndexOf(" bei ", StringComparison.Ordinal); + if (p < 0) + { + // advance to next oldest line + currLine++; + continue; + } + // search last "\" or "/", to get only filename portion and position + p = lines[currLine].LastIndexOfAny(new[] { '\\', '/' }); + if (p < 0) + { + // advance to next oldest line + currLine++; + continue; + } + // return this + return lines[currLine].Substring(p); + } + } + + public enum ConstantFoundEnum { No, AnyCase, ExactCase } + + public static ConstantFoundEnum CheckIfInConstantStringArray(string[] arr, string str) + { + if (arr == null || str == null) + return ConstantFoundEnum.No; + + bool anyCaseFound = false; + bool exactCaseFound = false; + foreach (var a in arr) + { + anyCaseFound = anyCaseFound || str.ToLower() == a.ToLower(); + exactCaseFound = exactCaseFound || str == a; + } + if (exactCaseFound) + return ConstantFoundEnum.ExactCase; + if (anyCaseFound) + return ConstantFoundEnum.AnyCase; + return ConstantFoundEnum.No; + } + + public static string CorrectCasingForConstantStringArray(string[] arr, string str) + { + if (arr == null || str == null) + return str; + + foreach (var a in arr) + if (str.ToLower() == a.ToLower()) + return a; + + return str; + } + + // + // + // + // + // + + public static void PrintSearchableProperties(object obj, int indent) + { + if (obj == null) return; + string indentString = new string(' ', indent); + Type objType = obj.GetType(); + PropertyInfo[] properties = objType.GetProperties(); + foreach (PropertyInfo property in properties) + { + object propValue = property.GetValue(obj, null); + var elems = propValue as IList; + if (elems != null) + { + foreach (var item in elems) + { + PrintSearchableProperties(item, indent + 3); + } + } + else + { + // This will not cut-off System.Collections because of the first check + if (property.PropertyType.Assembly == objType.Assembly) + { + Console.WriteLine("{0}{1}:", indentString, property.Name); + + PrintSearchableProperties(propValue, indent + 2); + } + else + { + Console.WriteLine("{0}{1}: {2}", indentString, property.Name, propValue); + } + } + } + } + + public class SearchOptions + { + public Assembly[] allowedAssemblies = null; + public int maxDepth = int.MaxValue; + public bool findFirst = false; + public int skipFirstResults = 0; + public string findText = null; + public bool isIgnoreCase = false; + public bool isRegex = false; + } + + public class SearchResultItem : IEquatable + { + public SearchOptions searchOptions; + public string qualifiedNameHead; + public string metaModelName; + public object businessObject; + public string foundText; + public object foundObject; + public object containingObject; + public int foundHash; + + public bool Equals(SearchResultItem other) + { + if (other == null) + return false; + + return this.qualifiedNameHead == other.qualifiedNameHead && + this.metaModelName == other.metaModelName && + this.businessObject == other.businessObject && + this.containingObject == other.containingObject && + this.foundText == other.foundText && + this.foundHash == other.foundHash; + } + } + + public class SearchResults + { + public int foundIndex = 0; + public List foundResults = new List(); + + public void Clear() + { + foundIndex = -1; + foundResults.Clear(); + } + } + + public static void CheckSearchable( + SearchResults results, SearchOptions options, string qualifiedNameHead, object businessObject, + MemberInfo mi, object memberValue, object containingObject, Func getMemberHash) + { + // try get a speaking name + var metaModelName = ""; + var x1 = mi.GetCustomAttribute(); + if (x1 != null && x1.name != null) + metaModelName = x1.name; + + // check if this object is searchable + var x2 = mi.GetCustomAttribute(); + if (x2 != null) + { + // what to check? + string foundText = "" + memberValue?.ToString(); + + // find options + var found = true; + if (options.findText != null) + found = foundText.IndexOf( + options.findText, options.isIgnoreCase ? StringComparison.CurrentCultureIgnoreCase : 0) >= 0; + + // add? + if (found) + { + var sri = new SearchResultItem(); + sri.searchOptions = options; + sri.qualifiedNameHead = qualifiedNameHead; + sri.metaModelName = metaModelName; + sri.businessObject = businessObject; + sri.foundText = foundText; + sri.foundObject = memberValue; + sri.containingObject = containingObject; + if (getMemberHash != null) + sri.foundHash = getMemberHash(); + + // avoid duplicates + if (!results.foundResults.Contains(sri)) + results.foundResults.Add(sri); + } + } + } + + public static void EnumerateSearchable( + SearchResults results, object obj, string qualifiedNameHead, int depth, SearchOptions options, + object businessObject = null) + { + // access + if (results == null || obj == null || options == null) + return; + Type objType = obj.GetType(); + + // depth + if (depth > options.maxDepth) + return; + + // try to get element name of an AAS entity + string elName = null; + if (obj is AdminShell.Referable) + { + elName = (obj as AdminShell.Referable).GetElementName(); + businessObject = obj; + } + + // enrich qualified name, accordingly + var qualifiedName = qualifiedNameHead; + if (elName != null) + qualifiedName = qualifiedName + (qualifiedName.Length > 0 ? "." : "") + elName; + + // do NOT dive into objects, which are not in the reight assembly + if (options.allowedAssemblies == null || !options.allowedAssemblies.Contains(objType.Assembly)) + return; + + // do not dive into enums + if (objType.IsEnum) + return; + + // look at fields, first + var fields = objType.GetFields(); + foreach (var fi in fields) + { + // is the object marked to be skipped? + var x3 = fi.GetCustomAttribute(); + if (x3 != null) + continue; + + var x4 = fi.GetCustomAttribute(); + if (x4 != null) + continue; + + // get value(s) + var fieldValue = fi.GetValue(obj); + if (fieldValue == null) + continue; + var valueElems = fieldValue as IList; + if (valueElems != null) + { + // field is a collection .. dive deeper, if allowed + foreach (var el in valueElems) + EnumerateSearchable(results, el, qualifiedName, depth + 1, options, businessObject); + } + else + { + // field is a single entity .. check it + CheckSearchable( + results, options, qualifiedName, businessObject, fi, fieldValue, obj, + () => { return fieldValue.GetHashCode(); }); + + // dive deeper .. + EnumerateSearchable(results, fieldValue, qualifiedName, depth + 1, options, businessObject); + } + } + + // properties & objects behind + var properties = objType.GetProperties(); + foreach (var pi in properties) + { + var gip = pi.GetIndexParameters(); + if (gip.Length > 0) + // no indexed properties, yet + continue; + + // is the object marked to be skipped? + var x3 = pi.GetCustomAttribute(); + if (x3 != null) + continue; + + var x4 = pi.GetCustomAttribute(); + if (x4 != null) + continue; + + // get value(s) + var propValue = pi.GetValue(obj, null); + if (propValue == null) + continue; + var valueElems = propValue as IList; + if (valueElems != null) + { + // property is a collection .. dive deeper, if allowed + foreach (var el in valueElems) + EnumerateSearchable(results, el, qualifiedName, depth + 1, options, businessObject); + } + else + { + // field is a single entity .. check it + CheckSearchable( + results, options, qualifiedName, businessObject, pi, propValue, obj, + () => { return propValue.GetHashCode(); }); + + // dive deeper .. + EnumerateSearchable(results, propValue, qualifiedName, depth + 1, options, businessObject); + } + } + } + + // + // String manipulations + // + + public static string ReplacePercentPlaceholder( + string input, + string searchFor, + Func substLamda, + StringComparison comparisonType = StringComparison.InvariantCulture) + { + // access + if (input == null || searchFor == null || searchFor == "") + return input; + + // find + while (true) + { + // any occurence + var p = input.IndexOf(searchFor, comparisonType); + if (p < 0) + break; + + // split + var left = input.Substring(0, p); + var right = ""; + var rp = p + searchFor.Length; + if (rp < input.Length) + right = input.Substring(rp); + + // lambda + var repl = "" + substLamda?.Invoke(); + + // build new + input = left + repl + right; + } + + // ok + return input; + } + + // + // Base 64 + // + + public static string Base64Encode(string plainText) + { + var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText); + return System.Convert.ToBase64String(plainTextBytes); + } + + public static string Base64Decode(string base64EncodedData) + { + var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData); + return System.Text.Encoding.UTF8.GetString(base64EncodedBytes); + } + + // + // Generation of Ids + // + + private static Random MyRnd = new Random(); + + public static string GenerateIdAccordingTemplate(string tpl) + { + // generate a deterministic decimal digit string + var decimals = String.Format("{0:ffffyyMMddHHmmss}", DateTime.UtcNow); + decimals = new string(decimals.Reverse().ToArray()); + // convert this to an int + if (!Int64.TryParse(decimals, out Int64 decii)) + decii = MyRnd.Next(Int32.MaxValue); + // make an hex out of this + string hexamals = decii.ToString("X"); + // make an alphanumeric string out of this + string alphamals = ""; + var dii = decii; + while (dii >= 1) + { + var m = dii % 26; + alphamals += Convert.ToChar(65 + m); + dii = dii / 26; + } + + // now, "salt" the strings + for (int i = 0; i < 32; i++) + { + var c = Convert.ToChar(48 + MyRnd.Next(10)); + decimals += c; + hexamals += c; + alphamals += c; + } + + // now, can just use the template + var id = ""; + foreach (var tpli in tpl) + { + if (tpli == 'D' && decimals.Length > 0) + { + id += decimals[0]; + decimals = decimals.Remove(0, 1); + } + else + if (tpli == 'X' && hexamals.Length > 0) + { + id += hexamals[0]; + hexamals = hexamals.Remove(0, 1); + } + else + if (tpli == 'A' && alphamals.Length > 0) + { + id += alphamals[0]; + alphamals = alphamals.Remove(0, 1); + } + else + id += tpli; + } + + // ok + return id; + } + + } +} diff --git a/src/AasxCsharpLib_bkp/AasxCompatibilityModels/V20/AdminShellValidate.cs b/src/AasxCsharpLib_bkp/AasxCompatibilityModels/V20/AdminShellValidate.cs new file mode 100644 index 000000000..524683e57 --- /dev/null +++ b/src/AasxCsharpLib_bkp/AasxCompatibilityModels/V20/AdminShellValidate.cs @@ -0,0 +1,326 @@ +/* +Copyright (c) 2018-2021 Festo AG & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ + +using System; +using System.Collections.Generic; +using System.ComponentModel.Design; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using System.Xml; +using System.Xml.Schema; +using JetBrains.Annotations; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Newtonsoft.Json.Schema; + +//namespace AdminShellNS +namespace AdminShell_V20 +{ + /// + /// validates the XML content against the AASX XML schema. + /// + /// Please produce instances with . + /// + public class XmlValidator + { + private System.Xml.Schema.XmlSchemaSet xmlSchemaSet; + + internal XmlValidator(XmlSchemaSet xmlSchemaSet) + { + this.xmlSchemaSet = xmlSchemaSet; + } + + /// + /// validates the given XML content and stores the results in the . + /// + /// Validation records + /// Content to be validated + public void Validate(AasValidationRecordList recs, Stream xmlContent) + { + if (recs == null) + throw new ArgumentException($"Unexpected null {nameof(recs)}"); + + if (xmlContent == null) + throw new ArgumentException($"Unexpected null {nameof(xmlContent)}"); + + // load/ validate on same records + var settings = new System.Xml.XmlReaderSettings(); + settings.ValidationType = System.Xml.ValidationType.Schema; + settings.Schemas = xmlSchemaSet; + + settings.ValidationEventHandler += + (object sender, System.Xml.Schema.ValidationEventArgs e) => + { + recs.Add( + new AasValidationRecord( + AasValidationSeverity.Serialization, null, + $"XML: {e?.Exception?.LineNumber}, {e?.Exception?.LinePosition}: {e?.Message}")); + }; + + // use the xml stream + using (var reader = System.Xml.XmlReader.Create(xmlContent, settings)) + { + while (reader.Read()) + { + // Invoke callbacks + }; + } + } + } + + public enum AasValidationSeverity + { + Hint, Warning, SpecViolation, SchemaViolation, Serialization + } + + [UsedImplicitlyAttribute] // for eventual use + public enum AasValidationAction + { + No, ToBeDeleted + } + + public class AasValidationRecord + { + public AasValidationSeverity Severity = AasValidationSeverity.Hint; + public AasxCompatibilityModels.AdminShellV20.Referable Source = null; + public string Message = ""; + + public Action Fix = null; + + public AasValidationRecord(AasValidationSeverity Severity, AasxCompatibilityModels.AdminShellV20.Referable Source, + string Message, Action Fix = null) + { + this.Severity = Severity; + this.Source = Source; + this.Message = Message; + this.Fix = Fix; + } + + public override string ToString() + { + return $"[{Severity.ToString()}] in {"" + Source?.ToString()}: {"" + Message}"; + } + + public string DisplaySeverity { get { return "" + Severity.ToString(); } } + public string DisplaySource + { + get + { + return "" + ((Source != null) ? Source.ToString() : "(whole content)"); + } + } + public string DisplayMessage { get { return "" + Message?.ToString(); } } + } + + public class AasValidationRecordList : List + { + } + + public static class AasSchemaValidation + { + public enum SerializationFormat { XML, JSON } + + public static string[] GetSchemaResources(SerializationFormat fmt) + { + if (fmt == SerializationFormat.XML) + { + return new[] + { + "AdminShellNS.Resources.schemaV201.AAS.xsd", + "AdminShellNS.Resources.schemaV201.AAS_ABAC.xsd", + "AdminShellNS.Resources.schemaV201.IEC61360.xsd" + }; + } + if (fmt == SerializationFormat.JSON) + { + return new[] + { + "AdminShellNS.Resources.schemaV201.aas.json" + }; + } + return null; + } + + /// + /// produces a validator which validates XML AASX files. + /// + /// initialized validator + public static XmlValidator NewXmlValidator() + { + // Load the schema files + var files = GetSchemaResources(SerializationFormat.XML); + if (files == null) + throw new InvalidOperationException("No XML schema files could be found in the resources."); + + var xmlSchemaSet = new System.Xml.Schema.XmlSchemaSet(); + xmlSchemaSet.XmlResolver = new System.Xml.XmlUrlResolver(); + + try + { + Assembly myAssembly = Assembly.GetExecutingAssembly(); + foreach (var schemaFn in files) + { + using (Stream schemaStream = myAssembly.GetManifestResourceStream(schemaFn)) + { + using (XmlReader schemaReader = XmlReader.Create(schemaStream)) + { + xmlSchemaSet.Add(null, schemaReader); + } + } + } + } + catch (Exception ex) + { + throw new FileNotFoundException( + $"Error accessing embedded resource schema files: {ex.Message}"); + } + + var newRecs = new AasValidationRecordList(); + + // set up messages + xmlSchemaSet.ValidationEventHandler += (object sender, System.Xml.Schema.ValidationEventArgs e) => + { + newRecs.Add( + new AasValidationRecord( + AasValidationSeverity.Serialization, null, + $"{e?.Exception?.LineNumber}, {e?.Exception?.LinePosition}: {e?.Message}")); + }; + + // compile + try + { + xmlSchemaSet.Compile(); + } + catch (Exception ex) + { + throw new InvalidOperationException( + $"Error compiling schema files: {ex.Message}"); + } + + if (newRecs.Count > 0) + { + var parts = new List { $"Failed to compile the schema files:" }; + parts.AddRange(newRecs.Select((r) => r.Message)); + throw new InvalidOperationException(string.Join(Environment.NewLine, parts)); + } + + return new XmlValidator(xmlSchemaSet); + } + + /// + /// creates an XML validator and applies it on the given content. + /// + /// If you repeatedly need to validate XML against a schema, re-use an instance of + /// produced with . + /// + /// Validation records + /// Content to be validated + public static void ValidateXML(AasValidationRecordList recs, Stream xmlContent) + { + var validator = NewXmlValidator(); + validator.Validate(recs, xmlContent); + } + + public static int ValidateJSONAlternative(AasValidationRecordList recs, Stream jsonContent) + { + // see: https://github.com/RicoSuter/NJsonSchema/wiki/JsonSchemaValidator + var newRecs = new AasValidationRecordList(); + + // access + if (recs == null || jsonContent == null) + return -1; + + // Load the schema files + // right now: exactly ONE schema file + var files = GetSchemaResources(SerializationFormat.JSON); + if (files == null || files.Length != 1) + return -1; + + NJsonSchema.JsonSchema schema = null; + + try + { + Assembly myAssembly = Assembly.GetExecutingAssembly(); + foreach (var schemaFn in files) + { + using (Stream schemaStream = myAssembly.GetManifestResourceStream(schemaFn)) + { + using (var streamReader = new StreamReader(schemaStream)) + { + var allTxt = streamReader.ReadToEnd(); + schema = NJsonSchema.JsonSchema.FromJsonAsync(allTxt).GetAwaiter().GetResult(); + break; + } + } + } + } + catch (Exception ex) + { + throw new FileNotFoundException("ValidateJSON: Error loading schema: " + + ex.Message); + } + + if (schema == null) + { + throw new FileNotFoundException("ValidateJSON: Schema not found properly."); + } + + // create validator + var validator = new NJsonSchema.Validation.JsonSchemaValidator(); + + // load the JSON content + string jsonTxt = null; + try + { + using (var streamReader = new StreamReader(jsonContent)) + { + jsonTxt = streamReader.ReadToEnd(); + } + } + catch (Exception ex) + { + throw new InvalidOperationException("ValidateJSON: Error loading JSON content: " + + ex.Message); + } + + if (jsonTxt == null || jsonTxt == "") + throw new InvalidOperationException("ValidateJSON: Error loading JSON content gave null."); + + // validate + ICollection errors; + try + { + errors = validator.Validate(jsonTxt, schema); + } + catch (Exception ex) + { + throw new InvalidOperationException("ValidateJSON: Error when validating: " + + ex.Message); + } + + // re-format messages + if (errors != null) + foreach (var ve in errors) + { + var msg = ("" + ve.ToString()); + msg = Regex.Replace(msg, @"\s+", " "); + newRecs.Add(new AasValidationRecord(AasValidationSeverity.Serialization, null, + $"JSON: {ve.LineNumber,5},{ve.LinePosition:3}: {msg}")); + } + + // result + recs.AddRange(newRecs); + return newRecs.Count; + } + } +} diff --git a/src/AasxCsharpLib_bkp/AasxCsharpLibrary.csproj b/src/AasxCsharpLib_bkp/AasxCsharpLibrary.csproj new file mode 100644 index 000000000..2c3c19237 --- /dev/null +++ b/src/AasxCsharpLib_bkp/AasxCsharpLibrary.csproj @@ -0,0 +1,42 @@ + + + net6.0 + Library + AdminShellNS + false + + + TRACE;UseAasxCompatibilityModels + + + false + + + + PreserveNewest + + + + + Designer + PreserveNewest + + + Designer + PreserveNewest + + + Designer + PreserveNewest + + + + + + + + + + + + diff --git a/src/AasxCsharpLib_bkp/AdminShellCollections.cs b/src/AasxCsharpLib_bkp/AdminShellCollections.cs new file mode 100644 index 000000000..26fc3f837 --- /dev/null +++ b/src/AasxCsharpLib_bkp/AdminShellCollections.cs @@ -0,0 +1,66 @@ +/* +Copyright (c) 2018-2021 Festo AG & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AdminShellNS +{ + public class MultiValueDictionary + { + private Dictionary> dict = new Dictionary>(); + public void Add(K key, V value) + { + if (dict.TryGetValue(key, out var list)) + list.Add(value); + else + dict.Add(key, new List { value }); + } + + public bool ContainsKey(K key) => dict.ContainsKey(key); + + public List this[K key] => dict[key]; + + public IEnumerable> Keys + { + get + { + return dict.Values; + } + } + } + + public class DoubleSidedDict + { + private Dictionary _forward = new Dictionary(); + private Dictionary _backward = new Dictionary(); + + public void AddPair(T1 item1, T2 item2) + { + _forward.Add(item1, item2); + _backward.Add(item2, item1); + } + + public bool Contains1(T1 key1) => _forward.ContainsKey(key1); + public bool Contains2(T2 key2) => _backward.ContainsKey(key2); + + public T2 Get2(T1 key1) => _forward[key1]; + public T1 Get1(T2 key2) => _backward[key2]; + + public T2 Get2OrDefault(T1 key1) + => (key1 != null && _forward.ContainsKey(key1)) ? _forward[key1] : default(T2); + public T1 Get1OrDefault(T2 key2) + => (key2 != null && _backward.ContainsKey(key2)) ? _backward[key2] : default(T1); + + public void Clear() { _forward.Clear(); _backward.Clear(); } + } +} diff --git a/src/AasxCsharpLib_bkp/AdminShellConverters.cs b/src/AasxCsharpLib_bkp/AdminShellConverters.cs new file mode 100644 index 000000000..fd30b6ec7 --- /dev/null +++ b/src/AasxCsharpLib_bkp/AdminShellConverters.cs @@ -0,0 +1,192 @@ +/* +Copyright (c) 2018-2021 Festo AG & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using AasCore.Aas3_0_RC02; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Newtonsoft.Json.Serialization; + +namespace AdminShellNS +{ + public static class AdminShellConverters + { + /// + /// This converter is used for reading JSON files; it claims to be responsible for + /// "Referable" (the base class) + /// and decides, which sub-class of the base class shall be populated. + /// If the object is SubmodelElement, the decision, shich special sub-class to create is done in a factory + /// SubmodelElementWrapper.CreateAdequateType(), + /// in order to have all sub-class specific decisions in one place (SubmodelElementWrapper) + /// Remark: There is a NuGet package JsonSubTypes, which could have done the job, except the fact of having + /// "modelType" being a class property with a contained property "name". + /// + public class JsonAasxConverter : JsonConverter + { + private string UpperClassProperty = "modelType"; + private string LowerClassProperty = "name"; + + public JsonAasxConverter() : base() + { + } + + public JsonAasxConverter(string UpperClassProperty, string LowerClassProperty) : base() + { + this.UpperClassProperty = UpperClassProperty; + this.LowerClassProperty = LowerClassProperty; + } + + public override bool CanConvert(Type objectType) + { + // Info MIHO 21 APR 2020: changed this from SubmodelElement to Referable + if (typeof(IReferable).IsAssignableFrom(objectType)) + return true; + return false; + } + + public override bool CanWrite + { + get { return false; } + } + + public override object ReadJson(JsonReader reader, + Type objectType, + object existingValue, + JsonSerializer serializer) + { + // Load JObject from stream + JObject jObject = JObject.Load(reader); + + // Create target object based on JObject + IReferable target = null; + + if (jObject.ContainsKey(UpperClassProperty)) + { + var j2 = jObject[UpperClassProperty]; + if (j2 != null) + foreach (var c in j2.Children()) + { + var cprop = c as Newtonsoft.Json.Linq.JProperty; + if (cprop == null) + continue; + if (cprop.Name == LowerClassProperty && cprop.Value.Type.ToString() == "String") + { + var cpval = cprop.Value.ToObject(); + if (cpval == null) + continue; + // Info MIHO 21 APR 2020: use Referable.CreateAdequateType instead of SMW... + var o = CreateAdequateType(cpval); + if (o != null) + target = o; + } + } + } + + // Populate the object properties + serializer.Populate(jObject.CreateReader(), target); + + return target; + } + + public static IReferable CreateAdequateType(string elementName) + { + if (elementName == KeyTypes.AssetAdministrationShell.ToString()) + return new AssetAdministrationShell("", null); //TODO: jtikekar: refactor default + //if (elementName == "Asset") //TODO: jtikekar Change + // return new AssetInformation(AssetKind.Instance); + if (elementName == KeyTypes.ConceptDescription.ToString()) + return new ConceptDescription(""); + if (elementName == KeyTypes.Submodel.ToString()) + return new Submodel(""); + //if (elementName == KeyTypes.View) + // return new View(); + return CreateSubmodelElementIstance(elementName); + } + + private static ISubmodelElement CreateSubmodelElementIstance(string typeName) + { + //TODO: jtikekar Need to test + Type type = Type.GetType(typeName); + if (type == null || !type.IsSubclassOf(typeof(ISubmodelElement))) + return null; + var sme = Activator.CreateInstance(type) as ISubmodelElement; + return sme; + } + + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + throw new NotImplementedException(); + } + } + + /// + /// This converter / contract resolver for Json.NET adaptively filters different levels of depth + /// of nested AASX structures. + /// + public class AdaptiveFilterContractResolver : DefaultContractResolver + { + public bool AasHasViews = true; + public bool BlobHasValue = true; + public bool SubmodelHasElements = true; + public bool SmcHasValue = true; + public bool OpHasVariables = true; + + public AdaptiveFilterContractResolver() { } + + public AdaptiveFilterContractResolver(bool deep = true, bool complete = true) + { + if (!deep) + { + this.SubmodelHasElements = false; + this.SmcHasValue = false; + this.OpHasVariables = false; + } + if (!complete) + { + this.AasHasViews = false; + this.BlobHasValue = false; + } + + } + + protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) + { + JsonProperty property = base.CreateProperty(member, memberSerialization); + + if (!BlobHasValue && property.DeclaringType == typeof(Blob) && + property.PropertyName == "value") + property.ShouldSerialize = instance => { return false; }; + + if (!SubmodelHasElements && property.DeclaringType == typeof(Submodel) && + property.PropertyName == "submodelElements") + property.ShouldSerialize = instance => { return false; }; + + if (!SmcHasValue && property.DeclaringType == typeof(SubmodelElementCollection) && + property.PropertyName == "value") + property.ShouldSerialize = instance => { return false; }; + + if (!OpHasVariables && property.DeclaringType == typeof(Operation) && + (property.PropertyName == "in" || property.PropertyName == "out")) + property.ShouldSerialize = instance => { return false; }; + + if (!AasHasViews && property.DeclaringType == typeof(AssetAdministrationShell) && + property.PropertyName == "views") + property.ShouldSerialize = instance => { return false; }; + + return property; + } + } + + } +} diff --git a/src/AasxCsharpLib_bkp/AdminShellPackageEnv.cs b/src/AasxCsharpLib_bkp/AdminShellPackageEnv.cs new file mode 100644 index 000000000..d0953358f --- /dev/null +++ b/src/AasxCsharpLib_bkp/AdminShellPackageEnv.cs @@ -0,0 +1,1454 @@ +/* +Copyright (c) 2018-2021 Festo AG & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ + +using System; +using System.Collections.Generic; +using System.IO; +using System.IO.Packaging; +using System.Linq; +using System.Text.RegularExpressions; +using System.Xml; +using System.Xml.Serialization; +using AasCore.Aas3_0_RC02; +using AdminShellNS; +using Extensions; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +namespace AdminShellNS +{ + /// + /// This class lets an outer functionality keep track on the supplementary files, which are in or + /// are pending to be added or deleted to an Package. + /// + public class AdminShellPackageSupplementaryFile /*: IReferable*/ + { + public delegate byte[] SourceGetByteChunk(); + + public enum LocationType { InPackage, AddPending, DeletePending } + + public enum SpecialHandlingType { None, EmbedAsThumbnail } + + public readonly Uri Uri = null; + + public readonly string UseMimeType = null; + + public readonly string SourceLocalPath = null; + public readonly SourceGetByteChunk SourceGetBytesDel = null; + + public LocationType Location; + public readonly SpecialHandlingType SpecialHandling; + + public AdminShellPackageSupplementaryFile( + Uri uri, string sourceLocalPath = null, LocationType location = LocationType.InPackage, + SpecialHandlingType specialHandling = SpecialHandlingType.None, + SourceGetByteChunk sourceGetBytesDel = null, string useMimeType = null) + { + Uri = uri; + UseMimeType = useMimeType; + SourceLocalPath = sourceLocalPath; + SourceGetBytesDel = sourceGetBytesDel; + Location = location; + SpecialHandling = specialHandling; + } + + // class derives from Referable in order to provide GetElementName + public string GetElementName() + { + return "File"; + } + + } + + public class ListOfAasSupplementaryFile : List + { + public AdminShellPackageSupplementaryFile FindByUri(string path) + { + if (path == null) + return null; + + return this.FirstOrDefault( + x => x?.Uri?.ToString().Trim() == path.Trim()); + } + } + + /// + /// Provides (static?) helpers for serializing AAS.. + /// + public static class AdminShellSerializationHelper + { + + public static string TryReadXmlFirstElementNamespaceURI(Stream s) + { + string res = null; + try + { + var xr = System.Xml.XmlReader.Create(s); + int i = 0; + while (xr.Read()) + { + // limit amount of read + i++; + if (i > 99) + // obviously not found + break; + + // find element + if (xr.NodeType == System.Xml.XmlNodeType.Element) + { + res = xr.NamespaceURI; + break; + } + } + xr.Close(); + } + catch (Exception ex) + { + LogInternally.That.SilentlyIgnoredError(ex); + } + + // return to zero pos + s.Seek(0, SeekOrigin.Begin); + + // give back + return res; + } + + /// + /// Skips first few tokens of an XML content until first "real" element is encountered + /// + /// + public static void XmlSkipHeader(XmlReader xmlReader) + { + while (xmlReader.NodeType == XmlNodeType.XmlDeclaration || + xmlReader.NodeType == XmlNodeType.Whitespace || + xmlReader.NodeType == XmlNodeType.Comment || + xmlReader.NodeType == XmlNodeType.None) + xmlReader.Read(); + } + + /// + /// De-serialize an open stream into Environment. Does version/ compatibility management. + /// + /// Open for read stream + /// + public static AasCore.Aas3_0_RC02.Environment DeserializeXmlFromStreamWithCompat(Stream s) + { + // not sure + AasCore.Aas3_0_RC02.Environment res = null; + + // try get first element + var nsuri = TryReadXmlFirstElementNamespaceURI(s); + + // read V1.0? + if (nsuri != null && nsuri.Trim() == "http://www.admin-shell.io/aas/1/0") + { +#if !DoNotUseAasxCompatibilityModels + XmlSerializer serializer = new XmlSerializer( + typeof(AasxCompatibilityModels.AdminShellV10.AdministrationShellEnv), + "http://www.admin-shell.io/aas/1/0"); + var v10 = serializer.Deserialize(s) as AasxCompatibilityModels.AdminShellV10.AdministrationShellEnv; + //res = new AdministrationShellEnv(v10); + res = new AasCore.Aas3_0_RC02.Environment(new List(), new List(), new List()); + res.ConvertFromV10(v10); + return res; +#else + throw (new Exception("Cannot handle AAS file format http://www.admin-shell.io/aas/1/0 !")); +#endif + } + + // read V2.0? + if (nsuri != null && nsuri.Trim() == "http://www.admin-shell.io/aas/2/0") + { +#if !DoNotUseAasxCompatibilityModels + XmlSerializer serializer = new XmlSerializer( + typeof(AasxCompatibilityModels.AdminShellV20.AdministrationShellEnv), + "http://www.admin-shell.io/aas/2/0"); + var v20 = serializer.Deserialize(s) as AasxCompatibilityModels.AdminShellV20.AdministrationShellEnv; + //res = new AdministrationShellEnv(v20); + res = new AasCore.Aas3_0_RC02.Environment(new List(), new List(), new List()); + res.ConvertFromV20(v20); + return res; +#else + throw (new Exception("Cannot handle AAS file format http://www.admin-shell.io/aas/1/0 !")); +#endif + } + + // read V3.0? + if (nsuri != null && nsuri.Trim() == Xmlization.NS) + { + //XmlSerializer serializer = new XmlSerializer( + // typeof(AasCore.Aas3_0_RC02.Environment), "http://www.admin-shell.io/aas/3/0"); + //res = serializer.Deserialize(s) as AasCore.Aas3_0_RC02.Environment; + + using (var xmlReader = XmlReader.Create(s)) + { + // TODO (MIHO, 2022-12-26): check if could be feature of AAS core + XmlSkipHeader(xmlReader); + res = Xmlization.Deserialize.EnvironmentFrom(xmlReader); + return res; + } + } + + // nope! + return null; + } + + //public static JsonSerializer BuildDefaultAasxJsonSerializer() + //{ + // var serializer = new JsonSerializer(); + // serializer.Converters.Add( + // new AdminShellConverters.JsonAasxConverter( + // "modelType", "name")); + // return serializer; + //} + + public static T DeserializeFromJSON(string data) where T : IReferable + { + //using (var tr = new StringReader(data)) + //{ + //var serializer = BuildDefaultAasxJsonSerializer(); + //var rf = (T)serializer.Deserialize(tr, typeof(T)); + + var node = System.Text.Json.Nodes.JsonNode.Parse(data); + var rf = Jsonization.Deserialize.IReferableFrom(node); + + return (T)rf; + //} + } + + //public static T DeserializeFromJSON(JToken obj) where T : IReferable + //{ + // if (obj == null) + // return default(T); + // var serializer = BuildDefaultAasxJsonSerializer(); + // var rf = obj.ToObject(serializer); + // return rf; + //} + + ///// + ///// Use this, if DeserializeFromJSON is too tight. + ///// + //public static T DeserializePureObjectFromJSON(string data) + //{ + // using (var tr = new StringReader(data)) + // { + // //var serializer = BuildDefaultAasxJsonSerializer(); + // //var rf = (T)serializer.Deserialize(tr, typeof(T)); + // return null; + // } + //} + } + + /// + /// This class encapsulates an AdminShellEnvironment and supplementary files into an AASX Package. + /// Specifically has the capability to load, update and store .XML, .JSON and .AASX packages. + /// + public class AdminShellPackageEnv : IDisposable + { + private string _fn = "New Package"; + + private string _tempFn = null; + + private AasCore.Aas3_0_RC02.Environment _aasEnv = new AasCore.Aas3_0_RC02.Environment(new List(), new List(), new List()); + private Package _openPackage = null; + private readonly ListOfAasSupplementaryFile _pendingFilesToAdd = new ListOfAasSupplementaryFile(); + private readonly ListOfAasSupplementaryFile _pendingFilesToDelete = new ListOfAasSupplementaryFile(); + + public AdminShellPackageEnv() { } + + public AdminShellPackageEnv(AasCore.Aas3_0_RC02.Environment env) + { + if (env != null) + _aasEnv = env; + } + + public AdminShellPackageEnv(string fn, bool indirectLoadSave = false) + { + Load(fn, indirectLoadSave); + } + + public bool IsOpen + { + get + { + return _openPackage != null; + } + } + + public string Filename + { + get + { + return _fn; + } + } + + public AasCore.Aas3_0_RC02.Environment AasEnv + { + get + { + return _aasEnv; + } + } + + private static AasCore.Aas3_0_RC02.Environment LoadXml(string fn) + { + try + { + using (var reader = new StreamReader(fn)) + { + var aasEnv = AdminShellSerializationHelper.DeserializeXmlFromStreamWithCompat( + reader.BaseStream); + + if (aasEnv == null) + throw new Exception("Type error for XML file"); + + return aasEnv; + } + } + catch (Exception ex) + { + throw new Exception( + $"While reading AAS {fn} at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); + } + } + + private static AasCore.Aas3_0_RC02.Environment LoadJson(string fn) + { + try + { + using (var file = System.IO.File.OpenRead(fn)) + { + //// TODO (Michael Hoffmeister, 2020-08-01): use a unified function to create a serializer + //var serializer = new JsonSerializer(); + //serializer.Converters.Add( + // new AdminShellConverters.JsonAasxConverter( + // "modelType", "name")); + + //var aasEnv = (AasCore.Aas3_0_RC02.Environment)serializer.Deserialize( + // file, typeof(AasCore.Aas3_0_RC02.Environment)); + + var node = System.Text.Json.Nodes.JsonNode.Parse(file); + var aasEnv = Jsonization.Deserialize.EnvironmentFrom(node); + + return aasEnv; + } + } + catch (Exception ex) + { + throw new Exception( + $"While reading AAS {fn} at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); + } + } + + /// is unequal if indirectLoadSave is used. + private static (AasCore.Aas3_0_RC02.Environment, Package) LoadPackageAasx(string fn, string fnToLoad) + { + AasCore.Aas3_0_RC02.Environment aasEnv; + Package openPackage = null; + + Package package; + try + { + package = Package.Open(fnToLoad, FileMode.Open); + } + catch (Exception ex) + { + throw new Exception( + fn == fnToLoad + ? $"While opening the package to read AASX {fn} " + + $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}" + : $"While opening the package to read AASX {fn} indirectly from {fnToLoad} " + + $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); + } + + try + { + // get the origin from the package + PackagePart originPart = null; + var xs = package.GetRelationshipsByType( + "http://www.admin-shell.io/aasx/relationships/aasx-origin"); + foreach (var x in xs) + if (x.SourceUri.ToString() == "/") + { + originPart = package.GetPart(x.TargetUri); + break; + } + + if (originPart == null) + throw (new Exception("Unable to find AASX origin. Aborting!")); + + // get the specs from the package + PackagePart specPart = null; + xs = originPart.GetRelationshipsByType("http://www.admin-shell.io/aasx/relationships/aas-spec"); + foreach (var x in xs) + { + specPart = package.GetPart(x.TargetUri); + break; + } + + if (specPart == null) + throw (new Exception("Unable to find AASX spec(s). Aborting!")); + + // open spec part to read + try + { + if (specPart.Uri.ToString().ToLower().Trim().EndsWith("json")) + { + using (var s = specPart.GetStream(FileMode.Open)) + { + //using (var file = new StreamReader(s)) + //{ + //JsonSerializer serializer = new JsonSerializer(); + //serializer.Converters.Add( + // new AdminShellConverters.JsonAasxConverter( + // "modelType", "name")); + + //aasEnv = (AasCore.Aas3_0_RC02.Environment)serializer.Deserialize( + // file, typeof(AasCore.Aas3_0_RC02.Environment)); + + var node = System.Text.Json.Nodes.JsonNode.Parse(s); + aasEnv = Jsonization.Deserialize.EnvironmentFrom(node); + //} + } + } + else + { + using (var s = specPart.GetStream(FileMode.Open)) + { + // own catch loop to be more specific + aasEnv = AdminShellSerializationHelper.DeserializeXmlFromStreamWithCompat(s); + openPackage = package; + + if (aasEnv == null) + throw new Exception("Type error for XML file!"); + } + } + } + catch (Exception ex) + { + throw new Exception( + fn == fnToLoad + ? $"While reading spec from the AASX {fn} " + + $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}" + : $"While reading spec from the {fn} (and indirectly over {fnToLoad}) " + + $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); + } + } + catch (Exception ex) + { + throw new Exception( + fn == fnToLoad + ? $"While reading the AASX {fn} " + + $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}" + : $"While reading the {fn} (and indirectly over {fnToLoad}) " + + $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); + } + finally + { + if (openPackage == null) + { + package.Close(); + } + } + + return (aasEnv, openPackage); + } + + public void Load(string fn, bool indirectLoadSave = false) + { + _fn = fn; + _openPackage?.Close(); + _openPackage = null; + + string extension = Path.GetExtension(fn).ToLower(); + switch (extension) + { + case ".xml": + { + _aasEnv = LoadXml(fn); + break; + } + case ".json": + { + _aasEnv = LoadJson(fn); + break; + } + case ".aasx": + { + var fnToLoad = fn; + _tempFn = null; + if (indirectLoadSave) + { + try + { + _tempFn = System.IO.Path.GetTempFileName().Replace(".tmp", ".aasx"); + System.IO.File.Copy(fn, _tempFn); + fnToLoad = _tempFn; + + } + catch (Exception ex) + { + throw new Exception( + $"While copying AASX {fn} for indirect load to {fnToLoad} " + + $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); + } + } + + // load package AASX + (_aasEnv, _openPackage) = LoadPackageAasx(fn, fnToLoad); + break; + } + default: + throw new Exception( + $"Does not know how to handle the extension {extension} of the file: {fn}"); + } + } + + public void LoadFromAasEnvString(string content) + { + try + { + //using (var file = new StringReader(content)) + //{ + // TODO (Michael Hoffmeister, 2020-08-01): use a unified function to create a serializer + //JsonSerializer serializer = new JsonSerializer(); + //serializer.Converters.Add(new AdminShellConverters.JsonAasxConverter("modelType", "name")); + //_aasEnv = (AasCore.Aas3_0_RC02.Environment)serializer.Deserialize( + // file, typeof(AasCore.Aas3_0_RC02.Environment)); + + var node = System.Text.Json.Nodes.JsonNode.Parse(content); + _aasEnv = Jsonization.Deserialize.EnvironmentFrom(node); + //} + } + catch (Exception ex) + { + throw (new Exception( + string.Format("While reading AASENV string {0} gave: {1}", + AdminShellUtil.ShortLocation(ex), ex.Message))); + } + } + + public enum SerializationFormat { None, Xml, Json }; + + //public static XmlSerializerNamespaces GetXmlDefaultNamespaces() + //{ + // var nss = new XmlSerializerNamespaces(); + // nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace); + // nss.Add("aas", "http://www.admin-shell.io/aas/2/0"); + // nss.Add("IEC", "http://www.admin-shell.io/IEC61360/2/0"); + // nss.Add("abac", "http://www.admin-shell.io/aas/abac/2/0"); + // return nss; + //} + + public bool SaveAs(string fn, bool writeFreshly = false, SerializationFormat prefFmt = SerializationFormat.None, + MemoryStream useMemoryStream = null, bool saveOnlyCopy = false) + { + if (fn.ToLower().EndsWith(".xml")) + { + // save only XML + if (!saveOnlyCopy) + _fn = fn; + try + { + Stream s = (useMemoryStream != null) + ? (Stream)useMemoryStream + : System.IO.File.Open(fn, FileMode.Create, FileAccess.Write); + + try + { + // TODO (Michael Hoffmeister, 2020-08-01): use a unified function to create a serializer + //var serializer = new XmlSerializer(typeof(AasCore.Aas3_0_RC02.Environment)); + //var nss = GetXmlDefaultNamespaces(); + //serializer.Serialize(s, _aasEnv, nss); + + var writer = XmlWriter.Create(s, new XmlWriterSettings() { Indent = true }); + Xmlization.Serialize.To( + _aasEnv, writer); + writer.Flush(); + writer.Close(); + s.Flush(); + } + finally + { + // close? + if (useMemoryStream == null) + s.Close(); + } + } + catch (Exception ex) + { + throw (new Exception( + string.Format("While writing AAS {0} at {1} gave: {2}", + fn, AdminShellUtil.ShortLocation(ex), ex.Message))); + } + return true; + } + + if (fn.ToLower().EndsWith(".json")) + { + // save only JSON + // This functionality is an initial test. + if (!saveOnlyCopy) + _fn = fn; + try + { + Stream s = (useMemoryStream != null) ? (Stream)useMemoryStream + : System.IO.File.Open(fn, FileMode.Create, FileAccess.Write); + + try + { + //// TODO (Michael Hoffmeister, 2020-08-01): use a unified function to create a serializer + //JsonSerializer serializer = new JsonSerializer() + //{ + // NullValueHandling = NullValueHandling.Ignore, + // ReferenceLoopHandling = ReferenceLoopHandling.Serialize, + // Formatting = Newtonsoft.Json.Formatting.Indented + //}; + + //var sw = new StreamWriter(s); + //var writer = new JsonTextWriter(sw); + + //serializer.Serialize(writer, _aasEnv); + //writer.Flush(); + //sw.Flush(); + //s.Flush(); + + //if (useMemoryStream == null) + //{ + // writer.Close(); + // sw.Close(); + //} + + using (var wr = new System.Text.Json.Utf8JsonWriter(s)) + { + Jsonization.Serialize.ToJsonObject(_aasEnv).WriteTo(wr, + new System.Text.Json.JsonSerializerOptions() + { + WriteIndented = true + }); + wr.Flush(); + s.Flush(); + } + } + finally + { + // close? + if (useMemoryStream == null) + s.Close(); + } + } + catch (Exception ex) + { + throw (new Exception( + string.Format("While writing AAS {0} at {1} gave: {2}", + fn, AdminShellUtil.ShortLocation(ex), ex.Message))); + } + return true; + } + + if (fn.ToLower().EndsWith(".aasx")) + { + // save package AASX + try + { + // We want existing contents to be preserved, but do not want to allow the change of the file name. + // Therefore: copy the file to a new name, then re-open. + // fn could be changed, therefore close "old" package first + if (_openPackage != null) + { + try + { + _openPackage.Close(); + if (!writeFreshly) + { + if (_tempFn != null) + System.IO.File.Copy(_tempFn, fn); + else + { + /* TODO (MIHO, 2021-01-02): check again. + * Revisiting this code after a while, and after + * the code has undergo some changes by MR, the following copy command needed + * to be amended with a if to protect against self-copy. */ + if (_fn != fn) + System.IO.File.Copy(_fn, fn); + } + } + } + catch (Exception ex) + { + LogInternally.That.SilentlyIgnoredError(ex); + } + _openPackage = null; + } + + // approach is to utilize the existing package, if possible. If not, create from scratch + Package package = null; + if (useMemoryStream != null) + { + package = Package.Open( + useMemoryStream, (writeFreshly) ? FileMode.Create : FileMode.OpenOrCreate); + } + else + { + package = Package.Open( + (_tempFn != null) ? _tempFn : fn, + (writeFreshly) ? FileMode.Create : FileMode.OpenOrCreate); + } + _fn = fn; + + // get the origin from the package + PackagePart originPart = null; + var xs = package.GetRelationshipsByType( + "http://www.admin-shell.io/aasx/relationships/aasx-origin"); + foreach (var x in xs) + if (x.SourceUri.ToString() == "/") + { + originPart = package.GetPart(x.TargetUri); + break; + } + if (originPart == null) + { + // create, as not existing + originPart = package.CreatePart( + new Uri("/aasx/aasx-origin", UriKind.RelativeOrAbsolute), + System.Net.Mime.MediaTypeNames.Text.Plain, CompressionOption.Maximum); + using (var s = originPart.GetStream(FileMode.Create)) + { + var bytes = System.Text.Encoding.ASCII.GetBytes("Intentionally empty."); + s.Write(bytes, 0, bytes.Length); + } + package.CreateRelationship( + originPart.Uri, TargetMode.Internal, + "http://www.admin-shell.io/aasx/relationships/aasx-origin"); + } + + // get the specs from the package + PackagePart specPart = null; + PackageRelationship specRel = null; + xs = originPart.GetRelationshipsByType("http://www.admin-shell.io/aasx/relationships/aas-spec"); + foreach (var x in xs) + { + specRel = x; + specPart = package.GetPart(x.TargetUri); + break; + } + + // check, if we have to change the spec part + if (specPart != null && specRel != null) + { + var name = System.IO.Path.GetFileNameWithoutExtension( + specPart.Uri.ToString()).ToLower().Trim(); + var ext = System.IO.Path.GetExtension(specPart.Uri.ToString()).ToLower().Trim(); + if ((ext == ".json" && prefFmt == SerializationFormat.Xml) + || (ext == ".xml" && prefFmt == SerializationFormat.Json) + || (name.StartsWith("aasenv-with-no-id"))) + { + // try kill specpart + try + { + originPart.DeleteRelationship(specRel.Id); + package.DeletePart(specPart.Uri); + } + catch (Exception ex) + { + LogInternally.That.SilentlyIgnoredError(ex); + } + finally { specPart = null; specRel = null; } + } + } + + if (specPart == null) + { + // create, as not existing + var frn = "aasenv-with-no-id"; + if (_aasEnv.AssetAdministrationShells.Count > 0) + frn = _aasEnv.AssetAdministrationShells[0].GetFriendlyName() ?? frn; + var aas_spec_fn = "/aasx/#/#.aas"; + if (prefFmt == SerializationFormat.Json) + aas_spec_fn += ".json"; + else + aas_spec_fn += ".xml"; + aas_spec_fn = aas_spec_fn.Replace("#", "" + frn); + specPart = package.CreatePart( + new Uri(aas_spec_fn, UriKind.RelativeOrAbsolute), + System.Net.Mime.MediaTypeNames.Text.Xml, CompressionOption.Maximum); + originPart.CreateRelationship( + specPart.Uri, TargetMode.Internal, + "http://www.admin-shell.io/aasx/relationships/aas-spec"); + } + + // now, specPart shall be != null! + if (specPart.Uri.ToString().ToLower().Trim().EndsWith("json")) + { + using (var s = specPart.GetStream(FileMode.Create)) + { + JsonSerializer serializer = new JsonSerializer(); + serializer.NullValueHandling = NullValueHandling.Ignore; + serializer.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; + serializer.Formatting = Newtonsoft.Json.Formatting.Indented; + using (var sw = new StreamWriter(s)) + { + using (JsonWriter writer = new JsonTextWriter(sw)) + { + serializer.Serialize(writer, _aasEnv); + } + } + } + } + else + { + using (var s = specPart.GetStream(FileMode.Create)) + { + //var serializer = new XmlSerializer(typeof(AasCore.Aas3_0_RC02.Environment)); + //var nss = GetXmlDefaultNamespaces(); + //serializer.Serialize(s, _aasEnv, nss); + + var writer = XmlWriter.Create(s, new XmlWriterSettings() { Indent = true }); + Xmlization.Serialize.To( + _aasEnv, writer); + writer.Flush(); + writer.Close(); + s.Flush(); + } + } + + // there might be pending files to be deleted (first delete, then add, + // in case of identical files in both categories) + foreach (var psfDel in _pendingFilesToDelete) + { + // try find an existing part for that file .. + var found = false; + + // normal files + xs = specPart.GetRelationshipsByType("http://www.admin-shell.io/aasx/relationships/aas-suppl"); + foreach (var x in xs) + if (x.TargetUri == psfDel.Uri) + { + // try to delete + specPart.DeleteRelationship(x.Id); + package.DeletePart(psfDel.Uri); + found = true; + break; + } + + // thumbnails + xs = package.GetRelationshipsByType( + "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); + foreach (var x in xs) + if (x.TargetUri == psfDel.Uri) + { + // try to delete + package.DeleteRelationship(x.Id); + package.DeletePart(psfDel.Uri); + found = true; + break; + } + + if (!found) + throw (new Exception( + $"Not able to delete pending file {psfDel.Uri} in saving package {fn}")); + } + + // after this, there are no more pending for delete files + _pendingFilesToDelete.Clear(); + + // write pending supplementary files + foreach (var psfAdd in _pendingFilesToAdd) + { + // make sure .. + if ((psfAdd.SourceLocalPath == null && psfAdd.SourceGetBytesDel == null) || + psfAdd.Location != AdminShellPackageSupplementaryFile.LocationType.AddPending) + continue; + + // normal file? + if (psfAdd.SpecialHandling == AdminShellPackageSupplementaryFile.SpecialHandlingType.None || + psfAdd.SpecialHandling == + AdminShellPackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail) + { + + // try find an existing part for that file .. + PackagePart filePart = null; + if (psfAdd.SpecialHandling == AdminShellPackageSupplementaryFile.SpecialHandlingType.None) + { + xs = specPart.GetRelationshipsByType( + "http://www.admin-shell.io/aasx/relationships/aas-suppl"); + foreach (var x in xs) + if (x.TargetUri == psfAdd.Uri) + { + filePart = package.GetPart(x.TargetUri); + break; + } + } + if (psfAdd.SpecialHandling == + AdminShellPackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail) + { + xs = package.GetRelationshipsByType( + "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); + foreach (var x in xs) + if (x.SourceUri.ToString() == "/" && x.TargetUri == psfAdd.Uri) + { + filePart = package.GetPart(x.TargetUri); + break; + } + } + + if (filePart == null) + { + // determine mimeType + var mimeType = psfAdd.UseMimeType; + // reconcile mime + if (mimeType == null && psfAdd.SourceLocalPath != null) + mimeType = AdminShellPackageEnv.GuessMimeType(psfAdd.SourceLocalPath); + // still null? + if (mimeType == null) + // see: https://stackoverflow.com/questions/6783921/ + // which-mime-type-to-use-for-a-binary-file-thats-specific-to-my-program + mimeType = "application/octet-stream"; + + // create new part and link + filePart = package.CreatePart(psfAdd.Uri, mimeType, CompressionOption.Maximum); + if (psfAdd.SpecialHandling == + AdminShellPackageSupplementaryFile.SpecialHandlingType.None) + specPart.CreateRelationship( + filePart.Uri, TargetMode.Internal, + "http://www.admin-shell.io/aasx/relationships/aas-suppl"); + if (psfAdd.SpecialHandling == + AdminShellPackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail) + package.CreateRelationship( + filePart.Uri, TargetMode.Internal, + "http://schemas.openxmlformats.org/package/2006/" + + "relationships/metadata/thumbnail"); + } + + // now should be able to write + using (var s = filePart.GetStream(FileMode.Create)) + { + if (psfAdd.SourceLocalPath != null) + { + var bytes = System.IO.File.ReadAllBytes(psfAdd.SourceLocalPath); + s.Write(bytes, 0, bytes.Length); + } + + if (psfAdd.SourceGetBytesDel != null) + { + var bytes = psfAdd.SourceGetBytesDel(); + if (bytes != null) + s.Write(bytes, 0, bytes.Length); + } + } + } + } + + // after this, there are no more pending for add files + _pendingFilesToAdd.Clear(); + + // flush, but leave open + package.Flush(); + _openPackage = package; + + // if in temp fn, close the package, copy to original fn, re-open the package + if (_tempFn != null) + try + { + package.Close(); + System.IO.File.Copy(_tempFn, _fn, overwrite: true); + _openPackage = Package.Open(_tempFn, FileMode.OpenOrCreate); + } + catch (Exception ex) + { + throw (new Exception( + string.Format("While write AASX {0} indirectly at {1} gave: {2}", + fn, AdminShellUtil.ShortLocation(ex), ex.Message))); + } + } + catch (Exception ex) + { + throw (new Exception( + string.Format("While write AASX {0} at {1} gave: {2}", + fn, AdminShellUtil.ShortLocation(ex), ex.Message))); + } + return true; + } + + // Don't know to handle + throw new Exception($"Does not know how to handle the file: {fn}"); + } + + /// + /// Temporariyl saves & closes package and executes lambda. Afterwards, the package is re-opened + /// under the same file name + /// + /// Action which is to be executed while the file is CLOSED + /// Format for the saved file + public void TemporarilySaveCloseAndReOpenPackage( + Action lambda, + AdminShellPackageEnv.SerializationFormat prefFmt = AdminShellPackageEnv.SerializationFormat.None) + { + // access + if (!this.IsOpen) + throw (new Exception( + string.Format("Could not temporarily close and re-open AASX {0}, because package" + + "not open as expected!", Filename))); + + try + { + // save (it will be open, still) + SaveAs(this.Filename, prefFmt: prefFmt); + + // close + _openPackage.Flush(); + _openPackage.Close(); + + // execute lambda + lambda?.Invoke(); + } + catch (Exception ex) + { + throw (new Exception( + string.Format("While temporarily close and re-open AASX {0} at {1} gave: {2}", + Filename, AdminShellUtil.ShortLocation(ex), ex.Message))); + } + finally + { + // even after failing of the lambda, the package shall be re-opened + _openPackage = Package.Open(Filename, FileMode.OpenOrCreate); + } + } + + private int BackupIndex = 0; + + public void BackupInDir(string backupDir, int maxFiles) + { + // access + if (backupDir == null || maxFiles < 1) + return; + + // we do it not caring on any errors + try + { + // get index in form + if (BackupIndex == 0) + { + // do not always start at 0!! + var rnd = new Random(); + BackupIndex = rnd.Next(maxFiles); + } + var ndx = BackupIndex % maxFiles; + BackupIndex += 1; + + // build a filename + var bdfn = Path.Combine(backupDir, $"backup{ndx:000}.xml"); + + // raw save + using (var s = new StreamWriter(bdfn)) + { + //var serializer = new XmlSerializer(typeof(AasCore.Aas3_0_RC02.Environment)); + //var nss = new XmlSerializerNamespaces(); + //nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace); + //nss.Add("aas", "http://www.admin-shell.io/aas/2/0"); + //nss.Add("IEC61360", "http://www.admin-shell.io/IEC61360/2/0"); + //serializer.Serialize(s, _aasEnv, nss); + + var writer = XmlWriter.Create(s, new XmlWriterSettings() { Indent = true }); + Xmlization.Serialize.To( + _aasEnv, writer); + writer.Flush(); + writer.Close(); + s.Flush(); + } + } + catch (Exception ex) + { + LogInternally.That.SilentlyIgnoredError(ex); + } + } + + public Stream GetStreamFromUriOrLocalPackage(string uriString, + FileMode mode = FileMode.Open, + FileAccess access = FileAccess.Read) + { + // local + if (IsLocalFile(uriString)) + return GetLocalStreamFromPackage(uriString, mode, access); + + // no .. + return System.IO.File.Open(uriString, mode, access); + } + + public byte[] GetByteArrayFromUriOrLocalPackage(string uriString) + { + try + { + using (var input = GetStreamFromUriOrLocalPackage(uriString)) + { + using (MemoryStream ms = new MemoryStream()) + { + input.CopyTo(ms); + return ms.ToArray(); + } + } + } + catch (Exception ex) + { + AdminShellNS.LogInternally.That.SilentlyIgnoredError(ex); + return null; + } + } + + public bool IsLocalFile(string uriString) + { + // access + if (_openPackage == null) + return false; + if (uriString == null || uriString == "" || !uriString.StartsWith("/")) + return false; + + // check + var isLocal = _openPackage.PartExists(new Uri(uriString, UriKind.RelativeOrAbsolute)); + return isLocal; + } + + public Stream GetLocalStreamFromPackage(string uriString, FileMode mode = FileMode.Open, FileAccess access = FileAccess.Read) + { + // access + if (_openPackage == null) + throw (new Exception(string.Format($"AASX Package {_fn} not opened. Aborting!"))); + + // exist + var puri = new Uri(uriString, UriKind.RelativeOrAbsolute); + if (!_openPackage.PartExists(puri)) + throw (new Exception(string.Format($"AASX Package has no part {uriString}. Aborting!"))); + + // get part + var part = _openPackage.GetPart(puri); + if (part == null) + throw (new Exception( + string.Format($"Cannot access part {uriString} in {_fn}. Aborting!"))); + return part.GetStream(mode, access); + } + + public long GetStreamSizeFromPackage(string uriString) + { + long res = 0; + try + { + if (_openPackage == null) + return 0; + var part = _openPackage.GetPart(new Uri(uriString, UriKind.RelativeOrAbsolute)); + using (var s = part.GetStream(FileMode.Open)) + { + res = s.Length; + } + } + catch (Exception ex) + { + LogInternally.That.SilentlyIgnoredError(ex); + return 0; + } + return res; + } + + /// + /// Ensures: + ///
  • result == null || result.CanRead
+ ///
+ public Stream GetLocalThumbnailStream(ref Uri thumbUri) + { + // access + if (_openPackage == null) + throw (new Exception(string.Format($"AASX Package {_fn} not opened. Aborting!"))); + // get the thumbnail over the relationship + PackagePart thumbPart = null; + var xs = _openPackage.GetRelationshipsByType( + "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); + foreach (var x in xs) + if (x.SourceUri.ToString() == "/") + { + thumbPart = _openPackage.GetPart(x.TargetUri); + thumbUri = x.TargetUri; + break; + } + if (thumbPart == null) + throw (new Exception("Unable to find AASX thumbnail. Aborting!")); + + var result = thumbPart.GetStream(FileMode.Open); + + // Post-condition + if (!(result == null || result.CanRead)) + { + throw new InvalidOperationException("Unexpected unreadable result stream"); + } + + return result; + } + + /// + /// Ensures: + ///
  • result == null || result.CanRead
+ ///
+ public Stream GetLocalThumbnailStream() + { + Uri dummy = null; + var result = GetLocalThumbnailStream(ref dummy); + + // Post-condition + if (!(result == null || result.CanRead)) + { + throw new InvalidOperationException("Unexpected unreadable result stream"); + } + + return result; + } + + public ListOfAasSupplementaryFile GetListOfSupplementaryFiles() + { + // new result + var result = new ListOfAasSupplementaryFile(); + + // access + if (_openPackage != null) + { + + // get the thumbnail(s) from the package + var xs = _openPackage.GetRelationshipsByType( + "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); + foreach (var x in xs) + if (x.SourceUri.ToString() == "/") + { + result.Add(new AdminShellPackageSupplementaryFile( + x.TargetUri, + location: AdminShellPackageSupplementaryFile.LocationType.InPackage, + specialHandling: AdminShellPackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail)); + } + + // get the origin from the package + PackagePart originPart = null; + xs = _openPackage.GetRelationshipsByType( + "http://www.admin-shell.io/aasx/relationships/aasx-origin"); + foreach (var x in xs) + if (x.SourceUri.ToString() == "/") + { + originPart = _openPackage.GetPart(x.TargetUri); + break; + } + + if (originPart != null) + { + // get the specs from the origin + PackagePart specPart = null; + xs = originPart.GetRelationshipsByType("http://www.admin-shell.io/aasx/relationships/aas-spec"); + foreach (var x in xs) + { + specPart = _openPackage.GetPart(x.TargetUri); + break; + } + + if (specPart != null) + { + // get the supplementaries from the package, derived from spec + xs = specPart.GetRelationshipsByType("http://www.admin-shell.io/aasx/relationships/aas-suppl"); + foreach (var x in xs) + { + result.Add( + new AdminShellPackageSupplementaryFile( + x.TargetUri, location: AdminShellPackageSupplementaryFile.LocationType.InPackage)); + } + } + } + } + + // add or modify the files to delete + foreach (var psfDel in _pendingFilesToDelete) + { + // already in + var found = result.Find(x => { return x.Uri == psfDel.Uri; }); + if (found != null) + found.Location = AdminShellPackageSupplementaryFile.LocationType.DeletePending; + else + { + psfDel.Location = AdminShellPackageSupplementaryFile.LocationType.DeletePending; + result.Add(psfDel); + } + } + + // add the files to store as well + foreach (var psfAdd in _pendingFilesToAdd) + { + // already in (should not happen ?!) + var found = result.Find(x => { return x.Uri == psfAdd.Uri; }); + if (found != null) + found.Location = AdminShellPackageSupplementaryFile.LocationType.AddPending; + else + { + psfAdd.Location = AdminShellPackageSupplementaryFile.LocationType.AddPending; + result.Add(psfAdd); + } + } + + // done + return result; + } + + public static string GuessMimeType(string fn) + { + var file_ext = System.IO.Path.GetExtension(fn).ToLower().Trim(); + var content_type = System.Net.Mime.MediaTypeNames.Text.Plain; + if (file_ext == ".pdf") content_type = System.Net.Mime.MediaTypeNames.Application.Pdf; + if (file_ext == ".xml") content_type = System.Net.Mime.MediaTypeNames.Text.Xml; + if (file_ext == ".txt") content_type = System.Net.Mime.MediaTypeNames.Text.Plain; + if (file_ext == ".igs") content_type = "application/iges"; + if (file_ext == ".iges") content_type = "application/iges"; + if (file_ext == ".stp") content_type = "application/step"; + if (file_ext == ".step") content_type = "application/step"; + if (file_ext == ".jpg") content_type = System.Net.Mime.MediaTypeNames.Image.Jpeg; + if (file_ext == ".jpeg") content_type = System.Net.Mime.MediaTypeNames.Image.Jpeg; + if (file_ext == ".png") content_type = "image/png"; + if (file_ext == ".gif") content_type = System.Net.Mime.MediaTypeNames.Image.Gif; + return content_type; + } + + public void PrepareSupplementaryFileParameters(ref string targetDir, ref string targetFn) + { + // re-work target dir + if (targetDir != null) + targetDir = targetDir.Replace(@"\", "/"); + + // rework targetFn + if (targetFn != null) + targetFn = Regex.Replace(targetFn, @"[^A-Za-z0-9-.]+", "_"); + } + + /// + /// Add a file as supplementary file to package. Operation will be pending, package needs to be saved in order + /// materialize embedding. + /// + /// Target path of file in package + public string AddSupplementaryFileToStore( + string sourcePath, string targetDir, string targetFn, bool embedAsThumb, + AdminShellPackageSupplementaryFile.SourceGetByteChunk sourceGetBytesDel = null, string useMimeType = null) + { + // beautify parameters + if ((sourcePath == null && sourceGetBytesDel == null) || targetDir == null || targetFn == null) + return null; + + // build target path + targetDir = targetDir.Trim(); + if (!targetDir.EndsWith("/")) + targetDir += "/"; + targetFn = targetFn.Trim(); + if (sourcePath == "" || targetDir == "" || targetFn == "") + throw (new Exception("Trying add supplementary file with empty name or path!")); + + var targetPath = "" + targetDir.Trim() + targetFn.Trim(); + + // base function + AddSupplementaryFileToStore(sourcePath, targetPath, embedAsThumb, sourceGetBytesDel, useMimeType); + + // return target path + return targetPath; + } + + public void AddSupplementaryFileToStore(string sourcePath, string targetPath, bool embedAsThumb, + AdminShellPackageSupplementaryFile.SourceGetByteChunk sourceGetBytesDel = null, string useMimeType = null) + { + // beautify parameters + if ((sourcePath == null && sourceGetBytesDel == null) || targetPath == null) + return; + + sourcePath = sourcePath?.Trim(); + targetPath = targetPath.Trim(); + + // add record + _pendingFilesToAdd.Add( + new AdminShellPackageSupplementaryFile( + new Uri(targetPath, UriKind.RelativeOrAbsolute), + sourcePath, + location: AdminShellPackageSupplementaryFile.LocationType.AddPending, + specialHandling: (embedAsThumb + ? AdminShellPackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail + : AdminShellPackageSupplementaryFile.SpecialHandlingType.None), + sourceGetBytesDel: sourceGetBytesDel, + useMimeType: useMimeType) + ); + + } + + public void DeleteSupplementaryFile(AdminShellPackageSupplementaryFile psf) + { + if (psf == null) + throw (new Exception("No supplementary file given!")); + + if (psf.Location == AdminShellPackageSupplementaryFile.LocationType.AddPending) + { + // is still pending in add list -> remove + _pendingFilesToAdd.RemoveAll((x) => { return x.Uri == psf.Uri; }); + } + + if (psf.Location == AdminShellPackageSupplementaryFile.LocationType.InPackage) + { + // add to pending delete list + _pendingFilesToDelete.Add(psf); + } + } + + public void Close() + { + _openPackage?.Close(); + _openPackage = null; + _fn = ""; + _aasEnv = null; + } + + public void Flush() + { + if (_openPackage != null) + _openPackage.Flush(); + } + + public void Dispose() + { + Close(); + } + + public string MakePackageFileAvailableAsTempFile(string packageUri, bool keepFilename = false) + { + // access + if (packageUri == null) + return null; + + // get input stream + using (var input = GetLocalStreamFromPackage(packageUri)) + { + // generate tempfile name + string tempext = System.IO.Path.GetExtension(packageUri); + string temppath = System.IO.Path.GetTempFileName().Replace(".tmp", tempext); + + // maybe modify tempfile name? + if (keepFilename) + { + var masterFn = System.IO.Path.GetFileNameWithoutExtension(packageUri); + var tmpDir = System.IO.Path.GetDirectoryName(temppath); + var tmpFnExt = System.IO.Path.GetFileName(temppath); + + temppath = System.IO.Path.Combine(tmpDir, "" + masterFn + "_" + tmpFnExt); + } + + // copy to temp file + using (var temp = System.IO.File.OpenWrite(temppath)) + { + input.CopyTo(temp); + return temppath; + } + } + } + + } +} diff --git a/src/AasxCsharpLib_bkp/AdminShellUtil.cs b/src/AasxCsharpLib_bkp/AdminShellUtil.cs new file mode 100644 index 000000000..66be9718e --- /dev/null +++ b/src/AasxCsharpLib_bkp/AdminShellUtil.cs @@ -0,0 +1,705 @@ +/* +Copyright (c) 2018-2021 Festo AG & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ + +using AasCore.Aas3_0_RC02; +using Extensions; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using static AasxCompatibilityModels.AdminShellV20.SubmodelElementWrapper; +using static Extensions.ExtendIDataSpecificationContent; + +namespace AdminShellNS +{ + public static class AdminShellUtil + { + + #region Various utilities + // ------------------------------------------------------------------------------------ + + public static T[] GetEnumValues() where T : Enum + => (T[])Enum.GetValues(typeof(T)); + + public static IEnumerable GetEnumValues(T[] excludes) where T : Enum + { + foreach (var v in (T[])Enum.GetValues(typeof(T))) + if (!excludes.Contains(v)) + yield return v; + } + + #endregion + + #region V3 Methods + + public static string[] GetPopularMimeTypes() + { + return + new[] { + System.Net.Mime.MediaTypeNames.Text.Plain, + System.Net.Mime.MediaTypeNames.Text.Xml, + System.Net.Mime.MediaTypeNames.Text.Html, + "application/json", + "application/rdf+xml", + System.Net.Mime.MediaTypeNames.Application.Pdf, + System.Net.Mime.MediaTypeNames.Image.Jpeg, + "image/png", + System.Net.Mime.MediaTypeNames.Image.Gif, + "application/iges", + "application/step" + }; + } + + public static IEnumerable GetAdequateEnums(AasSubmodelElements[] excludeValues = null, AasSubmodelElements[] includeValues = null) + { + if (includeValues != null) + { + foreach (var en in includeValues) + yield return en; + } + else + { + foreach (var en in (AasSubmodelElements[])Enum.GetValues(typeof(AasSubmodelElements))) + { + if (en == AasSubmodelElements.SubmodelElement) + continue; + if (excludeValues != null && excludeValues.Contains(en)) + continue; + yield return en; + } + } + } + + public static AasSubmodelElements? AasSubmodelElementsFrom() where T : ISubmodelElement + { + if (typeof(T) == typeof(Property)) + return AasSubmodelElements.Property; + if (typeof(T) == typeof(MultiLanguageProperty)) + return AasSubmodelElements.MultiLanguageProperty; + if (typeof(T) == typeof(AasCore.Aas3_0_RC02.Range)) + return AasSubmodelElements.Range; + if (typeof(T) == typeof(AasCore.Aas3_0_RC02.File)) + return AasSubmodelElements.File; + if (typeof(T) == typeof(Blob)) + return AasSubmodelElements.Blob; + if (typeof(T) == typeof(ReferenceElement)) + return AasSubmodelElements.ReferenceElement; + if (typeof(T) == typeof(RelationshipElement)) + return AasSubmodelElements.RelationshipElement; + if (typeof(T) == typeof(AnnotatedRelationshipElement)) + return AasSubmodelElements.AnnotatedRelationshipElement; + if (typeof(T) == typeof(Capability)) + return AasSubmodelElements.Capability; + if (typeof(T) == typeof(SubmodelElementCollection)) + return AasSubmodelElements.SubmodelElementCollection; + if (typeof(T) == typeof(Operation)) + return AasSubmodelElements.Operation; + if (typeof(T) == typeof(BasicEventElement)) + return AasSubmodelElements.BasicEventElement; + if (typeof(T) == typeof(Entity)) + return AasSubmodelElements.Entity; + return null; + } + + + public static ISubmodelElement CreateSubmodelElementFromEnum(AasSubmodelElements smeEnum, ISubmodelElement sourceSme = null) + { + switch(smeEnum) + { + case AasSubmodelElements.Property: + { + return new Property(DataTypeDefXsd.String).UpdateFrom(sourceSme); + } + case AasSubmodelElements.MultiLanguageProperty: + { + return new MultiLanguageProperty().UpdateFrom(sourceSme); + } + case AasSubmodelElements.Range: + { + return new AasCore.Aas3_0_RC02.Range(DataTypeDefXsd.String).UpdateFrom(sourceSme); + } + case AasSubmodelElements.File: + { + return new AasCore.Aas3_0_RC02.File("").UpdateFrom(sourceSme); + } + case AasSubmodelElements.Blob: + { + return new Blob("").UpdateFrom(sourceSme); + } + case AasSubmodelElements.ReferenceElement: + { + return new ReferenceElement().UpdateFrom(sourceSme); + } + case AasSubmodelElements.RelationshipElement: + { + return new RelationshipElement(null, null).UpdateFrom(sourceSme); + } + case AasSubmodelElements.AnnotatedRelationshipElement: + { + return new AnnotatedRelationshipElement(null, null).UpdateFrom(sourceSme); + } + case AasSubmodelElements.Capability: + { + return new Capability(); + } + case AasSubmodelElements.SubmodelElementCollection: + { + return new SubmodelElementCollection().UpdateFrom(sourceSme); + } + case AasSubmodelElements.SubmodelElementList: + { + return new SubmodelElementList(AasSubmodelElements.SubmodelElement).UpdateFrom(sourceSme); + } + case AasSubmodelElements.Operation: + { + return new Operation().UpdateFrom(sourceSme); + } + case AasSubmodelElements.BasicEventElement: + { + return new BasicEventElement(null, Direction.Input, StateOfEvent.Off); + } + case AasSubmodelElements.Entity: + { + return new Entity(EntityType.SelfManagedEntity); + } + default: + { + return null; + } + } + } + + #endregion + public static string EvalToNonNullString(string fmt, object o, string elseString = "") + { + if (o == null) + return elseString; + return string.Format(fmt, o); + } + + public static string EvalToNonEmptyString(string fmt, string o, string elseString = "") + { + if (o == null || o == "") + return elseString; + return string.Format(fmt, o); + } + + /// + /// If len of exceeds then + /// string is shortened and returned with an ellipsis(…) at the end. + /// + /// Shortened string + public static string ShortenWithEllipses(string str, int maxLen) + { + if (str == null) + return null; + if (maxLen >= 0 && str.Length > maxLen) + str = str.Substring(0, maxLen) + "\u2026"; + return str; + } + + /// + /// Returns a string without newlines and shortened (with ellipsis) + /// to a certain length + /// + /// Single-line, shortened string + public static string ToSingleLineShortened(string str, int maxLen, string textNewLine = " ") + { + str = str.ReplaceLineEndings(textNewLine); + return ShortenWithEllipses(str, maxLen); + } + + /// Creates a filter-friendly name from the source. + /// + /// Assert.AreEqual("", AdminShellUtil.FilterFriendlyName("")); + /// Assert.AreEqual("someName", AdminShellUtil.FilterFriendlyName("someName")); + /// Assert.AreEqual("some__name", AdminShellUtil.FilterFriendlyName("some!;name")); + /// + public static string FilterFriendlyName(string src) + { + if (src == null) + return null; + return Regex.Replace(src, @"[^a-zA-Z0-9\-_]", "_"); + } + + /// + /// Assert.IsFalse(AdminShellUtil.HasWhitespace("")); + /// Assert.IsTrue(AdminShellUtil.HasWhitespace(" ")); + /// Assert.IsTrue(AdminShellUtil.HasWhitespace("aa bb")); + /// Assert.IsTrue(AdminShellUtil.HasWhitespace(" aabb")); + /// Assert.IsTrue(AdminShellUtil.HasWhitespace("aabb ")); + /// Assert.IsFalse(AdminShellUtil.HasWhitespace("aabb")); + /// + public static bool HasWhitespace(string src) + { + if (src == null) + throw new ArgumentNullException(nameof(src)); + foreach (var s in src) + if (char.IsWhiteSpace(s)) + return true; + return false; + } + + /// Assert.IsTrue(AdminShellUtil.ComplyIdShort("")); + public static bool ComplyIdShort(string src) + { + if (src == null) + throw new ArgumentNullException(nameof(src)); + var res = true; + foreach (var s in src) + if (!Char.IsLetterOrDigit(s) && s != '_') + res = false; + if (src.Length > 0 && !Char.IsLetter(src[0])) + res = false; + return res; + } + + public static string ByteSizeHumanReadable(long len) + { + // see: https://stackoverflow.com/questions/281640/ + // how-do-i-get-a-human-readable-file-size-in-bytes-abbreviation-using-net + string[] sizes = { "B", "KB", "MB", "GB", "TB" }; + int order = 0; + while (len >= 1024 && order < sizes.Length - 1) + { + order++; + len = len / 1024; + } + // Adjust the format string to your preferences. For example "{0:0.#}{1}" would + // show a single decimal place, and no space. + string res = String.Format("{0:0.##} {1}", len, sizes[order]); + return res; + } + + public static string ExtractPascalCasingLetters(string src) + { + // access + src = src?.Trim(); + if (src == null || src.Length < 1) + return null; + + // walk through + var res = ""; + var arm = true; + foreach (var c in src) + { + // take? + if (arm && Char.IsUpper(c)) + res += c; + // state for next iteration + arm = !Char.IsUpper(c); + } + + // result + return res; + } + + public static int CountHeadingSpaces(string line) + { + if (line == null) + return 0; + int j; + for (j = 0; j < line.Length; j++) + if (!Char.IsWhiteSpace(line[j])) + break; + return j; + } + + /// + /// Used to re-reformat a C# here string, which is multiline string introduced by @" ... "; + /// + public static string[] CleanHereStringToArray(string here) + { + if (here == null) + return null; + + // convert all weird breaks to pure new lines + here = here.Replace("\r\n", "\n"); + here = here.Replace("\n\r", "\n"); + + // convert all tabs to spaces + here = here.Replace("\t", " "); + + // split these + var lines = new List(here.Split('\n')); + if (lines.Count < 1) + return lines.ToArray(); + + // the first line could be special + string firstLine = null; + if (lines[0].Trim() != "") + { + firstLine = lines[0].Trim(); + lines.RemoveAt(0); + } + + // detect an constant amount of heading spaces + var headSpaces = int.MaxValue; + foreach (var line in lines) + if (line.Trim() != "") + headSpaces = Math.Min(headSpaces, CountHeadingSpaces(line)); + + // multi line trim possible? + if (headSpaces != int.MaxValue && headSpaces > 0) + for (int i = 0; i < lines.Count; i++) + if (lines[i].Length > headSpaces) + lines[i] = lines[i].Substring(headSpaces); + + // re-compose again + if (firstLine != null) + lines.Insert(0, firstLine); + + // return + return lines.ToArray(); + } + + /// + /// Used to re-reformat a C# here string, which is multiline string introduced by @" ... "; + /// + public static string CleanHereStringWithNewlines(string here, string nl = null) + { + if (nl == null) + nl = System.Environment.NewLine; + var lines = CleanHereStringToArray(here); + if (lines == null) + return null; + return String.Join(nl, lines); + } + + public static string ShortLocation(Exception ex) + { + if (ex == null || ex.StackTrace == null) + return ""; + string[] lines = ex.StackTrace.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None); + if (lines.Length < 1) + return ""; + // search for " in " + // as the most actual stacktrace might be a built-in function, this might not work and therefore + // go down in the stack + int currLine = 0; + while (true) + { + // nothing found at all + if (currLine >= lines.Length) + return ""; + // access current line + /* TODO (MIHO, 2020-11-12): replace with Regex for multi language. Ideally have Exception messages + always as English. */ + var p = lines[currLine].IndexOf(" in ", StringComparison.Ordinal); + if (p < 0) + p = lines[currLine].IndexOf(" bei ", StringComparison.Ordinal); + if (p < 0) + { + // advance to next oldest line + currLine++; + continue; + } + // search last "\" or "/", to get only filename portion and position + p = lines[currLine].LastIndexOfAny(new[] { '\\', '/' }); + if (p < 0) + { + // advance to next oldest line + currLine++; + continue; + } + // return this + return lines[currLine].Substring(p); + } + } + + public enum ConstantFoundEnum { No, AnyCase, ExactCase } + + public static ConstantFoundEnum CheckIfInConstantStringArray(string[] arr, string str) + { + if (arr == null || str == null) + return ConstantFoundEnum.No; + + bool anyCaseFound = false; + bool exactCaseFound = false; + foreach (var a in arr) + { + anyCaseFound = anyCaseFound || str.ToLower() == a.ToLower(); + exactCaseFound = exactCaseFound || str == a; + } + if (exactCaseFound) + return ConstantFoundEnum.ExactCase; + if (anyCaseFound) + return ConstantFoundEnum.AnyCase; + return ConstantFoundEnum.No; + } + + public static string CorrectCasingForConstantStringArray(string[] arr, string str) + { + if (arr == null || str == null) + return str; + + foreach (var a in arr) + if (str.ToLower() == a.ToLower()) + return a; + + return str; + } + + // + // String manipulations + // + + public static string ReplacePercentPlaceholder( + string input, + string searchFor, + Func substLamda, + StringComparison comparisonType = StringComparison.InvariantCulture) + { + // access + if (input == null || searchFor == null || searchFor == "") + return input; + + // find + while (true) + { + // any occurence + var p = input.IndexOf(searchFor, comparisonType); + if (p < 0) + break; + + // split + var left = input.Substring(0, p); + var right = ""; + var rp = p + searchFor.Length; + if (rp < input.Length) + right = input.Substring(rp); + + // lambda + var repl = "" + substLamda?.Invoke(); + + // build new + input = left + repl + right; + } + + // ok + return input; + } + + // + // Reflection + // + + public static void SetFieldLazyValue(FieldInfo f, object obj, object value) + { + // access + if (f == null || obj == null) + return; + + switch (Type.GetTypeCode(f.FieldType)) + { + case TypeCode.String: + f.SetValue(obj, "" + value); + break; + + case TypeCode.Byte: + if (Byte.TryParse("" + value, out var ui8)) + f.SetValue(obj, ui8); + break; + + case TypeCode.SByte: + if (SByte.TryParse("" + value, out var i8)) + f.SetValue(obj, i8); + break; + + case TypeCode.Int16: + if (Int16.TryParse("" + value, out var i16)) + f.SetValue(obj, i16); + break; + + case TypeCode.Int32: + if (Int32.TryParse("" + value, out var i32)) + f.SetValue(obj, i32); + break; + + case TypeCode.Int64: + if (Int64.TryParse("" + value, out var i64)) + f.SetValue(obj, i64); + break; + + case TypeCode.UInt16: + if (UInt16.TryParse("" + value, out var ui16)) + f.SetValue(obj, ui16); + break; + + case TypeCode.UInt32: + if (UInt32.TryParse("" + value, out var ui32)) + f.SetValue(obj, ui32); + break; + + case TypeCode.UInt64: + if (UInt64.TryParse("" + value, out var ui64)) + f.SetValue(obj, ui64); + break; + + case TypeCode.Single: + if (Single.TryParse("" + value, NumberStyles.Float, + CultureInfo.InvariantCulture, out var sgl)) + f.SetValue(obj, sgl); + break; + + case TypeCode.Double: + if (Double.TryParse("" + value, NumberStyles.Float, + CultureInfo.InvariantCulture, out var dbl)) + f.SetValue(obj, dbl); + break; + + case TypeCode.Boolean: + var isFalse = value == null + || (value is int vi && vi == 0) + || (value is string vs && vs == "") + || (value is bool vb && !vb); + f.SetValue(obj, isFalse); + break; + } + } + + // + // some URL enabled path handling + // + + /// + /// Uses System.IO.Path.GetExtension() to determine the extension part + /// of a path. If a URL based query is added to the extension, remove this. + /// + public static string GetExtensionWoQuery(string fn) + { + // access + if (fn == null) + return null; + + // use system function + var ext = System.IO.Path.GetExtension(fn).ToLower().Trim(); + + // as URLs *might* have an extension, but a loto f query string afterwards, + // lets try to cut of it + var extMatch = Regex.Match(ext, @"([._A-Za-z0-9]+)"); + if (extMatch.Success) + ext = extMatch.Groups[1].ToString(); + + // ok + return ext; + } + + // + // Base 64 + // + + public static string Base64Encode(string plainText) + { + var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText); + return System.Convert.ToBase64String(plainTextBytes); + } + + public static string Base64Decode(string base64EncodedData) + { + var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData); + return System.Text.Encoding.UTF8.GetString(base64EncodedBytes); + } + + // + // Generation of Ids + // + + private static Random MyRnd = new Random(); + + public static string GenerateIdAccordingTemplate(string tpl) + { + // generate a deterministic decimal digit string + var decimals = String.Format("{0:ffffyyMMddHHmmss}", DateTime.UtcNow); + decimals = new string(decimals.Reverse().ToArray()); + // convert this to an int + if (!Int64.TryParse(decimals, out Int64 decii)) + decii = MyRnd.Next(Int32.MaxValue); + // make an hex out of this + string hexamals = decii.ToString("X"); + // make an alphanumeric string out of this + string alphamals = ""; + var dii = decii; + while (dii >= 1) + { + var m = dii % 26; + alphamals += Convert.ToChar(65 + m); + dii = dii / 26; + } + + // now, "salt" the strings + for (int i = 0; i < 32; i++) + { + var c = Convert.ToChar(48 + MyRnd.Next(10)); + decimals += c; + hexamals += c; + alphamals += c; + } + + // now, can just use the template + var id = ""; + foreach (var tpli in tpl) + { + if (tpli == 'D' && decimals.Length > 0) + { + id += decimals[0]; + decimals = decimals.Remove(0, 1); + } + else + if (tpli == 'X' && hexamals.Length > 0) + { + id += hexamals[0]; + hexamals = hexamals.Remove(0, 1); + } + else + if (tpli == 'A' && alphamals.Length > 0) + { + id += alphamals[0]; + alphamals = alphamals.Remove(0, 1); + } + else + id += tpli; + } + + // ok + return id; + } + + public static string RemoveNewLinesAndLimit(string input, int maxLength = -1, string ellipsis = "..") + { + // access + if (input == null) + return null; + + // maybe do a generouse limit first + if (maxLength >= 1 && input.Length > 2 * maxLength) + input = input.Substring(0, 2 * maxLength); + + // now do expensive operations + input = input.Replace('\r', ' '); + input = input.Replace('\n', ' '); + input = Regex.Replace(input, @"\s+", " ", RegexOptions.Compiled); + + // now apply exact limit + if (maxLength >= 1 && input.Length > maxLength) + input = input.Substring(0, maxLength) + ellipsis; + + // ok + return input; + } + + + } +} diff --git a/src/AasxCsharpLib_bkp/AdminShellValidate.cs b/src/AasxCsharpLib_bkp/AdminShellValidate.cs new file mode 100644 index 000000000..938c91c57 --- /dev/null +++ b/src/AasxCsharpLib_bkp/AdminShellValidate.cs @@ -0,0 +1,327 @@ +/* +Copyright (c) 2018-2021 Festo AG & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ + +using System; +using System.Collections.Generic; +using System.ComponentModel.Design; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using System.Xml; +using System.Xml.Schema; +using JetBrains.Annotations; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Newtonsoft.Json.Schema; +using AasCore.Aas3_0_RC02; +using Environment = System.Environment; + +namespace AdminShellNS +{ + /// + /// validates the XML content against the AASX XML schema. + /// + /// Please produce instances with . + /// + public class XmlValidator + { + private System.Xml.Schema.XmlSchemaSet xmlSchemaSet; + + internal XmlValidator(XmlSchemaSet xmlSchemaSet) + { + this.xmlSchemaSet = xmlSchemaSet; + } + + /// + /// validates the given XML content and stores the results in the . + /// + /// Validation records + /// Content to be validated + public void Validate(AasValidationRecordList recs, Stream xmlContent) + { + if (recs == null) + throw new ArgumentException($"Unexpected null {nameof(recs)}"); + + if (xmlContent == null) + throw new ArgumentException($"Unexpected null {nameof(xmlContent)}"); + + // load/ validate on same records + var settings = new System.Xml.XmlReaderSettings(); + settings.ValidationType = System.Xml.ValidationType.Schema; + settings.Schemas = xmlSchemaSet; + + settings.ValidationEventHandler += + (object sender, System.Xml.Schema.ValidationEventArgs e) => + { + recs.Add( + new AasValidationRecord( + AasValidationSeverity.Serialization, null, + $"XML: {e?.Exception?.LineNumber}, {e?.Exception?.LinePosition}: {e?.Message}")); + }; + + // use the xml stream + using (var reader = System.Xml.XmlReader.Create(xmlContent, settings)) + { + while (reader.Read()) + { + // Invoke callbacks + }; + } + } + } + + public enum AasValidationSeverity + { + Hint, Warning, SpecViolation, SchemaViolation, Serialization + } + + [UsedImplicitlyAttribute] // for eventual use + public enum AasValidationAction + { + No, ToBeDeleted + } + + public class AasValidationRecord + { + public AasValidationSeverity Severity = AasValidationSeverity.Hint; + public IReferable Source = null; + public string Message = ""; + + public Action Fix = null; + + public AasValidationRecord(AasValidationSeverity Severity, IReferable Source, + string Message, Action Fix = null) + { + this.Severity = Severity; + this.Source = Source; + this.Message = Message; + this.Fix = Fix; + } + + public override string ToString() + { + return $"[{Severity.ToString()}] in {"" + Source?.ToString()}: {"" + Message}"; + } + + public string DisplaySeverity { get { return "" + Severity.ToString(); } } + public string DisplaySource + { + get + { + return "" + ((Source != null) ? Source.ToString() : "(whole content)"); + } + } + public string DisplayMessage { get { return "" + Message?.ToString(); } } + } + + public class AasValidationRecordList : List + { + } + + public static class AasSchemaValidation + { + public enum SerializationFormat { XML, JSON } + + public static string[] GetSchemaResources(SerializationFormat fmt) + { + if (fmt == SerializationFormat.XML) + { + return new[] + { + "AdminShellNS.Resources.schemaV201.AAS.xsd", + "AdminShellNS.Resources.schemaV201.AAS_ABAC.xsd", + "AdminShellNS.Resources.schemaV201.IEC61360.xsd" + }; + } + if (fmt == SerializationFormat.JSON) + { + return new[] + { + "AdminShellNS.Resources.schemaV201.aas.json" + }; + } + return null; + } + + /// + /// produces a validator which validates XML AASX files. + /// + /// initialized validator + public static XmlValidator NewXmlValidator() + { + // Load the schema files + var files = GetSchemaResources(SerializationFormat.XML); + if (files == null) + throw new InvalidOperationException("No XML schema files could be found in the resources."); + + var xmlSchemaSet = new System.Xml.Schema.XmlSchemaSet(); + xmlSchemaSet.XmlResolver = new System.Xml.XmlUrlResolver(); + + try + { + Assembly myAssembly = Assembly.GetExecutingAssembly(); + foreach (var schemaFn in files) + { + using (Stream schemaStream = myAssembly.GetManifestResourceStream(schemaFn)) + { + using (XmlReader schemaReader = XmlReader.Create(schemaStream)) + { + xmlSchemaSet.Add(null, schemaReader); + } + } + } + } + catch (Exception ex) + { + throw new FileNotFoundException( + $"Error accessing embedded resource schema files: {ex.Message}"); + } + + var newRecs = new AasValidationRecordList(); + + // set up messages + xmlSchemaSet.ValidationEventHandler += (object sender, System.Xml.Schema.ValidationEventArgs e) => + { + newRecs.Add( + new AasValidationRecord( + AasValidationSeverity.Serialization, null, + $"{e?.Exception?.LineNumber}, {e?.Exception?.LinePosition}: {e?.Message}")); + }; + + // compile + try + { + xmlSchemaSet.Compile(); + } + catch (Exception ex) + { + throw new InvalidOperationException( + $"Error compiling schema files: {ex.Message}"); + } + + if (newRecs.Count > 0) + { + var parts = new List { $"Failed to compile the schema files:" }; + parts.AddRange(newRecs.Select((r) => r.Message)); + throw new InvalidOperationException(string.Join(Environment.NewLine, parts)); + } + + return new XmlValidator(xmlSchemaSet); + } + + /// + /// creates an XML validator and applies it on the given content. + /// + /// If you repeatedly need to validate XML against a schema, re-use an instance of + /// produced with . + /// + /// Validation records + /// Content to be validated + public static void ValidateXML(AasValidationRecordList recs, Stream xmlContent) + { + var validator = NewXmlValidator(); + validator.Validate(recs, xmlContent); + } + + public static int ValidateJSONAlternative(AasValidationRecordList recs, Stream jsonContent) + { + // see: https://github.com/RicoSuter/NJsonSchema/wiki/JsonSchemaValidator + var newRecs = new AasValidationRecordList(); + + // access + if (recs == null || jsonContent == null) + return -1; + + // Load the schema files + // right now: exactly ONE schema file + var files = GetSchemaResources(SerializationFormat.JSON); + if (files == null || files.Length != 1) + return -1; + + NJsonSchema.JsonSchema schema = null; + + try + { + Assembly myAssembly = Assembly.GetExecutingAssembly(); + foreach (var schemaFn in files) + { + using (Stream schemaStream = myAssembly.GetManifestResourceStream(schemaFn)) + { + using (var streamReader = new StreamReader(schemaStream)) + { + var allTxt = streamReader.ReadToEnd(); + schema = NJsonSchema.JsonSchema.FromJsonAsync(allTxt).GetAwaiter().GetResult(); + break; + } + } + } + } + catch (Exception ex) + { + throw new FileNotFoundException("ValidateJSON: Error loading schema: " + + ex.Message); + } + + if (schema == null) + { + throw new FileNotFoundException("ValidateJSON: Schema not found properly."); + } + + // create validator + var validator = new NJsonSchema.Validation.JsonSchemaValidator(); + + // load the JSON content + string jsonTxt = null; + try + { + using (var streamReader = new StreamReader(jsonContent)) + { + jsonTxt = streamReader.ReadToEnd(); + } + } + catch (Exception ex) + { + throw new InvalidOperationException("ValidateJSON: Error loading JSON content: " + + ex.Message); + } + + if (jsonTxt == null || jsonTxt == "") + throw new InvalidOperationException("ValidateJSON: Error loading JSON content gave null."); + + // validate + ICollection errors; + try + { + errors = validator.Validate(jsonTxt, schema); + } + catch (Exception ex) + { + throw new InvalidOperationException("ValidateJSON: Error when validating: " + + ex.Message); + } + + // re-format messages + if (errors != null) + foreach (var ve in errors) + { + var msg = ("" + ve.ToString()); + msg = Regex.Replace(msg, @"\s+", " "); + newRecs.Add(new AasValidationRecord(AasValidationSeverity.Serialization, null, + $"JSON: {ve.LineNumber,5},{ve.LinePosition:3}: {msg}")); + } + + // result + recs.AddRange(newRecs); + return newRecs.Count; + } + } +} diff --git a/src/AasxCsharpLib_bkp/Display/EnumerationPlacmentBase.cs b/src/AasxCsharpLib_bkp/Display/EnumerationPlacmentBase.cs new file mode 100644 index 000000000..5920e6f6d --- /dev/null +++ b/src/AasxCsharpLib_bkp/Display/EnumerationPlacmentBase.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AdminShellNS.Display +{ + public class EnumerationPlacmentBase + { + + } +} diff --git a/src/AasxCsharpLib_bkp/Display/EnumerationPlacmentOperationVariable.cs b/src/AasxCsharpLib_bkp/Display/EnumerationPlacmentOperationVariable.cs new file mode 100644 index 000000000..b6d0e3a0a --- /dev/null +++ b/src/AasxCsharpLib_bkp/Display/EnumerationPlacmentOperationVariable.cs @@ -0,0 +1,15 @@ +using AasCore.Aas3_0_RC02; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AdminShellNS.Display +{ + public class EnumerationPlacmentOperationVariable : EnumerationPlacmentBase + { + public OperationVariableDirection Direction; + public OperationVariable OperationVariable; + } +} diff --git a/src/AasxCsharpLib_bkp/Display/OperationVariableDirection.cs b/src/AasxCsharpLib_bkp/Display/OperationVariableDirection.cs new file mode 100644 index 000000000..d64f9c794 --- /dev/null +++ b/src/AasxCsharpLib_bkp/Display/OperationVariableDirection.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AdminShellNS.Display +{ + public enum OperationVariableDirection + { + In, + Out, + InOut + } +} diff --git a/src/AasxCsharpLib_bkp/Exceptions/NullValueException.cs b/src/AasxCsharpLib_bkp/Exceptions/NullValueException.cs new file mode 100644 index 000000000..7d44af167 --- /dev/null +++ b/src/AasxCsharpLib_bkp/Exceptions/NullValueException.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AdminShellNS.Exceptions +{ + public class NullValueException: Exception + { + public NullValueException(string field) : base($"The field {field} is null!!") + { + + } + } +} diff --git a/src/AasxCsharpLib_bkp/Extensions/AasElementSelfDescription.cs b/src/AasxCsharpLib_bkp/Extensions/AasElementSelfDescription.cs new file mode 100644 index 000000000..8ac8f2ed2 --- /dev/null +++ b/src/AasxCsharpLib_bkp/Extensions/AasElementSelfDescription.cs @@ -0,0 +1,29 @@ +using AasCore.Aas3_0_RC02; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public class AasElementSelfDescription + { + public string AasElementName { get; set; } + + public string ElementAbbreviation { get; set; } + + public KeyTypes? KeyType { get; set; } + + public AasSubmodelElements? SmeType { get; set; } + + public AasElementSelfDescription(string aasElementName, string elementAbbreviation, + KeyTypes? keyType, AasSubmodelElements? smeType) + { + AasElementName = aasElementName; + ElementAbbreviation = elementAbbreviation; + KeyType = keyType; + SmeType = smeType; + } + } +} diff --git a/src/AasxCsharpLib_bkp/Extensions/ComparerUtils.cs b/src/AasxCsharpLib_bkp/Extensions/ComparerUtils.cs new file mode 100644 index 000000000..7becf56cb --- /dev/null +++ b/src/AasxCsharpLib_bkp/Extensions/ComparerUtils.cs @@ -0,0 +1,57 @@ +using AasCore.Aas3_0_RC02; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public class ComparerIdShort : IComparer + { + public int Compare(IReferable a, IReferable b) + { + return string.Compare(a?.IdShort, b?.IdShort, + CultureInfo.InvariantCulture, CompareOptions.IgnoreCase); + } + } + + public class ComparerIdentification : IComparer + { + public int Compare(IIdentifiable a, IIdentifiable b) + { + return string.Compare(a.Id, b.Id, + CultureInfo.InvariantCulture, CompareOptions.IgnoreCase | CompareOptions.IgnoreNonSpace); + } + } + + public class ComparerIndexed : IComparer + { + public int NullIndex = int.MaxValue; + public Dictionary Index = new(); + + public int Compare(IReferable a, IReferable b) + { + var ca = Index.ContainsKey(a); + var cb = Index.ContainsKey(b); + + if (!ca && !cb) + return 0; + // make CDs without usage to appear at end of list + if (!ca) + return +1; + if (!cb) + return -1; + + var ia = Index[a]; + var ib = Index[b]; + + if (ia == ib) + return 0; + if (ia < ib) + return -1; + return +1; + } + } +} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendAnnotatedRelationshipElement.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendAnnotatedRelationshipElement.cs new file mode 100644 index 000000000..0a9c9f212 --- /dev/null +++ b/src/AasxCsharpLib_bkp/Extensions/ExtendAnnotatedRelationshipElement.cs @@ -0,0 +1,124 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using AasCore.Aas3_0_RC02; +using Extensions; +using AdminShellNS.Display; + +namespace Extensions +{ + public static class ExtendAnnotatedRelationshipElement + { + #region AasxPackageExplorer + + public static void Add(this AnnotatedRelationshipElement annotatedRelationshipElement, ISubmodelElement submodelElement) + { + if (annotatedRelationshipElement != null) + { + annotatedRelationshipElement.Annotations ??= new(); + + submodelElement.Parent = annotatedRelationshipElement; + + annotatedRelationshipElement.Annotations.Add((IDataElement)submodelElement); + } + } + + public static void Remove(this AnnotatedRelationshipElement annotatedRelationshipElement, ISubmodelElement submodelElement) + { + if(annotatedRelationshipElement != null) + { + if(annotatedRelationshipElement.Annotations != null) + { + annotatedRelationshipElement.Annotations.Remove((IDataElement)submodelElement); + } + } + } + + public static object AddChild(this AnnotatedRelationshipElement annotatedRelationshipElement, ISubmodelElement childSubmodelElement, EnumerationPlacmentBase placement = null) + { + if (childSubmodelElement == null || childSubmodelElement is not IDataElement) + return null; + + annotatedRelationshipElement.Annotations ??= new (); + + if (childSubmodelElement != null) + childSubmodelElement.Parent = annotatedRelationshipElement; + + annotatedRelationshipElement.Annotations.Add((IDataElement)childSubmodelElement); + return childSubmodelElement; + } + + #endregion + public static AnnotatedRelationshipElement ConvertAnnotationsFromV20(this AnnotatedRelationshipElement annotatedRelationshipElement, AasxCompatibilityModels.AdminShellV20.AnnotatedRelationshipElement sourceAnnotedRelElement) + { + if (sourceAnnotedRelElement == null) + { + return null; + } + + if (sourceAnnotedRelElement.annotations != null) + { + annotatedRelationshipElement.Annotations ??= new List(); + foreach (var submodelElementWrapper in sourceAnnotedRelElement.annotations) + { + var sourceSubmodelElement = submodelElementWrapper.submodelElement; + ISubmodelElement outputSubmodelElement = null; + if (sourceSubmodelElement != null) + { + outputSubmodelElement = outputSubmodelElement.ConvertFromV20(sourceSubmodelElement); + } + annotatedRelationshipElement.Annotations.Add((IDataElement)outputSubmodelElement); + } + } + + return annotatedRelationshipElement; + } + + public static T FindFirstIdShortAs(this AnnotatedRelationshipElement annotedRelationshipElement, string idShort) where T : ISubmodelElement + { + + var submodelElements = annotedRelationshipElement.Annotations.Where(sme => sme != null && sme is T && sme.IdShort.Equals(idShort, StringComparison.OrdinalIgnoreCase)); + + if (submodelElements.Any()) + { + return (T)submodelElements.First(); + } + + return default; + } + + public static AnnotatedRelationshipElement Set(this AnnotatedRelationshipElement elem, + Reference first, Reference second) + { + elem.First = first; + elem.Second = second; + return elem; + } + + public static AnnotatedRelationshipElement UpdateFrom( + this AnnotatedRelationshipElement elem, ISubmodelElement source) + { + if (source == null) + return elem; + + ((ISubmodelElement)elem).UpdateFrom(source); + + if (source is ReferenceElement srcRef) + { + if (srcRef.Value != null) + elem.First = srcRef.Value.Copy(); + } + + if (source is RelationshipElement srcRel) + { + if (srcRel.First != null) + elem.First = srcRel.First.Copy(); + } + + return elem; + } + + } +} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendAssetAdministrationShell.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendAssetAdministrationShell.cs new file mode 100644 index 000000000..be4051ee3 --- /dev/null +++ b/src/AasxCsharpLib_bkp/Extensions/ExtendAssetAdministrationShell.cs @@ -0,0 +1,242 @@ +using AasCore.Aas3_0_RC02; +using AdminShellNS; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendAssetAdministrationShell + { + #region AasxPackageExplorer + + public static Tuple ToCaptionInfo(this AssetAdministrationShell assetAdministrationShell) + { + var caption = AdminShellUtil.EvalToNonNullString("\"{0}\" ", assetAdministrationShell.IdShort, "\"AAS\""); + if (assetAdministrationShell.Administration != null) + caption += "V" + assetAdministrationShell.Administration.Version + "." + assetAdministrationShell.Administration.Revision; + + var info = ""; + if (assetAdministrationShell.Id != null) + info = $"[{assetAdministrationShell.Id}]"; + return Tuple.Create(caption, info); + } + + public static IEnumerable FindAllReferences(this AssetAdministrationShell assetAdministrationShell) + { + // Asset + //TODO:jtikekar support asset + //if (assetAdministrationShell.AssetInformation != null) + // yield return new LocatedReference(assetAdministrationShell, assetAdministrationShell.AssetInformation); + + // Submodel references + if (assetAdministrationShell.Submodels != null) + foreach (var r in assetAdministrationShell.Submodels) + yield return new LocatedReference(assetAdministrationShell, r); + + } + + #endregion + + public static bool HasSubmodelReference(this AssetAdministrationShell assetAdministrationShell, Reference submodelReference) + { + if (submodelReference == null) + { + return false; + } + + foreach (var aasSubmodelReference in assetAdministrationShell.Submodels) + { + if (aasSubmodelReference.Matches(submodelReference)) + { + return true; + } + } + + return false; + } + + public static void AddSubmodelReference(this AssetAdministrationShell assetAdministrationShell, Reference newSubmodelReference) + { + if (assetAdministrationShell.Submodels == null) + { + assetAdministrationShell.Submodels = new List(); + } + + assetAdministrationShell.Submodels.Add(newSubmodelReference); + } + + //TODO:jtikekar: Change the name, currently based on older implementation + public static string GetFriendlyName(this AssetAdministrationShell assetAdministrationShell) + { + if (string.IsNullOrEmpty(assetAdministrationShell.IdShort)) + { + return null; + } + + return Regex.Replace(assetAdministrationShell.IdShort, @"[^a-zA-Z0-9\-_]", "_"); + } + + public static AssetAdministrationShell ConvertFromV10(this AssetAdministrationShell assetAdministrationShell, AasxCompatibilityModels.AdminShellV10.AdministrationShell sourceAas) + { + if (sourceAas == null) + { + return null; + } + + if (string.IsNullOrEmpty(sourceAas.idShort)) + { + assetAdministrationShell.IdShort = ""; + } + else + { + assetAdministrationShell.IdShort = sourceAas.idShort; + } + + if (sourceAas.description != null) + { + assetAdministrationShell.Description = ExtensionsUtil.ConvertDescriptionFromV10(sourceAas.description); + } + + if (sourceAas.administration != null) + { + assetAdministrationShell.Administration = new AdministrativeInformation(version: sourceAas.administration.version, revision: sourceAas.administration.revision); + } + + if (sourceAas.derivedFrom != null) + { + var key = new Key(KeyTypes.AssetAdministrationShell, sourceAas.identification.id); + assetAdministrationShell.DerivedFrom = new Reference(ReferenceTypes.ModelReference, new List() { key }); + } + + if (sourceAas.submodelRefs != null || sourceAas.submodelRefs.Count != 0) + { + foreach (var submodelRef in sourceAas.submodelRefs) + { + var keyList = new List(); + foreach (var refKey in submodelRef.Keys) + { + //keyList.Add(new Key(ExtensionsUtil.GetKeyTypeFromString(refKey.type), refKey.value)); + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {refKey.type} not found."); + } + } + if (assetAdministrationShell.Submodels == null) + { + assetAdministrationShell.Submodels = new List(); + } + assetAdministrationShell.Submodels.Add(new Reference(ReferenceTypes.ModelReference, keyList)); + } + } + + if (sourceAas.hasDataSpecification != null) + { + //TODO: jtikekar : EmbeddedDataSpecification?? (as per old implementation) + if (assetAdministrationShell.EmbeddedDataSpecifications == null) + { + assetAdministrationShell.EmbeddedDataSpecifications = new List(); + } + foreach (var dataSpecification in sourceAas.hasDataSpecification.reference) + { + assetAdministrationShell.EmbeddedDataSpecifications.Add(new EmbeddedDataSpecification( + ExtensionsUtil.ConvertReferenceFromV10(dataSpecification, ReferenceTypes.GlobalReference), + null)); + } + } + + return assetAdministrationShell; + } + + public static AssetAdministrationShell ConvertFromV20(this AssetAdministrationShell assetAdministrationShell, AasxCompatibilityModels.AdminShellV20.AdministrationShell sourceAas) + { + if (sourceAas == null) + { + return null; + } + + if (string.IsNullOrEmpty(sourceAas.idShort)) + { + assetAdministrationShell.IdShort = ""; + } + else + { + assetAdministrationShell.IdShort = sourceAas.idShort; + } + + if (sourceAas.description != null) + { + assetAdministrationShell.Description = ExtensionsUtil.ConvertDescriptionFromV20(sourceAas.description); + } + + if (sourceAas.administration != null) + { + assetAdministrationShell.Administration = new AdministrativeInformation(version: sourceAas.administration.version, revision: sourceAas.administration.revision); + } + + if (sourceAas.derivedFrom != null) + { + var key = new Key(KeyTypes.AssetAdministrationShell, sourceAas.identification.id); + assetAdministrationShell.DerivedFrom = new Reference(ReferenceTypes.ModelReference, new List() { key }); + } + + if (sourceAas.submodelRefs != null || sourceAas.submodelRefs.Count != 0) + { + foreach (var submodelRef in sourceAas.submodelRefs) + { + var keyList = new List(); + foreach (var refKey in submodelRef.Keys) + { + //keyList.Add(new Key(ExtensionsUtil.GetKeyTypeFromString(refKey.type), refKey.value)); + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {refKey.type} not found."); + } + } + if (assetAdministrationShell.Submodels == null) + { + assetAdministrationShell.Submodels = new List(); + } + assetAdministrationShell.Submodels.Add(new Reference(ReferenceTypes.ModelReference, keyList)); + } + } + + if (sourceAas.hasDataSpecification != null) + { + //TODO: jtikekar : EmbeddedDataSpecification?? (as per old implementation) + if (assetAdministrationShell.EmbeddedDataSpecifications == null) + { + assetAdministrationShell.EmbeddedDataSpecifications = new List(); + } + + //TODO: jtikekar: DataSpecificationContent?? (as per old implementation) + foreach (var sourceDataSpec in sourceAas.hasDataSpecification) + { + if (sourceDataSpec.dataSpecification != null) + { + assetAdministrationShell.EmbeddedDataSpecifications.Add( + new EmbeddedDataSpecification( + ExtensionsUtil.ConvertReferenceFromV20(sourceDataSpec.dataSpecification, ReferenceTypes.GlobalReference), + null)); + } + } + } + + return assetAdministrationShell; + } + } +} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendAssetInformation.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendAssetInformation.cs new file mode 100644 index 000000000..41fb5b0c4 --- /dev/null +++ b/src/AasxCsharpLib_bkp/Extensions/ExtendAssetInformation.cs @@ -0,0 +1,62 @@ +using AasCore.Aas3_0_RC02; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendAssetInformation + { + #region AasxPackageExplorer + + public static Tuple ToCaptionInfo(this AssetInformation assetInformation) + { + //TODO:jtikekar support KeyType.AssetInformation + //var caption = Key.AssetInformation; + var caption = "AssetInformation"; + var info = "" + assetInformation.GlobalAssetId?.ToStringExtended(); + return Tuple.Create(caption, info); + } + + #endregion + public static AssetInformation ConvertFromV10(this AssetInformation assetInformation, AasxCompatibilityModels.AdminShellV10.Asset sourceAsset) + { + //Determine AssetKind + var assetKind = AssetKind.Instance; + if (sourceAsset.kind.IsType) + { + assetKind = AssetKind.Type; + } + + assetInformation.AssetKind = assetKind; + + + //Assign GlobalAssetId + var key = new Key(KeyTypes.GlobalReference, sourceAsset.identification.id); + assetInformation.GlobalAssetId = new Reference(ReferenceTypes.GlobalReference, new List { key }); + + return assetInformation; + } + + public static AssetInformation ConvertFromV20(this AssetInformation assetInformation, AasxCompatibilityModels.AdminShellV20.Asset sourceAsset) + { + //Determine AssetKind + var assetKind = AssetKind.Instance; + if (sourceAsset.kind.IsType) + { + assetKind = AssetKind.Type; + } + + assetInformation.AssetKind = assetKind; + + + //Assign GlobalAssetId + var key = new Key(KeyTypes.GlobalReference, sourceAsset.identification.id); + assetInformation.GlobalAssetId = new Reference(ReferenceTypes.GlobalReference, new List { key }); + + return assetInformation; + } + } +} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendBlob.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendBlob.cs new file mode 100644 index 000000000..b49adce56 --- /dev/null +++ b/src/AasxCsharpLib_bkp/Extensions/ExtendBlob.cs @@ -0,0 +1,69 @@ +using AasCore.Aas3_0_RC02; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendBlob + { + public static void Set(this Blob blob, + string contentType = "", byte[]? value = null) + { + blob.ContentType = contentType; + blob.Value = value; + } + + public static Blob ConvertFromV10(this Blob blob, AasxCompatibilityModels.AdminShellV10.Blob sourceBlob) + { + blob.ContentType = sourceBlob.mimeType; + blob.Value = Encoding.ASCII.GetBytes(sourceBlob.value); + return blob; + } + + public static Blob ConvertFromV20(this Blob blob, AasxCompatibilityModels.AdminShellV20.Blob sourceBlob) + { + blob.ContentType = sourceBlob.mimeType; + blob.Value = Encoding.ASCII.GetBytes(sourceBlob.value); + return blob; + } + + public static Blob UpdateFrom(this Blob elem, ISubmodelElement source) + { + if (source == null) + return elem; + + ((ISubmodelElement)elem).UpdateFrom(source); + + if (source is Property srcProp) + { + if (srcProp.Value != null) + elem.Value = Encoding.Default.GetBytes(srcProp.Value); + } + + if (source is AasCore.Aas3_0_RC02.Range srcRng) + { + if (srcRng.Min != null) + elem.Value = Encoding.Default.GetBytes(srcRng.Min); + } + + if (source is MultiLanguageProperty srcMlp) + { + var s = srcMlp.Value?.GetDefaultString(); + if (s != null) + elem.Value = Encoding.Default.GetBytes(s); + } + + if (source is File srcFile) + { + if (srcFile.Value != null) + elem.Value = Encoding.Default.GetBytes(srcFile.Value); + } + + return elem; + } + + } +} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendConceptDescription.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendConceptDescription.cs new file mode 100644 index 000000000..c7bc38ce9 --- /dev/null +++ b/src/AasxCsharpLib_bkp/Extensions/ExtendConceptDescription.cs @@ -0,0 +1,299 @@ +using AasCore.Aas3_0_RC02; +using AasxCompatibilityModels; +using AdminShellNS; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection.Metadata; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendConceptDescription + { + #region AasxPackageExplorer + + public static string GetDefaultPreferredName(this ConceptDescription conceptDescription,string defaultLang = null) + { + return "" + + conceptDescription.GetIEC61360()? + .PreferredName?.GetDefaultString(defaultLang); + } + + public static EmbeddedDataSpecification SetIEC61360Spec(this ConceptDescription conceptDescription, + string[] preferredNames = null, + string shortName = "", + string unit = "", + Reference unitId = null, + string valueFormat = null, + string sourceOfDefinition = null, + string symbol = null, + string dataType = "", + string[] definition = null + ) + { + var eds = new EmbeddedDataSpecification( + new Reference(ReferenceTypes.GlobalReference, + new List { ExtendIDataSpecificationContent.GetKeyForIec61360() }), + new DataSpecificationIec61360( + ExtendLangStringSet.CreateManyFromStringArray(preferredNames), + new List { new LangString("EN?", shortName)}, + unit, + unitId, + sourceOfDefinition, + symbol, + Stringification.DataTypeIec61360FromString(dataType), + ExtendLangStringSet.CreateManyFromStringArray(definition) + )); + + conceptDescription.EmbeddedDataSpecifications = new List { eds }; + + // TODO (MIHO, 2022-12-22): Check, but I think it makes no sense + // conceptDescription.IsCaseOf ??= new List(); + // conceptDescription.IsCaseOf.Add(new Reference(ReferenceTypes.ModelReference, new List() { new Key(KeyTypes.ConceptDescription, conceptDescription.Id) })); + + return eds; + } + + /* + + public static DataSpecificationIec61360 CreateDataSpecWithContentIec61360(this ConceptDescription conceptDescription) + { + var eds = EmbeddedDataSpecification.CreateIEC61360WithContent(); + conceptDescription.EmbeddedDataSpecification ??= new HasDataSpecification(); + conceptDescription.EmbeddedDataSpecification.Add(eds); + return eds.DataSpecificationContent?.DataSpecificationIEC61360; + } + + */ + + public static Tuple ToCaptionInfo(this ConceptDescription conceptDescription) + { + var caption = ""; + if (!string.IsNullOrEmpty(conceptDescription.IdShort)) + caption = $"\"{conceptDescription.IdShort.Trim()}\""; + if (conceptDescription.Id != null) + caption = (caption + " " + conceptDescription.Id).Trim(); + + var info = "" + conceptDescription.GetDefaultShortName(); + + return Tuple.Create(caption, info); + } + + public static string GetDefaultShortName(this ConceptDescription conceptDescription, string defaultLang = null) + { + return "" + + conceptDescription.GetIEC61360()? + .ShortName?.GetDefaultString(defaultLang); + } + + public static DataSpecificationIec61360 GetIEC61360(this ConceptDescription conceptDescription) + { + return conceptDescription.EmbeddedDataSpecifications?.GetIEC61360Content(); + } + + public static DataSpecificationPhysicalUnit GetPhysicalUnit(this ConceptDescription conceptDescription) + { + return conceptDescription.EmbeddedDataSpecifications?.GetPhysicalUnitContent(); + } + + public static IEnumerable FindAllReferences(this ConceptDescription conceptDescription) + { + yield break; + } + + #endregion + #region ListOfConceptDescription + public static ConceptDescription AddConceptDescriptionOrReturnExisting(this List conceptDescriptions, ConceptDescription newConceptDescription) + { + if(newConceptDescription == null) + { + return null; + } + if(conceptDescriptions != null) + { + var existingCd = conceptDescriptions.Where(c => c.Id == newConceptDescription.Id).First(); + if(existingCd != null) + { + return existingCd; + } + else + { + conceptDescriptions.Add(newConceptDescription); + } + } + + return newConceptDescription; + } + #endregion + + public static void Validate(this ConceptDescription conceptDescription,AasValidationRecordList results) + { + // access + if (results == null) + return; + + // check CD itself + //Handled by BaseValidation Method + //conceptDescription.Validate(results); + + // check IEC61360 spec + + //TODO:jtikekar Temporarily Removed + //var eds61360 = this.IEC61360DataSpec; + //if (eds61360 != null) + //{ + // // check data spec + // if (eds61360.dataSpecification == null || + // !(eds61360.dataSpecification.MatchesExactlyOneKey(DataSpecificationIEC61360.GetKey()))) + // results.Add(new AasValidationRecord( + // AasValidationSeverity.SpecViolation, this, + // "HasDataSpecification: data specification content set to IEC61360, but no " + + // "data specification reference set!", + // () => + // { + // eds61360.dataSpecification = new DataSpecificationRef( + // new Reference( + // DataSpecificationIEC61360.GetKey())); + // })); + + // // validate content + // if (eds61360.dataSpecificationContent?.dataSpecificationIEC61360 == null) + // { + // results.Add(new AasValidationRecord( + // AasValidationSeverity.SpecViolation, this, + // "HasDataSpecification: data specification reference set to IEC61360, but no " + + // "data specification content set!", + // () => + // { + // eds61360.dataSpecificationContent = new DataSpecificationContent(); + // eds61360.dataSpecificationContent.dataSpecificationIEC61360 = + // new DataSpecificationIEC61360(); + // })); + // } + // else + // { + // // validate + // eds61360.dataSpecificationContent.dataSpecificationIEC61360.Validate(results, this); + // } + } + + public static Key GetSingleKey(this ConceptDescription conceptDescription) + { + return new Key(KeyTypes.ConceptDescription, conceptDescription.Id); + } + public static ConceptDescription ConvertFromV10(this ConceptDescription conceptDescription, AasxCompatibilityModels.AdminShellV10.ConceptDescription sourceConceptDescription) + { + if (sourceConceptDescription == null) + { + return null; + } + + if (string.IsNullOrEmpty(sourceConceptDescription.idShort)) + { + conceptDescription.IdShort = ""; + } + else + { + conceptDescription.IdShort = sourceConceptDescription.idShort; + } + + if (sourceConceptDescription.description != null) + { + conceptDescription.Description = ExtensionsUtil.ConvertDescriptionFromV10(sourceConceptDescription.description); + } + + if (sourceConceptDescription.administration != null) + { + conceptDescription.Administration = new AdministrativeInformation(version: sourceConceptDescription.administration.version, revision: sourceConceptDescription.administration.revision); + } + + if (sourceConceptDescription.IsCaseOf != null && sourceConceptDescription.IsCaseOf.Count != 0) + { + if (conceptDescription.IsCaseOf == null) + { + conceptDescription.IsCaseOf = new List(); + } + foreach (var caseOf in sourceConceptDescription.IsCaseOf) + { + conceptDescription.IsCaseOf.Add(ExtensionsUtil.ConvertReferenceFromV10(caseOf, ReferenceTypes.ModelReference)); + } + } + + return conceptDescription; + } + + public static ConceptDescription ConvertFromV20(this ConceptDescription cd, AasxCompatibilityModels.AdminShellV20.ConceptDescription srcCD) + { + if (srcCD == null) + return null; + + if (string.IsNullOrEmpty(srcCD.idShort)) + cd.IdShort = ""; + else + cd.IdShort = srcCD.idShort; + + if (srcCD.identification?.id != null) + cd.Id = srcCD.identification.id; + + if (srcCD.description != null) + cd.Description = ExtensionsUtil.ConvertDescriptionFromV20(srcCD.description); + + if (srcCD.administration != null) + cd.Administration = new AdministrativeInformation( + version: srcCD.administration.version, revision: srcCD.administration.revision); + + if (srcCD.IsCaseOf != null && srcCD.IsCaseOf.Count != 0) + { + if (cd.IsCaseOf == null) + { + cd.IsCaseOf = new List(); + } + foreach (var caseOf in srcCD.IsCaseOf) + { + cd.IsCaseOf.Add(ExtensionsUtil.ConvertReferenceFromV20(caseOf, ReferenceTypes.ModelReference)); + } + } + + //jtikekar:as per old implementation + if(srcCD.embeddedDataSpecification != null) + { + foreach (var sourceEsd in srcCD.embeddedDataSpecification) + { + var esd = new EmbeddedDataSpecification(null, null); + esd.ConvertFromV20(sourceEsd); + cd.AddEmbeddedDataSpecification(esd); + } + } + + return cd; + } + + public static EmbeddedDataSpecification AddEmbeddedDataSpecification(this ConceptDescription cd, EmbeddedDataSpecification eds) + { + if (cd == null) + return null; + if (cd.EmbeddedDataSpecifications == null) + cd.EmbeddedDataSpecifications = new List(); + if (eds == null) + return null; + cd.EmbeddedDataSpecifications.Add(eds); + return eds; + } + + public static Reference GetCdReference(this ConceptDescription conceptDescription) + { + var key = new Key(KeyTypes.ConceptDescription, conceptDescription.Id); + return new Reference(ReferenceTypes.ModelReference, new List { key }); + } + + public static void AddIsCaseOf(this ConceptDescription cd, + Reference ico) + { + if (cd.IsCaseOf == null) + cd.IsCaseOf = new List(); + cd.IsCaseOf.Add(ico); + } + } +} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendDataElement.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendDataElement.cs new file mode 100644 index 000000000..299e3b350 --- /dev/null +++ b/src/AasxCsharpLib_bkp/Extensions/ExtendDataElement.cs @@ -0,0 +1,19 @@ +using AasCore.Aas3_0_RC02; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendDataElement + { + public static DataTypeDefXsd[] ValueTypes_Number = + new[] { DataTypeDefXsd.Decimal, DataTypeDefXsd.Double, DataTypeDefXsd.Float, + DataTypeDefXsd.Integer, DataTypeDefXsd.Long, DataTypeDefXsd.Int, DataTypeDefXsd.Short, + DataTypeDefXsd.Byte, DataTypeDefXsd.NonNegativeInteger, DataTypeDefXsd.NonPositiveInteger, + DataTypeDefXsd.UnsignedInt, DataTypeDefXsd.Integer, DataTypeDefXsd.UnsignedByte, + DataTypeDefXsd.UnsignedLong, DataTypeDefXsd.UnsignedShort, DataTypeDefXsd.NegativeInteger }; + } +} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendDataSpecificationIEC61360.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendDataSpecificationIEC61360.cs new file mode 100644 index 000000000..28da474ba --- /dev/null +++ b/src/AasxCsharpLib_bkp/Extensions/ExtendDataSpecificationIEC61360.cs @@ -0,0 +1,40 @@ +using AasCore.Aas3_0_RC02; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendDataSpecificationIEC61360 + { + public static DataSpecificationIec61360 ConvertFromV20(this DataSpecificationIec61360 ds61360, AasxCompatibilityModels.AdminShellV20.DataSpecificationIEC61360 src616360) + { + if (src616360.preferredName != null) + ds61360.PreferredName = new List().ConvertFromV20(src616360.preferredName); + + if (src616360.shortName != null) + ds61360.ShortName = new List().ConvertFromV20(src616360.shortName); + + ds61360.Unit = src616360.unit; + if (src616360.unitId != null) + ds61360.UnitId = ExtensionsUtil.ConvertReferenceFromV20(AasxCompatibilityModels.AdminShellV20.Reference.CreateNew(src616360.unitId.keys), ReferenceTypes.GlobalReference); + + ds61360.ValueFormat = src616360.valueFormat; + ds61360.SourceOfDefinition = src616360.sourceOfDefinition; + ds61360.Symbol = src616360.symbol; + if (!(string.IsNullOrEmpty(src616360.dataType))) + { + var dt = src616360.dataType; + if (!dt.StartsWith("xs:")) + dt = "xs:" + dt; + ds61360.DataType = Stringification.DataTypeIec61360FromString(dt); + } + if (src616360.definition != null) + ds61360.Definition = new List().ConvertFromV20(src616360.definition); + + return ds61360; + } + } +} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendEmbeddedDataSpecification.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendEmbeddedDataSpecification.cs new file mode 100644 index 000000000..e89dd5ad5 --- /dev/null +++ b/src/AasxCsharpLib_bkp/Extensions/ExtendEmbeddedDataSpecification.cs @@ -0,0 +1,108 @@ +using AasCore.Aas3_0_RC02; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +// using DataSpecificationContent = HasDataSpecification.DataSpecificationContent; + +namespace Extensions +{ + // TODO (Jui, 2022-12-21): I do not know, if to put the List<> extension here or in a separate file + public static class ExtendListOfEmbeddedDataSpecification + { + + + public static EmbeddedDataSpecification FindFirstIEC61360Spec(this List list) + { + foreach (var eds in list) + if (eds?.DataSpecificationContent is DataSpecificationIec61360 + || eds?.DataSpecification?.MatchesExactlyOneKey( + ExtendIDataSpecificationContent.GetKeyForIec61360()) == true) + return eds; + return null; + } + + public static DataSpecificationIec61360 GetIEC61360Content(this List list) + { + foreach (var eds in list) + if (eds?.DataSpecificationContent is DataSpecificationIec61360 dsiec) + return dsiec; + return null; + } + + public static DataSpecificationPhysicalUnit GetPhysicalUnitContent(this List list) + { + foreach (var eds in list) + if (eds?.DataSpecificationContent is DataSpecificationPhysicalUnit dspu) + return dspu; + return null; + } + } + + public static class ExtendEmbeddedDataSpecification + { + public static EmbeddedDataSpecification ConvertFromV20(this EmbeddedDataSpecification embeddedDataSpecification, AasxCompatibilityModels.AdminShellV20.EmbeddedDataSpecification sourceEmbeddedSpec) + { + if(sourceEmbeddedSpec != null) + { + embeddedDataSpecification.DataSpecification = ExtensionsUtil.ConvertReferenceFromV20(sourceEmbeddedSpec.dataSpecification, ReferenceTypes.GlobalReference); + + // TODO (MIHO, 2022-19-12): check again, see questions + var o2id = "http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360"; + var oldid = "http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/2/0"; + var newid = "http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"; + + if (sourceEmbeddedSpec.dataSpecification?.Matches("", false, "IRI", oldid, + AasxCompatibilityModels.AdminShellV20.Key.MatchMode.Identification) == true) + { + embeddedDataSpecification.DataSpecification.Keys[0].Value = newid; + } + + if (sourceEmbeddedSpec.dataSpecification?.Matches("", false, "IRI", o2id, + AasxCompatibilityModels.AdminShellV20.Key.MatchMode.Identification) == true) + { + embeddedDataSpecification.DataSpecification.Keys[0].Value = newid; + } + } + + if(sourceEmbeddedSpec.dataSpecificationContent?.dataSpecificationIEC61360 != null) + { + embeddedDataSpecification.DataSpecificationContent = + new DataSpecificationIec61360(null).ConvertFromV20( + sourceEmbeddedSpec.dataSpecificationContent.dataSpecificationIEC61360); + } + return embeddedDataSpecification; + } + + public static EmbeddedDataSpecification CreateIec61360WithContent(DataSpecificationIec61360 content = null) + { + if (content == null) + content = new DataSpecificationIec61360(null); + + var res = new EmbeddedDataSpecification( + new Reference(ReferenceTypes.GlobalReference, + new List( new[] { ExtendIDataSpecificationContent.GetKeyForIec61360() })), + content); + return res; + } + + public static bool FixReferenceWrtContent(this EmbeddedDataSpecification eds) + { + // does content tell something? + var ctc = ExtendIDataSpecificationContent.GuessContentTypeFor(eds?.DataSpecificationContent); + var ctr = ExtendIDataSpecificationContent.GuessContentTypeFor(eds?.DataSpecification); + + if (ctc == ExtendIDataSpecificationContent.ContentTypes.NoInfo) + return false; + + if (ctr == ctc) + return false; + + // ok, fix + eds.DataSpecification = new Reference(ReferenceTypes.GlobalReference, + new List { ExtendIDataSpecificationContent.GetKeyFor(ctc) }); + return true; + } + } +} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendEntity.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendEntity.cs new file mode 100644 index 000000000..4b520e1cf --- /dev/null +++ b/src/AasxCsharpLib_bkp/Extensions/ExtendEntity.cs @@ -0,0 +1,108 @@ +using AasCore.Aas3_0_RC02; +using AdminShellNS.Display; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendEntity + { + #region AasxPackageExplorer + + public static void Add(this Entity entity, ISubmodelElement submodelElement) + { + if (entity != null) + { + entity.Statements ??= new(); + + submodelElement.Parent = entity; + + entity.Statements.Add(submodelElement); + } + } + + public static void Remove(this Entity entity, ISubmodelElement submodelElement) + { + if(entity != null) + { + if(entity.Statements != null) + { + entity.Statements.Remove(submodelElement); + } + } + } + + public static object AddChild(this Entity entity, ISubmodelElement childSubmodelElement, EnumerationPlacmentBase placement = null) + { + if (childSubmodelElement == null) + return null; + if (entity.Statements == null) + entity.Statements = new (); + if (childSubmodelElement != null) + childSubmodelElement.Parent = entity; + entity.Statements.Add(childSubmodelElement); + return childSubmodelElement; + } + + #endregion + public static Entity ConvertFromV20(this Entity entity, AasxCompatibilityModels.AdminShellV20.Entity sourceEntity) + { + if (sourceEntity == null) + { + return null; + } + + if (sourceEntity.statements != null) + { + entity.Statements ??= new List(); + foreach (var submodelElementWrapper in sourceEntity.statements) + { + var sourceSubmodelElement = submodelElementWrapper.submodelElement; + ISubmodelElement outputSubmodelElement = null; + if (sourceSubmodelElement != null) + { + outputSubmodelElement = outputSubmodelElement.ConvertFromV20(sourceSubmodelElement); + } + entity.Statements.Add(outputSubmodelElement); + } + } + + if (sourceEntity.assetRef != null) + { + //TODO:jtikekar whether to convert to Global or specific asset id + var assetRef = ExtensionsUtil.ConvertReferenceFromV20(sourceEntity.assetRef, ReferenceTypes.GlobalReference); + entity.GlobalAssetId = assetRef; + } + + return entity; + } + + public static T FindFirstIdShortAs(this Entity entity, string idShort) where T : ISubmodelElement + { + + var submodelElements = entity.Statements.Where(sme => (sme != null) && (sme is T) && sme.IdShort.Equals(idShort, StringComparison.OrdinalIgnoreCase)); + + if (submodelElements.Any()) + { + return (T)submodelElements.First(); + } + + return default; + } + + public static T CreateSMEForCD( + this Entity ent, + ConceptDescription conceptDescription, string category = null, string idShort = null, + string idxTemplate = null, int maxNum = 999, bool addSme = false, bool isTemplate = false) + where T : ISubmodelElement + { + if (ent.Statements == null) + ent.Statements = new List(); + return ent.Statements.CreateSMEForCD( + conceptDescription, category, idShort, idxTemplate, maxNum, addSme, isTemplate); + } + } +} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendEnvironment.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendEnvironment.cs new file mode 100644 index 000000000..1dc5111e5 --- /dev/null +++ b/src/AasxCsharpLib_bkp/Extensions/ExtendEnvironment.cs @@ -0,0 +1,1052 @@ +using AasCore.Aas3_0_RC02; +using Extensions; +using AdminShellNS; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Runtime.CompilerServices; + +namespace Extensions +{ + public static class ExtendEnvironment + { + #region Environment + + #region AasxPackageExplorer + + public static void RecurseOnReferables(this AasCore.Aas3_0_RC02.Environment environment, + object state, Func, IReferable, bool> lambda, bool includeThis = false) + { + // includeThis does not make sense, as no Referable + // just use the others + foreach (var idf in environment.FindAllReferable(onlyIdentifiables: true)) + idf?.RecurseOnReferables(state, lambda, includeThis); + } + + #endregion + + public static AasValidationRecordList ValidateAll(this AasCore.Aas3_0_RC02.Environment environment) + { + // collect results + var results = new AasValidationRecordList(); + + // all entities + foreach (var rf in environment.FindAllReferable()) + rf.Validate(results); + + // give back + return results; + } + + public static int AutoFix(this AasCore.Aas3_0_RC02.Environment environment, IEnumerable records) + { + // access + if (records == null) + return -1; + + // collect Referables (expensive safety measure) + var allowedReferables = environment.FindAllReferable().ToList(); + + // go thru records + int res = 0; + foreach (var rec in records) + { + // access + if (rec == null || rec.Fix == null || rec.Source == null) + continue; + + // minimal safety measure + if (!allowedReferables.Contains(rec.Source)) + continue; + + // apply fix + res++; + try + { + rec.Fix.Invoke(); + } + catch + { + res--; + } + } + + // return number of applied fixes + return res; + } + + public static IEnumerable FindAllReferable(this AasCore.Aas3_0_RC02.Environment environment, bool onlyIdentifiables = false) + { + if (environment.AssetAdministrationShells != null) + foreach (var aas in environment.AssetAdministrationShells) + if (aas != null) + { + // AAS itself + yield return aas; + } + + if (environment.Submodels != null) + foreach (var sm in environment.Submodels) + if (sm != null) + { + yield return sm; + + if (!onlyIdentifiables) + { + // TODO (MIHO, 2020-08-26): not very elegant, yet. Avoid temporary collection + var allsme = new List(); + sm.RecurseOnSubmodelElements(null, (state, parents, sme) => + { + allsme.Add(sme); return true; + }); + foreach (var sme in allsme) + yield return sme; + } + } + + if (environment.ConceptDescriptions != null) + foreach (var cd in environment.ConceptDescriptions) + if (cd != null) + yield return cd; + } + +#if !DoNotUseAasxCompatibilityModels + + public static AasCore.Aas3_0_RC02.Environment ConvertFromV10(this AasCore.Aas3_0_RC02.Environment environment, AasxCompatibilityModels.AdminShellV10.AdministrationShellEnv sourceEnvironement) + { + //Convert Administration Shells + if (sourceEnvironement.AdministrationShells != null) + { + if (environment.AssetAdministrationShells == null) + { + environment.AssetAdministrationShells = new List(); + } + foreach (var sourceAas in sourceEnvironement.AdministrationShells) + { + var sourceAsset = sourceEnvironement?.FindAsset(sourceAas.assetRef); + if (sourceAsset != null) + { + var newAssetInformation = new AssetInformation(AssetKind.Instance); + newAssetInformation = newAssetInformation.ConvertFromV10(sourceAsset); + + var newAas = new AssetAdministrationShell(id: sourceAas.identification.id, newAssetInformation); + newAas = newAas.ConvertFromV10(sourceAas); + + environment.AssetAdministrationShells.Add(newAas); + } + + } + } + + //Convert Submodels + if (sourceEnvironement.Submodels != null) + { + if (environment.Submodels == null) + { + environment.Submodels = new List(); + } + foreach (var sourceSubmodel in sourceEnvironement.Submodels) + { + var newSubmodel = new Submodel(sourceSubmodel.identification.id); + newSubmodel = newSubmodel.ConvertFromV10(sourceSubmodel); + environment.Submodels.Add(newSubmodel); + } + } + + if (sourceEnvironement.ConceptDescriptions != null) + { + if (environment.ConceptDescriptions == null) + { + environment.ConceptDescriptions = new List(); + } + foreach (var sourceConceptDescription in sourceEnvironement.ConceptDescriptions) + { + var newConceptDescription = new ConceptDescription(sourceConceptDescription.identification.id); + newConceptDescription = newConceptDescription.ConvertFromV10(sourceConceptDescription); + environment.ConceptDescriptions.Add(newConceptDescription); + } + } + + return environment; + } + + + public static AasCore.Aas3_0_RC02.Environment ConvertFromV20(this AasCore.Aas3_0_RC02.Environment environment, AasxCompatibilityModels.AdminShellV20.AdministrationShellEnv sourceEnvironement) + { + //Convert Administration Shells + if (sourceEnvironement.AdministrationShells != null) + { + if (environment.AssetAdministrationShells == null) + { + environment.AssetAdministrationShells = new List(); + } + foreach (var sourceAas in sourceEnvironement.AdministrationShells) + { + // first make the AAS + var newAas = new AssetAdministrationShell(id: sourceAas.identification.id, null); + newAas = newAas.ConvertFromV20(sourceAas); + environment.AssetAdministrationShells.Add(newAas); + + var sourceAsset = sourceEnvironement?.FindAsset(sourceAas.assetRef); + if (sourceAsset != null) + { + var newAssetInformation = new AssetInformation(AssetKind.Instance); + newAssetInformation = newAssetInformation.ConvertFromV20(sourceAsset); + newAas.AssetInformation = newAssetInformation; + } + + } + } + + //Convert Submodels + if (sourceEnvironement.Submodels != null) + { + if (environment.Submodels == null) + { + environment.Submodels = new List(); + } + foreach (var sourceSubmodel in sourceEnvironement.Submodels) + { + var newSubmodel = new Submodel(sourceSubmodel.identification.id); + newSubmodel = newSubmodel.ConvertFromV20(sourceSubmodel); + environment.Submodels.Add(newSubmodel); + } + } + + if (sourceEnvironement.ConceptDescriptions != null) + { + if (environment.ConceptDescriptions == null) + { + environment.ConceptDescriptions = new List(); + } + foreach (var sourceConceptDescription in sourceEnvironement.ConceptDescriptions) + { + var newConceptDescription = new ConceptDescription(sourceConceptDescription.identification.id); + newConceptDescription = newConceptDescription.ConvertFromV20(sourceConceptDescription); + environment.ConceptDescriptions.Add(newConceptDescription); + } + } + + return environment; + } + +#endif + + //TODO:jtikekar to test + public static AasCore.Aas3_0_RC02.Environment CreateFromExistingEnvironment(this AasCore.Aas3_0_RC02.Environment environment, AasCore.Aas3_0_RC02.Environment sourceEnvironment, List filterForAas = null, List filterForAssets = null, List filterForSubmodel = null, List filterForConceptDescriptions = null) + { + if (filterForAas == null) + { + filterForAas = new List(); + } + + if (filterForAssets == null) + { + filterForAssets = new List(); + } + + if (filterForSubmodel == null) + { + filterForSubmodel = new List(); + } + + if (filterForConceptDescriptions == null) + { + filterForConceptDescriptions = new List(); + } + + //var outputEnvironment = new AasCore.Aas3_0_RC02.Environment(); + + //Copy AssetAdministrationShells + foreach (var aas in sourceEnvironment.AssetAdministrationShells) + { + if (filterForAas.Contains(aas)) + { + environment.AssetAdministrationShells.Add(aas); + + if (aas.Submodels != null && aas.Submodels.Count > 0) + { + foreach (var submodelReference in aas.Submodels) + { + var submodel = sourceEnvironment.FindSubmodel(submodelReference); + if (submodel != null) + { + filterForSubmodel.Add(submodel); + } + } + } + } + } + + //Copy Submodel + foreach (var submodel in sourceEnvironment.Submodels) + { + if (filterForSubmodel.Contains(submodel)) + { + environment.Submodels.Add(submodel); + + //Find Used CDs + environment.CreateFromExistingEnvRecurseForCDs(sourceEnvironment, submodel.SubmodelElements, ref filterForConceptDescriptions); + } + } + + //Copy ConceptDescription + foreach (var conceptDescription in sourceEnvironment.ConceptDescriptions) + { + if (filterForConceptDescriptions.Contains(conceptDescription)) + { + environment.ConceptDescriptions.Add(conceptDescription); + } + } + + return environment; + + } + + public static void CreateFromExistingEnvRecurseForCDs(this AasCore.Aas3_0_RC02.Environment environment, AasCore.Aas3_0_RC02.Environment sourceEnvironment, List submodelElements, ref List filterForConceptDescription) + { + if (submodelElements == null || submodelElements.Count == 0 || filterForConceptDescription == null || filterForConceptDescription.Count == 0) + { + return; + } + + foreach (var submodelElement in submodelElements) + { + if (submodelElement == null) + { + return; + } + + if (submodelElement.SemanticId != null) + { + var conceptDescription = sourceEnvironment.FindConceptDescriptionByReference(submodelElement.SemanticId); + if (conceptDescription != null) + { + filterForConceptDescription.Add(conceptDescription); + } + } + + if (submodelElement is SubmodelElementCollection smeColl) + { + environment.CreateFromExistingEnvRecurseForCDs(sourceEnvironment, smeColl.Value, ref filterForConceptDescription); + } + + if (submodelElement is SubmodelElementList smeList) + { + environment.CreateFromExistingEnvRecurseForCDs(sourceEnvironment, smeList.Value, ref filterForConceptDescription); + } + + if (submodelElement is Entity entity) + { + environment.CreateFromExistingEnvRecurseForCDs(sourceEnvironment, entity.Statements, ref filterForConceptDescription); + } + + if (submodelElement is AnnotatedRelationshipElement annotatedRelationshipElement) + { + var annotedELements = new List(); + foreach (var annotation in annotatedRelationshipElement.Annotations) + { + annotedELements.Add(annotation); + } + environment.CreateFromExistingEnvRecurseForCDs(sourceEnvironment, annotedELements, ref filterForConceptDescription); + } + + if (submodelElement is Operation operation) + { + var operationELements = new List(); + foreach (var inputVariable in operation.InputVariables) + { + operationELements.Add(inputVariable.Value); + } + + foreach (var outputVariable in operation.OutputVariables) + { + operationELements.Add(outputVariable.Value); + } + + foreach (var inOutVariable in operation.InoutputVariables) + { + operationELements.Add(inOutVariable.Value); + } + + environment.CreateFromExistingEnvRecurseForCDs(sourceEnvironment, operationELements, ref filterForConceptDescription); + + } + } + } + + public static ConceptDescription Add(this AasCore.Aas3_0_RC02.Environment env, ConceptDescription cd) + { + if (cd == null) + return null; + if (env.ConceptDescriptions == null) + env.ConceptDescriptions = new(); + env.ConceptDescriptions.Add(cd); + return cd; + } + + public static Submodel Add(this AasCore.Aas3_0_RC02.Environment env, Submodel sm) + { + if (sm == null) + return null; + if (env.Submodels == null) + env.Submodels = new(); + env.Submodels.Add(sm); + return sm; + } + + public static AssetAdministrationShell Add(this AasCore.Aas3_0_RC02.Environment env, AssetAdministrationShell aas) + { + if (aas == null) + return null; + if (env.AssetAdministrationShells == null) + env.AssetAdministrationShells = new(); + env.AssetAdministrationShells.Add(aas); + return aas; + } + + //public static JsonWriter SerialiazeJsonToStream(this AasCore.Aas3_0_RC02.Environment environment, StreamWriter streamWriter, bool leaveJsonWriterOpen = false) + //{ + // streamWriter.AutoFlush = true; + + // JsonSerializer serializer = new JsonSerializer() + // { + // NullValueHandling = NullValueHandling.Ignore, + // ReferenceLoopHandling = ReferenceLoopHandling.Serialize, + // Formatting = Newtonsoft.Json.Formatting.Indented + // }; + + // JsonWriter writer = new JsonTextWriter(streamWriter); + // serializer.Serialize(writer, environment); + // if (leaveJsonWriterOpen) + // return writer; + // writer.Close(); + // return null; + //} + + + #endregion + + #region Submodel Queries + + public static IEnumerable FindAllSubmodelGroupedByAAS(this AasCore.Aas3_0_RC02.Environment environment, Func p = null) + { + if (environment.AssetAdministrationShells == null || environment.Submodels == null) + yield break; + foreach (var aas in environment.AssetAdministrationShells) + { + if (aas?.Submodels == null) + continue; + foreach (var smref in aas.Submodels) + { + var sm = environment.FindSubmodel(smref); + if (sm != null && (p == null || p(aas, sm))) + yield return sm; + } + } + } + public static Submodel FindSubmodel(this AasCore.Aas3_0_RC02.Environment environment, Reference submodelReference) + { + if (submodelReference == null) + { + return null; + } + + if (submodelReference.Keys.Count != 1) // Can have only one reference key + { + return null; + } + + var key = submodelReference.Keys[0]; + if (key.Type != KeyTypes.Submodel) + { + return null; + } + + var submodels = environment.Submodels.Where(s => s.Id.Equals(key.Value, StringComparison.OrdinalIgnoreCase)); + if (submodels.Any()) + { + return submodels.First(); + } + + return null; + } + + public static Submodel FindSubmodelById(this AasCore.Aas3_0_RC02.Environment environment, string submodelId) + { + if (string.IsNullOrEmpty(submodelId)) + { + return null; + } + + var submodels = environment.Submodels.Where(s => s.Id.Equals(submodelId)); + if (submodels.Any()) + { + return submodels.First(); + } + + return null; + } + + public static IEnumerable FindAllSubmodelsGroupedByAAS(this AasCore.Aas3_0_RC02.Environment environment, Func p = null) + { + if (environment.AssetAdministrationShells == null || environment.Submodels == null) + yield break; + foreach (var aas in environment.AssetAdministrationShells) + { + if (aas?.Submodels == null) + continue; + foreach (var submodelReference in aas.Submodels) + { + var submodel = environment.FindSubmodel(submodelReference); + if (submodel != null && (p == null || p(aas, submodel))) + yield return submodel; + } + } + } + + public static IEnumerable FindAllSubmodelBySemanticId(this AasCore.Aas3_0_RC02.Environment environment, string semanticId) + { + if (semanticId == null) + yield break; + + foreach (var submodel in environment.Submodels) + if (true == submodel.SemanticId?.Matches(semanticId)) + yield return submodel; + } + + #endregion + + #region AssetAdministrationShell Queries + public static AssetAdministrationShell FindAasWithSubmodelId(this AasCore.Aas3_0_RC02.Environment environment, string submodelId) + { + if (submodelId == null) + { + return null; + } + + var aas = environment.AssetAdministrationShells.Where(a => (a.Submodels?.Where(s => s.Matches(submodelId)).First()) != null).First(); + + return aas; + } + + public static AssetAdministrationShell FindAasById(this AasCore.Aas3_0_RC02.Environment environment, string aasId) + { + if (string.IsNullOrEmpty(aasId)) + { + return null; + } + + var aas = environment.AssetAdministrationShells.Where(a => a.Id.Equals(aasId)).First(); + + return aas; + } + + #endregion + + #region ConceptDescription Queries + + public static ConceptDescription FindConceptDescriptionById( + this AasCore.Aas3_0_RC02.Environment env, string cdId) + { + if (string.IsNullOrEmpty(cdId)) + return null; + + var conceptDescription = env.ConceptDescriptions.Where(c => c.Id.Equals(cdId)).FirstOrDefault(); + return conceptDescription; + } + + public static ConceptDescription FindConceptDescriptionByReference( + this AasCore.Aas3_0_RC02.Environment env, Reference rf) + { + if (rf == null) + return null; + + return env.FindConceptDescriptionById(rf.GetAsIdentifier()); + } + + #endregion + + #region Referable Queries + + /// + /// Result of FindReferable in Environment + /// + public class ReferableRootInfo + { + public AssetAdministrationShell AAS = null; + public AssetInformation Asset = null; + public Submodel Submodel = null; + public ConceptDescription CD = null; + + public int NrOfRootKeys = 0; + + public bool IsValid + { + get + { + return NrOfRootKeys > 0 && (AAS != null || Submodel != null || Asset != null); + } + } + } + + //TODO: jtikekar Need to test + public static IReferable FindReferableByReference( + this AasCore.Aas3_0_RC02.Environment environment, + Reference reference, + int keyIndex = 0, + List submodelElementList = null, + ReferableRootInfo rootInfo = null) + { + // access + var keyList = reference?.Keys; + if (keyList == null || keyList.Count == 0 || keyIndex >= keyList.Count) + return null; + + // shortcuts + var firstKeyType = keyList[keyIndex].Type; + var firstKeyId = keyList[keyIndex].Value; + + // different pathes + switch (firstKeyType) + { + case KeyTypes.AssetAdministrationShell: + { + var aas = environment.FindAasById(firstKeyId); + + // side info? + if (rootInfo != null) + { + rootInfo.AAS = aas; + rootInfo.NrOfRootKeys = 1 + keyIndex; + } + + //Not found or already at the end of our search + if (aas == null || keyIndex >= keyList.Count - 1) + { + return aas; + } + + return environment.FindReferableByReference(reference, ++keyIndex); + } + + // TODO (MIHO, 2023-01-01): stupid generalization :-( + case KeyTypes.GlobalReference: + case KeyTypes.ConceptDescription: + { + // In meta model V3, multiple important things might by identified + // by a flat GlobalReference :-( + + // find an Asset by that id? + var keyedAas = environment.FindAasWithAssetInformation(firstKeyId); + if (keyedAas?.AssetInformation != null) + { + // found an Asset + + // side info? + if (rootInfo != null) + { + rootInfo.AAS = keyedAas; + rootInfo.Asset = keyedAas?.AssetInformation; + rootInfo.NrOfRootKeys = 1 + keyIndex; + } + + // give back the AAS + return keyedAas; + } + + // Concept?Description + var keyedCd = environment.FindConceptDescriptionById(firstKeyId); + if (keyedCd != null) + { + // side info? + if (rootInfo != null) + { + rootInfo.CD = keyedCd; + rootInfo.NrOfRootKeys = 1 + keyIndex; + } + + // give back the CD + return keyedCd; + } + + // Nope + return null; + } + + case KeyTypes.Submodel: + { + var submodel = environment.FindSubmodelById(firstKeyId); + // No? + if (submodel == null) + return null; + + // notice in side info + if (rootInfo != null) + { + rootInfo.Submodel = submodel; + rootInfo.NrOfRootKeys = 1 + keyIndex; + + // add even more info + if (rootInfo.AAS == null) + { + foreach (var aas2 in environment.AssetAdministrationShells) + { + var smref2 = environment.FindSubmodelById(submodel.Id); + if (smref2 != null) + { + rootInfo.AAS = aas2; + break; + } + } + } + } + + // at the end of the journey? + if (keyIndex >= keyList.Count - 1) + return submodel; + + return environment.FindReferableByReference(reference, ++keyIndex, submodel.SubmodelElements); + } + } + + if (firstKeyType.IsSME() && submodelElementList != null) + { + var submodelElement = submodelElementList.Where( + sme => sme.IdShort.Equals(keyList[keyIndex].Value, + StringComparison.OrdinalIgnoreCase)).First(); + + //This is required element + if (keyIndex + 1 >= keyList.Count) + { + return submodelElement; + } + + //Recurse again + if (submodelElement != null && submodelElement is SubmodelElementCollection smeColl) + { + return environment.FindReferableByReference(reference, ++keyIndex, smeColl.Value); + } + + if (submodelElement != null && submodelElement is SubmodelElementList smeList) + { + return environment.FindReferableByReference(reference, ++keyIndex, smeList.Value); + } + } + + //Nothing in this environment + return null; + } + + #endregion + + #region AasxPackageExplorer + + public static IEnumerable FindAllSubmodelElements(this AasCore.Aas3_0_RC02.Environment environment, + Predicate match = null, AssetAdministrationShell onlyForAAS = null) where T : ISubmodelElement + { + // more or less two different schemes + if (onlyForAAS != null) + { + if (onlyForAAS.Submodels == null) + yield break; + foreach (var smr in onlyForAAS.Submodels) + { + var sm = environment.FindSubmodel(smr); + if (sm?.SubmodelElements != null) + foreach (var x in sm.SubmodelElements.FindDeep(match)) + yield return x; + } + } + else + { + if (environment.Submodels != null) + foreach (var sm in environment.Submodels) + if (sm?.SubmodelElements != null) + foreach (var x in sm.SubmodelElements.FindDeep(match)) + yield return x; + } + } + + public static IEnumerable FindAllReferences(this AasCore.Aas3_0_RC02.Environment environment) + { + if (environment.AssetAdministrationShells != null) + foreach (var aas in environment.AssetAdministrationShells) + if (aas != null) + foreach (var r in aas.FindAllReferences()) + yield return r; + + //if (this.Assets != null) + // foreach (var asset in this.Assets) + // if (asset != null) + // foreach (var r in asset.FindAllReferences()) + // yield return new LocatedReference(asset, r); + + if (environment.Submodels != null) + foreach (var sm in environment.Submodels) + if (sm != null) + foreach (var r in sm.FindAllReferences()) + yield return r; + + if (environment.ConceptDescriptions != null) + foreach (var cd in environment.ConceptDescriptions) + if (cd != null) + foreach (var r in cd.FindAllReferences()) + yield return new LocatedReference(cd, r); + } + + /// + /// Tries renaming an Identifiable, specifically: the identification of an Identifiable and + /// all references to it. + /// Currently supported: ConceptDescriptions + /// Returns a list of Referables, which were changed or null in case of error + /// + public static List RenameIdentifiable(this AasCore.Aas3_0_RC02.Environment environment, string oldId, string newId) + where T : IClass + { + // access + if (oldId == null || newId == null || oldId.Equals(newId)) + return null; + + var res = new List(); + + if (typeof(T) == typeof(ConceptDescription)) + { + // check, if exist or not exist + var cdOld = environment.FindConceptDescriptionById(oldId); + if (cdOld == null || environment.FindConceptDescriptionById(newId) != null) + return null; + + // rename old cd + cdOld.Id = newId; + res.Add(cdOld); + + // search all SMEs referring to this CD + foreach (var sme in environment.FindAllSubmodelElements(match: (s) => + { + return (s != null && s.SemanticId != null && s.SemanticId.Matches(oldId)); + })) + { + sme.SemanticId.Keys[0].Value = newId; + res.Add(sme); + } + + // seems fine + return res; + } + else + if (typeof(T) == typeof(Submodel)) + { + // check, if exist or not exist + var smOld = environment.FindSubmodelById(oldId); + if (smOld == null || environment.FindSubmodelById(newId) != null) + return null; + + // recurse all possible Referenes in the aas env + foreach (var lr in environment.FindAllReferences()) + { + var r = lr?.Reference; + if (r != null) + for (int i = 0; i < r.Keys.Count; i++) + if (r.Keys[i].Matches(KeyTypes.Submodel, oldId, MatchMode.Relaxed)) + { + // directly replace + r.Keys[i].Value = newId; + if (res.Contains(lr.Identifiable)) + res.Add(lr.Identifiable); + } + } + + // rename old Submodel + smOld.Id = newId; + + // seems fine + return res; + } + else + if (typeof(T) == typeof(AssetAdministrationShell)) + { + // check, if exist or not exist + var aasOld = environment.FindAasById(oldId); + if (aasOld == null || environment.FindAasById(newId) != null) + return null; + + // recurse? -> no? + + // rename old Asset + aasOld.Id = newId; + + // seems fine + return res; + } + else + //TODO:jtikekar support asset + if (typeof(T) == typeof(AssetInformation)) + { + // check, if exist or not exist + var assetOld = environment.FindAasWithAssetInformation(oldId); + if (assetOld == null || environment.FindAasWithAssetInformation(newId) != null) + return null; + + // recurse all possible Referenes in the aas env + foreach (var lr in environment.FindAllReferences()) + { + var r = lr?.Reference; + if (r != null) + for (int i = 0; i < r.Keys.Count; i++) + if (r.Keys[i].Matches(KeyTypes.GlobalReference, oldId)) + { + // directly replace + r.Keys[i].Value = newId; + if (res.Contains(lr.Identifiable)) + res.Add(lr.Identifiable); + } + } + + // rename old Asset + assetOld.AssetInformation.GlobalAssetId = new Reference(ReferenceTypes.GlobalReference, new List() { new Key(KeyTypes.GlobalReference, newId)}); + + // seems fine + return res; + } + + // no result is false, as well + return null; + } + + public static AssetAdministrationShell FindAasWithAssetInformation(this AasCore.Aas3_0_RC02.Environment environment, string globalAssetId) + { + if(string.IsNullOrEmpty(globalAssetId)) + { + return null; + } + + foreach(var aas in environment.AssetAdministrationShells) + { + if(aas.AssetInformation.GlobalAssetId.GetAsIdentifier().Equals(globalAssetId)) + { + return aas; + } + } + + return null; + } + + public static ComparerIndexed CreateIndexedComparerCdsForSmUsage(this AasCore.Aas3_0_RC02.Environment environment) + { + var cmp = new ComparerIndexed(); + int nr = 0; + foreach (var sm in environment.FindAllSubmodelGroupedByAAS()) + foreach (var sme in sm.FindDeep()) + { + if (sme.SemanticId == null) + continue; + var cd = environment.FindConceptDescriptionByReference(sme.SemanticId); + if (cd == null) + continue; + if (cmp.Index.ContainsKey(cd)) + continue; + cmp.Index[cd] = nr++; + } + return cmp; + } + + public static ISubmodelElement CopySubmodelElementAndCD(this AasCore.Aas3_0_RC02.Environment environment, + AasCore.Aas3_0_RC02.Environment srcEnv, ISubmodelElement srcElem, bool copyCD = false, bool shallowCopy = false) + { + // access + if (srcEnv == null || srcElem == null) + return null; + + // 1st result pretty easy (calling function will add this to the appropriate Submodel) + var res = srcElem.Copy(); + + // copy the CDs.. + if (copyCD) + environment.CopyConceptDescriptionsFrom(srcEnv, srcElem, shallowCopy); + + // give back + return res; + } + + public static Reference CopySubmodelRefAndCD( this AasCore.Aas3_0_RC02.Environment environment, + AasCore.Aas3_0_RC02.Environment srcEnv, Reference srcSubRef, bool copySubmodel = false, bool copyCD = false, + bool shallowCopy = false) + { + // access + if (srcEnv == null || srcSubRef == null) + return null; + + // need to have the source Submodel + var srcSub = srcEnv.FindSubmodel(srcSubRef); + if (srcSub == null) + return null; + + // 1st result pretty easy (calling function will add this to the appropriate AAS) + var dstSubRef =srcSubRef.Copy(); + + // get the destination and shall src != dst + var dstSub = environment.FindSubmodel(dstSubRef); + if (srcSub == dstSub) + return null; + + // maybe we need the Submodel in our environment, as well + if (dstSub == null && copySubmodel) + { + dstSub = srcSub.Copy(); + environment.Submodels.Add(dstSub); + } + else + if (dstSub != null) + { + // there is already an submodel, just add members + if (!shallowCopy && srcSub.SubmodelElements != null) + { + if (dstSub.SubmodelElements == null) + dstSub.SubmodelElements = new List(); + foreach (var smw in srcSub.SubmodelElements) + dstSub.SubmodelElements.Add( + smw.Copy()); + } + } + + // copy the CDs.. + if (copyCD && srcSub.SubmodelElements != null) + foreach (var smw in srcSub.SubmodelElements) + environment.CopyConceptDescriptionsFrom(srcEnv, smw, shallowCopy); + + // give back + return dstSubRef; + } + + private static void CopyConceptDescriptionsFrom(this AasCore.Aas3_0_RC02.Environment environment, + AasCore.Aas3_0_RC02.Environment srcEnv, ISubmodelElement src, bool shallowCopy = false) + { + // access + if (srcEnv == null || src == null || src.SemanticId == null) + return; + // check for this SubmodelElement in Source + var cdSrc = srcEnv.FindConceptDescriptionByReference(src.SemanticId); + if (cdSrc == null) + return; + // check for this SubmodelElement in Destnation (this!) + var cdDest = environment.FindConceptDescriptionByReference(src.SemanticId); + if (cdDest != null) + return; + // copy new + environment.ConceptDescriptions.Add(cdSrc.Copy()); + // recurse? + if (!shallowCopy && src is SubmodelElementCollection) + foreach (var m in (src as SubmodelElementCollection).Value) + environment.CopyConceptDescriptionsFrom(srcEnv, m, shallowCopy: false); + + } + #endregion + + } + + + +} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendFile.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendFile.cs new file mode 100644 index 000000000..8b8cc7576 --- /dev/null +++ b/src/AasxCsharpLib_bkp/Extensions/ExtendFile.cs @@ -0,0 +1,68 @@ +using AasCore.Aas3_0_RC02; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendFile + { + public static string ValueAsText(this File file) + { + return "" + file.Value; + } + + public static void Set(this File file, + string contentType = "", string value = "") + { + file.ContentType = contentType; + file.Value = value; + } + + public static File ConvertFromV10(this File file, AasxCompatibilityModels.AdminShellV10.File sourceFile) + { + file.ContentType = sourceFile.mimeType; + file.Value = sourceFile.value; + return file; + } + public static File ConvertFromV20(this File file, AasxCompatibilityModels.AdminShellV20.File sourceFile) + { + file.ContentType = sourceFile.mimeType; + file.Value = sourceFile.value; + return file; + } + + public static File UpdateFrom(this File elem, ISubmodelElement source) + { + if (source == null) + return elem; + + ((ISubmodelElement)elem).UpdateFrom(source); + + if (source is Property srcProp) + { + elem.Value = srcProp.Value; + } + + if (source is AasCore.Aas3_0_RC02.Range srcRng) + { + elem.Value = srcRng.Min; + } + + if (source is MultiLanguageProperty srcMlp) + { + elem.Value = "" + srcMlp.Value?.GetDefaultString(); + } + + if (source is File srcFile) + { + elem.Value = "" + srcFile.Value; + } + + return elem; + } + + } +} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendHasDataSpecification.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendHasDataSpecification.cs new file mode 100644 index 000000000..1a34c6d18 --- /dev/null +++ b/src/AasxCsharpLib_bkp/Extensions/ExtendHasDataSpecification.cs @@ -0,0 +1,26 @@ +using AasCore.Aas3_0_RC02; +using AasxCompatibilityModels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendHasDataSpecification + { + public static IHasDataSpecification ConvertFromV20(this IHasDataSpecification embeddedDataSpecifications, AasxCompatibilityModels.AdminShellV20.HasDataSpecification sourceSpecification) + { + foreach(var sourceSpec in sourceSpecification) + { + var newEmbeddedSpec = new EmbeddedDataSpecification(null, null); + newEmbeddedSpec.ConvertFromV20(sourceSpec); + embeddedDataSpecifications.EmbeddedDataSpecifications.Add(newEmbeddedSpec); + } + + return embeddedDataSpecifications; + } + } +} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendIDataSpecificationContent.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendIDataSpecificationContent.cs new file mode 100644 index 000000000..4f020cea9 --- /dev/null +++ b/src/AasxCsharpLib_bkp/Extensions/ExtendIDataSpecificationContent.cs @@ -0,0 +1,68 @@ +using Extensions; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using AasCore.Aas3_0_RC02; +using AdminShellNS; + +namespace Extensions +{ + public static class ExtendIDataSpecificationContent + { + public enum ContentTypes { NoInfo, Iec61360, PhysicalUnit} + + public static Key GetKeyForIec61360() + { + return new Key(KeyTypes.GlobalReference, + "http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"); + } + + public static Reference GetReferencForIec61360() + { + return new Reference(ReferenceTypes.GlobalReference, new List { GetKeyForIec61360() }); + } + + public static Key GetKeyForPhysicalUnit() + { + return new Key(KeyTypes.GlobalReference, + "http://admin-shell.io/DataSpecificationTemplates/DataSpecificationPhysicalUnit/3/0"); + } + + public static Key GetKeyFor(ContentTypes ct) + { + if (ct == ContentTypes.Iec61360) + return GetKeyForIec61360(); + if (ct == ContentTypes.PhysicalUnit) + return GetKeyForPhysicalUnit(); + return null; + } + + public static IDataSpecificationContent ContentFactoryFor(ContentTypes ct) + { + if (ct == ContentTypes.Iec61360) + return new DataSpecificationIec61360(null); + if (ct == ContentTypes.PhysicalUnit) + return new DataSpecificationPhysicalUnit("", "", null); + return null; + } + + public static ContentTypes GuessContentTypeFor(Reference rf) + { + foreach (var v in AdminShellUtil.GetEnumValues(new[] { ContentTypes.NoInfo })) + if (rf?.MatchesExactlyOneKey(GetKeyFor(v)) == true) + return v; + return ContentTypes.NoInfo; + } + + public static ContentTypes GuessContentTypeFor(IDataSpecificationContent content) + { + if (content is DataSpecificationIec61360) + return ContentTypes.Iec61360; + if (content is DataSpecificationPhysicalUnit) + return ContentTypes.PhysicalUnit; + return ContentTypes.NoInfo; + } + } +} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendIIdentifiable.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendIIdentifiable.cs new file mode 100644 index 000000000..29d8ffc33 --- /dev/null +++ b/src/AasxCsharpLib_bkp/Extensions/ExtendIIdentifiable.cs @@ -0,0 +1,28 @@ +using AasCore.Aas3_0_RC02; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendIIdentifiable + { + #region List of Identifiers + + public static string ToStringExtended(this List identifiables,string delimiter = ",") + { + return string.Join(delimiter, identifiables.Select((x) => x.Id)); + } + + #endregion + public static Reference GetReference(this IIdentifiable identifiable) + { + var key = new Key(ExtensionsUtil.GetKeyType(identifiable), identifiable.Id); + var outputReference = new Reference(ReferenceTypes.ModelReference, new List() { key }); + + return outputReference; + } + } +} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendIReferable.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendIReferable.cs new file mode 100644 index 000000000..340900668 --- /dev/null +++ b/src/AasxCsharpLib_bkp/Extensions/ExtendIReferable.cs @@ -0,0 +1,600 @@ +using AasCore.Aas3_0_RC02; +using AdminShellNS; +using AdminShellNS.Display; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http.Headers; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendIReferable + { + #region AasxPackageExplorer + + public static void RecurseOnReferables(this IReferable referable, + object state, Func, IReferable, bool> lambda, + bool includeThis = false) + { + if(referable is Submodel submodel) + { + submodel.RecurseOnReferables(state, lambda, includeThis); + } + else if(referable is SubmodelElementCollection submodelElementCollection) + { + submodelElementCollection.RecurseOnReferables(state, lambda, includeThis); + } + else if(referable is SubmodelElementList submodelElementList) + { + submodelElementList.RecurseOnReferables(state, lambda, includeThis); + } + else if (includeThis) + lambda(state, null, referable); + } + + public static void Remove(this IReferable referable, ISubmodelElement submodelElement) + { + if(referable is Submodel submodel) + { + submodel.Remove(submodelElement); + } + else if(referable is AnnotatedRelationshipElement annotatedRelationshipElement) + { + annotatedRelationshipElement.Remove(submodelElement); + } + else if(referable is SubmodelElementCollection submodelElementCollection) + { + submodelElementCollection.Remove(submodelElement); + } + else if(referable is SubmodelElementList submodelElementList) + { + submodelElementList.Remove(submodelElement); + } + else if(referable is Entity entity) + { + entity.Remove(submodelElement); + } + } + + public static void Add(this IReferable referable, ISubmodelElement submodelElement) + { + if (referable is Submodel submodel) + { + submodel.Add(submodelElement); + } + else if (referable is AnnotatedRelationshipElement annotatedRelationshipElement) + { + annotatedRelationshipElement.Add(submodelElement); + } + else if (referable is SubmodelElementCollection submodelElementCollection) + { + submodelElementCollection.Add(submodelElement); + } + else if (referable is SubmodelElementList submodelElementList) + { + submodelElementList.Add(submodelElement); + } + else if (referable is Entity entity) + { + entity.Add(submodelElement); + } + } + + #region Display + + public static EnumerationPlacmentBase GetChildrenPlacement(this IReferable referable, ISubmodelElement submodelElement) + { + if(referable is Operation operation) + { + return operation.GetChildrenPlacement(submodelElement); + } + + return null; + } + + #endregion + + public static IIdentifiable FindParentFirstIdentifiable(this IReferable referable) + { + IReferable curr = referable; + while (curr != null) + { + if (curr is IIdentifiable curri) + return curri; + curr = curr.Parent as IReferable; + } + return null; + } + + #endregion + + #region ListOfReferables + public static Reference GetReference(this List referables) + { + return new Reference(ReferenceTypes.GlobalReference, referables.ToKeyList()); + } + + public static List ToKeyList(this List referables) + { + var res = new List(); + foreach (var rf in referables) + res.Add(new Key(rf.GetSelfDescription()?.KeyType ?? KeyTypes.GlobalReference, rf.IdShort)); + return res; + } + #endregion + + public static string ToIdShortString(this IReferable rf) + { + if (rf.IdShort == null || rf.IdShort.Trim().Length < 1) + return (""); + return rf.IdShort.Trim(); + } + + public static Reference GetReference(this IReferable referable) + { + if (referable is IIdentifiable identifiable) + { + return identifiable.GetReference(); + } + else if (referable is ISubmodelElement submodelElement) + { + return submodelElement.GetModelReference(); + } + else + return null; + } + public static void Validate(this IReferable referable,AasValidationRecordList results) + { + referable.BaseValidation(results); + + if(referable is ConceptDescription conceptDescription) + { + conceptDescription.Validate(results); + } + else if(referable is Submodel submodel) + { + submodel.Validate(results); + } + else if(referable is ISubmodelElement submodelElement) + { + submodelElement.Validate(results); + } + } + + public static void BaseValidation(this IReferable referable, AasValidationRecordList results) + { + // access + if (results == null) + return; + + // check + if (string.IsNullOrEmpty(referable.IdShort)) + results.Add(new AasValidationRecord( + AasValidationSeverity.SpecViolation, referable, + "Referable: missing idShort", + () => + { + referable.IdShort = "TO_FIX"; + })); + + if (referable.Description != null && (referable.Description.Count < 1)) + results.Add(new AasValidationRecord( + AasValidationSeverity.SchemaViolation, referable, + "Referable: existing description with missing langString", + () => + { + referable.Description = null; + })); + } + + /// + /// Tells, if the IReferable is used with an index instead of idShort. + /// + public static bool IsIndexed(this IReferable rf) + { + return rf is SubmodelElementList; + } + + public static AasElementSelfDescription GetSelfDescription(this IReferable referable) + { + if (referable is AssetAdministrationShell) + { + return new AasElementSelfDescription("AssetAdministrationShell", "AAS", + KeyTypes.AssetAdministrationShell, null); + } + else if (referable is ConceptDescription) + { + return new AasElementSelfDescription("ConceptDescription", "CD", + KeyTypes.ConceptDescription, null); + } + else if (referable is Submodel) + { + return new AasElementSelfDescription("Submodel", "SM", + KeyTypes.Submodel, null); + } + else if (referable is Property) + { + return new AasElementSelfDescription("Property", "Prop", + KeyTypes.Property, AasSubmodelElements.Property); + } + else if (referable is MultiLanguageProperty) + { + return new AasElementSelfDescription("MultiLanguageProperty", "MLP", + KeyTypes.MultiLanguageProperty, AasSubmodelElements.MultiLanguageProperty); + } + else if(referable is AasCore.Aas3_0_RC02.Range) + { + return new AasElementSelfDescription("Range", "Range", + KeyTypes.Range, AasSubmodelElements.Range); + } + else if(referable is Blob) + { + return new AasElementSelfDescription("Blob", "Blob", + KeyTypes.Blob, AasSubmodelElements.Blob); + } + else if(referable is AasCore.Aas3_0_RC02.File) + { + return new AasElementSelfDescription("File", "File", + KeyTypes.File, AasSubmodelElements.File); + } + else if(referable is ReferenceElement) + { + return new AasElementSelfDescription("ReferenceElement", "Ref", + KeyTypes.ReferenceElement, AasSubmodelElements.ReferenceElement); + } + else if(referable is RelationshipElement) + { + return new AasElementSelfDescription("RelationshipElement", "Rel", + KeyTypes.RelationshipElement, AasSubmodelElements.RelationshipElement); + } + else if(referable is AnnotatedRelationshipElement) + { + return new AasElementSelfDescription("AnnotatedRelationshipElement", "RelA", + KeyTypes.AnnotatedRelationshipElement, AasSubmodelElements.AnnotatedRelationshipElement); + } + else if(referable is Capability) + { + return new AasElementSelfDescription("Capability", "Cap", + KeyTypes.Capability, AasSubmodelElements.Capability); + } + else if(referable is SubmodelElementCollection) + { + return new AasElementSelfDescription("SubmodelElementCollection", "SMC", + KeyTypes.SubmodelElementCollection, AasSubmodelElements.SubmodelElementCollection); + } + else if(referable is SubmodelElementList) + { + return new AasElementSelfDescription("SubmodelElementList", "SML", + KeyTypes.SubmodelElementList, AasSubmodelElements.SubmodelElementList); + } + else if(referable is Operation) + { + return new AasElementSelfDescription("Operation", "Opr", + KeyTypes.Operation, AasSubmodelElements.Operation); + } + else if(referable is Entity) + { + return new AasElementSelfDescription("Entity", "Ent", + KeyTypes.Entity, AasSubmodelElements.Entity); + } + else if(referable is BasicEventElement) + { + return new AasElementSelfDescription("BasicEventElement", "Evt", + + KeyTypes.BasicEventElement, AasSubmodelElements.BasicEventElement); + } + else if(referable is IDataElement) + { + return new AasElementSelfDescription("DataElement", "DE", + KeyTypes.DataElement, AasSubmodelElements.DataElement); + } + else if(referable is ISubmodelElement) + { + return new AasElementSelfDescription("SubmodelElement", "SME", + KeyTypes.SubmodelElement, AasSubmodelElements.SubmodelElement); + } + else + { + return new AasElementSelfDescription("Referable", "Ref", + KeyTypes.Referable, null); + } + } + public static void CollectReferencesByParent(this IReferable referable, List refs) + { + // access + if (refs == null) + return; + + // check, if this is identifiable + if (referable is IIdentifiable) + { + var idf = referable as IIdentifiable; + if (idf != null) + { + //var k = Key.CreateNew( + // idf.GetElementName(), true, idf.identification?.idType, idf.identification?.id); + + var key = new Key((KeyTypes)Stringification.KeyTypesFromString(idf.GetType().Name), idf.Id); + refs.Insert(0, key); + } + } + else + { + //var k = Key.CreateNew(this.GetElementName(), true, "IdShort", referable.IdShort); + var key = new Key((KeyTypes)Stringification.KeyTypesFromString(referable.GetType().Name), referable.IdShort); + refs.Insert(0, key); + // recurse upwards! + if (referable.Parent is IReferable prf) + prf.CollectReferencesByParent(refs); + } + } + public static void SetTimeStamp(this IReferable referable, DateTime timeStamp) + { + IReferable newReferable = referable; + do + { + newReferable.TimeStamp = timeStamp; + if (newReferable != newReferable.Parent) + { + newReferable = (IReferable)newReferable.Parent; + } + else + newReferable = null; + } + while (newReferable != null); + } + + public static bool EnumeratesChildren(this ISubmodelElement elem) + { + var num = elem.EnumerateChildren().Count(); + return (num > 0); + } + + public static IEnumerable EnumerateChildren(this IReferable referable) + { + if (referable is Submodel submodel && submodel.SubmodelElements != null) + { + if (submodel.SubmodelElements != null) + { + foreach (var submodelElement in submodel.SubmodelElements) + { + yield return submodelElement; + } + } + } + else if (referable is SubmodelElementCollection submodelElementCollection) + { + if (submodelElementCollection.Value != null) + { + foreach (var submodelElement in submodelElementCollection.Value) + { + yield return submodelElement; + } + } + } + else if (referable is SubmodelElementList submodelElementList) + { + if (submodelElementList.Value != null) + { + foreach (var submodelElement in submodelElementList.Value) + { + yield return submodelElement; + } + } + } + else if (referable is AnnotatedRelationshipElement annotatedRelationshipElement) + { + if (annotatedRelationshipElement.Annotations != null) + { + foreach (var submodelElement in annotatedRelationshipElement.Annotations) + { + yield return submodelElement; + } + } + } + else if (referable is Entity entity) + { + if (entity.Statements != null) + { + foreach (var submodelElement in entity.Statements) + { + yield return submodelElement; + } + } + } + else if (referable is Operation operation) + { + if (operation.InputVariables != null) + foreach (var inputVariable in operation.InputVariables) + { + yield return inputVariable.Value; + } + + if (operation.OutputVariables != null) + foreach (var outputVariable in operation.OutputVariables) + { + yield return outputVariable.Value; + } + + if (operation.InoutputVariables != null) + foreach (var inOutVariable in operation.InoutputVariables) + { + yield return inOutVariable.Value; + } + } + else + { + yield break; + } + } + + + public static void SetAllParentsAndTimestamps(this IReferable referable, IReferable parent, DateTime timeStamp, DateTime timeStampCreate) + { + if (parent == null) + return; + + referable.Parent = parent; + referable.TimeStamp = timeStamp; + referable.TimeStampCreate = timeStampCreate; + + foreach (var submodelElement in referable.EnumerateChildren()) + { + submodelElement.SetAllParentsAndTimestamps(referable, timeStamp, timeStampCreate); + } + } + + public static Submodel GetParentSubmodel(this IReferable referable) + { + IReferable parent = referable; + while (parent is not Submodel && parent != null) + parent = (IReferable)parent.Parent; + return parent as Submodel; + } + + public static string CollectIdShortByParent(this IReferable referable) + { + // recurse first + var head = ""; + if (referable is not IIdentifiable && referable.Parent is IReferable parentReferable) + // can go up + head = parentReferable.CollectIdShortByParent() + "/"; + // add own + var myid = ""; + if (string.IsNullOrEmpty(referable.IdShort)) + myid = referable.IdShort.Trim(); + // together + return head + myid; + } + + public static void AddDescription(this IReferable referable,string language, string Text) + { + if (referable.Description == null) + referable.Description = new List(); + referable.Description.Add(new LangString(language, Text)); + } + + public static List ListOfIReferableFrom( + System.Text.Json.Nodes.JsonNode node) + { + var res = new List(); + if (node == null) + return res; + var array = node.AsArray(); + foreach (var it in array) + { + var ir = Jsonization.Deserialize.IReferableFrom(it); + res.Add(ir); + } + return res; + } + + public static Key ToKey(this IReferable rf) + { + var sd = rf.GetSelfDescription(); + if (sd == null || !sd.KeyType.HasValue) + return null; + if (rf is IIdentifiable rfi) + return new Key(sd.KeyType.Value, rfi.Id); + return new Key(sd.KeyType.Value, rf.IdShort); + } + + public static System.Text.Json.Nodes.JsonNode ToJsonObject(List classes) + { + var jar = new System.Text.Json.Nodes.JsonArray(); + if (classes != null) + foreach (var c in classes) + jar.Add(Jsonization.Serialize.ToJsonObject(c)); + return jar; + } + + public static IEnumerable FindAllQualifierType(this IReferable rf, string qualifierType) + { + if (!(rf is IQualifiable rfq) || rfq.Qualifiers == null || qualifierType == null) + yield break; + foreach (var q in rfq.Qualifiers) + if (q.Type.Trim().ToLower() == qualifierType.Trim().ToLower()) + yield return q; + } + + public static Qualifier HasQualifierOfType(this IReferable rf, string qualifierType) + { + if (!(rf is IQualifiable rfq) || rfq.Qualifiers == null) + return null; + foreach (var q in rfq.Qualifiers) + if (q.Type?.Trim().ToLower() == qualifierType?.Trim().ToLower()) + return q; + return null; + } + + public static Qualifier Add(this IReferable rf, Qualifier q) + { + if (!(rf is IQualifiable rfq)) + return null; + if (rfq.Qualifiers == null) + rfq.Qualifiers = new List(); + rfq.Qualifiers.Add(q); + return q; + } + + public static IEnumerable FindAllExtensionName(this IReferable rf, string extensionName) + { + if (!(rf is IHasExtensions rfe) || rfe.Extensions == null) + yield break; + foreach (var e in rfe.Extensions) + if (e.Name?.Trim().ToLower() == extensionName?.Trim().ToLower()) + yield return e; + } + + + public static Extension HasExtensionOfName(this IReferable rf, string extensionName) + { + if (!(rf is IHasExtensions rfe) || rfe.Extensions == null) + return null; + foreach (var e in rfe.Extensions) + if (e.Name?.Trim().ToLower() == extensionName?.Trim().ToLower()) + return e; + return null; + } + + public static Extension Add(this IReferable rf, Extension ext) + { + if (rf.Extensions == null) + rf.Extensions = new List(); + rf.Extensions.Add(ext); + return ext; + } + + public static void MigrateV20QualifiersToExtensions(this IReferable rf) + { + // access + if (!(rf is IQualifiable iq) || iq.Qualifiers == null || !(rf is IHasExtensions ihe)) + return; + + // Qualifiers to migrate + var toMigrate = new[] { + "Animate.Args", "Plotting.Args", "TimeSeries.Args", "BOM.Args", "ImageMap.Args" + }; + + List toMove = new List(); + foreach (var q in iq.Qualifiers) + foreach (var tm in toMigrate) + if (q?.Type?.Equals(tm, StringComparison.InvariantCultureIgnoreCase) == true) + toMove.Add(q); + + // now move these + for (int i=0; i ToCaptionInfo(this ISubmodelElement submodelElement) + { + var caption = AdminShellUtil.EvalToNonNullString("\"{0}\" ", submodelElement.IdShort, ""); + var info = ""; + // TODO (MIHO, 2021-07-08): obvious error .. info should receive semanticId .. but would change + // display presentation .. therefore to be checked again + if (submodelElement.SemanticId != null) + AdminShellUtil.EvalToNonEmptyString("\u21e8 {0}", submodelElement.SemanticId.ToStringExtended(), ""); + return Tuple.Create(caption, info); + } + + public static void ValueFromText(this ISubmodelElement submodelElement, string text, string defaultLang = null) + { + switch(submodelElement) + { + case Property property: + { + property.ValueFromText(text); + break; + } + case MultiLanguageProperty multiLanguageProperty: + { + multiLanguageProperty.ValueFromText(text, defaultLang); + break; + } + default: + { + throw new Exception("Unhandled submodel element type"); + } + } + } + + #endregion + public static IEnumerable FindAllParents(this ISubmodelElement submodelElement, + Predicate p, + bool includeThis = false, bool includeSubmodel = false, + bool passOverMiss = false) + { + // call for this? + if (includeThis) + { + if (p == null || p.Invoke(submodelElement)) + yield return submodelElement; + else + if (!passOverMiss) + yield break; + } + + // daisy chain all parents .. + if (submodelElement.Parent != null) + { + if (submodelElement.Parent is ISubmodelElement psme) + { + foreach (var q in psme.FindAllParents(p, includeThis: true, + passOverMiss: passOverMiss)) + yield return q; + } + else if (includeSubmodel && submodelElement.Parent is Submodel psm) + { + if (p == null || p.Invoke(psm)) + yield return submodelElement; + } + } + } + + public static IEnumerable FindAllParentsWithSemanticId( + this ISubmodelElement submodelElement, Reference semId, + bool includeThis = false, bool includeSubmodel = false, bool passOverMiss = false) + { + return (FindAllParents(submodelElement, + (rf) => (true == (rf as IHasSemantics)?.SemanticId?.Matches(semId, + matchMode: MatchMode.Relaxed)), + includeThis: includeThis, includeSubmodel: includeSubmodel, passOverMiss: passOverMiss)); + } + + public static string ValueAsText(this ISubmodelElement submodelElement, string defaultLang = null) + { + //TODO:Need to check/test this logic again + if (submodelElement is Property property) + { + return property.ValueAsText(); + } + + if (submodelElement is MultiLanguageProperty multiLanguageProperty) + { + return multiLanguageProperty.ValueAsText(defaultLang); + } + + if (submodelElement is AasCore.Aas3_0_RC02.Range range) + { + return range.ValueAsText(); + } + + if (submodelElement is File file) + { + return file.ValueAsText(); + } + + return ""; + } + + public static Qualifier FindQualifierOfType(this ISubmodelElement submodelElement, string qualifierType) + { + if (submodelElement.Qualifiers == null || submodelElement.Qualifiers.Count == 0) + { + return null; + } + + foreach (var qualifier in submodelElement.Qualifiers) + { + if (qualifier.Type.Equals(qualifierType, StringComparison.OrdinalIgnoreCase)) + { + return qualifier; + } + } + + return null; + + } + + public static Reference GetModelReference(this ISubmodelElement sme, bool includeParents = true) + { + // this will be the tail of our chain + var keyList = new List(); + var keyType = ExtensionsUtil.GetKeyType(sme); + var key = new Key(keyType, sme.IdShort); + keyList.Add(key); + + // keys for Parents will be INSERTED in front, iteratively + var currentParent = sme.Parent; + while (includeParents && currentParent != null) + { + if (currentParent is IIdentifiable identifiable) + { + var currentParentKey = new Key(ExtensionsUtil.GetKeyType(identifiable), identifiable.Id); + keyList.Insert(0, currentParentKey); + currentParent = null; + } + else if (currentParent is IReferable referable) + { + var currentParentKey = new Key(ExtensionsUtil.GetKeyType(referable), referable.IdShort); + keyList.Insert(0, currentParentKey); + currentParent = referable.Parent; + } + + } + + var outputReference = new Reference(ReferenceTypes.ModelReference, keyList); + outputReference.ReferredSemanticId = sme.SemanticId; + return outputReference; + } + + public static IEnumerable FindDeep(this ISubmodelElement submodelElement) + { + if (submodelElement is T) + { + yield return (T)submodelElement; + } + + foreach (var x in submodelElement.Descend().OfType()) + yield return x; + + //if (submodelElement is SubmodelElementList sml && sml.Value != null) + // foreach (var ce in sml.Value) + // if (ce != null) + // foreach (var x in ce.FindDeep()) + // yield return x; + + //if (submodelElement is AnnotatedRelationshipElement arel && arel.Annotations != null) + // foreach (var x in arel.FindDeep()) + // yield return x; + + //if (submodelElement is Entity entity) + // foreach (var statement in entity.Statements) + // foreach (var x in statement.FindDeep()) + // yield return x; + + //if (submodelElement is Operation operation) + //{ + // var variableCollection = new SubmodelElementCollection(); + // variableCollection.Value = new List(); + // foreach (var inputVariable in operation.InputVariables) + // { + // variableCollection.Value.Add(inputVariable.Value); + // } + // foreach (var outputVariable in operation.OutputVariables) + // { + // variableCollection.Value.Add(outputVariable.Value); + // } + // foreach (var inOutVariable in operation.InoutputVariables) + // { + // variableCollection.Value.Add(inOutVariable.Value); + // } + // yield return (T)variableCollection.FindDeep(); + //} + } + + public static ISubmodelElement ConvertFromV10(this ISubmodelElement submodelElement, AdminShellV10.SubmodelElement sourceSubmodelElement, bool shallowCopy = false) + { + ISubmodelElement outputSubmodelElement = null; + if (sourceSubmodelElement != null) + { + if (sourceSubmodelElement is AdminShellV10.SubmodelElementCollection collection) + { + var newSmeCollection = new SubmodelElementCollection(); + outputSubmodelElement = newSmeCollection.ConvertFromV10(collection, shallowCopy); + } + else if (sourceSubmodelElement is AdminShellV10.Property sourceProperty) + { + var newProperty = new Property(DataTypeDefXsd.String); + outputSubmodelElement = newProperty.ConvertFromV10(sourceProperty); + } + else if (sourceSubmodelElement is AdminShellV10.File sourceFile) + { + var newFile = new File(""); + outputSubmodelElement = newFile.ConvertFromV10(sourceFile); + } + else if (sourceSubmodelElement is AdminShellV10.Blob blob) + { + var newBlob = new Blob(""); + outputSubmodelElement = newBlob.ConvertFromV10(blob); + } + else if (sourceSubmodelElement is AdminShellV10.ReferenceElement sourceReferenceElement) + { + outputSubmodelElement = new ReferenceElement(); + } + else if (sourceSubmodelElement is AdminShellV10.RelationshipElement sourceRelationshipElement) + { + var newFirst = ExtensionsUtil.ConvertReferenceFromV10(sourceRelationshipElement.first, ReferenceTypes.ModelReference); + var newSecond = ExtensionsUtil.ConvertReferenceFromV10(sourceRelationshipElement.second, ReferenceTypes.ModelReference); + outputSubmodelElement = new RelationshipElement(newFirst, newSecond); + } + + if (sourceSubmodelElement is AdminShellV10.Operation sourceOperation) + { + var newInputVariables = new List(); + var newOutputVariables = new List(); + if (sourceOperation.valueIn != null) + { + + foreach (var inputVariable in sourceOperation.valueIn) + { + if (inputVariable.value.submodelElement != null) + { + ISubmodelElement newSubmodelElement = null; + newSubmodelElement = newSubmodelElement.ConvertFromV10(inputVariable.value.submodelElement); + var newOpVariable = new OperationVariable(newSubmodelElement); + newInputVariables.Add(newOpVariable); + } + } + } + if (sourceOperation.valueOut != null) + { + foreach (var outputVariable in sourceOperation.valueOut) + { + if (outputVariable.value.submodelElement != null) + { + ISubmodelElement newSubmodelElement = null; + newSubmodelElement = newSubmodelElement.ConvertFromV10(outputVariable.value.submodelElement); + var newOpVariable = new OperationVariable(newSubmodelElement); + newOutputVariables.Add(newOpVariable); + } + } + } + + outputSubmodelElement = new Operation(inputVariables: newInputVariables, outputVariables: newOutputVariables); + } + + + outputSubmodelElement.BasicConversionFromV10(sourceSubmodelElement); + } + + return outputSubmodelElement; + } + + private static void BasicConversionFromV10(this ISubmodelElement submodelElement, AdminShellV10.SubmodelElement sourceSubmodelElement) + { + if (!string.IsNullOrEmpty(sourceSubmodelElement.idShort)) + { + submodelElement.IdShort = sourceSubmodelElement.idShort; + } + + if (!string.IsNullOrEmpty(sourceSubmodelElement.category)) + { + submodelElement.Category = sourceSubmodelElement.category; + } + + if (sourceSubmodelElement.description != null) + { + submodelElement.Description = ExtensionsUtil.ConvertDescriptionFromV10(sourceSubmodelElement.description); + } + + if (sourceSubmodelElement.semanticId != null) + { + var keyList = new List(); + foreach (var refKey in sourceSubmodelElement.semanticId.Keys) + { + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {refKey.type} not found."); + } + } + submodelElement.SemanticId = new Reference(ReferenceTypes.GlobalReference, keyList); + } + + if (sourceSubmodelElement.kind != null) + { + if (sourceSubmodelElement.kind.IsInstance) + { + submodelElement.Kind = ModelingKind.Instance; + } + else + { + submodelElement.Kind = ModelingKind.Template; + } + } + + if (sourceSubmodelElement.qualifiers != null && sourceSubmodelElement.qualifiers.Count != 0) + { + if (submodelElement.Qualifiers == null && submodelElement.Qualifiers.Count != 0) + { + submodelElement.Qualifiers = new List(); + } + + foreach (var sourceQualifier in sourceSubmodelElement.qualifiers) + { + var newQualifier = new Qualifier("", DataTypeDefXsd.String); + newQualifier = newQualifier.ConvertFromV10(sourceQualifier); + submodelElement.Qualifiers.Add(newQualifier); + } + } + + if (sourceSubmodelElement.hasDataSpecification != null) + { + //TODO: jtikekar : EmbeddedDataSpecification?? (as per old implementation) + if (submodelElement.EmbeddedDataSpecifications == null) + { + submodelElement.EmbeddedDataSpecifications = new List(); + } + foreach (var dataSpecification in sourceSubmodelElement.hasDataSpecification.reference) + { + submodelElement.EmbeddedDataSpecifications.Add( + new EmbeddedDataSpecification( + ExtensionsUtil.ConvertReferenceFromV10(dataSpecification, ReferenceTypes.GlobalReference), + null)); + } + } + } + + public static ISubmodelElement ConvertFromV20(this ISubmodelElement submodelElement, AdminShellV20.SubmodelElement sourceSubmodelElement, bool shallowCopy = false) + { + ISubmodelElement outputSubmodelElement = null; + if (sourceSubmodelElement != null) + { + if (sourceSubmodelElement is AdminShellV20.SubmodelElementCollection collection) + { + var newSmeCollection = new SubmodelElementCollection(); + outputSubmodelElement = newSmeCollection.ConvertFromV20(collection, shallowCopy); + } + else if (sourceSubmodelElement is AdminShellV20.Property sourceProperty) + { + var newProperty = new Property(DataTypeDefXsd.String); + outputSubmodelElement = newProperty.ConvertFromV20(sourceProperty); + } + else if (sourceSubmodelElement is AdminShellV20.MultiLanguageProperty sourceMultiLangProp) + { + var newMultiLangProperty = new MultiLanguageProperty(); + outputSubmodelElement = newMultiLangProperty.ConvertFromV20(sourceMultiLangProp); + } + else if (sourceSubmodelElement is AdminShellV20.Range sourceRange) + { + var newRange = new AasCore.Aas3_0_RC02.Range(DataTypeDefXsd.String); + outputSubmodelElement = newRange.ConvertFromV20(sourceRange); + } + else if (sourceSubmodelElement is AdminShellV20.File sourceFile) + { + var newFile = new File(""); + outputSubmodelElement = newFile.ConvertFromV20(sourceFile); + } + else if (sourceSubmodelElement is AdminShellV20.Blob blob) + { + var newBlob = new Blob(""); + outputSubmodelElement = newBlob.ConvertFromV20(blob); + } + else if (sourceSubmodelElement is AdminShellV20.ReferenceElement sourceReferenceElement) + { + var newReference = ExtensionsUtil.ConvertReferenceFromV20(sourceReferenceElement.value, ReferenceTypes.ModelReference); + outputSubmodelElement = new ReferenceElement(value: newReference); + } + else if (sourceSubmodelElement is AdminShellV20.AnnotatedRelationshipElement sourceAnnotedRelationshipElement) + { + var newFirst = ExtensionsUtil.ConvertReferenceFromV20(sourceAnnotedRelationshipElement.first, ReferenceTypes.ModelReference); + var newSecond = ExtensionsUtil.ConvertReferenceFromV20(sourceAnnotedRelationshipElement.second, ReferenceTypes.ModelReference); + var newAnnotedRelElement = new AnnotatedRelationshipElement(newFirst, newSecond); + outputSubmodelElement = newAnnotedRelElement.ConvertAnnotationsFromV20(sourceAnnotedRelationshipElement); + } + else if (sourceSubmodelElement is AdminShellV20.RelationshipElement sourceRelationshipElement) + { + var newFirst = ExtensionsUtil.ConvertReferenceFromV20(sourceRelationshipElement.first, ReferenceTypes.ModelReference); + var newSecond = ExtensionsUtil.ConvertReferenceFromV20(sourceRelationshipElement.second, ReferenceTypes.ModelReference); + outputSubmodelElement = new RelationshipElement(newFirst, newSecond); + } + else if (sourceSubmodelElement is AdminShellV20.BasicEvent sourceBasicEvent) + { + var newObserved = ExtensionsUtil.ConvertReferenceFromV20(sourceBasicEvent.observed, ReferenceTypes.ModelReference); + + outputSubmodelElement = new BasicEventElement(newObserved, Direction.Input, StateOfEvent.Off); //TODO: jtikekar default values of enums + } + else if (sourceSubmodelElement is AdminShellV20.Entity sourceEntity) + { + var entityType = Stringification.EntityTypeFromString(sourceEntity.entityType); + var newEntity = new Entity(entityType ?? EntityType.CoManagedEntity); + outputSubmodelElement = newEntity.ConvertFromV20(sourceEntity); + } + else if (sourceSubmodelElement is AdminShellV20.Operation sourceOperation) + { + var newInputVariables = new List(); + var newOutputVariables = new List(); + var newInOutVariables = new List(); + if (sourceOperation.inputVariable != null) + { + + foreach (var inputVariable in sourceOperation.inputVariable) + { + if (inputVariable.value.submodelElement != null) + { + ISubmodelElement newSubmodelElement = null; + newSubmodelElement = newSubmodelElement.ConvertFromV20(inputVariable.value.submodelElement); + var newOpVariable = new OperationVariable(newSubmodelElement); + newInputVariables.Add(newOpVariable); + } + } + } + if (sourceOperation.outputVariable != null) + { + foreach (var outputVariable in sourceOperation.outputVariable) + { + if (outputVariable.value.submodelElement != null) + { + ISubmodelElement newSubmodelElement = null; + newSubmodelElement = newSubmodelElement.ConvertFromV20(outputVariable.value.submodelElement); + var newOpVariable = new OperationVariable(newSubmodelElement); + newOutputVariables.Add(newOpVariable); + } + } + } + + if (sourceOperation.inoutputVariable != null) + { + foreach (var inOutVariable in sourceOperation.inoutputVariable) + { + if (inOutVariable.value.submodelElement != null) + { + ISubmodelElement newSubmodelElement = null; + newSubmodelElement = newSubmodelElement.ConvertFromV20(inOutVariable.value.submodelElement); + var newOpVariable = new OperationVariable(newSubmodelElement); + newInOutVariables.Add(newOpVariable); + } + } + } + + outputSubmodelElement = new Operation(inputVariables: newInputVariables, outputVariables: newOutputVariables, inoutputVariables: newInOutVariables); + } + + outputSubmodelElement.BasicConversionFromV20(sourceSubmodelElement); + } + + return outputSubmodelElement; + } + + private static void BasicConversionFromV20(this ISubmodelElement submodelElement, AdminShellV20.SubmodelElement sourceSubmodelElement) + { + if (!string.IsNullOrEmpty(sourceSubmodelElement.idShort)) + submodelElement.IdShort = sourceSubmodelElement.idShort; + + if (!string.IsNullOrEmpty(sourceSubmodelElement.category)) + submodelElement.Category = sourceSubmodelElement.category; + + if (sourceSubmodelElement.description != null) + submodelElement.Description = ExtensionsUtil.ConvertDescriptionFromV20(sourceSubmodelElement.description); + + if (sourceSubmodelElement.semanticId != null) + { + var keyList = new List(); + foreach (var refKey in sourceSubmodelElement.semanticId.Keys) + { + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + // DECISION: After phone call with Birgit, set all CD to GlobalReference + // assuming it is always a external concept + if (keyType == KeyTypes.ConceptDescription) + keyType = KeyTypes.GlobalReference; + + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {refKey.type} not found."); + } + } + submodelElement.SemanticId = new Reference(ReferenceTypes.GlobalReference, keyList); + } + + if (sourceSubmodelElement.kind != null) + { + if (sourceSubmodelElement.kind.IsInstance) + submodelElement.Kind = ModelingKind.Instance; + else + submodelElement.Kind = ModelingKind.Template; + } + + if (sourceSubmodelElement.qualifiers != null && sourceSubmodelElement.qualifiers.Count != 0) + { + if (submodelElement.Qualifiers == null || submodelElement.Qualifiers.Count == 0) + submodelElement.Qualifiers = new List(); + + foreach (var sourceQualifier in sourceSubmodelElement.qualifiers) + { + var newQualifier = new Qualifier("", DataTypeDefXsd.String); + newQualifier = newQualifier.ConvertFromV20(sourceQualifier); + submodelElement.Qualifiers.Add(newQualifier); + } + } + + if (sourceSubmodelElement.hasDataSpecification != null) + { + //TODO: jtikekar : EmbeddedDataSpecification?? (as per old implementation) + if (submodelElement.EmbeddedDataSpecifications == null) + submodelElement.EmbeddedDataSpecifications = new List(); + + //TODO: jtikekar: DataSpecificationContent?? (as per old implementation) + foreach (var sourceDataSpec in sourceSubmodelElement.hasDataSpecification) + { + submodelElement.EmbeddedDataSpecifications.Add( + new EmbeddedDataSpecification( + ExtensionsUtil.ConvertReferenceFromV20(sourceDataSpec.dataSpecification, ReferenceTypes.GlobalReference), + null)); + } + } + + // move Qualifiers to Extensions + submodelElement.MigrateV20QualifiersToExtensions(); + } + + #region List + + public static IReferable FindReferableByReference( + this List submodelElements, Reference rf, int keyIndex) + { + return FindReferableByReference(submodelElements, rf?.Keys, keyIndex); + } + + public static IReferable FindReferableByReference( + this List submodelElements, List keys, int keyIndex) + { + // first index needs to exist .. + if (submodelElements == null || keys == null || keyIndex >= keys.Count) + return null; + + + // over all wrappers + foreach (var smw in submodelElements) + if (smw != null && smw.IdShort.Equals(keys[keyIndex].Value, StringComparison.OrdinalIgnoreCase)) + { + // match on this level. Did we find a leaf element? + if ((keyIndex + 1) >= keys.Count) + return smw; + + // dive into SMC? + if (smw is SubmodelElementCollection smc) + { + var found = FindReferableByReference(smc.Value, keys, keyIndex + 1); + if (found != null) + return found; + } + // dive into SML? + if (smw is SubmodelElementList submodelElementList) + { + var found = FindReferableByReference(submodelElementList.Value, keys, keyIndex + 1); + if (found != null) + return found; + } + + // dive into AnnotedRelationshipElement? + if (smw is AnnotatedRelationshipElement annotatedRelationshipElement) + { + var annotations = new List(annotatedRelationshipElement.Annotations); + var found = FindReferableByReference(annotations, keys, keyIndex + 1); + if (found != null) + return found; + } + + // dive into Entity statements? + if (smw is Entity ent) + { + var found = FindReferableByReference(ent.Statements, keys, keyIndex + 1); + if (found != null) + return found; + } + + // else: + return null; + } + + // no? + return null; + } + + public static IEnumerable FindDeep(this List submodelElements, Predicate match = null) where T : ISubmodelElement + { + foreach (var smw in submodelElements) + { + var current = smw; + if (current == null) + continue; + + // call lambda for this element + if (current is T) + if (match == null || match.Invoke((T)current)) + yield return (T)current; + + // dive into? + // TODO (MIHO, 2020-07-31): would be nice to use IEnumerateChildren for this .. + if (current is SubmodelElementCollection smc && smc.Value != null) + foreach (var x in smc.Value.FindDeep(match)) + yield return x; + + if (current is AnnotatedRelationshipElement are && are.Annotations != null) + { + var annotationsList = new List(are.Annotations); + foreach (var x in annotationsList.FindDeep(match)) + yield return x; + } + + if (current is Entity ent && ent.Statements != null) + foreach (var x in ent.Statements.FindDeep(match)) + yield return x; + + if (current is Operation op) + { + var operationVariables = new List(); + foreach(var opVariable in op.InputVariables) + { + operationVariables.Add(opVariable.Value); + } + + foreach(var opVariable in op.InoutputVariables) + { + operationVariables.Add(opVariable.Value); + } + + foreach(var opVariable in op.OutputVariables) + { + operationVariables.Add(opVariable.Value); + } + + foreach (var x in operationVariables.FindDeep(match)) + yield return x; + } + } + } + + public static void CopyManySMEbyCopy(this List submodelElements, ConceptDescription destCD, + List sourceSmc, ConceptDescription sourceCD, + bool createDefault = false, Action setDefault = null, + MatchMode matchMode = MatchMode.Relaxed) where T : ISubmodelElement + { + submodelElements.CopyManySMEbyCopy(destCD.GetSingleKey(), sourceSmc, sourceCD.GetSingleKey(), + createDefault ? destCD : null, setDefault, matchMode); + } + + public static void CopyManySMEbyCopy(this List submodelElements, Key destSemanticId, + List sourceSmc, Key sourceSemanticId, + ConceptDescription createDefault = null, Action setDefault = null, + MatchMode matchMode = MatchMode.Relaxed) where T : ISubmodelElement + { + // bool find possible sources + bool foundSrc = false; + if (sourceSmc == null) + return; + foreach (var src in sourceSmc.FindAllSemanticIdAs(sourceSemanticId, matchMode)) + { + // type of found src? + AasSubmodelElements aeSrc = (AasSubmodelElements)Enum.Parse(typeof(AasSubmodelElements), src.GetType().Name); + + // ok? + if (src == null || aeSrc == AasSubmodelElements.SubmodelElement) + continue; + foundSrc = true; + + // ok, create new one + var dst = AdminShellNS.AdminShellUtil.CreateSubmodelElementFromEnum(aeSrc, src); + if (dst != null) + { + // make same things sure + dst.IdShort = src.IdShort; + dst.Category = src.Category; + dst.SemanticId = new Reference(ReferenceTypes.ModelReference, new List() { destSemanticId}); + + // instantanously add it? + submodelElements.Add(dst); + } + } + + // default? + if (createDefault != null && !foundSrc) + { + // ok, default + var dflt = submodelElements.CreateSMEForCD(createDefault, addSme: true); + + // set default? + setDefault?.Invoke(dflt); + } + } + + public static T CopyOneSMEbyCopy(this List submodelElements, ConceptDescription destCD, + List sourceSmc, Key[] sourceKeys, + bool createDefault = false, Action setDefault = null, + MatchMode matchMode = MatchMode.Relaxed, + string idShort = null, bool addSme = false) where T : ISubmodelElement + { + return submodelElements.CopyOneSMEbyCopy(destCD?.GetSingleKey(), sourceSmc, sourceKeys, + createDefault ? destCD : null, setDefault, matchMode, idShort, addSme); + } + + public static T CopyOneSMEbyCopy(this List submodelELements, ConceptDescription destCD, + List sourceSmc, ConceptDescription sourceCD, + bool createDefault = false, Action setDefault = null, + MatchMode matchMode = MatchMode.Relaxed, + string idShort = null, bool addSme = false) where T : ISubmodelElement + { + return submodelELements.CopyOneSMEbyCopy(destCD?.GetSingleKey(), sourceSmc, new[] { sourceCD?.GetSingleKey() }, + createDefault ? destCD : null, setDefault, matchMode, idShort, addSme); + } + + public static T CopyOneSMEbyCopy(this List submodelElements, Key destSemanticId, + List sourceSmc, Key[] sourceSemanticId, + ConceptDescription createDefault = null, Action setDefault = null, + MatchMode matchMode = MatchMode.Relaxed, + string idShort = null, bool addSme = false) where T : ISubmodelElement + { + // get source + var src = sourceSmc.FindFirstAnySemanticIdAs(sourceSemanticId, matchMode); + + // may be make an adaptive conversion + if (src == null) + { + var anySrc = sourceSmc?.FindFirstAnySemanticId(sourceSemanticId, matchMode: matchMode); + src = submodelElements.AdaptiveConvertTo(anySrc, createDefault, + idShort: idShort, addSme: false); + } + + // proceed + AasSubmodelElements aeSrc = (AasSubmodelElements)Enum.Parse(typeof(AasSubmodelElements), src?.GetType().Name); + if (src == null || aeSrc == AasSubmodelElements.SubmodelElement) + { + // create a default? + if (createDefault == null) + return default(T); + + // ok, default + var dflt = submodelElements.CreateSMEForCD(createDefault, idShort: idShort, addSme: addSme); + + // set default? + setDefault?.Invoke(dflt); + + // return + return dflt; + } + + // ok, create new one + var dst = AdminShellNS.AdminShellUtil.CreateSubmodelElementFromEnum(aeSrc, src); + if (dst == null) + return default(T); + + // make same things sure + dst.IdShort = src.IdShort; + dst.Category = src.Category; + dst.SemanticId = new Reference(ReferenceTypes.ModelReference, new List() { destSemanticId}); + + // instantanously add it? + if (addSme) + submodelElements.Add(dst); + + // give back + return (T)dst; + } + + public static T AdaptiveConvertTo(this List submodelElements, + ISubmodelElement anySrc, + ConceptDescription createDefault = null, + string idShort = null, bool addSme = false) where T : ISubmodelElement + { + if (typeof(T) == typeof(MultiLanguageProperty) + && anySrc is Property srcProp) + { + var res = submodelElements.CreateSMEForCD(createDefault, idShort: idShort, addSme: addSme); + if (res is MultiLanguageProperty mlp) + { + mlp.Value = new List() { new LangString("EN?", srcProp.Value) }; + mlp.ValueId = srcProp.ValueId; + return res; + } + } + + if (typeof(T) == typeof(Property) + && anySrc is MultiLanguageProperty srcMlp) + { + var res = submodelElements.CreateSMEForCD(createDefault, idShort: idShort, addSme: addSme); + if (res is Property prp) + { + prp.Value = "" + srcMlp.Value?.GetDefaultString(); + prp.ValueId = srcMlp.ValueId; + return res; + } + } + + return default(T); + } + + public static IEnumerable FindAllIdShort(this List submodelElements, + string idShort) + { + foreach (var smw in submodelElements) + if (smw != null) + if (smw.IdShort.Trim().ToLower() == idShort.Trim().ToLower()) + yield return smw; + } + + public static IEnumerable FindAllIdShortAs(this List submodelElements, + string idShort) where T : class, ISubmodelElement + { + foreach (var smw in submodelElements) + if (smw is T) + if (smw.IdShort.Trim().ToLower() == idShort.Trim().ToLower()) + yield return smw as T; + } + + public static ISubmodelElement FindFirstIdShort(this List submodelElements, + string idShort) + { + return submodelElements.FindAllIdShort(idShort)?.FirstOrDefault(); + } + + public static T FindFirstIdShortAs(this List submodelElements, + string idShort) where T : class, ISubmodelElement + { + return submodelElements.FindAllIdShortAs(idShort)?.FirstOrDefault(); + } + + + public static ISubmodelElement FindFirstAnySemanticId(this List submodelElements, + Key[] semId, Type[] allowedTypes = null, MatchMode matchMode = MatchMode.Strict) + { + if (semId == null) + return null; + foreach (var si in semId) + { + var found = submodelElements.FindAllSemanticId(si, allowedTypes, matchMode)? + .FirstOrDefault(); + if (found != null) + return found; + } + return null; + } + + public static T FindFirstAnySemanticIdAs(this List submodelElements, Key[] semId, MatchMode matchMode = MatchMode.Strict) + where T : ISubmodelElement + { + if (semId == null) + return default(T); + foreach (var si in semId) + { + var found = submodelElements.FindAllSemanticIdAs(si, matchMode).FirstOrDefault(); + if (found != null) + return found; + } + return default(T); + } + + public static T CreateNew(string idShort = null, string category = null, Reference semanticId = null) + where T : ISubmodelElement, new() + { + var res = new T(); + if (idShort != null) + res.IdShort = idShort; + if (category != null) + res.Category = category; + if (semanticId != null) + res.SemanticId = semanticId.Copy(); + return res; + } + + public static T CreateSMEForCD(this List submodelELements, ConceptDescription conceptDescription, string category = null, string idShort = null, + string idxTemplate = null, int maxNum = 999, bool addSme = false, bool isTemplate = false) + where T : ISubmodelElement + { + // access + if (conceptDescription == null) + return default(T); + + // fin type enum + var smeType = AdminShellUtil.AasSubmodelElementsFrom(); + if (!smeType.HasValue) + return default(T); + + // try to potentially figure out idShort + var ids = conceptDescription.IdShort; + + //TODO:jtikekar Temporarily removed + if ((ids == null || ids.Trim() == "") && conceptDescription.GetIEC61360() != null) + ids = conceptDescription.GetIEC61360().ShortName? + .GetDefaultString(); + + if (idShort != null) + ids = idShort; + + if (ids == null) + return default(T); + + // unique? + if (idxTemplate != null) + ids = submodelELements.IterateIdShortTemplateToBeUnique(idxTemplate, maxNum); + + // make a new instance + var semanticId = conceptDescription.GetCdReference(); + ISubmodelElement sme = AdminShellUtil.CreateSubmodelElementFromEnum(smeType.Value); + if (sme == null) + return default(T); + sme.IdShort = ids; + sme.SemanticId = semanticId.Copy(); + if (category != null) + sme.Category = category; + if (isTemplate) + sme.Kind = ModelingKind.Template; + + // if its a SMC, make sure its accessible + if (sme is SubmodelElementCollection smc) + smc.Value = new List(); + + // instantanously add it? + if (addSme) + submodelELements.Add(sme); + + // give back + return (T)sme; + } + + public static IEnumerable FindAllSemanticIdAs(this List submodelELements, Key semId, MatchMode matchMode = MatchMode.Strict) + where T : ISubmodelElement + { + foreach (var submodelElement in submodelELements) + if (submodelElement != null && submodelElement is T + && submodelElement.SemanticId != null) + if (submodelElement.SemanticId.MatchesExactlyOneKey(semId, matchMode)) + yield return (T)submodelElement; + } + + public static IEnumerable FindAllSemanticIdAs(this List submodelELements, + Reference semId, MatchMode matchMode = MatchMode.Strict) + where T : ISubmodelElement + { + foreach (var submodelElement in submodelELements) + if (submodelElement != null && submodelElement is T + && submodelElement.SemanticId != null) + if (submodelElement.SemanticId.Matches(semId, matchMode)) + yield return (T)submodelElement; + } + + public static T FindFirstSemanticIdAs(this List submodelElements, + Key semId, MatchMode matchMode = MatchMode.Strict) + where T : ISubmodelElement + { + return submodelElements.FindAllSemanticIdAs(semId, matchMode).FirstOrDefault(); + } + + public static T FindFirstSemanticIdAs(this List submodelElements, + Reference semId, MatchMode matchMode = MatchMode.Strict) + where T : ISubmodelElement + { + return submodelElements.FindAllSemanticIdAs(semId, matchMode).FirstOrDefault(); + } + + public static void RecurseOnReferables(this List submodelElements, object state, List parents, + Func, IReferable, bool> lambda) + { + if (lambda == null) + return; + if (parents == null) + parents = new List(); + + // over all elements + foreach (var submodelElement in submodelElements) + { + var current = submodelElement; + if (current == null) + continue; + + // call lambda for this element + // AND decide, if to recurse! + var goDeeper = lambda(state, parents, current); + + if (goDeeper) + { + // add to parents + parents.Add(current); + + // dive into? + if (current is SubmodelElementCollection smc) + smc.Value?.RecurseOnReferables(state, parents, lambda); + + if (current is Entity ent) + ent.Statements?.RecurseOnReferables(state, parents, lambda); + + if (current is Operation operation) + { + SubmodelElementCollection opVariableCollection = new SubmodelElementCollection(); + foreach (var inputVariable in operation.InputVariables) + { + opVariableCollection.Value.Add(inputVariable.Value); + } + + foreach (var outputVariable in operation.OutputVariables) + { + opVariableCollection.Value.Add(outputVariable.Value); + } + + foreach (var inOutVariable in operation.InoutputVariables) + { + opVariableCollection.Value.Add(inOutVariable.Value); + } + + opVariableCollection.Value.RecurseOnReferables(state, parents, lambda); + } + + if (current is AnnotatedRelationshipElement annotatedRelationshipElement) + { + var annotationElements = new List(); + if (annotatedRelationshipElement.Annotations != null) + foreach (var annotation in annotatedRelationshipElement.Annotations) + { + annotationElements.Add(annotation); + } + annotationElements.RecurseOnReferables(state, parents, lambda); + } + + // remove from parents + parents.RemoveAt(parents.Count - 1); + } + } + } + + public static void RecurseOnSubmodelElements(this List submodelElements, object state, List parents, Action, ISubmodelElement> lambda) + { + // trivial + if (lambda == null) + return; + if (parents == null) + parents = new List(); + + // over all elements + foreach (var smw in submodelElements) + { + var current = smw; + if (current == null) + continue; + + // call lambda for this element + lambda(state, parents, current); + + // add to parents + parents.Add(current); + + // dive into? + if (current is SubmodelElementCollection smc) + smc.Value?.RecurseOnSubmodelElements(state, parents, lambda); + + if (current is Entity ent) + ent.Statements?.RecurseOnSubmodelElements(state, parents, lambda); + + if (current is Operation operation) + { + SubmodelElementCollection opVariableCollection = new SubmodelElementCollection(); + foreach (var inputVariable in operation.InputVariables) + { + opVariableCollection.Value.Add(inputVariable.Value); + } + + foreach (var outputVariable in operation.OutputVariables) + { + opVariableCollection.Value.Add(outputVariable.Value); + } + + foreach (var inOutVariable in operation.InoutputVariables) + { + opVariableCollection.Value.Add(inOutVariable.Value); + } + + opVariableCollection.Value.RecurseOnSubmodelElements(state, parents, lambda); + } + + if (current is AnnotatedRelationshipElement annotatedRelationshipElement) + { + var annotationElements = new List(); + foreach (var annotation in annotatedRelationshipElement.Annotations) + { + annotationElements.Add(annotation); + } + annotationElements.RecurseOnSubmodelElements(state, parents, lambda); + } + + // remove from parents + parents.RemoveAt(parents.Count - 1); + } + } + + public static IEnumerable FindAllSemanticIdAs(this List submodelELements, string semanticId) where T : ISubmodelElement + { + foreach (var submodelElement in submodelELements) + { + if (submodelElement != null && submodelElement is T && submodelElement.SemanticId != null) + { + if (submodelElement.SemanticId.Matches(semanticId)) + { + yield return (T)submodelElement; + } + } + } + } + + public static T FindFirstSemanticIdAs(this List submodelELements, string semanticId) where T : ISubmodelElement + { + return submodelELements.FindAllSemanticIdAs(semanticId).FirstOrDefault(); + } + + public static T FindFirstAnySemanticIdAs(this List submodelELements, string[] semanticIds) where T : ISubmodelElement + { + if (semanticIds == null) + return default; + foreach (var semanticId in semanticIds) + { + var found = submodelELements.FindFirstSemanticIdAs(semanticId); + if (found != null) + return found; + } + return default; + } + + public static IEnumerable FindAllSemanticId( + this List smes, + string[] allowedSemanticIds, + bool invertedAllowed = false) where T : ISubmodelElement + { + if (allowedSemanticIds == null || allowedSemanticIds.Length < 1) + yield break; + + foreach (var sme in smes) + { + if (sme == null || !(sme is T)) + continue; + + if (sme.SemanticId == null || sme.SemanticId.Keys.Count < 1) + { + if (invertedAllowed) + yield return (T)sme; + continue; + } + + var found = false; + foreach (var semanticId in allowedSemanticIds) + if (sme.SemanticId.Matches(semanticId)) + { + found = true; + break; + } + + if (invertedAllowed) + found = !found; + + if (found) + yield return (T)sme; + } + } + + public static T FindFirstAnySemanticId(this List submodelElements, string[] allowedSemanticIds, bool invertAllowed = false) where T : ISubmodelElement + { + return submodelElements.FindAllSemanticId(allowedSemanticIds, invertAllowed).FirstOrDefault(); + } + + public static IEnumerable FindAllSemanticId( + this List smes, + Key[] allowedSemanticIds, MatchMode mm = MatchMode.Strict, + bool invertedAllowed = false) where T : ISubmodelElement + { + if (allowedSemanticIds == null || allowedSemanticIds.Length < 1) + yield break; + + foreach (var sme in smes) + { + if (sme == null || !(sme is T)) + continue; + + if (sme.SemanticId == null || sme.SemanticId.Keys.Count < 1) + { + if (invertedAllowed) + yield return (T)sme; + continue; + } + + var found = false; + foreach (var semanticId in allowedSemanticIds) + if (sme.SemanticId.MatchesExactlyOneKey(semanticId, mm)) + { + found = true; + break; + } + + if (invertedAllowed) + found = !found; + + if (found) + yield return (T)sme; + } + } + + public static T FindFirstAnySemanticId( + this List submodelElements, + Key[] allowedSemanticIds, MatchMode mm = MatchMode.Strict, + bool invertAllowed = false) where T : ISubmodelElement + { + return submodelElements.FindAllSemanticId(allowedSemanticIds, mm, invertAllowed).FirstOrDefault(); + } + + public static IEnumerable FindAllSemanticId( + this List submodelElements, Key semId, + Type[] allowedTypes = null, + MatchMode matchMode = MatchMode.Strict) + { + foreach (var smw in submodelElements) + if (smw != null && smw.SemanticId != null) + { + if (smw == null) + continue; + + if (allowedTypes != null) + { + var smwt = smw.GetType(); + if (!allowedTypes.Contains(smwt)) + continue; + } + + if (smw.SemanticId.MatchesExactlyOneKey(semId, matchMode)) + yield return smw; + } + } + + public static ISubmodelElement FindFirstSemanticId(this List submodelElements, Key semId, Type[] allowedTypes = null, MatchMode matchMode = MatchMode.Strict) + { + return submodelElements.FindAllSemanticId(semId, allowedTypes, matchMode)?.FirstOrDefault(); + } + + public static IEnumerable FindAllSemanticIdAs( + this List smes, + ConceptDescription cd, MatchMode matchMode = MatchMode.Strict) + where T : ISubmodelElement + { + foreach (var x in FindAllSemanticIdAs(smes, cd.GetReference(), matchMode)) + yield return x; + } + + public static T FindFirstSemanticIdAs( + this List smes, + ConceptDescription cd, MatchMode matchMode = MatchMode.Strict) + where T : ISubmodelElement + { + return smes.FindAllSemanticIdAs(cd, matchMode).FirstOrDefault(); + } + + + public static string IterateIdShortTemplateToBeUnique(this List submodelElements, string idShortTemplate, int maxNum) + { + if (idShortTemplate == null || maxNum < 1 || !idShortTemplate.Contains("{0")) + return null; + + int i = 1; + while (i < maxNum) + { + var ids = string.Format(idShortTemplate, i); + if (submodelElements.CheckIdShortIsUnique(ids)) + return ids; + i++; + } + + return null; + } + + public static bool CheckIdShortIsUnique(this List submodelElements, string idShort) + { + idShort = idShort?.Trim(); + if (idShort == null || idShort.Length < 1) + return false; + + var res = true; + foreach (var smw in submodelElements) + if (smw != null && smw.IdShort != null && smw.IdShort == idShort) + { + res = false; + break; + } + + return res; + } + + #endregion + + public static ISubmodelElement UpdateFrom(this ISubmodelElement elem, ISubmodelElement source) + { + if (source == null) + return elem; + + // IReferable + elem.Category = source.Category; + elem.IdShort = source.IdShort; + elem.DisplayName = source.DisplayName?.Copy(); + elem.Description = source.Description?.Copy(); + elem.Checksum = source.Checksum; + + // IHasKind + if (source.Kind.HasValue) + elem.Kind = source.Kind.Value; + + // IHasSemantics + if (source.SemanticId != null) + elem.SemanticId = source.SemanticId.Copy(); + if (source.SupplementalSemanticIds != null) + elem.SupplementalSemanticIds = source.SupplementalSemanticIds.Copy(); + + // IQualifiable + if (source.Qualifiers != null) + elem.Qualifiers = source.Qualifiers.Copy(); + + // IHasDataSpecification + if (source.EmbeddedDataSpecifications != null) + elem.EmbeddedDataSpecifications = source.EmbeddedDataSpecifications.Copy(); + + return elem; + } + + // + // Factories + // + + private static readonly Dictionary AasSubmodelElementsToAbbrev = ( + new Dictionary() + { + { AasSubmodelElements.AnnotatedRelationshipElement, "RelA" }, + { AasSubmodelElements.BasicEventElement, "BEvt" }, + { AasSubmodelElements.Blob, "Blob" }, + { AasSubmodelElements.Capability, "Cap" }, + { AasSubmodelElements.DataElement, "DE" }, + { AasSubmodelElements.Entity, "Ent" }, + { AasSubmodelElements.EventElement, "Evt" }, + { AasSubmodelElements.File, "File" }, + { AasSubmodelElements.MultiLanguageProperty, "MLP" }, + { AasSubmodelElements.Operation, "Opr" }, + { AasSubmodelElements.Property, "Prop" }, + { AasSubmodelElements.Range, "Range" }, + { AasSubmodelElements.ReferenceElement, "Ref" }, + { AasSubmodelElements.RelationshipElement, "Rel" }, + { AasSubmodelElements.SubmodelElement, "SME" }, + { AasSubmodelElements.SubmodelElementList, "SML" }, + { AasSubmodelElements.SubmodelElementCollection, "SMC" } + }); + + /// + /// Retrieve the string abbreviation of . + /// + /// + /// If is not a valid literal, return null. + /// + public static string? ToString(AasSubmodelElements? that) + { + if (!that.HasValue) + { + return null; + } + else + { + if (AasSubmodelElementsToAbbrev.TryGetValue(that.Value, out string? value)) + { + return value; + } + else + { + return null; + } + } + } + + private static readonly Dictionary _aasSubmodelElementsFromAbbrev = ( + new Dictionary() + { + { "RelA", AasSubmodelElements.AnnotatedRelationshipElement }, + { "BEvt", AasSubmodelElements.BasicEventElement }, + { "Blob", AasSubmodelElements.Blob }, + { "Cap", AasSubmodelElements.Capability }, + { "DE", AasSubmodelElements.DataElement }, + { "Ent", AasSubmodelElements.Entity }, + { "Evt", AasSubmodelElements.EventElement }, + { "File", AasSubmodelElements.File }, + { "MLP", AasSubmodelElements.MultiLanguageProperty }, + { "Opr", AasSubmodelElements.Operation }, + { "Prop", AasSubmodelElements.Property }, + { "Range", AasSubmodelElements.Range }, + { "Ref", AasSubmodelElements.ReferenceElement }, + { "Rel", AasSubmodelElements.RelationshipElement }, + { "SME", AasSubmodelElements.SubmodelElement }, + { "SML", AasSubmodelElements.SubmodelElementList }, + { "SMC", AasSubmodelElements.SubmodelElementCollection } + }); + + /// + /// Parse the string abbreviation of . + /// + /// + /// If is not a valid string representation + /// of a literal of , + /// return null. + /// + public static AasSubmodelElements? AasSubmodelElementsFromAbbrev(string text) + { + if (_aasSubmodelElementsFromAbbrev.TryGetValue(text, out AasSubmodelElements value)) + { + return value; + } + else + { + return null; + } + } + + /// + /// Parse the string representation or the abbreviation of . + /// + /// + /// If is not a valid string representation + /// of a literal of , + /// return null. + /// + public static AasSubmodelElements? AasSubmodelElementsFromStringOrAbbrev(string text) + { + var res = Stringification.AasSubmodelElementsFromString(text); + if (res.HasValue) + return res; + + return AasSubmodelElementsFromAbbrev(text); + } + + } +} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendKey.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendKey.cs new file mode 100644 index 000000000..141308e50 --- /dev/null +++ b/src/AasxCsharpLib_bkp/Extensions/ExtendKey.cs @@ -0,0 +1,229 @@ +using AasCore.Aas3_0_RC02; +using AasxCompatibilityModels; +using AdminShellNS; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.Serialization; +using System.Text.RegularExpressions; + +namespace Extensions +{ + public static class ExtendKey + { + public static Key CreateFrom(Reference r) + { + if (r == null || r.Count() != 1) + return null; + return r.Keys[0].Copy(); + } + + public static bool Matches(this Key key, + KeyTypes type, string id, MatchMode matchMode = MatchMode.Strict) + { + if (matchMode == MatchMode.Strict) + return key.Type == type && key.Value == id; + + if (matchMode == MatchMode.Relaxed) + return (key.Type == type || key.Type == KeyTypes.GlobalReference || type == KeyTypes.GlobalReference) + && key.Value == id; + + if (matchMode == MatchMode.Identification) + return key.Value == id; + + return false; + } + public static bool Matches(this Key key, Key otherKey) + { + if (otherKey == null) + { + return false; + } + + if (key.Type == otherKey.Type && key.Value.Equals(otherKey.Value)) + { + return true; + } + + return false; + } + + public static bool Matches(this Key key, Key otherKey, MatchMode matchMode = MatchMode.Strict) + { + if (matchMode == MatchMode.Strict) + return key.Type == otherKey.Type && key.Value == otherKey.Value; + + if (matchMode == MatchMode.Relaxed) + return (key.Type == otherKey.Type || key.Type == KeyTypes.GlobalReference || otherKey.Type == KeyTypes.GlobalReference) + && (key.Value == otherKey.Value); + + if (matchMode == MatchMode.Identification) + return key.Value == otherKey.Value; + + return false; + } + + public static bool MatchesSetOfTypes(this Key key, IEnumerable set) + { + foreach (var kt in set) + if (key.Type == kt) + return true; + return false; + } + + + public static AasValidationAction Validate(this Key key, AasValidationRecordList results, IReferable container) + { + // access + if (results == null || container == null) + return AasValidationAction.No; + + var res = AasValidationAction.No; + + // check + if (key == null) + { + // violation case + results.Add(new AasValidationRecord( + AasValidationSeverity.SpecViolation, container, + "Key: is null", + () => + { + res = AasValidationAction.ToBeDeleted; + })); + } + else + { + + // check type + var tf = AdminShellUtil.CheckIfInConstantStringArray(Enum.GetNames(typeof(KeyTypes)), Stringification.ToString(key.Type)); + if (tf == AdminShellUtil.ConstantFoundEnum.No) + // violation case + results.Add(new AasValidationRecord( + AasValidationSeverity.SchemaViolation, container, + "Key: type is not in allowed enumeration values", + () => + { + key.Type = KeyTypes.GlobalReference; + })); + if (tf == AdminShellUtil.ConstantFoundEnum.AnyCase) + // violation case + results.Add(new AasValidationRecord( + AasValidationSeverity.SchemaViolation, container, + "Key: type in wrong casing", + () => + { + //NO IdType in V3 + //key.idType = AdminShellUtil.CorrectCasingForConstantStringArray( + // KeyElements, key.type); + })); + } + + // may give result "to be deleted" + return res; + } + + + + public static string ToStringExtended(this Key key, int format = 1) + { + if (format == 2) + return "" + key.Value; + return $"[{key.Type}, {key.Value}]"; + } + + public static bool IsAbsolute(this Key key) + { + return key.Type == KeyTypes.GlobalReference || key.Type == KeyTypes.AssetAdministrationShell || key.Type == KeyTypes.Submodel; + } + + public static Key Parse(string cell, KeyTypes typeIfNotSet = KeyTypes.GlobalReference, + bool allowFmtAll = false, bool allowFmt0 = false, + bool allowFmt1 = false, bool allowFmt2 = false) + { + // access and defaults? + if (cell == null || cell.Trim().Length < 1) + return null; + + // format == 1 + if (allowFmtAll || allowFmt1) + { + var m = Regex.Match(cell, @"\((\w+)\)( ?)(.*)$"); + if (m.Success) + { + return new Key( + Stringification.KeyTypesFromString(m.Groups[1].ToString()) ?? KeyTypes.GlobalReference, + m.Groups[3].ToString()); + } + } + + // format == 2 + if (allowFmtAll || allowFmt2) + { + var m = Regex.Match(cell, @"( ?)(.*)$"); + if (m.Success) + { + return new Key( + typeIfNotSet, m.Groups[2].ToString()); + } + } + + // format == 0 + if (allowFmtAll || allowFmt0) + { + var m = Regex.Match(cell, @"\[(\w+),( ?)(.*)\]"); + if (m.Success) + { + return new Key( + Stringification.KeyTypesFromString(m.Groups[1].ToString()) ?? KeyTypes.GlobalReference, + m.Groups[3].ToString()); + } + } + + // no + return null; + } + + // ------------------------------------------------------------------------------------------------------------- + #region Handling with enums for KeyTypes + + // see: https://stackoverflow.com/questions/27372816/how-to-read-the-value-for-an-enummember-attribute + //public static string? GetEnumMemberValue(this T value) + // where T : Enum + //{ + // return typeof(T) + // .GetTypeInfo() + // .DeclaredMembers + // .SingleOrDefault(x => x.Name == value.ToString()) + // ?.GetCustomAttribute(false) + // ?.Value; + //} + + //public static KeyTypes? MapFrom(AasReferables input) + //{ + // var st = input.GetEnumMemberValue(); + // var res = Stringification.KeyTypesFromString(st); + // return res; + //} + + //public static List MapFrom(IEnumerable input) + //{ + // List res = new(); + // foreach (var i in input) + // { + // var x = MapFrom(i); + // if (x.HasValue) + // res.Add(x.Value); + // } + // return res; + //} + + //public static List GetAllKeyTypesForAasReferables() + // => ExtendKey.MapFrom(Enum.GetValues(typeof(AasReferables)).OfType()); + + #endregion + + } +} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendKeyList.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendKeyList.cs new file mode 100644 index 000000000..86d899062 --- /dev/null +++ b/src/AasxCsharpLib_bkp/Extensions/ExtendKeyList.cs @@ -0,0 +1,183 @@ +using AasCore.Aas3_0_RC02; +using AasxCompatibilityModels; +using AdminShellNS; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.Serialization; +using System.Text.RegularExpressions; +using Extensions; + +namespace Extensions +{ + public static class ExtendKeyList + { + public static bool IsEmpty(this List keys) + { + return keys.Count < 1; + } + + public static bool Matches(this List keys, List other, MatchMode matchMode = MatchMode.Strict) + { + if (other == null || other.Count != keys.Count) + return false; + + var same = true; + for (int i = 0; i < keys.Count; i++) + same = same && keys[i].Matches(other[i], matchMode); + + return same; + } + + public static List ReplaceLastKey(this List keys,List newKeys) + { + var res = new List(keys); + if (res.Count < 1 || newKeys == null || newKeys.Count < 1) + return res; + + res.Remove(res.Last()); + res.AddRange(newKeys); + return res; + } + + public static bool StartsWith(this List keyList, List otherKeyList) + { + if (otherKeyList == null || otherKeyList.Count == 0) + return false; + + // simply test element-wise + for (int i = 0; i < otherKeyList.Count; i++) + { + // does head have more elements than this list? + if (i >= keyList.Count) + return false; + + if (!otherKeyList[i].Matches(keyList[i])) + return false; + } + + // ok! + return true; + } + + public static bool StartsWith(this List keyList,List head, bool emptyIsTrue = false, + MatchMode matchMode = MatchMode.Relaxed) + { + // access + if (head == null) + return false; + if (head.Count == 0) + return emptyIsTrue; + + // simply test element-wise + for (int i = 0; i < head.Count; i++) + { + // does head have more elements than this list? + if (i >= keyList.Count) + return false; + + if (!head[i].Matches(keyList[i], matchMode)) + return false; + } + + // ok! + return true; + } + + public static string ToStringExtended(this List keys, int format = 1, string delimiter = ",") + { + return string.Join(delimiter, keys.Select((k) => k.ToStringExtended(format))); + } + + public static void Validate(this List keys, AasValidationRecordList results, + IReferable container) + { + // access + if (results == null || keys == null || container == null) + return; + + // iterate thru + var idx = 0; + while (idx < keys.Count) + { + var act = keys[idx].Validate(results, container); + if (act == AasValidationAction.ToBeDeleted) + { + keys.RemoveAt(idx); + continue; + } + idx++; + } + } + + public static bool MatchesSetOfTypes(this List key, IEnumerable set) + { + var res = true; + foreach (var kt in key) + if (!key.MatchesSetOfTypes(set)) + res = false; + return res; + } + + public static List Parse(string input) + { + // access + if (input == null) + return null; + + // split + var parts = input.Split(',', ';'); + var kl = new List(); + + foreach (var p in parts) + { + var k = ExtendKey.Parse(p); + if (k != null) + kl.Add(k); + } + + return kl; + } + + /// + /// Take only idShort, ignore all other key-types and create a '/'-separated list + /// + /// Empty string or list of idShorts + public static string BuildIdShortPath(this List keyList, + int startPos = 0, int count = int.MaxValue) + { + if (keyList == null || startPos >= keyList.Count) + return ""; + int nr = 0; + var res = ""; + for (int i = startPos; i < keyList.Count && nr < count; i++) + { + nr++; + //// if (keyList[i].Type.Trim().ToLower() == Key.IdShort.Trim().ToLower()) + { + if (res != "") + res += "/"; + res += keyList[i].Value; + } + } + return res; + } + + public static List SubList(this List keyList, + int startPos, int count = int.MaxValue) + { + var res = new List(); + if (startPos >= keyList.Count()) + return res; + int nr = 0; + for (int i = startPos; i < keyList.Count() && nr < count; i++) + { + nr++; + res.Add(keyList[i]); + } + return res; + } + } +} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendKeyTypes.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendKeyTypes.cs new file mode 100644 index 000000000..2b00c5fd1 --- /dev/null +++ b/src/AasxCsharpLib_bkp/Extensions/ExtendKeyTypes.cs @@ -0,0 +1,22 @@ +using AasCore.Aas3_0_RC02; +using AdminShellNS; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.Serialization; + +namespace Extensions +{ + public static class ExtendKeyTypes + { + public static bool IsSME(this KeyTypes keyType) + { + foreach (var kt in Constants.AasSubmodelElementsAsKeys) + if (kt.HasValue && kt.Value == keyType) + return true; + return false; + } + } +} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendLangString.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendLangString.cs new file mode 100644 index 000000000..1dc8f9504 --- /dev/null +++ b/src/AasxCsharpLib_bkp/Extensions/ExtendLangString.cs @@ -0,0 +1,35 @@ +using AasCore.Aas3_0_RC02; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendLangString + { + // constants + public static string LANG_DEFAULT = "en"; + + // MIHO: not required, see ExtendLangStringSte + //public static string GetDefaultString(this List langStrings, string defaultLang = null) + //{ + // // start + // if (defaultLang == null) + // defaultLang = "en"; + // defaultLang = defaultLang.Trim().ToLower(); + // string res = null; + + // // search + // foreach (var ls in langStrings) + // if (ls.Language.Trim().ToLower() == defaultLang) + // res = ls.Text; + // if (res == null && langStrings.Count > 0) + // res = langStrings[0].Text; + + // // found? + // return res; + //} + } +} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendLangStringSet.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendLangStringSet.cs new file mode 100644 index 000000000..c5743605c --- /dev/null +++ b/src/AasxCsharpLib_bkp/Extensions/ExtendLangStringSet.cs @@ -0,0 +1,165 @@ +using AasCore.Aas3_0_RC02; +using System; +using System.Collections.Generic; +using System.Text.RegularExpressions; + +namespace Extensions +{ + public static class ExtendLangStringSet + { + #region AasxPackageExplorer + + public static bool IsValid(this List langStringSet) + { + if(langStringSet != null && langStringSet.Count >=1) + { + return true; + } + + return false; + } + + #endregion + public static bool IsEmpty(this List langStringSet) + { + if (langStringSet == null || langStringSet.Count == 0) + { + return true; + } + + return false; + } + public static string GetDefaultString(this List langStringSet, string defaultLang = null) + { + // start + if (defaultLang == null) + defaultLang = "en"; //Default Lang in old implementation is en + + string res = null; + + // search + foreach (var langString in langStringSet) + if (langString.Language.Equals(defaultLang, StringComparison.OrdinalIgnoreCase)) + res = langString.Text; + + if (res == null && langStringSet.Count > 0) + res = langStringSet[0].Text; + + // found? + return res; + } + + public static List Create(string language, string text) + { + return new List { new LangString(language, text) }; + } + + public static List CreateManyFromStringArray(string[] s) + { + if (s == null) + return null; + var r = new List(); + var i = 0; + while ((i + 1) < s.Length) + { + r.Add(new LangString(s[i], s[i + 1])); + i += 2; + } + return r; + } + + // TODO (Jui, 2023-01-05): Check why the generic Copy does not apply here?! + public static List Copy(this List original) + { + var res = new List(); + if (original != null) + foreach (var o in original) + res.Add(o.Copy()); + return res; + } + + public static List Set(this List lss, string lang, string text) + { + foreach (var ls in lss) + if (ls.Language.Trim().ToLower() == lang?.Trim().ToLower()) + { + ls.Text = text; + return lss; + } + lss.Add(new LangString(lang, text)); + return lss; + } + + public static List ConvertFromV20( + this List langStringSet, + AasxCompatibilityModels.AdminShellV20.LangStringSet sourceLangStrings) + { + + //if (!sourceLangStrings.langString.IsNullOrEmpty()) + if (sourceLangStrings.langString!= null && sourceLangStrings.langString.Count != 0) + { + langStringSet = new List(); + foreach (var sourceLangString in sourceLangStrings.langString) + { + var langString = new LangString(sourceLangString.lang, sourceLangString.str); + langStringSet.Add(langString); + } + } + return langStringSet; + } + + public static List ConvertFromV20( + this List lss, + AasxCompatibilityModels.AdminShellV20.LangStringSetIEC61360 src) + { + + //if (!sourceLangStrings.langString.IsNullOrEmpty()) + if (src != null && src.Count != 0) + { + lss = new List(); + foreach (var sourceLangString in src) + { + var langString = new LangString(sourceLangString.lang, sourceLangString.str); + lss.Add(langString); + } + } + return lss; + } + + public static List Parse(string cell) + { + // access + if (cell == null) + return null; + + // iterative approach + var res = new List(); + while (true) + { + // trivial case and finite end + if (!cell.Contains("@")) + { + if (cell.Trim() != "") + res.Add(new LangString(ExtendLangString.LANG_DEFAULT, cell)); + break; + } + + // OK, pick the next couple + var m = Regex.Match(cell, @"(.*?)@(\w+)", RegexOptions.Singleline); + if (!m.Success) + { + // take emergency exit? + res.Add(new LangString("??", cell)); + break; + } + + // use the match and shorten cell .. + res.Add(new LangString(m.Groups[2].ToString(), m.Groups[1].ToString().Trim())); + cell = cell.Substring(m.Index + m.Length); + } + + return res; + } + + } +} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendModelKind.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendModelKind.cs new file mode 100644 index 000000000..142f91c65 --- /dev/null +++ b/src/AasxCsharpLib_bkp/Extensions/ExtendModelKind.cs @@ -0,0 +1,33 @@ +using AasCore.Aas3_0_RC02; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using AdminShellNS; + +namespace Extensions +{ + public static class ExtendModelKind + { + public static void Validate(this ModelingKind modelingKind, AasValidationRecordList results, IReferable container) + { + // access + if (results == null || container == null) + return; + + // check + if (modelingKind != ModelingKind.Template && modelingKind != ModelingKind.Instance) + { + // violation case + results.Add(new AasValidationRecord( + AasValidationSeverity.SchemaViolation, container, + $"ModelingKind: enumeration value neither Template nor Instance", + () => + { + modelingKind = ModelingKind.Instance; + })); + } + } + } +} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendMultiLanguageProperty.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendMultiLanguageProperty.cs new file mode 100644 index 000000000..6dd634852 --- /dev/null +++ b/src/AasxCsharpLib_bkp/Extensions/ExtendMultiLanguageProperty.cs @@ -0,0 +1,127 @@ +using AasCore.Aas3_0_RC02; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendMultiLanguageProperty + { + #region AasxPackageExplorer + + public static void ValueFromText(this MultiLanguageProperty multiLanguageProperty, string text, string defaultLang) + { + multiLanguageProperty.Value ??= new List(); + + multiLanguageProperty.Value.Add(new LangString(defaultLang == null? "en" : defaultLang, text)); + } + + #endregion + + public static string ValueAsText(this MultiLanguageProperty multiLanguageProperty, string defaultLang = null) + { + //TODO: need to check/test again + //return "" + multiLanguageProperty.Value?.LangStrings.FirstOrDefault().Text; + return "" + multiLanguageProperty.Value?.GetDefaultString(defaultLang); + } + + public static MultiLanguageProperty ConvertFromV20(this MultiLanguageProperty property, AasxCompatibilityModels.AdminShellV20.MultiLanguageProperty sourceProperty) + { + if (sourceProperty == null) + { + return null; + } + + if (sourceProperty.valueId != null) + { + var keyList = new List(); + foreach (var refKey in sourceProperty.valueId.Keys) + { + //keyList.Add(new Key(ExtensionsUtil.GetKeyTypeFromString(refKey.type), refKey.value)); + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value not found for property {property.IdShort}"); + } + } + property.ValueId = new Reference(ReferenceTypes.GlobalReference, keyList); + } + + var newLangStrings = new List(); + + List newLangStringSet = new(newLangStrings); + + property.Value = newLangStringSet.ConvertFromV20(sourceProperty.value); + + return property; + + } + + public static MultiLanguageProperty UpdateFrom( + this MultiLanguageProperty elem, ISubmodelElement source) + { + if (source == null) + return elem; + + ((ISubmodelElement)elem).UpdateFrom(source); + + if (source is Property srcProp) + { + elem.Value = new List { new LangString("EN?", srcProp.Value) }; + if (srcProp.ValueId != null) + elem.ValueId = srcProp.ValueId.Copy(); + } + + if (source is MultiLanguageProperty srcMlp) + { + if (srcMlp.Value != null) + elem.Value = srcMlp.Value.Copy(); + if (srcMlp.ValueId != null) + elem.ValueId = srcMlp.ValueId.Copy(); + } + + if (source is AasCore.Aas3_0_RC02.Range srcRng) + { + if (srcRng.Min != null) + elem.Value = new List { new LangString("EN?", srcRng.Min) }; + } + + if (source is File srcFile) + { + elem.Value = new List { new LangString("EN?", srcFile.Value) }; + } + + return elem; + } + + public static MultiLanguageProperty Set(this MultiLanguageProperty mlp, + List ls) + { + mlp.Value = ls; + return mlp; + } + + public static MultiLanguageProperty Set(this MultiLanguageProperty mlp, + LangString ls) + { + if (ls == null) + return mlp; + if (mlp.Value == null) + mlp.Value = new List(); + mlp.Value.Set(ls.Language, ls.Text); + return mlp; + } + + public static MultiLanguageProperty Set(this MultiLanguageProperty mlp, + string lang, string str) + { + return mlp.Set(new LangString(lang, str)); + } + } +} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendObject.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendObject.cs new file mode 100644 index 000000000..2f0db29c2 --- /dev/null +++ b/src/AasxCsharpLib_bkp/Extensions/ExtendObject.cs @@ -0,0 +1,137 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using Extensions.ArrayExtensions; + +namespace Extensions +{ + public static class ExtendObject + { + private static readonly MethodInfo CloneMethod = typeof(Object).GetMethod("MemberwiseClone", BindingFlags.NonPublic | BindingFlags.Instance); + + public static bool IsPrimitive(this Type type) + { + if (type == typeof(String)) return true; + return (type.IsValueType & type.IsPrimitive); + } + + public static Object Copy(this Object originalObject) + { + return InternalCopy(originalObject, new Dictionary(new ReferenceEqualityComparer())); + } + + private static Object InternalCopy(Object originalObject, IDictionary visited) + { + if (originalObject == null) return null; + var typeToReflect = originalObject.GetType(); + if (IsPrimitive(typeToReflect)) return originalObject; + if (visited.ContainsKey(originalObject)) return visited[originalObject]; + if (typeof(Delegate).IsAssignableFrom(typeToReflect)) return null; + var cloneObject = CloneMethod.Invoke(originalObject, null); + if (typeToReflect.IsArray) + { + var arrayType = typeToReflect.GetElementType(); + if (IsPrimitive(arrayType) == false) + { + Array clonedArray = (Array)cloneObject; + clonedArray.ForEach((array, indices) => array.SetValue(InternalCopy(clonedArray.GetValue(indices), visited), indices)); + } + + } + visited.Add(originalObject, cloneObject); + CopyFields(originalObject, visited, cloneObject, typeToReflect); + RecursiveCopyBaseTypePrivateFields(originalObject, visited, cloneObject, typeToReflect); + return cloneObject; + } + + private static void RecursiveCopyBaseTypePrivateFields(object originalObject, IDictionary visited, object cloneObject, Type typeToReflect) + { + if (typeToReflect.BaseType != null) + { + RecursiveCopyBaseTypePrivateFields(originalObject, visited, cloneObject, typeToReflect.BaseType); + CopyFields(originalObject, visited, cloneObject, typeToReflect.BaseType, BindingFlags.Instance | BindingFlags.NonPublic, info => info.IsPrivate); + } + } + + private static void CopyFields(object originalObject, IDictionary visited, object cloneObject, Type typeToReflect, BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.FlattenHierarchy, Func filter = null) + { + foreach (FieldInfo fieldInfo in typeToReflect.GetFields(bindingFlags)) + { + if (filter != null && filter(fieldInfo) == false) continue; + if (IsPrimitive(fieldInfo.FieldType)) continue; + var originalFieldValue = fieldInfo.GetValue(originalObject); + var clonedFieldValue = InternalCopy(originalFieldValue, visited); + fieldInfo.SetValue(cloneObject, clonedFieldValue); + } + } + public static T Copy(this T original) + { + return (T)Copy((Object)original); + } + } + + public class ReferenceEqualityComparer : EqualityComparer + { + public override bool Equals(object x, object y) + { + return ReferenceEquals(x, y); + } + public override int GetHashCode(object obj) + { + if (obj == null) return 0; + return obj.GetHashCode(); + } + } + + namespace ArrayExtensions + { + public static class ArrayExtensions + { + public static void ForEach(this Array array, Action action) + { + if (array.LongLength == 0) return; + ArrayTraverse walker = new ArrayTraverse(array); + do action(array, walker.Position); + while (walker.Step()); + } + } + + internal class ArrayTraverse + { + public int[] Position; + private int[] maxLengths; + + public ArrayTraverse(Array array) + { + maxLengths = new int[array.Rank]; + for (int i = 0; i < array.Rank; ++i) + { + maxLengths[i] = array.GetLength(i) - 1; + } + Position = new int[array.Rank]; + } + + public bool Step() + { + for (int i = 0; i < Position.Length; ++i) + { + if (Position[i] < maxLengths[i]) + { + Position[i]++; + for (int j = 0; j < i; j++) + { + Position[j] = 0; + } + return true; + } + } + return false; + } + } + } + +} + diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendOperation.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendOperation.cs new file mode 100644 index 000000000..12ad52979 --- /dev/null +++ b/src/AasxCsharpLib_bkp/Extensions/ExtendOperation.cs @@ -0,0 +1,148 @@ +using AasCore.Aas3_0_RC02; +using AdminShellNS.Display; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendOperation + { + #region AasxPackageExplorer + + public static object AddChild(this Operation operation, ISubmodelElement childSubmodelElement, EnumerationPlacmentBase placement = null) + { + // not enough information to select list of children? + var pl = placement as EnumerationPlacmentOperationVariable; + if (childSubmodelElement == null || pl == null) + return null; + + // ok, use information + var ov = new OperationVariable(childSubmodelElement); + + if (childSubmodelElement != null) + childSubmodelElement.Parent = operation; + + if (pl.Direction == OperationVariableDirection.In) + { + operation.InputVariables ??= new List(); + operation.InputVariables.Add(ov); + } + + if (pl.Direction == OperationVariableDirection.Out) + { + operation.OutputVariables ??= new List(); + operation.OutputVariables.Add(ov); + } + + if (pl.Direction == OperationVariableDirection.InOut) + { + operation.InoutputVariables ??= new List(); + operation.InoutputVariables.Add(ov); + } + + return ov; + } + + public static EnumerationPlacmentBase GetChildrenPlacement(this Operation operation, ISubmodelElement child) + { + // trivial + if (child == null) + return null; + + // search + OperationVariableDirection? dir = null; + OperationVariable opvar = null; + if (operation.InputVariables != null) + foreach (var ov in operation.InputVariables) + if (ov?.Value == child) + { + dir = OperationVariableDirection.In; + opvar = ov; + } + + if (operation.OutputVariables != null) + foreach (var ov in operation.OutputVariables) + if (ov?.Value == child) + { + dir = OperationVariableDirection.Out; + opvar = ov; + } + + if (operation.InoutputVariables != null) + foreach (var ov in operation.InoutputVariables) + if (ov?.Value == child) + { + dir = OperationVariableDirection.InOut; + opvar = ov; + } + + // found + if (!dir.HasValue) + return null; + return new EnumerationPlacmentOperationVariable() + { + Direction = dir.Value, + OperationVariable = opvar + }; + } + + public static List GetVars(this Operation op, OperationVariableDirection dir) + { + if (dir == OperationVariableDirection.In) + return op.InputVariables; + if (dir == OperationVariableDirection.Out) + return op.OutputVariables; + return op.InoutputVariables; + } + + public static List SetVars( + this Operation op, OperationVariableDirection dir, List value) + { + if (dir == OperationVariableDirection.In) + { + op.InputVariables = value; + return op.InputVariables; + } + if (dir == OperationVariableDirection.Out) + { + op.OutputVariables = value; + return op.OutputVariables; + } + + op.InoutputVariables = value; + return op.InoutputVariables; + } + + #endregion + + public static Operation UpdateFrom( + this Operation elem, ISubmodelElement source) + { + if (source == null) + return elem; + + ((ISubmodelElement)elem).UpdateFrom(source); + + if (source is SubmodelElementCollection srcColl) + { + if (srcColl.Value != null) + elem.InputVariables = srcColl.Value.Copy().Select( + (isme) => new OperationVariable(isme)).ToList(); + } + + if (source is SubmodelElementCollection srcList) + { + if (srcList.Value != null) + elem.InputVariables = srcList.Value.Copy().Select( + (isme) => new OperationVariable(isme)).ToList(); + } + + return elem; + } + } +} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendProperty.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendProperty.cs new file mode 100644 index 000000000..b9e9d4e4d --- /dev/null +++ b/src/AasxCsharpLib_bkp/Extensions/ExtendProperty.cs @@ -0,0 +1,266 @@ +using AasCore.Aas3_0_RC02; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendProperty + { + #region AasxPackageExplorer + + public static void ValueFromText(this Property property, string text) + { + property.Value = text; + } + + #endregion + public static bool IsValueTrue(this Property property) + { + if(property.ValueType == DataTypeDefXsd.Boolean) + { + if(property.Value.Equals("true", StringComparison.OrdinalIgnoreCase)) + { + return true; + } + } + + return false; + } + + public static string ValueAsText(this Property property) + { + return "" + property.Value; + } + + public static double? ValueAsDouble(this Property prop) + { + // pointless + if (prop.Value == null || prop.Value.Trim() == "") + return null; + + // type? + if (!ExtendDataElement.ValueTypes_Number.Contains(prop.ValueType)) + return null; + + // try convert + if (double.TryParse(prop.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out double dbl)) + return dbl; + + // no + return null; + } + public static Property ConvertFromV10(this Property property, AasxCompatibilityModels.AdminShellV10.Property sourceProperty) + { + if (sourceProperty == null) + { + return null; + } + var propertyType = Stringification.DataTypeDefXsdFromString("xs:" + sourceProperty.valueType); + if (propertyType != null) + { + property.ValueType = (DataTypeDefXsd)propertyType; + } + else + { + Console.WriteLine($"ValueType {sourceProperty.valueType} not found for property {sourceProperty.idShort}"); + } + property.Value = sourceProperty.value; + if (sourceProperty.valueId != null) + { + var keyList = new List(); + foreach (var refKey in sourceProperty.valueId.Keys) + { + //keyList.Add(new Key(ExtensionsUtil.GetKeyTypeFromString(refKey.type), refKey.value)); + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {sourceProperty.valueType} not found for property {property.IdShort}"); + } + } + property.ValueId = new Reference(ReferenceTypes.GlobalReference, keyList); + } + + return property; + } + + public static Property ConvertFromV20(this Property property, AasxCompatibilityModels.AdminShellV20.Property sourceProperty) + { + if (sourceProperty == null) + { + return null; + } + + var propertyType = Stringification.DataTypeDefXsdFromString("xs:" + sourceProperty.valueType); + if (propertyType != null) + { + property.ValueType = (DataTypeDefXsd)propertyType; + } + else + { + Console.WriteLine($"ValueType {sourceProperty.valueType} not found for property {sourceProperty.idShort}"); + } + property.Value = sourceProperty.value; + if (sourceProperty.valueId != null) + { + var keyList = new List(); + foreach (var refKey in sourceProperty.valueId.Keys) + { + //keyList.Add(new Key(ExtensionsUtil.GetKeyTypeFromString(refKey.type), refKey.value)); + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {sourceProperty.valueType} not found for property {property.IdShort}"); + } + } + property.ValueId = new Reference(ReferenceTypes.GlobalReference, keyList); + } + + return property; + } + + public static Property UpdateFrom(this Property elem, ISubmodelElement source) + { + if (source == null) + return elem; + + ((ISubmodelElement)elem).UpdateFrom(source); + + if (source is Property srcProp) + { + elem.ValueType = srcProp.ValueType; + elem.Value = srcProp.Value; + if (srcProp.ValueId != null) + elem.ValueId = srcProp.ValueId.Copy(); + } + + if (source is AasCore.Aas3_0_RC02.Range srcRng) + { + elem.ValueType = srcRng.ValueType; + elem.Value = srcRng.Min; + } + + if (source is MultiLanguageProperty srcMlp) + { + elem.ValueType = DataTypeDefXsd.String; + elem.Value = "" + srcMlp.Value?.GetDefaultString(); + if (srcMlp.ValueId != null) + elem.ValueId = srcMlp.ValueId.Copy(); + } + + if (source is File srcFile) + { + elem.ValueType = DataTypeDefXsd.String; + elem.Value = "" + srcFile.Value; + } + + return elem; + } + + // MIHO: Jui, why was this required? +#if OLD + + public static void UpdatePropertyFrom(this Property property, Property sourceProperty) + { + if (sourceProperty.Extensions != null) + { + property.Extensions = sourceProperty.Extensions; + } + if (sourceProperty.Category != null) + { + property.Category = sourceProperty.Category; + } + if (sourceProperty.IdShort != null) + { + property.IdShort = sourceProperty.IdShort; + } + if (sourceProperty.DisplayName != null) + { + property.DisplayName = sourceProperty.DisplayName; + } + if (sourceProperty.Description != null) + { + property.Description = sourceProperty.Description; + } + if (sourceProperty.Checksum != null) + { + property.Checksum = sourceProperty.Checksum; + } + if (sourceProperty.Kind != null) + { + property.Kind = sourceProperty.Kind; + } + if (sourceProperty.SemanticId != null) + { + property.SemanticId = sourceProperty.SemanticId; + } + if (sourceProperty.SupplementalSemanticIds != null) + { + property.SupplementalSemanticIds = sourceProperty.SupplementalSemanticIds; + } + if (sourceProperty.Qualifiers != null) + { + property.Qualifiers = sourceProperty.Qualifiers; + } + if (sourceProperty.EmbeddedDataSpecifications != null) + { + property.EmbeddedDataSpecifications = sourceProperty.EmbeddedDataSpecifications; + } + if (true) + { + property.ValueType = sourceProperty.ValueType; + } + if (sourceProperty.ValueId != null) + { + property.ValueId = sourceProperty.ValueId; + } + if (sourceProperty.Value != null) + { + property.Value = sourceProperty.Value; + } + } +#endif + + public static Property Set(this Property prop, + DataTypeDefXsd valueType = DataTypeDefXsd.String, string value = "") + { + prop.ValueType = valueType; + prop.Value = value; + return prop; + } + + public static Property Set(this Property prop, + KeyTypes type, string value) + { + prop.ValueId = ExtendReference.CreateFromKey(new Key(type, value)); + return prop; + } + + public static Property Set(this Property prop, + Qualifier q) + { + if (q != null) + prop.Add(q); + return prop; + } + + public static Property Set(this Property prop, + Extension ext) + { + if (ext != null) + prop.Add(ext); + return prop; + } + } +} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendQualifier.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendQualifier.cs new file mode 100644 index 000000000..44a495d65 --- /dev/null +++ b/src/AasxCsharpLib_bkp/Extensions/ExtendQualifier.cs @@ -0,0 +1,192 @@ +using AasCore.Aas3_0_RC02; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendQualifier + { + public static Qualifier ConvertFromV10(this Qualifier qualifier, AasxCompatibilityModels.AdminShellV10.Qualifier sourceQualifier) + { + if (sourceQualifier.semanticId != null) + { + var keyList = new List(); + foreach (var refKey in sourceQualifier.semanticId.Keys) + { + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {refKey.type} not found."); + } + } + qualifier.SemanticId = new Reference(ReferenceTypes.GlobalReference, keyList); + } + + qualifier.Type = sourceQualifier.qualifierType; + qualifier.Value = sourceQualifier.qualifierValue; + + if (sourceQualifier.qualifierValueId != null) + { + var keyList = new List(); + foreach (var refKey in sourceQualifier.qualifierValueId.Keys) + { + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {refKey.type} not found."); + } + } + qualifier.ValueId = new Reference(ReferenceTypes.GlobalReference, keyList); + } + + return qualifier; + } + + public static Qualifier ConvertFromV20(this Qualifier qualifier, AasxCompatibilityModels.AdminShellV20.Qualifier sourceQualifier) + { + if (sourceQualifier.semanticId != null) + { + var keyList = new List(); + foreach (var refKey in sourceQualifier.semanticId.Keys) + { + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {refKey.type} not found."); + } + + } + qualifier.SemanticId = new Reference(ReferenceTypes.GlobalReference, keyList); + } + + qualifier.Type = sourceQualifier.type; + qualifier.Value = sourceQualifier.value; + + if (sourceQualifier.valueId != null) + { + var keyList = new List(); + foreach (var refKey in sourceQualifier.valueId.Keys) + { + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {refKey.type} not found."); + } + } + qualifier.ValueId = new Reference(ReferenceTypes.GlobalReference, keyList); + } + + return qualifier; + } + + // ReSharper disable MethodOverloadWithOptionalParameter .. this seems to work, anyhow + // ReSharper disable RedundantArgumentDefaultValue + public static string ToStringExtended(this Qualifier q, + int format = 0, string delimiter = ",") + { + var res = "" + q.Type; + if (res == "") + res += "" + q.SemanticId?.ToStringExtended(format, delimiter); + + if (q.Value != null) + res += " = " + q.Value; + else if (q.ValueId != null) + res += " = " + q.ValueId?.ToStringExtended(format, delimiter); + + return res; + } + // ReSharper enable MethodOverloadWithOptionalParameter + // ReSharper enable RedundantArgumentDefaultValue + + // + // + // List + // + // + + #region QualifierCollection + + public static Qualifier FindQualifierOfType(this List qualifiers, string qualifierType) + { + if(qualifierType == null) + { + return null; + } + + foreach(var qualifier in qualifiers) + { + if(qualifier != null && qualifierType.Equals(qualifier.Type)) + { + return qualifier; + } + } + + return null; + } + + // ReSharper disable MethodOverloadWithOptionalParameter .. this seems to work, anyhow + // ReSharper disable RedundantArgumentDefaultValue + public static string ToStringExtended(this List qualifiers, + int format = 0, string delimiter = ";", string referencesDelimiter = ",") + { + var res = ""; + foreach (var q in qualifiers) + { + if (res != "") + res += delimiter; + res += q.ToStringExtended(format, referencesDelimiter); + } + return res; + } + // ReSharper enable MethodOverloadWithOptionalParameter + // ReSharper enable RedundantArgumentDefaultValue + + public static Qualifier FindType(this List qualifiers, string type) + { + if (type == null || qualifiers == null) + return null; + foreach (var q in qualifiers) + if (q != null && q.Type != null && q.Type.Trim() == type.Trim()) + return q; + return null; + } + + public static Qualifier Parse(string input) + { + var m = Regex.Match(input, @"\s*([^,]*)(,[^=]+){0,1}\s*=\s*([^,]*)(,.+){0,1}\s*"); + if (!m.Success) + return null; + + return new Qualifier( + valueType: DataTypeDefXsd.String, + type: m.Groups[1].ToString().Trim(), + semanticId: ExtendReference.Parse(m.Groups[1].ToString().Trim()), + value: m.Groups[3].ToString().Trim(), + valueId: ExtendReference.Parse(m.Groups[1].ToString().Trim()) + ); + } + + #endregion + } +} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendRange.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendRange.cs new file mode 100644 index 000000000..e67c7b40c --- /dev/null +++ b/src/AasxCsharpLib_bkp/Extensions/ExtendRange.cs @@ -0,0 +1,71 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using AAS = AasCore.Aas3_0_RC02; + +namespace Extensions +{ + public static class ExtendRange + { + public static string ValueAsText(this AasCore.Aas3_0_RC02.Range range) + { + return "" + range.Min + " .. " + range.Max; + } + + public static AasCore.Aas3_0_RC02.Range ConvertFromV20(this AasCore.Aas3_0_RC02.Range range, AasxCompatibilityModels.AdminShellV20.Range sourceRange) + { + if (sourceRange == null) + { + return null; + } + + var propertyType = AAS.Stringification.DataTypeDefXsdFromString("xs:" + sourceRange.valueType); + if (propertyType != null) + { + range.ValueType = (AAS.DataTypeDefXsd)propertyType; + } + else + { + Console.WriteLine($"ValueType {sourceRange.valueType} not found for property {range.IdShort}"); + } + + range.Max = sourceRange.max; + range.Min = sourceRange.min; + + return range; + } + + public static AAS.Range UpdateFrom(this AAS.Range elem, AAS.ISubmodelElement source) + { + if (source == null) + return elem; + + ((AAS.ISubmodelElement)elem).UpdateFrom(source); + + if (source is AAS.Property srcProp) + { + elem.ValueType = srcProp.ValueType; + elem.Min = srcProp.Value; + elem.Max = elem.Min; + } + + if (source is AAS.MultiLanguageProperty srcMlp) + { + elem.ValueType = AAS.DataTypeDefXsd.String; + elem.Min = "" + srcMlp.Value?.GetDefaultString(); + elem.Max = elem.Min; + } + + if (source is AAS.File srcFile) + { + elem.ValueType = AAS.DataTypeDefXsd.String; + elem.Min = "" + srcFile.Value; + elem.Max = elem.Min; + } + + return elem; + } + } +} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendReference.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendReference.cs new file mode 100644 index 000000000..ad4870212 --- /dev/null +++ b/src/AasxCsharpLib_bkp/Extensions/ExtendReference.cs @@ -0,0 +1,263 @@ +using AasCore.Aas3_0_RC02; +using AdminShellNS.Exceptions; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendReference + { + #region AasxPackageExplorer + + public static AasElementSelfDescription GetSelfDescription(this Reference reference) + { + return new AasElementSelfDescription("Reference", "Rfc", null, null); + } + + public static bool IsValid(this Reference reference) + { + return reference.Keys != null && !reference.Keys.IsEmpty(); + } + + /// + /// Formaly a static constructor. + /// Creates a Reference from a key, guessing Reference.Type. + /// + /// Given single Key + /// Reference with guessed type + public static Reference CreateFromKey(Key k) + { + var res = new Reference(ReferenceTypes.GlobalReference, new List { k }); + res.Type = res.GuessType(); + return res; + } + + /// + /// Formaly a static constructor. + /// Creates a Reference from a key, guessing Reference.Type. + /// + public static Reference CreateFromKey(KeyTypes type, + string value) + { + var res = new Reference(ReferenceTypes.GlobalReference, + new List { new Key(type, value) }); + res.Type = res.GuessType(); + return res; + } + + /// + /// Formaly a static constructor. + /// Creates a Reference from a list of keys, guessing Reference.Type. + /// + /// + /// + public static Reference CreateNew(List lk) + { + var res = new Reference(ReferenceTypes.GlobalReference, new List()); + if (lk == null) + return res; + res.Keys.AddRange(lk.Copy()); + res.Type = res.GuessType(); + return res; + } + + // TODO (Jui, 2023-01-05): Check why the generic Copy does not apply here?! + public static Reference Copy(this Reference original) + { + var res = new Reference(original.Type, new List()); + if (original != null) + foreach (var o in original.Keys) + res.Add(o.Copy()); + return res; + } + + + public static Reference Parse(string input) + { + var res = new Reference(ReferenceTypes.GlobalReference, new List()); + if (input == null) + return res; + + res.Keys = ExtendKeyList.Parse(input); + res.Type = res.GuessType(); + return res; + } + + //This is alternative for operator overloding method +, as operator overloading cannot be done in extension classes + public static Reference Add(this Reference a, Reference b) + { + a.Keys?.AddRange(b?.Keys); + return a; + } + + public static Reference Add(this Reference a, Key k) + { + if (k != null) + a.Keys?.Add(k); + return a; + } + + public static bool IsEmpty(this Reference reference) + { + if (reference == null || reference.Keys == null || reference.Keys.Count < 1) + { + return true; + } + + return false; + } + + #endregion + + public static bool Matches (this Reference reference, KeyTypes keyType, string id, MatchMode matchMode = MatchMode.Strict) + { + if(reference.IsEmpty()) + { + return false; + } + + if(reference.Keys.Count == 1) + { + var key = reference.Keys[0]; + return key.Matches(new Key(keyType, id), matchMode); + } + + return false; + } + + public static bool Matches(this Reference reference, string id) + { + if (string.IsNullOrEmpty(id)) + { + return false; + } + + if (reference.Keys.Count == 1) // As per old implementation + { + if (reference.Keys[0].Value == id) + return true; + } + + return false; + } + + public static bool Matches(this Reference reference, Reference otherReference, MatchMode matchMode = MatchMode.Strict) + { + if (reference.Keys == null || reference.Keys.Count == 0 || otherReference?.Keys == null || otherReference.Keys.Count == 0) + { + return false; + } + + bool match = true; + for (int i = 0; i < reference.Keys.Count; i++) + { + match = match && reference.Keys[i].Matches(otherReference.Keys[i], matchMode); + } + + return match; + } + + public static bool MatchesExactlyOneKey(this Reference reference, Key key, MatchMode matchMode = MatchMode.Strict) + { + if(key == null || reference.Keys == null || reference.Keys.Count != 1) + { + return false; + } + + var referenceKey = reference.Keys[0]; + return referenceKey.Matches(key, matchMode); + } + + public static string GetAsIdentifier(this Reference reference) + { + if (reference.Type == ReferenceTypes.GlobalReference) // Applying only to Global Reference, based on older implementation, TODO:Make it Generic + { + if (reference.Keys == null || reference.Keys.Count < 1) + { + return null; + } + + return reference.Keys[0].Value; + } + + return null; + } + + public static string MostSignificantInfo(this Reference reference) + { + if (reference.Keys.Count < 1) + { + return "-"; + } + + var i = reference.Keys.Count - 1; + var output = reference.Keys[i].Value; + if (reference.Keys[i].Type == KeyTypes.FragmentReference && i > 0) + output += reference.Keys[i - 1].Value; + return output; + } + + public static Key GetAsExactlyOneKey(this Reference reference) + { + if (reference.Keys == null || reference.Keys.Count != 1) + { + return null; + } + + var key = reference.Keys[0]; + return new Key(key.Type, key.Value); + } + + public static string ToStringExtended(this Reference reference, int format = 1, string delimiter = ",") + { + if(reference.Keys == null) + { + throw new NullValueException("Keys"); + } + + return reference.Keys.ToStringExtended(format, delimiter); + } + + public static ReferenceTypes GuessType(this Reference reference) + { + var setAasRefs = Constants.AasReferables.Where((kt) => kt != null).Select(kt => kt.Value).ToArray(); + var allAasRefs = true; + foreach (var k in reference.Keys) + if (!k.MatchesSetOfTypes(setAasRefs)) + allAasRefs = false; + if (allAasRefs) + return ReferenceTypes.ModelReference; + else + return ReferenceTypes.GlobalReference; + } + + public static int Count(this Reference rf) + { + return rf.Keys.Count; + } + + public static Key Last(this Reference rf) + { + return rf.Keys.Last(); + } + + public static string ListOfValues(this Reference rf, string delim) + { + string res = ""; + if (rf.Keys != null) + foreach (var x in rf.Keys) + { + if (x == null) + continue; + if (res != "") res += delim; + res += x.Value; + } + return res; + } + } + +} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendReferenceElement.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendReferenceElement.cs new file mode 100644 index 000000000..4fdc888a0 --- /dev/null +++ b/src/AasxCsharpLib_bkp/Extensions/ExtendReferenceElement.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using AAS = AasCore.Aas3_0_RC02; +using AasCore.Aas3_0_RC02; + +namespace Extensions +{ + public static class ExtendReferenceElement + { + public static AAS.ReferenceElement Set(this AAS.ReferenceElement elem, + Reference rf) + { + elem.Value = rf; + return elem; + } + + public static AAS.ReferenceElement UpdateFrom( + this AAS.ReferenceElement elem, AAS.ISubmodelElement source) + { + if (source == null) + return elem; + + ((AAS.ISubmodelElement)elem).UpdateFrom(source); + + if (source is AAS.RelationshipElement srcRel) + { + if (srcRel.First != null) + elem.Value = srcRel.First.Copy(); + } + + if (source is AAS.AnnotatedRelationshipElement srcRelA) + { + if (srcRelA.First != null) + elem.Value = srcRelA.First.Copy(); + } + + return elem; + } + } +} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendRelationshipElement.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendRelationshipElement.cs new file mode 100644 index 000000000..45dfa17b3 --- /dev/null +++ b/src/AasxCsharpLib_bkp/Extensions/ExtendRelationshipElement.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using AAS = AasCore.Aas3_0_RC02; + +namespace Extensions +{ + public static class ExtendRelationshipElement + { + public static AAS.RelationshipElement Set(this AAS.RelationshipElement elem, + AAS.Reference first, AAS.Reference second) + { + elem.First = first; + elem.Second = second; + return elem; + } + + public static AAS.RelationshipElement UpdateFrom( + this AAS.RelationshipElement elem, AAS.ISubmodelElement source) + { + if (source == null) + return elem; + + ((AAS.ISubmodelElement)elem).UpdateFrom(source); + + if (source is AAS.ReferenceElement srcRef) + { + if (srcRef.Value != null) + elem.First = srcRef.Value.Copy(); + } + + if (source is AAS.AnnotatedRelationshipElement srcRelA) + { + if (srcRelA.First != null) + elem.First = srcRelA.First.Copy(); + } + + return elem; + } + } +} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendStream.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendStream.cs new file mode 100644 index 000000000..fefe4af1f --- /dev/null +++ b/src/AasxCsharpLib_bkp/Extensions/ExtendStream.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendStream + { + public static byte[] ToByteArray(this Stream stream) + { + using (stream) + { + using MemoryStream memStream = new(); + stream.CopyTo(memStream); + return memStream.ToArray(); + } + } + } +} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendStringification.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendStringification.cs new file mode 100644 index 000000000..cb554c921 --- /dev/null +++ b/src/AasxCsharpLib_bkp/Extensions/ExtendStringification.cs @@ -0,0 +1,15 @@ +using AasCore.Aas3_0_RC02; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendStringification + { + public static IEnumerable DataTypeXsdToStringArray() => + Enum.GetValues(typeof(DataTypeDefXsd)).OfType().Select((dt) => Stringification.ToString(dt)); + } +} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendSubmodel.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendSubmodel.cs new file mode 100644 index 000000000..3f07b4ff9 --- /dev/null +++ b/src/AasxCsharpLib_bkp/Extensions/ExtendSubmodel.cs @@ -0,0 +1,455 @@ +using AasCore.Aas3_0_RC02; +using AdminShellNS; +using AdminShellNS.Display; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendSubmodel + { + #region AasxPackageExplorer + + /// + /// Recurses on all Submodel elements of a Submodel or SME, which allows children. + /// The state object will be passed to the lambda function in order to provide + /// stateful approaches. Include this element, as well. + /// + /// State object to be provided to lambda. Could be null. + /// The lambda function as (state, parents, SME) + /// The lambda shall return TRUE in order to deep into recursion. + /// Include this element as well. parents will then + /// include this element as well! + public static void RecurseOnReferables(this Submodel submodel, + object state, Func, IReferable, bool> lambda, + bool includeThis = false) + { + var parents = new List(); + if (includeThis) + { + lambda(state, null, submodel); + parents.Add(submodel); + } + submodel.SubmodelElements?.RecurseOnReferables(state, parents, lambda); + } + + public static void Remove(this Submodel submodel, ISubmodelElement submodelElement) + { + if(submodel != null) + { + if(submodel.SubmodelElements != null) + { + submodel.SubmodelElements.Remove(submodelElement); + } + } + } + + public static object AddChild(this Submodel submodel,ISubmodelElement childSubmodelElement, EnumerationPlacmentBase placement = null) + { + if (childSubmodelElement == null) + return null; + submodel.SubmodelElements ??= new (); + if (childSubmodelElement != null) + childSubmodelElement.Parent = submodel; + submodel.SubmodelElements.Add(childSubmodelElement); + return childSubmodelElement; + } + + public static Tuple ToCaptionInfo(this Submodel submodel) + { + var caption = AdminShellUtil.EvalToNonNullString("\"{0}\" ", submodel.IdShort, ""); + if (submodel.Administration != null) + caption += "V" + submodel.Administration.Version + "." + submodel.Administration.Revision; + var info = ""; + if (submodel.Id != null) + info = $"[{submodel.Id}]"; + return Tuple.Create(caption, info); + } + + public static IEnumerable FindAllReferences(this Submodel submodel) + { + // not nice: use temp list + var temp = new List(); + + // recurse + submodel.RecurseOnSubmodelElements(null, (state, parents, sme) => + { + if (sme is ReferenceElement re) + if (re.Value != null) + temp.Add(re.Value); + if (sme is RelationshipElement rl) + { + if (rl.First != null) + temp.Add(rl.First); + if (rl.Second != null) + temp.Add(rl.Second); + } + // recurse + return true; + }); + + // now, give back + foreach (var r in temp) + yield return new LocatedReference(submodel, r); + } + + #endregion + public static void Validate(this Submodel submodel,AasValidationRecordList results) + { + // access + if (results == null) + return; + + // check + submodel.BaseValidation(results); + submodel.Kind.Value.Validate(results,submodel); + submodel.SemanticId.Keys.Validate(results, submodel); + } + public static Submodel ConvertFromV10(this Submodel submodel, AasxCompatibilityModels.AdminShellV10.Submodel sourceSubmodel, bool shallowCopy = false) + { + if (sourceSubmodel == null) + { + return null; + } + + if (string.IsNullOrEmpty(sourceSubmodel.idShort)) + { + submodel.IdShort = ""; + } + else + { + submodel.IdShort = sourceSubmodel.idShort; + } + + if (sourceSubmodel.description != null) + { + submodel.Description = ExtensionsUtil.ConvertDescriptionFromV10(sourceSubmodel.description); + } + + if (sourceSubmodel.administration != null) + { + submodel.Administration = new AdministrativeInformation(version: sourceSubmodel.administration.version, revision: sourceSubmodel.administration.revision); + } + + if (sourceSubmodel.semanticId != null) + { + var keyList = new List(); + foreach (var refKey in sourceSubmodel.semanticId.Keys) + { + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {refKey.type} not found."); + } + } + submodel.SemanticId = new Reference(ReferenceTypes.GlobalReference, keyList); + } + + if (sourceSubmodel.kind != null) + { + if (sourceSubmodel.kind.IsInstance) + { + submodel.Kind = ModelingKind.Instance; + } + else + { + submodel.Kind = ModelingKind.Template; + } + } + + if (sourceSubmodel.qualifiers != null && sourceSubmodel.qualifiers.Count != 0) + { + if (submodel.Qualifiers == null && submodel.Qualifiers.Count != 0) + { + submodel.Qualifiers = new List(); + } + + foreach (var sourceQualifier in sourceSubmodel.qualifiers) + { + var newQualifier = new Qualifier("", DataTypeDefXsd.String); + newQualifier = newQualifier.ConvertFromV10(sourceQualifier); + submodel.Qualifiers.Add(newQualifier); + } + } + + if (!shallowCopy && sourceSubmodel.submodelElements != null) + { + if (submodel.SubmodelElements == null) + { + submodel.SubmodelElements = new List(); + } + + foreach (var submodelElementWrapper in sourceSubmodel.submodelElements) + { + var sourceSubmodelELement = submodelElementWrapper.submodelElement; + ISubmodelElement outputSubmodelElement = null; + if (sourceSubmodelELement != null) + { + outputSubmodelElement = outputSubmodelElement.ConvertFromV10(sourceSubmodelELement, shallowCopy); + submodel.SubmodelElements.Add(outputSubmodelElement); + } + + } + } + + return submodel; + + } + + public static Submodel ConvertFromV20(this Submodel sm, AasxCompatibilityModels.AdminShellV20.Submodel srcSM, bool shallowCopy = false) + { + if (srcSM == null) + return null; + + if (string.IsNullOrEmpty(srcSM.idShort)) + sm.IdShort = ""; + else + sm.IdShort = srcSM.idShort; + + if (srcSM.identification?.id != null) + sm.Id = srcSM.identification.id; + + if (srcSM.description != null) + sm.Description = ExtensionsUtil.ConvertDescriptionFromV20(srcSM.description); + + if (srcSM.administration != null) + sm.Administration = new AdministrativeInformation( + version: srcSM.administration.version, revision: srcSM.administration.revision); + + if (srcSM.semanticId != null) + { + var keyList = new List(); + foreach (var refKey in srcSM.semanticId.Keys) + { + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {refKey.type} not found."); + } + } + sm.SemanticId = new Reference(ReferenceTypes.GlobalReference, keyList); + } + + if (srcSM.kind != null) + { + if (srcSM.kind.IsInstance) + { + sm.Kind = ModelingKind.Instance; + } + else + { + sm.Kind = ModelingKind.Template; + } + } + + if (srcSM.qualifiers != null && srcSM.qualifiers.Count != 0) + { + if (sm.Qualifiers == null) + { + sm.Qualifiers = new List(); + } + + foreach (var sourceQualifier in srcSM.qualifiers) + { + var newQualifier = new Qualifier("", DataTypeDefXsd.String); + newQualifier = newQualifier.ConvertFromV20(sourceQualifier); + sm.Qualifiers.Add(newQualifier); + } + } + + if (!shallowCopy && srcSM.submodelElements != null) + { + if (sm.SubmodelElements == null) + { + sm.SubmodelElements = new List(); + } + + foreach (var submodelElementWrapper in srcSM.submodelElements) + { + var sourceSubmodelELement = submodelElementWrapper.submodelElement; + ISubmodelElement outputSubmodelElement = null; + if (sourceSubmodelELement != null) + { + outputSubmodelElement = outputSubmodelElement.ConvertFromV20(sourceSubmodelELement, shallowCopy); + sm.SubmodelElements.Add(outputSubmodelElement); + } + + } + } + + // move Qualifiers to Extensions + sm.MigrateV20QualifiersToExtensions(); + + return sm; + } + + public static T FindFirstIdShortAs(this Submodel submodel, string idShort) where T : ISubmodelElement + { + + var submodelElement = submodel.SubmodelElements.Where(sme => (sme != null) && (sme is T) && sme.IdShort.Equals(idShort, StringComparison.OrdinalIgnoreCase)).FirstOrDefault(); + + return (T)submodelElement; + } + + public static IEnumerable FindDeep(this Submodel submodel) + { + if (submodel.SubmodelElements == null || submodel.SubmodelElements.Count == 0) + { + yield break; + } + + foreach (var submodelElement in submodel.SubmodelElements) + { + foreach (var x in submodelElement.FindDeep()) + yield return x; + } + } + + public static Reference GetModelReference(this Submodel submodel) + { + var key = new Key(KeyTypes.Submodel, submodel.Id); + var outputReference = new Reference(ReferenceTypes.ModelReference, new List() { key }) + { + ReferredSemanticId = submodel.SemanticId + }; + + return outputReference; + } + + /// + /// If instance, return semanticId as one key. + /// If template, return identification as key. + /// + public static Key GetSemanticKey(this Submodel submodel) + { + if (submodel.Kind == ModelingKind.Instance) + return submodel.SemanticId.GetAsExactlyOneKey(); + else + return new Key(KeyTypes.Submodel, submodel.Id); + } + + public static List SmeForWrite(this Submodel submodel) + { + if (submodel.SubmodelElements == null) + submodel.SubmodelElements = new(); + return submodel.SubmodelElements; + } + + public static void RecurseOnSubmodelElements(this Submodel submodel, object state, Func, ISubmodelElement, bool> lambda) + { + submodel.SubmodelElements?.RecurseOnReferables(state, null, (o, par, rf) => + { + if (rf is ISubmodelElement sme) + return lambda(o, par, sme); + else + return true; + }); + } + + public static ISubmodelElement FindSubmodelElementByIdShort(this Submodel submodel, string smeIdShort) + { + if (submodel.SubmodelElements == null || submodel.SubmodelElements.Count == 0) + { + return null; + } + + var submodelElements = submodel.SubmodelElements.Where(sme => (sme != null) && sme.IdShort.Equals(smeIdShort, StringComparison.OrdinalIgnoreCase)); + if (submodelElements.Any()) + { + return submodelElements.First(); + } + else + { + return null; + } + } + + public static void SetAllParents(this Submodel submodel, DateTime timestamp) + { + if (submodel.SubmodelElements != null) + foreach (var sme in submodel.SubmodelElements) + SetParentsForSME(submodel, sme, timestamp); + } + + public static void SetParentsForSME(IReferable parent, ISubmodelElement submodelElement, DateTime timestamp) + { + if (submodelElement == null) + return; + + submodelElement.Parent = parent; + submodelElement.TimeStamp = timestamp; + submodelElement.TimeStampCreate = timestamp; + + foreach (var childElement in submodelElement.EnumerateChildren()) + { + SetParentsForSME(submodelElement, childElement, timestamp); + } + } + + public static void SetParentsForSME(IReferable parent, ISubmodelElement submodelElement) + { + if (submodelElement == null) + return; + + submodelElement.Parent = parent; + + foreach (var childElement in submodelElement.EnumerateChildren()) + { + SetParentsForSME(submodelElement, childElement); + } + } + + public static void SetAllParents(this Submodel submodel) + { + if (submodel.SubmodelElements != null) + foreach (var sme in submodel.SubmodelElements) + SetParentsForSME(submodel, sme); + } + + public static void Add(this Submodel submodel, ISubmodelElement submodelElement) + { + if (submodel.SubmodelElements == null) + { + submodel.SubmodelElements = new List(); + } + + submodelElement.Parent = submodel; + submodel.SubmodelElements.Add(submodelElement); + } + + public static void Insert(this Submodel submodel, int index, ISubmodelElement submodelElement) + { + if (submodel.SubmodelElements == null) + { + submodel.SubmodelElements = new List(); + } + + submodelElement.Parent = submodel; + submodel.SubmodelElements.Insert(index, submodelElement); + } + + public static T CreateSMEForCD( + this Submodel sm, + ConceptDescription conceptDescription, string category = null, string idShort = null, + string idxTemplate = null, int maxNum = 999, bool addSme = false, bool isTemplate = false) + where T : ISubmodelElement + { + if (sm.SubmodelElements == null) + sm.SubmodelElements = new List(); + return sm.SubmodelElements.CreateSMEForCD( + conceptDescription, category, idShort, idxTemplate, maxNum, addSme, isTemplate); + } + + } +} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendSubmodelElementCollection.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendSubmodelElementCollection.cs new file mode 100644 index 000000000..c5ca34340 --- /dev/null +++ b/src/AasxCsharpLib_bkp/Extensions/ExtendSubmodelElementCollection.cs @@ -0,0 +1,194 @@ +using AasCore.Aas3_0_RC02; +using AdminShellNS.Display; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendSubmodelElementCollection + { + #region AasxPackageExplorer + + /// + /// Recurses on all Submodel elements of a Submodel or SME, which allows children. + /// The state object will be passed to the lambda function in order to provide + /// stateful approaches. Include this element, as well. + /// + /// State object to be provided to lambda. Could be null. + /// The lambda function as (state, parents, SME) + /// The lambda shall return TRUE in order to deep into recursion. + /// Include this element as well. parents will then + /// include this element as well! + public static void RecurseOnReferables(this SubmodelElementCollection submodelElementCollection, + object state, Func, IReferable, bool> lambda, + bool includeThis = false) + { + var parents = new List(); + if (includeThis) + { + lambda(state, null, submodelElementCollection); + parents.Add(submodelElementCollection); + } + submodelElementCollection.Value?.RecurseOnReferables(state, parents, lambda); + } + + public static void Remove(this SubmodelElementCollection submodelElementCollection, ISubmodelElement submodelElement) + { + if(submodelElementCollection != null) + { + if(submodelElementCollection.Value != null) + { + submodelElementCollection.Value.Remove(submodelElement); + } + } + } + + public static object AddChild(this SubmodelElementCollection submodelElementCollection, ISubmodelElement childSubmodelElement, EnumerationPlacmentBase placement = null) + { + if (childSubmodelElement == null) + return null; + if (submodelElementCollection.Value == null) + submodelElementCollection.Value = new (); + if (childSubmodelElement != null) + childSubmodelElement.Parent = submodelElementCollection; + submodelElementCollection.Value.Add(childSubmodelElement); + return childSubmodelElement; + } + + #endregion + public static T FindFirstIdShortAs(this SubmodelElementCollection submodelElementCollection, string idShort) where T : ISubmodelElement + { + + var submodelElement = submodelElementCollection.Value.Where(sme => (sme != null) && (sme is T) && sme.IdShort.Equals(idShort, StringComparison.OrdinalIgnoreCase)).FirstOrDefault(); + + return (T)submodelElement; + } + + public static SubmodelElementCollection ConvertFromV10(this SubmodelElementCollection submodelElementCollection, AasxCompatibilityModels.AdminShellV10.SubmodelElementCollection sourceSmeCollection, bool shallowCopy = false) + { + if (sourceSmeCollection == null) + return null; + + if (submodelElementCollection.Value == null) + { + submodelElementCollection.Value = new List(); + } + + if (!shallowCopy) + { + foreach (var submodelElementWrapper in sourceSmeCollection.value) + { + var sourceSubmodelElement = submodelElementWrapper.submodelElement; + ISubmodelElement outputSubmodelElement = null; + if (sourceSubmodelElement != null) + { + outputSubmodelElement = outputSubmodelElement.ConvertFromV10(sourceSubmodelElement, shallowCopy); + } + + submodelElementCollection.Value.Add(outputSubmodelElement); + } + } + + return submodelElementCollection; + } + + public static SubmodelElementCollection ConvertFromV20(this SubmodelElementCollection submodelElementCollection, AasxCompatibilityModels.AdminShellV20.SubmodelElementCollection sourceSmeCollection, bool shallowCopy = false) + { + if (sourceSmeCollection == null) + return null; + + if (submodelElementCollection.Value == null) + { + submodelElementCollection.Value = new List(); + } + + if (!shallowCopy) + { + foreach (var submodelElementWrapper in sourceSmeCollection.value) + { + var sourceSubmodelElement = submodelElementWrapper.submodelElement; + ISubmodelElement outputSubmodelElement = null; + if (sourceSubmodelElement != null) + { + outputSubmodelElement = outputSubmodelElement.ConvertFromV20(sourceSubmodelElement, shallowCopy); + } + + submodelElementCollection.Value.Add(outputSubmodelElement); + } + } + + return submodelElementCollection; + } + + public static void Add(this SubmodelElementCollection submodelElementCollection, ISubmodelElement submodelElement) + { + submodelElementCollection.Value ??= new List(); + + submodelElement.Parent = submodelElementCollection; + submodelElementCollection.Value.Add(submodelElement); + } + + public static void Insert(this SubmodelElementCollection submodelElementCollection, int index, ISubmodelElement submodelElement) + { + if (submodelElementCollection.Value == null) + { + submodelElementCollection.Value = new List(); + } + + submodelElement.Parent = submodelElementCollection; + submodelElementCollection.Value.Insert(index, submodelElement); + } + + public static T CreateSMEForCD( + this SubmodelElementCollection smc, + ConceptDescription conceptDescription, string category = null, string idShort = null, + string idxTemplate = null, int maxNum = 999, bool addSme = false, bool isTemplate = false) + where T : ISubmodelElement + { + if (smc.Value == null) + smc.Value = new List(); + return smc.Value.CreateSMEForCD( + conceptDescription, category, idShort, idxTemplate, maxNum, addSme, isTemplate); + } + + public static SubmodelElementCollection UpdateFrom( + this SubmodelElementCollection elem, ISubmodelElement source) + { + if (source == null) + return elem; + + ((ISubmodelElement)elem).UpdateFrom(source); + + if (source is SubmodelElementList srcList) + { + if (srcList.Value != null) + elem.Value = srcList.Value.Copy(); + } + + if (source is Operation srcOp) + { + Action, List> appov = (dst, src) => + { + if (src == null) + return; + foreach (var ov in src) + if (ov.Value != null) + dst.Append(ov.Value.Copy()); + }; + + elem.Value = new(); + appov(elem.Value, srcOp.InputVariables); + appov(elem.Value, srcOp.InoutputVariables); + appov(elem.Value, srcOp.OutputVariables); + if (elem.Value.Count < 1) + elem.Value = null; + } + + return elem; + } + + } +} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendSubmodelElementList.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendSubmodelElementList.cs new file mode 100644 index 000000000..4d700549f --- /dev/null +++ b/src/AasxCsharpLib_bkp/Extensions/ExtendSubmodelElementList.cs @@ -0,0 +1,200 @@ +using AasCore.Aas3_0_RC02; +using AdminShellNS.Display; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtendSubmodelElementList + { + #region AasxPackageExplorer + + /// + /// Recurses on all Submodel elements of a Submodel or SME, which allows children. + /// The state object will be passed to the lambda function in order to provide + /// stateful approaches. Include this element, as well. + /// + /// State object to be provided to lambda. Could be null. + /// The lambda function as (state, parents, SME) + /// The lambda shall return TRUE in order to deep into recursion. + /// Include this element as well. parents will then + /// include this element as well! + public static void RecurseOnReferables(this SubmodelElementList submodelElementList, + object state, Func, IReferable, bool> lambda, + bool includeThis = false) + { + var parents = new List(); + if (includeThis) + { + lambda(state, null, submodelElementList); + parents.Add(submodelElementList); + } + submodelElementList.Value?.RecurseOnReferables(state, parents, lambda); + } + + public static void Add(this SubmodelElementList submodelElementList, ISubmodelElement submodelElement) + { + if (submodelElementList != null) + { + submodelElementList.Value ??= new(); + + submodelElement.Parent = submodelElementList; + + submodelElementList.Value.Add(submodelElement); + } + } + + public static void Remove(this SubmodelElementList submodelElementList, ISubmodelElement submodelElement) + { + if (submodelElementList != null) + { + if (submodelElementList.Value != null) + { + submodelElementList.Value.Remove(submodelElement); + } + } + } + + public static object AddChild(this SubmodelElementList submodelElementList, ISubmodelElement childSubmodelElement, EnumerationPlacmentBase placement = null) + { + if (childSubmodelElement == null) + return null; + if (submodelElementList.Value == null) + submodelElementList.Value = new(); + if (childSubmodelElement != null) + childSubmodelElement.Parent = submodelElementList; + submodelElementList.Value.Add(childSubmodelElement); + return childSubmodelElement; + } + + #endregion + public static T FindFirstIdShortAs(this SubmodelElementList submodelElementList, string idShort) where T : ISubmodelElement + { + + var submodelElements = submodelElementList.Value.Where(sme => sme != null && sme is T && sme.IdShort.Equals(idShort, StringComparison.OrdinalIgnoreCase)); + + if (submodelElements.Any()) + { + return (T)submodelElements.First(); + } + + return default; + } + + public static SubmodelElementList UpdateFrom( + this SubmodelElementList elem, ISubmodelElement source) + { + if (source == null) + return elem; + + ((ISubmodelElement)elem).UpdateFrom(source); + + if (source is SubmodelElementCollection srcColl) + { + if (srcColl.Value != null) + elem.Value = srcColl.Value.Copy(); + } + + if (source is Operation srcOp) + { + Action, List> appov = (dst, src) => + { + if (src == null) + return; + foreach (var ov in src) + if (ov.Value != null) + dst.Append(ov.Value.Copy()); + }; + + elem.Value = new(); + appov(elem.Value, srcOp.InputVariables); + appov(elem.Value, srcOp.InoutputVariables); + appov(elem.Value, srcOp.OutputVariables); + if (elem.Value.Count < 1) + elem.Value = null; + } + + return elem; + } + + // advanced checks + + public class ConstraintStat + { + /// + /// Constraint AASd-107: If a first level child element in a SubmodelElementList has a semanticId + /// it shall be identical to SubmodelElementList/semanticIdListElement. + /// + public bool AllChildSemIdMatch = true; + + /// + /// Constraint AASd-108: All first level child elements in a SubmodelElementList shall have the + /// same submodel element type as specified in SubmodelElementList/typeValueListElement. + /// + public bool AllChildSmeTypeMatch = true; + + /// + /// Constraint AASd-109: If SubmodelElementList/typeValueListElement equal to Property or Range, + /// SubmodelElementList/valueTypeListElement shall be set and all first level child elements in + /// the SubmodelElementList shall have the the value type as specified in + /// SubmodelElementList/valueTypeListElement + /// + public bool AllChildValueTypeMatch = true; + } + + public static ConstraintStat EvalConstraintStat(this SubmodelElementList list) + { + // access + var res = new ConstraintStat(); + if (list.Value == null) + return res; + + // prepare SME type + var smeTypeToCheck = list.TypeValueListElement; + + // prepare value type + var valueTypeToCheck = list.ValueTypeListElement; + + // eval + foreach (var sme in list.Value) + { + // need self description + var smesd = sme.GetSelfDescription(); + if (smesd == null) + continue; + + // sem id? + if (res.AllChildSemIdMatch + && list.SemanticIdListElement?.IsValid() == true + && sme.SemanticId?.IsValid() == true + && !list.SemanticIdListElement.Matches(sme.SemanticId)) + res.AllChildSemIdMatch = false; + + // type of SME? + if (res.AllChildSmeTypeMatch + && smesd.SmeType != smeTypeToCheck) + res.AllChildSmeTypeMatch = false; + + // value type to check + if (valueTypeToCheck.HasValue + && res.AllChildValueTypeMatch + && sme is Property prop + && prop.ValueType != valueTypeToCheck.Value) + res.AllChildValueTypeMatch = false; + + if (valueTypeToCheck.HasValue + && res.AllChildValueTypeMatch + && sme is AasCore.Aas3_0_RC02.Range range + && range.ValueType != valueTypeToCheck.Value) + res.AllChildValueTypeMatch = false; + } + + // ok + return res; + } + } +} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtensionsUtil.cs b/src/AasxCsharpLib_bkp/Extensions/ExtensionsUtil.cs new file mode 100644 index 000000000..fc2940ab2 --- /dev/null +++ b/src/AasxCsharpLib_bkp/Extensions/ExtensionsUtil.cs @@ -0,0 +1,115 @@ +using AasCore.Aas3_0_RC02; +using AasxCompatibilityModels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public static class ExtensionsUtil + { + + public static Reference ConvertReferenceFromV10(AdminShellV10.Reference sourceReference, ReferenceTypes referenceTypes) + { + Reference outputReference = null; + if (sourceReference != null) + { + var keyList = new List(); + foreach (var refKey in sourceReference.Keys) + { + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {refKey.type} not found."); + } + } + outputReference = new Reference(referenceTypes, keyList); + } + + return outputReference; + } + + public static Reference ConvertReferenceFromV20(AdminShellV20.Reference sourceReference, ReferenceTypes referenceTypes) + { + Reference outputReference = null; + if (sourceReference != null) + { + var keyList = new List(); + foreach (var refKey in sourceReference.Keys) + { + // Fix, as Asset does not exist anymore + if (refKey.type?.Trim().Equals("Asset", StringComparison.InvariantCultureIgnoreCase) == true) + refKey.type = "GlobalReference"; + + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {refKey.type} not found."); + } + } + outputReference = new Reference(referenceTypes, keyList); + } + + return outputReference; + } + + internal static List ConvertDescriptionFromV10(AdminShellV10.Description sourceDescription) + { + var newLangStrList = new List(); + foreach (var ls in sourceDescription.langString) + { + newLangStrList.Add(new LangString(ls.lang, ls.str)); + } + + return new List(newLangStrList); + } + + internal static List ConvertDescriptionFromV20(AdminShellV20.Description sourceDescription) + { + var newLangStrList = new List(); + foreach (var ls in sourceDescription.langString) + { + newLangStrList.Add(new LangString(ls.lang, ls.str)); + } + + return new List(newLangStrList); + } + + internal static KeyTypes GetKeyType(IClass aasElement) + { + return aasElement switch + { + AssetAdministrationShell => KeyTypes.AssetAdministrationShell, + Submodel => KeyTypes.Submodel, + ConceptDescription => KeyTypes.ConceptDescription, + SubmodelElementCollection => KeyTypes.SubmodelElementCollection, + SubmodelElementList => KeyTypes.SubmodelElementList, + BasicEventElement => KeyTypes.BasicEventElement, + Blob => KeyTypes.Blob, + Entity => KeyTypes.Entity, + File => KeyTypes.File, + MultiLanguageProperty => KeyTypes.MultiLanguageProperty, + Property => KeyTypes.Property, + Operation => KeyTypes.Operation, + AasCore.Aas3_0_RC02.Range => KeyTypes.Range, + ReferenceElement => KeyTypes.ReferenceElement, + RelationshipElement => KeyTypes.RelationshipElement, + AnnotatedRelationshipElement => KeyTypes.AnnotatedRelationshipElement, + IIdentifiable => KeyTypes.Identifiable, + IReferable => KeyTypes.Referable, + Reference => KeyTypes.GlobalReference,//TODO:jtikekar what about model reference + _ => KeyTypes.SubmodelElement, // default case + }; + } + } +} diff --git a/src/AasxCsharpLib_bkp/Extensions/LocatedReference.cs b/src/AasxCsharpLib_bkp/Extensions/LocatedReference.cs new file mode 100644 index 000000000..433578d61 --- /dev/null +++ b/src/AasxCsharpLib_bkp/Extensions/LocatedReference.cs @@ -0,0 +1,22 @@ +using AasCore.Aas3_0_RC02; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public class LocatedReference + { + public IIdentifiable Identifiable; + public Reference Reference; + + public LocatedReference() { } + public LocatedReference(IIdentifiable identifiable, Reference reference) + { + Identifiable = identifiable; + Reference = reference; + } + } +} diff --git a/src/AasxCsharpLib_bkp/Extensions/MatchMode.cs b/src/AasxCsharpLib_bkp/Extensions/MatchMode.cs new file mode 100644 index 000000000..f30029657 --- /dev/null +++ b/src/AasxCsharpLib_bkp/Extensions/MatchMode.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Extensions +{ + public enum MatchMode + { + Strict, //may be not needed in future, as no local flag in V3 + Relaxed, //should be as default + Identification + } +} diff --git a/src/AasxCsharpLib_bkp/IAasxOnlineConnection.cs b/src/AasxCsharpLib_bkp/IAasxOnlineConnection.cs new file mode 100644 index 000000000..7ce13b014 --- /dev/null +++ b/src/AasxCsharpLib_bkp/IAasxOnlineConnection.cs @@ -0,0 +1,33 @@ +/* +Copyright (c) 2018-2021 Festo AG & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using AasCore.Aas3_0_RC02; +using AdminShellNS; + +namespace AasxIntegrationBase +{ + /// + /// This interface describes a connection for a server resource of AASX contents, such as OPC UA or REST + /// + public interface IAasxOnlineConnection + { + bool IsValid(); + bool IsConnected(); + string GetInfo(); + Stream GetThumbnailStream(); + string UpdatePropertyValue( + AasCore.Aas3_0_RC02.Environment env, Submodel submodel, ISubmodelElement sme); + } +} diff --git a/src/AasxCsharpLib_bkp/LICENSE.txt b/src/AasxCsharpLib_bkp/LICENSE.txt new file mode 100644 index 000000000..2e5ee87b9 --- /dev/null +++ b/src/AasxCsharpLib_bkp/LICENSE.txt @@ -0,0 +1,1475 @@ +Copyright (c) 2018-2021 Festo AG & Co. KG +, +author: Michael Hoffmeister + +Copyright (c) 2019-2021 PHOENIX CONTACT GmbH & Co. KG +, +author: Andreas Orzelski + +Copyright (c) 2019-2020 Fraunhofer IOSB-INA Lemgo, + eine rechtlich nicht selbstaendige Einrichtung der Fraunhofer-Gesellschaft + zur Foerderung der angewandten Forschung e.V. + +Copyright (c) 2020 Schneider Electric Automation GmbH +, +author: Marco Mendes + +Copyright (c) 2020 SICK AG + +Copyright (c) 2021 KEB Automation KG + +Copyright (c) 2021 Lenze SE +author: Jonas Grote, Denis Göllner, Sebastian Bischof + +The AASX Package Explorer is licensed under the Apache License 2.0 +(Apache-2.0, see below). + +The AASX Package Explorer is a sample application for demonstration of the +features of the Asset Administration Shell. +The implementation uses the concepts of the document "Details of the Asset +Administration Shell" published on www.plattform-i40.de which is licensed +under Creative Commons CC BY-ND 3.0 DE. + +When using eCl@ss or IEC CDD data, please check the corresponding license +conditions. + +------------------------------------------------------------------------------- + +The components below are used in AASX Package Explorer. +The related licenses are listed for information purposes only. +Some licenses may only apply to their related plugins. + +The browser functionality is licensed under the cefSharp license (see below). + +The Newtonsoft.JSON serialization is licensed under the MIT License +(MIT, see below). + +The QR code generation is licensed under the MIT license (MIT, see below). + +The Zxing.Net Dot Matrix Code (DMC) generation is licensed under +the Apache License 2.0 (Apache-2.0, see below). + +The Grapevine REST server framework is licensed under Apache License 2.0 +(Apache-2.0, see below). + +The AutomationML.Engine is licensed under the MIT license (MIT, see below). + +The MQTT server and client is licensed under the MIT license (MIT, see below). + +The ClosedXML Excel reader/writer is licensed under the MIT license (MIT, +see below). + +The CountryFlag WPF control is licensed under the Code Project Open License +(CPOL, see below). + +The DocumentFormat.OpenXml SDK is licensed under the MIT license (MIT, +see below). + +The ExcelNumberFormat number parser is licensed under the MIT license (MIT, +see below). + +The FastMember reflection access is licensed under Apache License 2.0 +(Apache-2.0, see below). + +The IdentityModel OpenID client is licensed under Apache License 2.0 +(Apache-2.0, see below). + +The jose-jwt object signing and encryption is licensed under the +MIT license (MIT, see below). + +The ExcelDataReader is licensed under the MIT license (MIT, see below). + +Portions copyright (c) by OPC Foundation, Inc. and licensed under the +Reciprocal Community License (RCL, see below) + +The OPC UA Example Code of OPC UA Standard is licensed under the MIT license +(MIT, see below). + +The MSAGL (Microsoft Automatic Graph Layout) is licensed under the MIT license +(MIT, see below) + +Glob (https://www.nuget.org/packages/Glob/) is licensed under the MIT license +(MIT, see below). + +The Magick.NET library is licensed under Apache License 2.0 +(Apache-2.0, see below). + +The SSharp.NET library (https://github.com/PetroProtsyk/SSharp) is licensed +under Apache License 2.0 (Apache-2.0, see below). + +------------------------------------------------------------------------------- + + +With respect to AASX Package Explorer +===================================== + +(http://www.apache.org/licenses/LICENSE-2.0) + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + +With respect to cefSharp +======================== + +(https://raw.githubusercontent.com/cefsharp/CefSharp/master/LICENSE) + +Copyright © The CefSharp Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + + * Neither the name of Google Inc. nor the name Chromium Embedded + Framework nor the name CefSharp nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +With respect to Newtonsoft.Json +=============================== + +(https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md) + +The MIT License (MIT) + +Copyright (c) 2007 James Newton-King + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +With respect to QRcoder +======================= + +(https://github.com/codebude/QRCoder/blob/master/LICENSE.txt) + +The MIT License (MIT) + +Copyright (c) 2013-2018 Raffael Herrmann + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +With respect to ZXing.Net +========================= +With respect to Grapevine +========================= +With respect to FastMember +========================== +With respect to IdentityModel +============================= + +(http://www.apache.org/licenses/LICENSE-2.0) + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + +With respect to AutomationML.Engine +=================================== + +(https://raw.githubusercontent.com/AutomationML/AMLEngine2.1/master/license.txt) + +The MIT License (MIT) + +Copyright 2017 AutomationML e.V. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + + +With respect to MQTTnet +======================= + +(https://github.com/chkr1011/MQTTnet/blob/master/LICENSE) + +MIT License + +MQTTnet Copyright (c) 2016-2019 Christian Kratky + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +With resepct to ClosedXML +========================= + +(https://github.com/ClosedXML/ClosedXML/blob/develop/LICENSE) + +MIT License + +Copyright (c) 2016 ClosedXML + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +With resepct to CountryFlag +=========================== + +(https://www.codeproject.com/Articles/190722/WPF-CountryFlag-Control) + +The Code Project Open License (CPOL) 1.02 + +Copyright © 2017 Meshack Musundi + +Preamble + +This License governs Your use of the Work. This License is intended to allow +developers to use the Source Code and Executable Files provided as part of +the Work in any application in any form. + +The main points subject to the terms of the License are: + + Source Code and Executable Files can be used in commercial applications; + Source Code and Executable Files can be redistributed; and + Source Code can be modified to create derivative works. + No claim of suitability, guarantee, or any warranty whatsoever is provided. + The software is provided "as-is". + The Article(s) accompanying the Work may not be distributed or republished + without the Author's consent + +This License is entered between You, the individual or other entity reading or +otherwise making use of the Work licensed pursuant to this License and the +individual or other entity which offers the Work under the terms of this +License ("Author"). + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS +CODE PROJECT OPEN LICENSE ("LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT +AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED +UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HEREIN, YOU ACCEPT AND AGREE +TO BE BOUND BY THE TERMS OF THIS LICENSE. THE AUTHOR GRANTS YOU THE RIGHTS +CONTAINED HEREIN IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND +CONDITIONS. IF YOU DO NOT AGREE TO ACCEPT AND BE BOUND BY THE TERMS OF THIS +LICENSE, YOU CANNOT MAKE ANY USE OF THE WORK. + +Definitions. + "Articles" means, collectively, all articles written by Author which +describes how the Source Code and Executable Files for the Work may +be used by a user. + "Author" means the individual or entity that offers the Work under +the terms of this License. + "Derivative Work" means a work based upon the Work or upon the Work +and other pre-existing works. + "Executable Files" refer to the executables, binary files, +configuration and any required data files included in the Work. + "Publisher" means the provider of the website, magazine, CD-ROM, +DVD or other medium from or by which the Work is obtained by You. + "Source Code" refers to the collection of source code and +configuration files used to create the Executable Files. + "Standard Version" refers to such a Work if it has not been modified, +or has been modified in accordance with the consent of the Author, +such consent being in the full discretion of the Author. + "Work" refers to the collection of files distributed by the Publisher, +including the Source Code, Executable Files, binaries, data files, +documentation, whitepapers and the Articles. + "You" is you, an individual or entity wishing to use the Work and +exercise your rights under this License. + +Fair Use/Fair Use Rights. Nothing in this License is intended to reduce, +limit, or restrict any rights arising from fair use, fair dealing, +first sale or other limitations on the exclusive rights of the +copyright owner under copyright law or other applicable laws. + +License Grant. Subject to the terms and conditions of this License, the +Author hereby grants You a worldwide, royalty-free, non-exclusive, +perpetual (for the duration of the applicable copyright) license +to exercise the rights in the Work as stated below: + You may use the standard version of the Source Code or Executable +Files in Your own applications. + You may apply bug fixes, portability fixes and other modifications +obtained from the Public Domain or from the Author. A Work modified +in such a way shall still be considered the standard version and will +be subject to this License. + You may otherwise modify Your copy of this Work (excluding the Articles) +in any way to create a Derivative Work, provided that You insert a prominent +notice in each changed file stating how, when and where You changed that file. + You may distribute the standard version of the Executable Files and Source +Code or Derivative Work in aggregate with other (possibly commercial) +programs as part of a larger (possibly commercial) software distribution. + The Articles discussing the Work published in any form by the author may +not be distributed or republished without the Author's consent. The author +retains copyright to any such Articles. You may use the Executable Files and +Source Code pursuant to this License but you may not repost or republish or +otherwise distribute or make available the Articles, without the prior written +consent of the Author. + +Any subroutines or modules supplied by You and linked into the Source Code +or Executable Files of this Work shall not be considered part of this Work +and will not be subject to the terms of this License. + +Patent License. Subject to the terms and conditions of this License, each +Author hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, +royalty-free, irrevocable (except as stated in this section) patent license +to make, have made, use, import, and otherwise transfer the Work. + +Restrictions. The license granted in Section 3 above is expressly made subject +to and limited by the following restrictions: + You agree not to remove any of the original copyright, patent, trademark, +and attribution notices and associated disclaimers that may appear in the +Source Code or Executable Files. + You agree not to advertise or in any way imply that this Work is a product +of Your own. + The name of the Author may not be used to endorse or promote products +derived from the Work without the prior written consent of the Author. + You agree not to sell, lease, or rent any part of the Work. This does +not restrict you from including the Work or any part of the Work inside +a larger software distribution that itself is being sold. The Work by itself, +though, cannot be sold, leased or rented. + You may distribute the Executable Files and Source Code only under the terms +of this License, and You must include a copy of, or the Uniform Resource +Identifier for, this License with every copy of the Executable Files or +Source Code You distribute and ensure that anyone receiving such Executable +Files and Source Code agrees that the terms of this License apply to such +Executable Files and/or Source Code. You may not offer or impose any terms +on the Work that alter or restrict the terms of this License or the +recipients' exercise of the rights granted hereunder. You may not sublicense +the Work. You must keep intact all notices that refer to this License and to +the disclaimer of warranties. You may not distribute the Executable Files or +Source Code with any technological measures that control access or use of the +Work in a manner inconsistent with the terms of this License. + You agree not to use the Work for illegal, immoral or improper +purposes, or on pages containing illegal, immoral or improper material. +The Work is subject to applicable export laws. You agree to comply with all +such laws and regulations that may apply to the Work after Your receipt of +the Work. + +Representations, Warranties and Disclaimer. THIS WORK IS PROVIDED "AS IS", +"WHERE IS" AND "AS AVAILABLE", WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES OR +CONDITIONS OR GUARANTEES. YOU, THE USER, ASSUME ALL RISK IN ITS USE, +INCLUDING COPYRIGHT INFRINGEMENT, PATENT INFRINGEMENT, SUITABILITY, ETC. +AUTHOR EXPRESSLY DISCLAIMS ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES +OR CONDITIONS, INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS +OF MERCHANTABILITY, MERCHANTABLE QUALITY OR FITNESS FOR A PARTICULAR +PURPOSE, OR ANY WARRANTY OF TITLE OR NON-INFRINGEMENT, OR THAT THE WORK +(OR ANY PORTION THEREOF) IS CORRECT, USEFUL, BUG-FREE OR FREE OF VIRUSES. +YOU MUST PASS THIS DISCLAIMER ON WHENEVER YOU DISTRIBUTE THE WORK OR DERIVATIVE +WORKS. + +Indemnity. You agree to defend, indemnify and hold harmless the Author and the +Publisher from and against any claims, suits, losses, damages, liabilities, +costs, and expenses (including reasonable legal or attorneys’ fees) +resulting from or relating to any use of the Work by You. + +Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, +IN NO EVENT WILL THE AUTHOR OR THE PUBLISHER BE LIABLE TO YOU ON ANY LEGAL +THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY +DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK OR OTHERWISE, +EVEN IF THE AUTHOR OR THE PUBLISHER HAS BEEN ADVISED OF THE POSSIBILITY +OF SUCH DAMAGES. + +Termination. + This License and the rights granted hereunder will terminate +automatically upon any breach by You of any term of this License. +Individuals or entities who have received Derivative Works from You under +this License, however, will not have their licenses terminated provided such +individuals or entities remain in full compliance with those licenses. +Sections 1, 2, 6, 7, 8, 9, 10 and 11 will survive any termination of +this License. + If You bring a copyright, trademark, patent or any other infringement +claim against any contributor over infringements You claim are made by the +Work, your License from such contributor to the Work ends automatically. + Subject to the above terms and conditions, this License is perpetual +(for the duration of the applicable copyright in the Work). +Notwithstanding the above, the Author reserves the right to release the Work +under different license terms or to stop distributing the Work at any time; +provided, however that any such election will not serve to withdraw this +License (or any other license that has been, or is required to be, +granted under the terms of this License), and this License will continue +in full force and effect unless terminated as stated above. + +Publisher. The parties hereby confirm that the Publisher shall not, under +any circumstances, be responsible for and shall not have any liability +in respect of the subject matter of this License. The Publisher makes no +warranty whatsoever in connection with the Work and shall not be liable +to You or any party on any legal theory for any damages whatsoever, including +without limitation any general, special, incidental or consequential damages +arising in connection to this license. The Publisher reserves the right to +cease making the Work available to You at any time without notice + +Miscellaneous + This License shall be governed by the laws of the location of the head +office of the Author or if the Author is an individual, the laws of +location of the principal place of residence of the Author. + If any provision of this License is invalid or unenforceable under +applicable law, it shall not affect the validity or enforceability of the +remainder of the terms of this License, and without further action by the +parties to this License, such provision shall be reformed to the minimum +extent necessary to make such provision valid and enforceable. + No term or provision of this License shall be deemed waived and no +breach consented to unless such waiver or consent shall be in writing +and signed by the party to be charged with such waiver or consent. + This License constitutes the entire agreement between the parties +with respect to the Work licensed herein. There are no understandings, +agreements or representations with respect to the Work not specified herein. +The Author shall not be bound by any additional provisions that may appear +in any communication from You. This License may not be modified without +the mutual written agreement of the Author and You. + + +With respect to DocumentFormat.OpenXml +====================================== + +(https://github.com/OfficeDev/Open-XML-SDK/blob/master/LICENSE) + +The MIT License (MIT) + +Copyright (c) Microsoft Corporation + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +With respect to ExcelNumberFormat +================================= + +(https://github.com/andersnm/ExcelNumberFormat/blob/master/LICENSE) + +The MIT License (MIT) + +Copyright (c) 2017 andersnm + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +With respect to jose-jwt +======================== + +(https://github.com/dvsekhvalnov/jose-jwt/blob/master/LICENSE) + +The MIT License (MIT) + +Copyright (c) 2014-2019 dvsekhvalnov + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +With resepect to ExcelDataReader +================================ + +(https://github.com/ExcelDataReader/ExcelDataReader/blob/develop/LICENSE) + +The MIT License (MIT) + +Copyright (c) 2014 ExcelDataReader + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +With resepect to OPC UA Example Code +==================================== + + * Copyright (c) 2005-2019 The OPC Foundation, Inc. All rights reserved. + * + * OPC Foundation MIT License 1.00 + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * The complete license agreement can be found here: + * http://opcfoundation.org/License/MIT/1.00/ + + +With respect to OPC Foundation +============================== + +RCL License +Reciprocal Community License 1.00 (RCL1.00) +Version 1.00, June 24, 2009 +Copyright (C) 2008,2009 OPC Foundation, Inc., All Rights Reserved. + +https://opcfoundation.org/license/rcl.html + +Remark: PHOENIX CONTACT GmbH & Co. KG and Festo SE & Co. KG are members +of OPC foundation. + +With respect to MSAGL (Microsoft Automatic Graph Layout) +======================================================== +(see: https://github.com/microsoft/automatic-graph-layout/blob/master/LICENSE) + +Microsoft Automatic Graph Layout, MSAGL + +Copyright (c) Microsoft Corporation + +All rights reserved. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +""Software""), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +With respect to Glob (https://www.nuget.org/packages/Glob/) +=========================================================== +(see: https://raw.githubusercontent.com/kthompson/glob/master/LICENSE) + +The MIT License (MIT) + +Copyright (c) 2013-2019 Kevin Thompson + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +With respect to Magick.NET +========================== + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. + +With respect to SSharp.NET library +================================== + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/src/AasxCsharpLib_bkp/LogInternally.cs b/src/AasxCsharpLib_bkp/LogInternally.cs new file mode 100644 index 000000000..f5a9bfad9 --- /dev/null +++ b/src/AasxCsharpLib_bkp/LogInternally.cs @@ -0,0 +1,84 @@ +/* +Copyright (c) 2020 ZHAW Zürcher Hochschule für Angewandte Wissenschaften +Author: Marko Ristin + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ + +using System; +using Exception = System.Exception; + +namespace AdminShellNS +{ + public static class Logging + { + // see: https://stackoverflow.com/questions/9314172/getting-all-messages-from-innerexceptions + private static string GetExceptionMessages(this Exception e, string msgs = "") + { + if (e == null) return string.Empty; + if (msgs == "") msgs = e.Message; + if (e.InnerException != null) + msgs += "\r\nInnerException: " + GetExceptionMessages(e.InnerException); + return msgs; + } + + public static string FormatError(Exception ex, string where) + { + var res = string.Format("Error: {0}: {1} {2} at {3}.", + where, + ex.Message, + ex.GetExceptionMessages(), + ex.StackTrace); + + var inner = ex.InnerException; + while (inner != null) + { + res += $"Inner message: {inner.Message}" + Environment.NewLine; + inner = inner.InnerException; + } + + return res; + } + } + + public class InternalLog + { + /// + /// Logs the exception to STDERR. + /// + public void Error(Exception ex, string where) + { + System.Console.Error.WriteLine(Logging.FormatError(ex, where)); + } + + /// + /// Logs that the exception is silently ignored to STDERR. + /// + public void SilentlyIgnoredError(Exception ex) + { + System.Console.Error.WriteLine("The exception is silently ignored: {0} {1} at {2}.", + ex.Message, + ((ex.InnerException != null) ? ex.InnerException.Message : ""), + ex.StackTrace); + } + + /// + /// Does no logging at all. Allows to have non-empty catch clauses. + /// + public void CompletelyIgnoredError(Exception ex) + { + } + } + + /// + /// Handles logging meant to be read by developers (*i.e*, not by the users of the software). + /// + /// Please see AasxIntegrationBase\LogInstance.cs for how to keep logs intended + /// for the user. + public static class LogInternally + { + public static readonly InternalLog That = new InternalLog(); + } +} \ No newline at end of file diff --git a/src/AasxCsharpLib_bkp/Properties/AssemblyInfo.cs b/src/AasxCsharpLib_bkp/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..9aa23c08b --- /dev/null +++ b/src/AasxCsharpLib_bkp/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// Allgemeine Informationen über eine Assembly werden über die folgenden +// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, +// die einer Assembly zugeordnet sind. +[assembly: AssemblyTitle("AasxCsharpLibrary")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("AasxCsharpLibrary")] +[assembly: AssemblyCopyright("Copyright © 2019")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly +// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von +// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen. +[assembly: ComVisible(false)] + +// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird +[assembly: Guid("9863799b-4e44-4da2-9120-c85c7985bc6d")] + +// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: +// +// Hauptversion +// Nebenversion +// Buildnummer +// Revision +// +// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, +// indem Sie "*" wie unten gezeigt eingeben: +//// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/AasxCsharpLib_bkp/Resources/schemaV201/AAS.xsd b/src/AasxCsharpLib_bkp/Resources/schemaV201/AAS.xsd new file mode 100644 index 000000000..2e6c24f6b --- /dev/null +++ b/src/AasxCsharpLib_bkp/Resources/schemaV201/AAS.xsd @@ -0,0 +1,555 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/AasxCsharpLib_bkp/Resources/schemaV201/AAS_ABAC.xsd b/src/AasxCsharpLib_bkp/Resources/schemaV201/AAS_ABAC.xsd new file mode 100644 index 000000000..4048a5746 --- /dev/null +++ b/src/AasxCsharpLib_bkp/Resources/schemaV201/AAS_ABAC.xsd @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AasxCsharpLib_bkp/Resources/schemaV201/IEC61360.xsd b/src/AasxCsharpLib_bkp/Resources/schemaV201/IEC61360.xsd new file mode 100644 index 000000000..d52f04f1e --- /dev/null +++ b/src/AasxCsharpLib_bkp/Resources/schemaV201/IEC61360.xsd @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/AasxCsharpLib_bkp/Resources/schemaV201/aas.json b/src/AasxCsharpLib_bkp/Resources/schemaV201/aas.json new file mode 100644 index 000000000..9583c2b1f --- /dev/null +++ b/src/AasxCsharpLib_bkp/Resources/schemaV201/aas.json @@ -0,0 +1,1148 @@ +{ + "$schema": "https://json-schema.org/draft/2019-09/schema", + "title": "AssetAdministrationShellEnvironment", + "$id": "http://www.admin-shell.io/schema/json/v2.0.1", + "type": "object", + "required": ["assetAdministrationShells", "submodels", "assets", "conceptDescriptions"], + "properties": { + "assetAdministrationShells": { + "type": "array", + "items": { + "$ref": "#/definitions/AssetAdministrationShell" + } + }, + "submodels": { + "type": "array", + "items": { + "$ref": "#/definitions/Submodel" + } + }, + "assets": { + "type": "array", + "items": { + "$ref": "#/definitions/Asset" + } + }, + "conceptDescriptions": { + "type": "array", + "items": { + "$ref": "#/definitions/ConceptDescription" + } + } + }, + "definitions": { + "Referable": { + "type": "object", + "properties": { + "idShort": { + "type": "string" + }, + "category": { + "type": "string" + }, + "description": { + "type": "array", + "items": { + "$ref": "#/definitions/LangString" + } + }, + "parent": { + "$ref": "#/definitions/Reference" + }, + "modelType": { + "$ref": "#/definitions/ModelType" + } + }, + "required": [ "idShort", "modelType" ] + }, + "Identifiable": { + "allOf": [ + { "$ref": "#/definitions/Referable" }, + { "properties": { + "identification": { + "$ref": "#/definitions/Identifier" + }, + "administration": { + "$ref": "#/definitions/AdministrativeInformation" + } + }, + "required": [ "identification" ] + } + ] + }, + "Qualifiable": { + "type": "object", + "properties": { + "qualifiers": { + "type": "array", + "items": { + "$ref": "#/definitions/Constraint" + } + } + } + }, + "HasSemantics": { + "type": "object", + "properties": { + "semanticId": { + "$ref": "#/definitions/Reference" + } + } + }, + "HasDataSpecification": { + "type": "object", + "properties": { + "embeddedDataSpecifications": { + "type": "array", + "items": { + "$ref": "#/definitions/EmbeddedDataSpecification" + } + } + } + }, + "AssetAdministrationShell": { + "allOf": [ + { "$ref": "#/definitions/Identifiable" }, + { "$ref": "#/definitions/HasDataSpecification" }, + { "properties": { + "derivedFrom": { + "$ref": "#/definitions/Reference" + }, + "asset": { + "$ref": "#/definitions/Reference" + }, + "submodels": { + "type": "array", + "items": { + "$ref": "#/definitions/Reference" + } + }, + "views": { + "type": "array", + "items": { + "$ref": "#/definitions/View" + } + }, + "conceptDictionaries": { + "type": "array", + "items": { + "$ref": "#/definitions/ConceptDictionary" + } + }, + "security": { + "$ref": "#/definitions/Security" + } + }, + "required": [ "asset" ] + } + ] + }, + "Identifier": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "idType": { + "$ref": "#/definitions/KeyType" + } + }, + "required": [ "id", "idType" ] + }, + "KeyType": { + "type": "string", + "enum": ["Custom", "IRDI", "IRI", "IdShort", "FragmentId"] + }, + "AdministrativeInformation": { + "type": "object", + "properties": { + "version": { + "type": "string" + }, + "revision": { + "type": "string" + } + } + }, + "LangString": { + "type": "object", + "properties": { + "language": { + "type": "string" + }, + "text": { + "type": "string" + } + }, + "required": [ "language", "text" ] + }, + "Reference": { + "type": "object", + "properties": { + "keys": { + "type": "array", + "items": { + "$ref": "#/definitions/Key" + } + } + }, + "required": [ "keys" ] + }, + "Key": { + "type": "object", + "properties": { + "type": { + "$ref": "#/definitions/KeyElements" + }, + "idType": { + "$ref": "#/definitions/KeyType" + }, + "value": { + "type": "string" + }, + "local": { + "type": "boolean" + } + }, + "required": [ "type", "idType", "value", "local" ] + }, + "KeyElements": { + "type": "string", + "enum": [ + "Asset", + "AssetAdministrationShell", + "ConceptDescription", + "Submodel", + "AccessPermissionRule", + "AnnotatedRelationshipElement", + "BasicEvent", + "Blob", + "Capability", + "ConceptDictionary", + "DataElement", + "File", + "Entity", + "Event", + "MultiLanguageProperty", + "Operation", + "Property", + "Range", + "ReferenceElement", + "RelationshipElement", + "SubmodelElement", + "SubmodelElementCollection", + "View", + "GlobalReference", + "FragmentReference" + ] + }, + "ModelTypes": { + "type": "string", + "enum": [ + "Asset", + "AssetAdministrationShell", + "ConceptDescription", + "Submodel", + "AccessPermissionRule", + "AnnotatedRelationshipElement", + "BasicEvent", + "Blob", + "Capability", + "ConceptDictionary", + "DataElement", + "File", + "Entity", + "Event", + "MultiLanguageProperty", + "Operation", + "Property", + "Range", + "ReferenceElement", + "RelationshipElement", + "SubmodelElement", + "SubmodelElementCollection", + "View", + "GlobalReference", + "FragmentReference", + "Constraint", + "Formula", + "Qualifier" + ] + }, + "ModelType": { + "type": "object", + "properties": { + "name": { + "$ref": "#/definitions/ModelTypes" + } + }, + "required": [ "name" ] + }, + "EmbeddedDataSpecification": { + "type": "object", + "properties": { + "dataSpecification": { + "$ref": "#/definitions/Reference" + }, + "dataSpecificationContent": { + "$ref": "#/definitions/DataSpecificationContent" + } + }, + "required": [ "dataSpecification", "dataSpecificationContent" ] + }, + "DataSpecificationContent": { + "oneOf": [ + { "$ref": "#/definitions/DataSpecificationIEC61360Content" }, + { "$ref": "#/definitions/DataSpecificationPhysicalUnitContent" } + ] + }, + "DataSpecificationPhysicalUnitContent": { + "type": "object", + "properties": { + "unitName": { + "type": "string" + }, + "unitSymbol": { + "type": "string" + }, + "definition": { + "type": "array", + "items": { + "$ref": "#/definitions/LangString" + } + }, + "siNotation": { + "type": "string" + }, + "siName": { + "type": "string" + }, + "dinNotation": { + "type": "string" + }, + "eceName": { + "type": "string" + }, + "eceCode": { + "type": "string" + }, + "nistName": { + "type": "string" + }, + "sourceOfDefinition": { + "type": "string" + }, + "conversionFactor": { + "type": "string" + }, + "registrationAuthorityId": { + "type": "string" + }, + "supplier": { + "type": "string" + } + }, + "required": [ "unitName", "unitSymbol", "definition" ] + }, + "DataSpecificationIEC61360Content": { + "allOf": [ + { "$ref": "#/definitions/ValueObject" }, + { + "type": "object", + "properties": { + "dataType": { + "enum": [ + "DATE", + "STRING", + "STRING_TRANSLATABLE", + "REAL_MEASURE", + "REAL_COUNT", + "REAL_CURRENCY", + "BOOLEAN", + "URL", + "RATIONAL", + "RATIONAL_MEASURE", + "TIME", + "TIMESTAMP", + "INTEGER_COUNT", + "INTEGER_MEASURE", + "INTEGER_CURRENCY" + ] + }, + "definition": { + "type": "array", + "items": { + "$ref": "#/definitions/LangString" + } + }, + "preferredName": { + "type": "array", + "items": { + "$ref": "#/definitions/LangString" + } + }, + "shortName": { + "type": "array", + "items": { + "$ref": "#/definitions/LangString" + } + }, + "sourceOfDefinition": { + "type": "string" + }, + "symbol": { + "type": "string" + }, + "unit": { + "type": "string" + }, + "unitId": { + "$ref": "#/definitions/Reference" + }, + "valueFormat": { + "type": "string" + }, + "valueList": { + "$ref": "#/definitions/ValueList" + }, + "levelType": { + "type": "array", + "items": { + "$ref": "#/definitions/LevelType" + } + } + }, + "required": [ "preferredName" ] + } + ] + }, + "LevelType": { + "type": "string", + "enum": [ "Min", "Max", "Nom", "Typ" ] + }, + "ValueList": { + "type": "object", + "properties": { + "valueReferencePairTypes": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/ValueReferencePairType" + } + } + }, + "required": [ "valueReferencePairTypes" ] + }, + "ValueReferencePairType": { + "allOf": [ + { "$ref": "#/definitions/ValueObject" } + ] + }, + "ValueObject": { + "type": "object", + "properties": { + "value": { "type": "string" }, + "valueId": { + "$ref": "#/definitions/Reference" + }, + "valueType": { + "type": "string", + "enum": [ + "anyUri", + "base64Binary", + "boolean", + "date", + "dateTime", + "dateTimeStamp", + "decimal", + "integer", + "long", + "int", + "short", + "byte", + "nonNegativeInteger", + "positiveInteger", + "unsignedLong", + "unsignedInt", + "unsignedShort", + "unsignedByte", + "nonPositiveInteger", + "negativeInteger", + "double", + "duration", + "dayTimeDuration", + "yearMonthDuration", + "float", + "gDay", + "gMonth", + "gMonthDay", + "gYear", + "gYearMonth", + "hexBinary", + "NOTATION", + "QName", + "string", + "normalizedString", + "token", + "language", + "Name", + "NCName", + "ENTITY", + "ID", + "IDREF", + "NMTOKEN", + "time" + ]} + } + }, + "Asset": { + "allOf": [ + { "$ref": "#/definitions/Identifiable" }, + { "$ref": "#/definitions/HasDataSpecification" }, + { "properties": { + "kind": { + "$ref": "#/definitions/AssetKind" + }, + "assetIdentificationModel": { + "$ref": "#/definitions/Reference" + }, + "billOfMaterial": { + "$ref": "#/definitions/Reference" + } + }, + "required": [ "kind" ] + } + ] + }, + "AssetKind": { + "type": "string", + "enum": ["Type", "Instance"] + }, + "ModelingKind": { + "type": "string", + "enum": ["Template", "Instance"] + }, + "Submodel": { + "allOf": [ + { "$ref": "#/definitions/Identifiable" }, + { "$ref": "#/definitions/HasDataSpecification" }, + { "$ref": "#/definitions/Qualifiable" }, + { "$ref": "#/definitions/HasSemantics" }, + { "properties": { + "kind": { + "$ref": "#/definitions/ModelingKind" + }, + "submodelElements": { + "type": "array", + "items": { + "$ref": "#/definitions/SubmodelElement" + } + } + } + } + ] + }, + "Constraint": { + "type": "object", + "properties": { + "modelType": { + "$ref": "#/definitions/ModelType" + } + }, + "required": [ "modelType" ] + }, + "Operation": { + "allOf": [ + { "$ref": "#/definitions/SubmodelElement" }, + { "properties": { + "inputVariable": { + "type": "array", + "items": { + "$ref": "#/definitions/OperationVariable" + } + }, + "outputVariable": { + "type": "array", + "items": { + "$ref": "#/definitions/OperationVariable" + } + }, + "inoutputVariable": { + "type": "array", + "items": { + "$ref": "#/definitions/OperationVariable" + } + } + } + } + ] + }, + "OperationVariable": { + "type": "object", + "properties": { + "value": { + "oneOf": [ + { "$ref": "#/definitions/Blob" }, + { "$ref": "#/definitions/File" }, + { "$ref": "#/definitions/Capability" }, + { "$ref": "#/definitions/Entity" }, + { "$ref": "#/definitions/Event" }, + { "$ref": "#/definitions/BasicEvent" }, + { "$ref": "#/definitions/MultiLanguageProperty" }, + { "$ref": "#/definitions/Operation" }, + { "$ref": "#/definitions/Property" }, + { "$ref": "#/definitions/Range" }, + { "$ref": "#/definitions/ReferenceElement" }, + { "$ref": "#/definitions/RelationshipElement" }, + { "$ref": "#/definitions/SubmodelElementCollection" } + ] + } + }, + "required": [ "value" ] + }, + "SubmodelElement": { + "allOf": [ + { "$ref": "#/definitions/Referable" }, + { "$ref": "#/definitions/HasDataSpecification" }, + { "$ref": "#/definitions/HasSemantics" }, + { "$ref": "#/definitions/Qualifiable" }, + { "properties": { + "kind": { + "$ref": "#/definitions/ModelingKind" + } + } + } + ] + }, + "Event": { + "allOf": [ + { "$ref": "#/definitions/SubmodelElement" } + ] + }, + "BasicEvent": { + "allOf": [ + { "$ref": "#/definitions/Event" }, + { "properties": { + "observed": { + "$ref": "#/definitions/Reference" + } + }, + "required": [ "observed" ] + } + ] + }, + "EntityType": { + "type": "string", + "enum": ["CoManagedEntity", "SelfManagedEntity"] + }, + "Entity": { + "allOf": [ + { "$ref": "#/definitions/SubmodelElement" }, + { "properties": { + "statements": { + "type": "array", + "items": { + "$ref": "#/definitions/SubmodelElement" + } + }, + "entityType": { + "$ref": "#/definitions/EntityType" + }, + "asset": { + "$ref": "#/definitions/Reference" + } + }, + "required": [ "entityType" ] + } + ] + }, + "View": { + "allOf": [ + { "$ref": "#/definitions/Referable" }, + { "$ref": "#/definitions/HasDataSpecification" }, + { "$ref": "#/definitions/HasSemantics" }, + { "properties": { + "containedElements": { + "type": "array", + "items": { + "$ref": "#/definitions/Reference" + } + } + } + } + ] + }, + "ConceptDictionary": { + "allOf": [ + { "$ref": "#/definitions/Referable" }, + { "$ref": "#/definitions/HasDataSpecification" }, + { "properties": { + "conceptDescriptions": { + "type": "array", + "items": { + "$ref": "#/definitions/Reference" + } + } + } + } + ] + }, + "ConceptDescription": { + "allOf": [ + { "$ref": "#/definitions/Identifiable" }, + { "$ref": "#/definitions/HasDataSpecification" }, + { "properties": { + "isCaseOf": { + "type": "array", + "items": { + "$ref": "#/definitions/Reference" + } + } + } + } + ] + }, + "Capability": { + "allOf": [ + { "$ref": "#/definitions/SubmodelElement" } + ] + }, + "Property": { + "allOf": [ + { "$ref": "#/definitions/SubmodelElement" }, + { "$ref": "#/definitions/ValueObject" } + ] + }, + "Range": { + "allOf": [ + { "$ref": "#/definitions/SubmodelElement" }, + { "properties": { + "valueType": { + "type": "string", + "enum": [ + "anyUri", + "base64Binary", + "boolean", + "date", + "dateTime", + "dateTimeStamp", + "decimal", + "integer", + "long", + "int", + "short", + "byte", + "nonNegativeInteger", + "positiveInteger", + "unsignedLong", + "unsignedInt", + "unsignedShort", + "unsignedByte", + "nonPositiveInteger", + "negativeInteger", + "double", + "duration", + "dayTimeDuration", + "yearMonthDuration", + "float", + "gDay", + "gMonth", + "gMonthDay", + "gYear", + "gYearMonth", + "hexBinary", + "NOTATION", + "QName", + "string", + "normalizedString", + "token", + "language", + "Name", + "NCName", + "ENTITY", + "ID", + "IDREF", + "NMTOKEN", + "time" + ] + }, + "min": { "type": "string" }, + "max": { "type": "string" } + }, + "required": [ "valueType"] + } + ] + }, + "MultiLanguageProperty": { + "allOf": [ + { "$ref": "#/definitions/SubmodelElement" }, + { "properties": { + "value": { + "type": "array", + "items": { + "$ref": "#/definitions/LangString" + } + }, + "valueId": { + "$ref": "#/definitions/Reference" + } + } + } + ] + }, + "File": { + "allOf": [ + { "$ref": "#/definitions/SubmodelElement" }, + { "properties": { + "value": { + "type": "string" + }, + "mimeType": { + "type": "string" + } + }, + "required": [ "mimeType" ] + } + ] + }, + "Blob": { + "allOf": [ + { "$ref": "#/definitions/SubmodelElement" }, + { "properties": { + "value": { + "type": "string" + }, + "mimeType": { + "type": "string" + } + }, + "required": [ "mimeType" ] + } + ] + }, + "ReferenceElement": { + "allOf": [ + { "$ref": "#/definitions/SubmodelElement" }, + { "properties": { + "value": { + "$ref": "#/definitions/Reference" + } + } + } + ] + }, + "SubmodelElementCollection": { + "allOf": [ + { "$ref": "#/definitions/SubmodelElement" }, + { "properties": { + "value": { + "type": "array", + "items": { + "oneOf": [ + { "$ref": "#/definitions/Blob" }, + { "$ref": "#/definitions/File" }, + { "$ref": "#/definitions/Capability" }, + { "$ref": "#/definitions/Entity" }, + { "$ref": "#/definitions/Event" }, + { "$ref": "#/definitions/BasicEvent" }, + { "$ref": "#/definitions/MultiLanguageProperty" }, + { "$ref": "#/definitions/Operation" }, + { "$ref": "#/definitions/Property" }, + { "$ref": "#/definitions/Range" }, + { "$ref": "#/definitions/ReferenceElement" }, + { "$ref": "#/definitions/RelationshipElement" }, + { "$ref": "#/definitions/SubmodelElementCollection" } + ] + } + }, + "allowDuplicates": { + "type": "boolean" + }, + "ordered": { + "type": "boolean" + } + } + } + ] + }, + "RelationshipElement": { + "allOf": [ + { "$ref": "#/definitions/SubmodelElement" }, + { "properties": { + "first": { + "$ref": "#/definitions/Reference" + }, + "second": { + "$ref": "#/definitions/Reference" + } + }, + "required": [ "first", "second" ] + } + ] + }, + "AnnotatedRelationshipElement": { + "allOf": [ + { "$ref": "#/definitions/RelationshipElement" }, + { "properties": { + "annotation": { + "type": "array", + "items": { + "oneOf": [ + { "$ref": "#/definitions/Blob" }, + { "$ref": "#/definitions/File" }, + { "$ref": "#/definitions/MultiLanguageProperty" }, + { "$ref": "#/definitions/Property" }, + { "$ref": "#/definitions/Range" }, + { "$ref": "#/definitions/ReferenceElement" } + ] + } + } + } + } + ] + }, + "Qualifier": { + "allOf": [ + { "$ref": "#/definitions/Constraint" }, + { "$ref": "#/definitions/HasSemantics" }, + { "$ref": "#/definitions/ValueObject" }, + { "properties": { + "type": { + "type": "string" + } + }, + "required": [ "type" ] + } + ] + }, + "Formula": { + "allOf": [ + { "$ref": "#/definitions/Constraint" }, + { "properties": { + "dependsOn": { + "type": "array", + "items": { + "$ref": "#/definitions/Reference" + } + } + } + } + ] + }, + "Security": { + "type": "object", + "properties": { + "accessControlPolicyPoints": { + "$ref": "#/definitions/AccessControlPolicyPoints" + }, + "certificate": { + "type": "array", + "items": { + "oneOf": [ + { "$ref": "#/definitions/BlobCertificate" } + ] + } + }, + "requiredCertificateExtension": { + "type": "array", + "items": { + "$ref": "#/definitions/Reference" + } + } + }, + "required": [ "accessControlPolicyPoints" ] + }, + "Certificate": { + "type": "object" + }, + "BlobCertificate": { + "allOf": [ + { "$ref": "#/definitions/Certificate" }, + { "properties": { + "blobCertificate": { + "$ref": "#/definitions/Blob" + }, + "containedExtension": { + "type": "array", + "items": { + "$ref": "#/definitions/Reference" + } + }, + "lastCertificate": { + "type": "boolean" + } + } + } + ] + }, + "AccessControlPolicyPoints": { + "type": "object", + "properties": { + "policyAdministrationPoint": { + "$ref": "#/definitions/PolicyAdministrationPoint" + }, + "policyDecisionPoint": { + "$ref": "#/definitions/PolicyDecisionPoint" + }, + "policyEnforcementPoint": { + "$ref": "#/definitions/PolicyEnforcementPoint" + }, + "policyInformationPoints": { + "$ref": "#/definitions/PolicyInformationPoints" + } + }, + "required": [ "policyAdministrationPoint", "policyDecisionPoint", "policyEnforcementPoint" ] + }, + "PolicyAdministrationPoint": { + "type": "object", + "properties": { + "localAccessControl": { + "$ref": "#/definitions/AccessControl" + }, + "externalAccessControl": { + "type": "boolean" + } + }, + "required": [ "externalAccessControl" ] + }, + "PolicyInformationPoints": { + "type": "object", + "properties": { + "internalInformationPoint": { + "type": "array", + "items": { + "$ref": "#/definitions/Reference" + } + }, + "externalInformationPoint": { + "type": "boolean" + } + }, + "required": [ "externalInformationPoint" ] + }, + "PolicyEnforcementPoint": { + "type": "object", + "properties": { + "externalPolicyEnforcementPoint": { + "type": "boolean" + } + }, + "required": [ "externalPolicyEnforcementPoint" ] + }, + "PolicyDecisionPoint": { + "type": "object", + "properties": { + "externalPolicyDecisionPoints": { + "type": "boolean" + } + }, + "required": [ "externalPolicyDecisionPoints" ] + }, + "AccessControl": { + "type": "object", + "properties": { + "selectableSubjectAttributes": { + "$ref": "#/definitions/Reference" + }, + "defaultSubjectAttributes": { + "$ref": "#/definitions/Reference" + }, + "selectablePermissions": { + "$ref": "#/definitions/Reference" + }, + "defaultPermissions": { + "$ref": "#/definitions/Reference" + }, + "selectableEnvironmentAttributes": { + "$ref": "#/definitions/Reference" + }, + "defaultEnvironmentAttributes": { + "$ref": "#/definitions/Reference" + }, + "accessPermissionRule": { + "type": "array", + "items": { + "$ref": "#/definitions/AccessPermissionRule" + } + } + } + }, + "AccessPermissionRule": { + "allOf": [ + { "$ref": "#/definitions/Referable" }, + { "$ref": "#/definitions/Qualifiable" }, + { "properties": { + "targetSubjectAttributes": { + "type": "array", + "items": { + "$ref": "#/definitions/SubjectAttributes" + }, + "minItems": 1 + }, + "permissionsPerObject": { + "type": "array", + "items": { + "$ref": "#/definitions/PermissionsPerObject" + } + } + }, + "required": [ "targetSubjectAttributes" ] + } + ] + }, + "SubjectAttributes": { + "type": "object", + "properties": { + "subjectAttributes": { + "type": "array", + "items": { + "$ref": "#/definitions/Reference" + }, + "minItems": 1 + } + } + }, + "PermissionsPerObject": { + "type": "object", + "properties": { + "object": { + "$ref": "#/definitions/Reference" + }, + "targetObjectAttributes": { + "$ref": "#/definitions/ObjectAttributes" + }, + "permission": { + "type": "array", + "items": { + "$ref": "#/definitions/Permission" + } + } + } + }, + "ObjectAttributes": { + "type": "object", + "properties": { + "objectAttribute": { + "type": "array", + "items": { + "$ref": "#/definitions/Property" + }, + "minItems": 1 + } + } + }, + "Permission": { + "type": "object", + "properties": { + "permission": { + "$ref": "#/definitions/Reference" + }, + "kindOfPermission": { + "type": "string", + "enum": ["Allow", "Deny", "NotApplicable", "Undefined"] + } + }, + "required": [ "permission", "kindOfPermission" ] + } + } +} diff --git a/src/AasxCsharpLibrary.Tests/AasxCsharpLibrary.Tests.csproj b/src/AasxCsharpLibrary.Tests/AasxCsharpLibrary.Tests.csproj new file mode 100644 index 000000000..65684b16f --- /dev/null +++ b/src/AasxCsharpLibrary.Tests/AasxCsharpLibrary.Tests.csproj @@ -0,0 +1,24 @@ + + + net6.0-windows + Library + false + 8 + false + + + + PreserveNewest + + + + + Always + + + + + + + + diff --git a/src/AasxCsharpLibrary.Tests/DocTestAdminShellUtil.cs b/src/AasxCsharpLibrary.Tests/DocTestAdminShellUtil.cs new file mode 100644 index 000000000..e6bd57845 --- /dev/null +++ b/src/AasxCsharpLibrary.Tests/DocTestAdminShellUtil.cs @@ -0,0 +1,67 @@ +// This file was automatically generated by doctest-csharp. +// !!! DO NOT EDIT OR APPEND !!! + +using NUnit.Framework; + +namespace AdminShellNS.Tests +{ + public class DocTest_AdminShellUtil_cs + { + [Test] + public void AtLine40AndColumn12() + { + Assert.AreEqual("someName", AdminShellUtil.FilterFriendlyName("someName")); + } + + [Test] + public void AtLine41AndColumn12() + { + Assert.AreEqual("some__name", AdminShellUtil.FilterFriendlyName("some!;name")); + } + + [Test] + public void AtLine51AndColumn12() + { + Assert.IsFalse(AdminShellUtil.HasWhitespace("")); + } + + [Test] + public void AtLine52AndColumn12() + { + Assert.IsTrue(AdminShellUtil.HasWhitespace(" ")); + } + + [Test] + public void AtLine53AndColumn12() + { + Assert.IsTrue(AdminShellUtil.HasWhitespace("aa bb")); + } + + [Test] + public void AtLine54AndColumn12() + { + Assert.IsTrue(AdminShellUtil.HasWhitespace(" aabb")); + } + + [Test] + public void AtLine55AndColumn12() + { + Assert.IsTrue(AdminShellUtil.HasWhitespace("aabb ")); + } + + [Test] + public void AtLine56AndColumn12() + { + Assert.IsFalse(AdminShellUtil.HasWhitespace("aabb")); + } + + [Test] + public void AtLine68AndColumn12() + { + Assert.IsTrue(AdminShellUtil.ComplyIdShort("")); + } + } +} + +// This file was automatically generated by doctest-csharp. +// !!! DO NOT EDIT OR APPEND !!! diff --git a/src/AasxCsharpLibrary.Tests/LICENSE.txt b/src/AasxCsharpLibrary.Tests/LICENSE.txt new file mode 100644 index 000000000..75f36a4ff --- /dev/null +++ b/src/AasxCsharpLibrary.Tests/LICENSE.txt @@ -0,0 +1,1475 @@ +Copyright (c) 2018-2023 Festo AG & Co. KG +, +author: Michael Hoffmeister + +Copyright (c) 2019-2021 PHOENIX CONTACT GmbH & Co. KG +, +author: Andreas Orzelski + +Copyright (c) 2019-2020 Fraunhofer IOSB-INA Lemgo, + eine rechtlich nicht selbstaendige Einrichtung der Fraunhofer-Gesellschaft + zur Foerderung der angewandten Forschung e.V. + +Copyright (c) 2020 Schneider Electric Automation GmbH +, +author: Marco Mendes + +Copyright (c) 2020 SICK AG + +Copyright (c) 2021 KEB Automation KG + +Copyright (c) 2021 Lenze SE +author: Jonas Grote, Denis Göllner, Sebastian Bischof + +The AASX Package Explorer is licensed under the Apache License 2.0 +(Apache-2.0, see below). + +The AASX Package Explorer is a sample application for demonstration of the +features of the Asset Administration Shell. +The implementation uses the concepts of the document "Details of the Asset +Administration Shell" published on www.plattform-i40.de which is licensed +under Creative Commons CC BY-ND 3.0 DE. + +When using eCl@ss or IEC CDD data, please check the corresponding license +conditions. + +------------------------------------------------------------------------------- + +The components below are used in AASX Package Explorer. +The related licenses are listed for information purposes only. +Some licenses may only apply to their related plugins. + +The browser functionality is licensed under the cefSharp license (see below). + +The Newtonsoft.JSON serialization is licensed under the MIT License +(MIT, see below). + +The QR code generation is licensed under the MIT license (MIT, see below). + +The Zxing.Net Dot Matrix Code (DMC) generation is licensed under +the Apache License 2.0 (Apache-2.0, see below). + +The Grapevine REST server framework is licensed under Apache License 2.0 +(Apache-2.0, see below). + +The AutomationML.Engine is licensed under the MIT license (MIT, see below). + +The MQTT server and client is licensed under the MIT license (MIT, see below). + +The ClosedXML Excel reader/writer is licensed under the MIT license (MIT, +see below). + +The CountryFlag WPF control is licensed under the Code Project Open License +(CPOL, see below). + +The DocumentFormat.OpenXml SDK is licensed under the MIT license (MIT, +see below). + +The ExcelNumberFormat number parser is licensed under the MIT license (MIT, +see below). + +The FastMember reflection access is licensed under Apache License 2.0 +(Apache-2.0, see below). + +The IdentityModel OpenID client is licensed under Apache License 2.0 +(Apache-2.0, see below). + +The jose-jwt object signing and encryption is licensed under the +MIT license (MIT, see below). + +The ExcelDataReader is licensed under the MIT license (MIT, see below). + +Portions copyright (c) by OPC Foundation, Inc. and licensed under the +Reciprocal Community License (RCL, see below) + +The OPC UA Example Code of OPC UA Standard is licensed under the MIT license +(MIT, see below). + +The MSAGL (Microsoft Automatic Graph Layout) is licensed under the MIT license +(MIT, see below) + +Glob (https://www.nuget.org/packages/Glob/) is licensed under the MIT license +(MIT, see below). + +The Magick.NET library is licensed under Apache License 2.0 +(Apache-2.0, see below). + +The SSharp.NET library (https://github.com/PetroProtsyk/SSharp) is licensed +under Apache License 2.0 (Apache-2.0, see below). + +------------------------------------------------------------------------------- + + +With respect to AASX Package Explorer +===================================== + +(http://www.apache.org/licenses/LICENSE-2.0) + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + +With respect to cefSharp +======================== + +(https://raw.githubusercontent.com/cefsharp/CefSharp/master/LICENSE) + +Copyright © The CefSharp Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + + * Neither the name of Google Inc. nor the name Chromium Embedded + Framework nor the name CefSharp nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +With respect to Newtonsoft.Json +=============================== + +(https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md) + +The MIT License (MIT) + +Copyright (c) 2007 James Newton-King + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +With respect to QRcoder +======================= + +(https://github.com/codebude/QRCoder/blob/master/LICENSE.txt) + +The MIT License (MIT) + +Copyright (c) 2013-2018 Raffael Herrmann + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +With respect to ZXing.Net +========================= +With respect to Grapevine +========================= +With respect to FastMember +========================== +With respect to IdentityModel +============================= + +(http://www.apache.org/licenses/LICENSE-2.0) + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + +With respect to AutomationML.Engine +=================================== + +(https://raw.githubusercontent.com/AutomationML/AMLEngine2.1/master/license.txt) + +The MIT License (MIT) + +Copyright 2017 AutomationML e.V. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + + +With respect to MQTTnet +======================= + +(https://github.com/chkr1011/MQTTnet/blob/master/LICENSE) + +MIT License + +MQTTnet Copyright (c) 2016-2019 Christian Kratky + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +With resepct to ClosedXML +========================= + +(https://github.com/ClosedXML/ClosedXML/blob/develop/LICENSE) + +MIT License + +Copyright (c) 2016 ClosedXML + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +With resepct to CountryFlag +=========================== + +(https://www.codeproject.com/Articles/190722/WPF-CountryFlag-Control) + +The Code Project Open License (CPOL) 1.02 + +Copyright © 2017 Meshack Musundi + +Preamble + +This License governs Your use of the Work. This License is intended to allow +developers to use the Source Code and Executable Files provided as part of +the Work in any application in any form. + +The main points subject to the terms of the License are: + + Source Code and Executable Files can be used in commercial applications; + Source Code and Executable Files can be redistributed; and + Source Code can be modified to create derivative works. + No claim of suitability, guarantee, or any warranty whatsoever is provided. + The software is provided "as-is". + The Article(s) accompanying the Work may not be distributed or republished + without the Author's consent + +This License is entered between You, the individual or other entity reading or +otherwise making use of the Work licensed pursuant to this License and the +individual or other entity which offers the Work under the terms of this +License ("Author"). + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS +CODE PROJECT OPEN LICENSE ("LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT +AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED +UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HEREIN, YOU ACCEPT AND AGREE +TO BE BOUND BY THE TERMS OF THIS LICENSE. THE AUTHOR GRANTS YOU THE RIGHTS +CONTAINED HEREIN IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND +CONDITIONS. IF YOU DO NOT AGREE TO ACCEPT AND BE BOUND BY THE TERMS OF THIS +LICENSE, YOU CANNOT MAKE ANY USE OF THE WORK. + +Definitions. + "Articles" means, collectively, all articles written by Author which +describes how the Source Code and Executable Files for the Work may +be used by a user. + "Author" means the individual or entity that offers the Work under +the terms of this License. + "Derivative Work" means a work based upon the Work or upon the Work +and other pre-existing works. + "Executable Files" refer to the executables, binary files, +configuration and any required data files included in the Work. + "Publisher" means the provider of the website, magazine, CD-ROM, +DVD or other medium from or by which the Work is obtained by You. + "Source Code" refers to the collection of source code and +configuration files used to create the Executable Files. + "Standard Version" refers to such a Work if it has not been modified, +or has been modified in accordance with the consent of the Author, +such consent being in the full discretion of the Author. + "Work" refers to the collection of files distributed by the Publisher, +including the Source Code, Executable Files, binaries, data files, +documentation, whitepapers and the Articles. + "You" is you, an individual or entity wishing to use the Work and +exercise your rights under this License. + +Fair Use/Fair Use Rights. Nothing in this License is intended to reduce, +limit, or restrict any rights arising from fair use, fair dealing, +first sale or other limitations on the exclusive rights of the +copyright owner under copyright law or other applicable laws. + +License Grant. Subject to the terms and conditions of this License, the +Author hereby grants You a worldwide, royalty-free, non-exclusive, +perpetual (for the duration of the applicable copyright) license +to exercise the rights in the Work as stated below: + You may use the standard version of the Source Code or Executable +Files in Your own applications. + You may apply bug fixes, portability fixes and other modifications +obtained from the Public Domain or from the Author. A Work modified +in such a way shall still be considered the standard version and will +be subject to this License. + You may otherwise modify Your copy of this Work (excluding the Articles) +in any way to create a Derivative Work, provided that You insert a prominent +notice in each changed file stating how, when and where You changed that file. + You may distribute the standard version of the Executable Files and Source +Code or Derivative Work in aggregate with other (possibly commercial) +programs as part of a larger (possibly commercial) software distribution. + The Articles discussing the Work published in any form by the author may +not be distributed or republished without the Author's consent. The author +retains copyright to any such Articles. You may use the Executable Files and +Source Code pursuant to this License but you may not repost or republish or +otherwise distribute or make available the Articles, without the prior written +consent of the Author. + +Any subroutines or modules supplied by You and linked into the Source Code +or Executable Files of this Work shall not be considered part of this Work +and will not be subject to the terms of this License. + +Patent License. Subject to the terms and conditions of this License, each +Author hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, +royalty-free, irrevocable (except as stated in this section) patent license +to make, have made, use, import, and otherwise transfer the Work. + +Restrictions. The license granted in Section 3 above is expressly made subject +to and limited by the following restrictions: + You agree not to remove any of the original copyright, patent, trademark, +and attribution notices and associated disclaimers that may appear in the +Source Code or Executable Files. + You agree not to advertise or in any way imply that this Work is a product +of Your own. + The name of the Author may not be used to endorse or promote products +derived from the Work without the prior written consent of the Author. + You agree not to sell, lease, or rent any part of the Work. This does +not restrict you from including the Work or any part of the Work inside +a larger software distribution that itself is being sold. The Work by itself, +though, cannot be sold, leased or rented. + You may distribute the Executable Files and Source Code only under the terms +of this License, and You must include a copy of, or the Uniform Resource +Identifier for, this License with every copy of the Executable Files or +Source Code You distribute and ensure that anyone receiving such Executable +Files and Source Code agrees that the terms of this License apply to such +Executable Files and/or Source Code. You may not offer or impose any terms +on the Work that alter or restrict the terms of this License or the +recipients' exercise of the rights granted hereunder. You may not sublicense +the Work. You must keep intact all notices that refer to this License and to +the disclaimer of warranties. You may not distribute the Executable Files or +Source Code with any technological measures that control access or use of the +Work in a manner inconsistent with the terms of this License. + You agree not to use the Work for illegal, immoral or improper +purposes, or on pages containing illegal, immoral or improper material. +The Work is subject to applicable export laws. You agree to comply with all +such laws and regulations that may apply to the Work after Your receipt of +the Work. + +Representations, Warranties and Disclaimer. THIS WORK IS PROVIDED "AS IS", +"WHERE IS" AND "AS AVAILABLE", WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES OR +CONDITIONS OR GUARANTEES. YOU, THE USER, ASSUME ALL RISK IN ITS USE, +INCLUDING COPYRIGHT INFRINGEMENT, PATENT INFRINGEMENT, SUITABILITY, ETC. +AUTHOR EXPRESSLY DISCLAIMS ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES +OR CONDITIONS, INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS +OF MERCHANTABILITY, MERCHANTABLE QUALITY OR FITNESS FOR A PARTICULAR +PURPOSE, OR ANY WARRANTY OF TITLE OR NON-INFRINGEMENT, OR THAT THE WORK +(OR ANY PORTION THEREOF) IS CORRECT, USEFUL, BUG-FREE OR FREE OF VIRUSES. +YOU MUST PASS THIS DISCLAIMER ON WHENEVER YOU DISTRIBUTE THE WORK OR DERIVATIVE +WORKS. + +Indemnity. You agree to defend, indemnify and hold harmless the Author and the +Publisher from and against any claims, suits, losses, damages, liabilities, +costs, and expenses (including reasonable legal or attorneys’ fees) +resulting from or relating to any use of the Work by You. + +Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, +IN NO EVENT WILL THE AUTHOR OR THE PUBLISHER BE LIABLE TO YOU ON ANY LEGAL +THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY +DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK OR OTHERWISE, +EVEN IF THE AUTHOR OR THE PUBLISHER HAS BEEN ADVISED OF THE POSSIBILITY +OF SUCH DAMAGES. + +Termination. + This License and the rights granted hereunder will terminate +automatically upon any breach by You of any term of this License. +Individuals or entities who have received Derivative Works from You under +this License, however, will not have their licenses terminated provided such +individuals or entities remain in full compliance with those licenses. +Sections 1, 2, 6, 7, 8, 9, 10 and 11 will survive any termination of +this License. + If You bring a copyright, trademark, patent or any other infringement +claim against any contributor over infringements You claim are made by the +Work, your License from such contributor to the Work ends automatically. + Subject to the above terms and conditions, this License is perpetual +(for the duration of the applicable copyright in the Work). +Notwithstanding the above, the Author reserves the right to release the Work +under different license terms or to stop distributing the Work at any time; +provided, however that any such election will not serve to withdraw this +License (or any other license that has been, or is required to be, +granted under the terms of this License), and this License will continue +in full force and effect unless terminated as stated above. + +Publisher. The parties hereby confirm that the Publisher shall not, under +any circumstances, be responsible for and shall not have any liability +in respect of the subject matter of this License. The Publisher makes no +warranty whatsoever in connection with the Work and shall not be liable +to You or any party on any legal theory for any damages whatsoever, including +without limitation any general, special, incidental or consequential damages +arising in connection to this license. The Publisher reserves the right to +cease making the Work available to You at any time without notice + +Miscellaneous + This License shall be governed by the laws of the location of the head +office of the Author or if the Author is an individual, the laws of +location of the principal place of residence of the Author. + If any provision of this License is invalid or unenforceable under +applicable law, it shall not affect the validity or enforceability of the +remainder of the terms of this License, and without further action by the +parties to this License, such provision shall be reformed to the minimum +extent necessary to make such provision valid and enforceable. + No term or provision of this License shall be deemed waived and no +breach consented to unless such waiver or consent shall be in writing +and signed by the party to be charged with such waiver or consent. + This License constitutes the entire agreement between the parties +with respect to the Work licensed herein. There are no understandings, +agreements or representations with respect to the Work not specified herein. +The Author shall not be bound by any additional provisions that may appear +in any communication from You. This License may not be modified without +the mutual written agreement of the Author and You. + + +With respect to DocumentFormat.OpenXml +====================================== + +(https://github.com/OfficeDev/Open-XML-SDK/blob/master/LICENSE) + +The MIT License (MIT) + +Copyright (c) Microsoft Corporation + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +With respect to ExcelNumberFormat +================================= + +(https://github.com/andersnm/ExcelNumberFormat/blob/master/LICENSE) + +The MIT License (MIT) + +Copyright (c) 2017 andersnm + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +With respect to jose-jwt +======================== + +(https://github.com/dvsekhvalnov/jose-jwt/blob/master/LICENSE) + +The MIT License (MIT) + +Copyright (c) 2014-2019 dvsekhvalnov + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +With resepect to ExcelDataReader +================================ + +(https://github.com/ExcelDataReader/ExcelDataReader/blob/develop/LICENSE) + +The MIT License (MIT) + +Copyright (c) 2014 ExcelDataReader + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +With resepect to OPC UA Example Code +==================================== + + * Copyright (c) 2005-2019 The OPC Foundation, Inc. All rights reserved. + * + * OPC Foundation MIT License 1.00 + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * The complete license agreement can be found here: + * http://opcfoundation.org/License/MIT/1.00/ + + +With respect to OPC Foundation +============================== + +RCL License +Reciprocal Community License 1.00 (RCL1.00) +Version 1.00, June 24, 2009 +Copyright (C) 2008,2009 OPC Foundation, Inc., All Rights Reserved. + +https://opcfoundation.org/license/rcl.html + +Remark: PHOENIX CONTACT GmbH & Co. KG and Festo SE & Co. KG are members +of OPC foundation. + +With respect to MSAGL (Microsoft Automatic Graph Layout) +======================================================== +(see: https://github.com/microsoft/automatic-graph-layout/blob/master/LICENSE) + +Microsoft Automatic Graph Layout, MSAGL + +Copyright (c) Microsoft Corporation + +All rights reserved. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +""Software""), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +With respect to Glob (https://www.nuget.org/packages/Glob/) +=========================================================== +(see: https://raw.githubusercontent.com/kthompson/glob/master/LICENSE) + +The MIT License (MIT) + +Copyright (c) 2013-2019 Kevin Thompson + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +With respect to Magick.NET +========================== + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. + +With respect to SSharp.NET library +================================== + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/src/AasxCsharpLibrary.Tests/Properties/AssemblyInfo.cs b/src/AasxCsharpLibrary.Tests/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..e76309e43 --- /dev/null +++ b/src/AasxCsharpLibrary.Tests/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// Allgemeine Informationen über eine Assembly werden über die folgenden +// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, +// die einer Assembly zugeordnet sind. +[assembly: AssemblyTitle("AasxCsharpLibrary.TestsNew")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("AasxCsharpLibrary.TestsNew")] +[assembly: AssemblyCopyright("Copyright © 2020")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly +// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von +// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen. +[assembly: ComVisible(false)] + +// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird +[assembly: Guid("2f21feff-f0ef-40b5-ba05-09fc9f499ae9")] + +// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: +// +// Hauptversion +// Nebenversion +// Buildnummer +// Revision +// +// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, +// indem Sie "*" wie unten gezeigt eingeben: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/AasxCsharpLibrary.Tests/TemporaryDirectory.cs b/src/AasxCsharpLibrary.Tests/TemporaryDirectory.cs new file mode 100644 index 000000000..94c002bf0 --- /dev/null +++ b/src/AasxCsharpLibrary.Tests/TemporaryDirectory.cs @@ -0,0 +1,23 @@ +using IDisposable = System.IDisposable; + +namespace AdminShellNS.Tests +{ + class TemporaryDirectory : IDisposable + { + public readonly string Path; + + public TemporaryDirectory() + { + this.Path = System.IO.Path.Combine( + System.IO.Path.GetTempPath(), + System.IO.Path.GetRandomFileName()); + + System.IO.Directory.CreateDirectory(this.Path); + } + + public void Dispose() + { + System.IO.Directory.Delete(this.Path, true); + } + } +} diff --git a/src/AasxCsharpLibrary.Tests/TestAdminShellUtil.cs b/src/AasxCsharpLibrary.Tests/TestAdminShellUtil.cs new file mode 100644 index 000000000..b6ce2eac3 --- /dev/null +++ b/src/AasxCsharpLibrary.Tests/TestAdminShellUtil.cs @@ -0,0 +1,28 @@ +using NUnit.Framework; + +namespace AdminShellNS.Tests +{ + // ReSharper disable UnusedType.Global + public class Test_EvalToNonNullString + { + [Test] + public void NonNull_Gives_Formatted() + { + var result = AdminShellNS.AdminShellUtil.EvalToNonNullString( + "some message: {0}", 1984, "something else"); + + Assert.That(result, Is.EqualTo("some message: 1984")); + } + + [Test] + public void Null_Gives_ElseString() + { + var result = AdminShellNS.AdminShellUtil.EvalToNonNullString( + "some message: {0}", null, "something else"); + + Assert.That(result, Is.EqualTo("something else")); + } + } + // ReSharper restore UnusedType.Global + +} diff --git a/src/AasxCsharpLibrary.Tests/TestAgainstAasCorePackage.cs b/src/AasxCsharpLibrary.Tests/TestAgainstAasCorePackage.cs new file mode 100644 index 000000000..dfe5fc069 --- /dev/null +++ b/src/AasxCsharpLibrary.Tests/TestAgainstAasCorePackage.cs @@ -0,0 +1,85 @@ +using System; +using System.IO; +using System.Linq; +using System.Text; +using NUnit.Framework; + +namespace AdminShellNS.Tests +{ + public class TestAgainstAasCorePackage + { + /** + * Retrieve the bytes of the valid XML file 01_Festo.aasx.xml from the + * test resources. + */ + private static byte[] Get01FestoAasxXmlBytes() + { + string pth = Path.Combine( + TestContext.CurrentContext.TestDirectory, + "TestResources\\AasxCsharpLibrary.Tests\\XmlValidation\\expectedOk\\" + + "01_Festo.aasx.xml"); + + if (!File.Exists(pth)) + { + throw new FileNotFoundException( + $"Could not find the XML file: {pth}"); + } + + return File.ReadAllBytes(pth); + } + + [Test] + public void TestThatSupplementaryMaterialIsLoaded() + { + var packaging = new AasCore.Aas3.Package.Packaging(); + using var tmpDir = new TemporaryDirectory(); + + var pth = System.IO.Path.Combine(tmpDir.Path, "dummy.aasx"); + + var supplUri = new Uri( + "/aasx-suppl/some-company/some-manual.pdf", + UriKind.Relative); + + var supplContent = Encoding.UTF8.GetBytes("some content"); + + // Create a package + { + using var pkg = packaging.Create(pth); + + var spec = pkg.MakeSpec( + pkg.PutPart( + new Uri("/aasx/some-company/data.xml", UriKind.Relative), + "text/xml", + Get01FestoAasxXmlBytes())); + + pkg.RelateSupplementaryToSpec( + pkg.PutPart( + supplUri, + "application/pdf", + supplContent), + spec); + + pkg.Flush(); + } + + // Load the AASX using AasxCsharpLibrary + { + using var package = new AdminShellPackageEnv(pth); + + Assert.IsTrue(package.IsOpen); + + var lst = package.GetListOfSupplementaryFiles(); + + Assert.AreEqual(1, lst.Count); + var suppl = lst.First(); + Assert.AreEqual(supplUri, suppl.Uri); + Assert.AreEqual( + Encoding.UTF8.GetString(supplContent), + Encoding.UTF8.GetString( + package.GetByteArrayFromUriOrLocalPackage( + suppl.Uri.ToString())) + ); + } + } + } +} \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestLoadSaveChain.cs b/src/AasxCsharpLibrary.Tests/TestLoadSaveChain.cs new file mode 100644 index 000000000..48b7b66a9 --- /dev/null +++ b/src/AasxCsharpLibrary.Tests/TestLoadSaveChain.cs @@ -0,0 +1,189 @@ +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Environment = System.Environment; +using InvalidOperationException = System.InvalidOperationException; +using Path = System.IO.Path; + +namespace AdminShellNS.Tests +{ + static class SamplesAasxDir + { + public static List ListAasxPaths() + { + var variable = "SAMPLE_AASX_DIR"; + + var sampleAasxDir = System.Environment.GetEnvironmentVariable(variable); + if (sampleAasxDir == null) + { + throw new InvalidOperationException( + $"The environment variable {variable} has not been set. " + + "Did you set it manually to the directory containing sample AASXs? " + + "Otherwise, run the test through Test.ps1?"); + } + + if (!System.IO.Directory.Exists(sampleAasxDir)) + { + throw new InvalidOperationException( + $"The directory containing the sample AASXs does not exist or is not a directory: " + + $"{sampleAasxDir}; did you download the samples with DownloadSamples.ps1?"); + } + + var result = System.IO.Directory.GetFiles(sampleAasxDir) + .Where(p => System.IO.Path.GetExtension(p) == ".aasx") + .ToList(); + + result.Sort(); + + return result; + } + } + + /* + TODO (mristin, 2020-10-05): The class is unused since all its tests were disabled temporarily and + will be fixed in the near future. + + Once the tests are enabled, please remove this Resharper directive. + */ + // ReSharper disable once UnusedType.Global + public class TestLoadSaveChain + { + private static void AssertFilesEqual(string firstPath, string secondPath, string aasxPath) + { + string firstContent = System.IO.File.ReadAllText(firstPath); + string secondContent = System.IO.File.ReadAllText(secondPath); + + string[] firstLines = firstContent.Split( + new[] { "\r\n", "\r", "\n" }, + System.StringSplitOptions.None + ); + + string[] secondLines = secondContent.Split( + new[] { "\r\n", "\r", "\n" }, + System.StringSplitOptions.None + ); + + int min = (firstLines.Length < secondLines.Length) + ? firstLines.Length + : secondLines.Length; + + for (var i = 0; i < min; i++) + { + if (firstLines[i] != secondLines[i]) + { + int start = (i < 20) ? 0 : i - 20; + var sb = new System.Text.StringBuilder(); + sb.AppendLine("The first and the second export in the chain differ:"); + + for (var j = start; j < i; j++) + { + sb.AppendLine($"[{i,6}:SAME IN BOTH]{firstLines[j]}"); + } + + sb.AppendLine($"[{i,6}:IN FIRST ]{firstLines[i]}"); + sb.AppendLine($"[{i,6}:IN SECOND ]{secondLines[i]}"); + + sb.AppendLine($"The AASX sample used was: {aasxPath}"); + throw new AssertionException(sb.ToString()); + } + } + } + + /* + TODO (mristin, 2020-10-05): This test has been temporary disabled so that we can merge in the branch + MIHO/EnhanceDocumentShelf. The test should be fixed in a future pull request and we will then re-enable it + again. + + Please do not forget to remove the Resharper directive at the top of this class. + + [TestCase(".xml")] + + dead-csharp ignore this comment + */ + public void TestLoadSaveLoadAssertEqual(string extension) + { + List aasxPaths = SamplesAasxDir.ListAasxPaths(); + + using var tmpDir = new TemporaryDirectory(); + foreach (string aasxPath in aasxPaths) + { + /* + * The chain is as follows: + * - First load from AASX (package A) + * - Convert package 1 to `extension` format and save as path 1 + * - Load from the path 1 in `extension` format (package B) + * - Save package B in `extension` format to path 2 + * + * We expect the content of the two files (path 1 and path 2, respectively) to be equal. + */ + using var packageA = new AdminShellPackageEnv(aasxPath); + string path1 = System.IO.Path.Combine(tmpDir.Path, $"first{extension}"); + string path2 = System.IO.Path.Combine(tmpDir.Path, $"second{extension}"); + + packageA.SaveAs(path1, writeFreshly: true); + + using var packageB = new AdminShellPackageEnv(path1); + packageB.SaveAs(path2, writeFreshly: true); + AssertFilesEqual(path1, path2, aasxPath); + } + } + + + /* + TODO (mristin, 2020-10-05): This test has been temporary disabled so that we can merge in the branch + MIHO/EnhanceDocumentShelf. The test should be fixed in a future pull request and we will then re-enable it + again. + + Please do not forget to remove the Resharper directive at the top of this class. + + [Test] + + dead-csharp ignore this comment + */ + public void TestLoadSaveXmlValidate() + { + var validator = AasSchemaValidation.NewXmlValidator(); + + List aasxPaths = SamplesAasxDir.ListAasxPaths(); + + using var tmpDir = new TemporaryDirectory(); + string tmpDirPath = tmpDir.Path; + + foreach (string aasxPath in aasxPaths) + { + using var package = new AdminShellPackageEnv(aasxPath); + /* + TODO (mristin, 2020-09-17): Remove autofix once XSD and Aasx library in sync + + Package has been loaded, now we need to do an automatic check & fix. + + This is necessary as Aasx library is still not conform with the XSD AASX schema and breaks + certain constraints (*e.g.*, the cardinality of langString = 1..*). + */ + var recs = package.AasEnv.ValidateAll(); + if (recs != null) + { + package.AasEnv.AutoFix(recs); + } + + // Save as XML + string name = Path.GetFileName(aasxPath); + string outPath = System.IO.Path.Combine(tmpDirPath, $"{name}.converted.xml"); + package.SaveAs(outPath, writeFreshly: true); + + using var fileStream = System.IO.File.OpenRead(outPath); + var records = new AasValidationRecordList(); + validator.Validate(records, fileStream); + if (records.Count != 0) + { + var parts = new List + { + $"Failed to validate XML file exported from {aasxPath} to {outPath}:" + }; + parts.AddRange(records.Select((r) => r.Message)); + throw new AssertionException(string.Join(Environment.NewLine, parts)); + } + } + } + } +} diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/01_Festo.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/01_Festo.aasx.xml new file mode 100644 index 000000000..ac57a24bd --- /dev/null +++ b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/01_Festo.aasx.xml @@ -0,0 +1,8384 @@ + + + + + Festo_3S7PM0CP4BD + CONSTANT + smart.festo.com/demo/aas/1/1/454576463545648365874 + + + HTTP://PK.FESTO.COM/3S7PM0CP4BD + + + + + + www.company.com/ids/sm/4343_5072_7091_3242 + + + + + www.company.com/ids/sm/2543_5072_7091_2660 + + + + + www.company.com/ids/sm/6053_5072_7091_5102 + + + + + www.company.com/ids/sm/6563_5072_7091_4267 + + + + + smart.festo.com/demo/sm/instance/1/1/13B7CCD9BF7A3F24 + + + + + + + + + FPK_3s7plfdrs35 + + Festo OVEL Vacuum generator + Festo OVEL Vakuumsaugdüse + + HTTP://PK.FESTO.COM/3S7PM0CP4BD + Instance + + + + + Nameplate + www.company.com/ids/sm/4343_5072_7091_3242 + + + https://www.hsu-hh.de/aut/aas/nameplate + + + Instance + + + + + ManufacturerName + PARAMETER + + + 0173-1#02-AAO677#002 + + + Instance + + string + Festo AG & Co. KG + + + + + ManufacturerProductDesignation + PARAMETER + + + 0173-1#02-AAW338#001 + + + Instance + + string + OVEL Vacuum generator + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Ruiter Straße 82 + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 73734 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Esslingen-Berkheim + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Baden-Württemberg + + + + false + false + + + + + ManufacturerProductFamily + PARAMETER + + + 0173-1#02-AAU731#001 + + + Instance + + + OVEL-5-H-10-P-VQ4-UA-Z-C-A-V1PNLK-H3 + + + + + SerialNumber + PARAMETER + + + 0173-1#02-AAM556#002 + + + Instance + + string + JO43 + + + + + BatchNumber + PARAMETER + + + 0173-1#02-AAQ196#001 + + + Instance + + + + + + + + ProductCountryOfOrigin + PARAMETER + + + 0173-1#02-AAO841#001 + + + Instance + + string + DE + + + + + YearOfConstruction + PARAMETER + + + 0173-1#02-AAP906#001 + + + Instance + + integer + 2019 + + + + + Marking_CE + PARAMETER + + + https://www.hsu-hh.de/aut/aas/productmarking + + + Instance + + + + + CEQualificationPresent + PARAMETER + + + 0173-1#02-BAF053#008 + + + Instance + + boolean + 1 + + + 0173-1#07-CAA016#001 + + + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + image/png + /aasx/Nameplate/marking_ce.png + + + + false + false + + + + + Marking_CRUUS + PARAMETER + + + https://www.hsu-hh.de/aut/aas/productmarking + + + Instance + + + + + CRUUSLabelingPresent + PARAMETER + + + 0173-1#02-AAR528#005 + + + Instance + + boolean + 1 + + + 0173-1#07-CAA016#001 + + + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + image/png + /aasx/Nameplate/marking_cruus.jpg + + + + false + false + + + + + Marking_RCM + PARAMETER + + + https://www.hsu-hh.de/aut/aas/productmarking + + + Instance + + + + + RCMLabelingPresent + PARAMETER + + + 0173-1#02-AAR528#005 + + + Instance + + boolean + 1 + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + image/png + /aasx/Nameplate/marking_rcm.jpg + + + + false + false + + + + + + Document + www.company.com/ids/sm/2543_5072_7091_2660 + + + https://www.hsu-hh.de/aut/aas/document + + + Instance + + + + + DeclarationCEMarking + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Festo + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Festo AG & Co. KG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 02-04 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Zeugnisse, Zertifikate, Bescheinigungen + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + de + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Erklärung zur CE-Kennzeichnung bei Produkten der Festo AG & Co.KG + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + CE_Kennzeichnung_2016_de.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/CE_Kennzeichnung_2016_de.pdf + + + + false + false + + + + + DeclarationRoHS + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Festo + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Festo AG & Co. KG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 02-04 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Zeugnisse, Zertifikate, Bescheinigungen + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + de + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + RoHS 2011/65/EU und delegierte Fassung (EU) 2015/863 + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + RoHS_2011_65_EU_Konzern_Information_de.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/RoHS_2011_65_EU_Konzern_Information_de.pdf + + + + false + false + + + + + DeclarationCRUUS + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + UL + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Underwriter Laboratories LLC + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 02-04 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Zeugnisse, Zertifikate, Bescheinigungen + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Certificate of compliance + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + SPAE_UL_4531318_-_2_EN.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/SPAE_UL_4531318_-_2_EN.pdf + + + + false + false + + + + + DeclarationIOLink + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Festo + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Festo AG & Co. KG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 02-04 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Zeugnisse, Zertifikate, Bescheinigungen + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Manufacturer's declaration of conformity + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + OVEL_IO_Link_5439356_-_3_EN.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/OVEL_IO_Link_5439356_-_3_EN.pdf + + + + false + false + + + + + Manual_OVEL_EN + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + 8070874 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Festo + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Festo AG & Co. KG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-02 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Bedienung + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + 2017-05 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Operating instructions Vacuum generator OVEL + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + The OVEL vacuum generator is used to generate a vacuum. + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + OVEL_2017-05_8070876g1_EN.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/OVEL_2017-05_8070876g1_EN.pdf + + + + false + false + + + + + Manual_OVEL_DE + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + 8070874 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Festo + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Festo AG & Co. KG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-02 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Bedienung + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + 2017-05 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + de + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Bedienungsanleitung Vakuumsaugdüse OVEL + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + Die Vakuumsaugdüse OVEL wird bestimmungsgemäß zur Erzeugung von Vakuum eingesetzt. + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + OVEL_2017-05_8070875d1_DE.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/OVEL_2017-05_8070875d1_DE.pdf + + + + false + false + + + + + Manual_SPAE_EN + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + 8058480 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Festo + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Festo AG & Co. KG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-02 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Bedienung + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + 2017-03b + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Operating instructions Pressure sensor SPAE + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + The SPAE pressure sensor is intended for measuring the relative pressure in pneumatic applications. The SPAE converts pneumatic pressure values into a pressure proportional voltage. The measurement result is shown on the display. + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + SPAE_2017-03b_8058481d1_EN.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/SPAE_2017-03b_8058481d1_EN.pdf + + + + false + false + + + + + Manual_SPAE_DE + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + 8058480 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Festo + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Festo AG & Co. KG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-02 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Bedienung + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + 2017-03b + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + de + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Bedienungsanleitung Drucksensor SPAE + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + Der Drucksensor SPAE dient bestimmungsgemäß zur Erfassung des Relativdrucks in Pneumatikapplikationen. Der SPAE wandelt pneumatische Druckwerte in eine druckproportionale Spannung. Das Messergebnis wird im Display angezeigt. + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + SPAE_2017-03b_8058481d1_DE.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/SPAE_2017-03b_8058481d1_DE.pdf + + + + false + false + + + + + ApplicationNote_SPAE_EN + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Festo + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Festo AG & Co. KG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-02 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Bedienung + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + 1.10 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Application Note IO-Link parameter description + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + A brief explanation of the contents (identification, parameter and commands, block parameterization, teach-In, process data, using different pressure units, diagnosis) + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + 09.02.2015 + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + SPAE_100017_ApplNote.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/SPAE_100017_ApplNote.pdf + + + + false + false + + + + + + Service + www.company.com/ids/sm/6053_5072_7091_5102 + + + https://www.hsu-hh.de/aut/aas/service + + + Instance + + + + + ContactInfo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/contactinfo + + + Instance + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + Festo AG & Co. KG + + + + + ContactInfo_Role + PARAMETER + + + https://www.hsu-hh.de/aut/aas/role + + + Instance + + string + Manufacturer + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Ruiter Straße 82 + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 73734 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Esslingen-Berkheim + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Baden-Württemberg + + + + false + false + + + + + Email + PARAMETER + + + https://www.hsu-hh.de/aut/aas/email + + + Instance + + string + technikservice@festo.com + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + string + https://www.festo.com + + + + + PhoneNumber + PARAMETER + + + 0173-1#02-AAO136#002 + + + Instance + + string + +49711347-3000 + + + + + Fax + PARAMETER + + + https://www.hsu-hh.de/aut/aas/fax + + + Instance + + string + +49711 347-2190 + + + + false + false + + + + + + Identification + www.company.com/ids/sm/6563_5072_7091_4267 + + + https://www.hsu-hh.de/aut/aas/identification + + + Instance + + + + + ManufacturerName + PARAMETER + + + 0173-1#02-AAO677#002 + + + Instance + + string + Festo AG & Co. KG + + + + + GLNOfManufacturer + PARAMETER + + + 0173-1#02-AAY812#001 + + + Instance + + string + 2220000020640 + + + + + SupplierOfTheIdentifier + + + 0173-1#02-AAP796#004 + + + Instance + + + + + + + + MAN_PROD_NUM + + + 0173-1#02-AAO676#003 + + + Instance + + + + + + + + ManufacturerProductDesignation + PARAMETER + + + 0173-1#02-AAW338#001 + + + Instance + + string + OVEL Vacuum generator + + + + + ManufacturerProductDescription + PARAMETER + + + 0173-1#02-AAU734#001 + + + Instance + + langString + Compact vacuum generator with IO-Link sensor + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + Festo AG & Co. KG + + + + + GLNOfSupplier + PARAMETER + + + 0173-1#02-AAY813#001 + + + Instance + + string + 2220000020640 + + + + + SupplierIdProvider + PARAMETER + + + https://www.hsu-hh.de/aut/aas/supplieridprovider + + + Instance + + + + + + + + SUP_PROD_NUM + PARAMETER + + + 0173-1#02-AAO736#004 + + + Instance + + + + + + + + SupplierProductDesignation + + + 0173-1#02-AAM551#002 + + + Instance + + string + OVEL Vacuum generator + + + + + SupplierProductDescription + PARAMETER + + + 0173-1#02-AAU730#001 + + + Instance + + langString + Compact vacuum generator with IO-Link sensor + + + + + ManufacturerProductFamily + PARAMETER + + + 0173-1#02-AAU731#001 + + + Instance + + string + OVEL-5-H-10-P-VQ4-UA-Z-C-A-V1PNLK-H3 + + + + + ClassificationSystem + PARAMETER + + + 0173-1#02-AAO715#002 + + + Instance + + string + eclass + + + + + SecondaryKeyTyp + + + https://www.hsu-hh.de/aut/aas/secondarykeytyp + + + Instance + + + + + + + + TypThumbnail + PARAMETER + + + https://www.hsu-hh.de/aut/aas/thumbnail + + + Instance + + image/jpeg + /Festo_OVEL_product_rendering.png + + + + + AssetId + PARAMETER + + + https://www.hsu-hh.de/aut/aas/assetid + + + Instance + + anyURI + HTTP://PK.FESTO.COM/3S7PM0CP4BD + + + + + SerialNumber + PARAMETER + + + 0173-1#02-AAM556#002 + + + Instance + + string + smart.festo.com/demo/aas/1/1/454576463545648365874 + + + + + BatchNumber + PARAMETER + + + 0173-1#02-AAQ196#001 + + + Instance + + + + + + + + SecondaryKeyInstance + PARAMETER + + + https://www.hsu-hh.de/aut/aas/secondarykeyinstance + + + Instance + + + + + + + + DateOfManufacture + PARAMETER + + + 0173-1#02-AAR972#002 + + + Instance + + date + + + + + + DeviceRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/devicerevision + + + Instance + + + + + + + + SoftwareRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/softwarerevision + + + Instance + + + + + + + + HardwareRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/hardwarerevision + + + Instance + + + + + + + + ContactInfo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/contactinfo + + + Instance + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + Festo AG & Co. KG + + + + + ContactInfo_Role + PARAMETER + + + https://www.hsu-hh.de/aut/aas/role + + + Instance + + string + Manufacturer + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + langString + Ruiter Straße 82 + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 73734 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Esslingen-Berkheim + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Baden-Württemberg + + + + false + false + + + + + Email + PARAMETER + + + https://www.hsu-hh.de/aut/aas/email + + + Instance + + string + technikservice@festo.com + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://www.festo.com + + + + + PhoneNumber + PARAMETER + + + 0173-1#02-AAO136#002 + + + Instance + + string + +49711347-3000 + + + + + Fax + PARAMETER + + + https://www.hsu-hh.de/aut/aas/fax + + + Instance + + string + +49711 347-2190 + + + + false + false + + + + + CompanyLogo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/companylogo + + + Instance + + image/png + /aasx/assetIdentification/logo.png + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://pk.festo.com/3s7plfdrs35 + + + + + + DeviceDescriptionFiles + smart.festo.com/demo/sm/instance/1/1/13B7CCD9BF7A3F24 + + + http://admin-shell/sample/submodel/type/device-description-files + + + Instance + + + + + IODD + + + http://admin-shell.io/sample/conceptdescriptions/437857438753457473 + + + Instance + + application/general + /aasx/Software/Festo-SPAE-kPa-20171025-IODD1.1.zip + + + + + + + + ManufacturerName + 0173-1#02-AAO677#002 + + + + + + + + Herstellername + Manufacturer Name + + Manufacturer Name + + + + + Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist + 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 + + + + + + + GLNOfManufacturer + 0173-1#02-AAY812#001 + + + + + + + + GLN of manufacturer + GLN des Herstellers + + GLN of manufacturer + + + + + international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort + internationally unique identification number for the manufacturer of the device or the product and for the physical location + + + + + + + SupplierOfTheIdentifier + 0173-1#02-AAP796#004 + + + + + + + + Supplier of the identifier + Anbieter der Identifikationsnummer für Hersteller + + Supplier of the identifier + + + STRING_TRANSLATABLE + + DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification + DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer + + + + + + + MAN_PROD_NUM + + product article number of manufacturer + + 0173-1#02-AAO676#003 + + + + + + + + product article number of manufacturer + Herstellerartikelnummer + + MAN_PROD_NUM + + + STRING_TRANSLATABLE + + eindeutiger Bestellschlüssel des Herstellers + unique product identifier of the manufacturer + + + + + + + ManufacturerProductDesignation + 0173-1#02-AAW338#001 + + + + + + + + Manufacturer product designation + Herstellerproduktbezeichnung + + ManufacturerTypName + + + STRING_TRANSLATABLE + + Kurze Beschreibung des Produktes (Kurztext) + Short description of the product (short text) + + + + + + + ManufacturerProductDescription + 0173-1#02-AAU734#001 + + + + + + + + Manufacturer product description + Herstellerproduktbeschreibung + + Manufacturer product description + + + + + Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) + Description of the product, it's technical features and implementation if needed (long text) + + + + + + + NameOfSupplier + 0173-1#02-AAO735#003 + + + + + + + + + + + + name of supplier + Lieferantenname + + name of supplier + + + + + Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt + name of supplier which provides the customer with a product or a service + + + + + + + GLNOfSupplier + 0173-1#02-AAY813#001 + + + + + + + + GLN of supplier + GLN des Lieferanten + + GLN of supplier + + + + + international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort + internationally unique identification number for the supplier of the device or the product and for the physical location + + + + + + + SupplierIdProvider + https://www.hsu-hh.de/aut/aas/supplieridprovider + + + + + + + + SupplierIdProvider + Anbieter der Identifikationsnummer + + SupplierIdProvider + + + STRING_TRANSLATABLE + + DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer + DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification + + + + + + + SUP_PROD_NUM + 0173-1#02-AAO736#004 + + + + + + + + product article number of supplier + Lieferantenartikelnummer + + product article number of supplier + + + + + eindeutiger Bestellschlüssel des Lieferanten + unique product order identifier of the supplier + + + + + + + SupplierProductDesignation + 0173-1#02-AAM551#002 + + + + + + + + Supplier product designation + Lieferantenproduktbezeichnung + + SupplierTypName + + + STRING_TRANSLATABLE + + Kurze Beschreibung des Produktes (Kurztext) + Short description of the product (short text) + + + + + + + SupplierProductDescription + 0173-1#02-AAU730#001 + + + + + + + + Supplier product description + Lieferantenproduktbeschreibung + + Supplier product description + + + + + Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) + Description of the product, it's technical features and implementation if needed (long text) + + + + + + + ManufacturerProductFamily + 0173-1#02-AAU731#001 + + + + + + + + Manufacturer product family + Herstellerproduktfamilie + + TypClass + + + + + 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie + 2nd level of a 3 level manufacturer specific product hierarchy + + + + + + + ClassificationSystem + 0173-1#02-AAO715#002 + + + + + + + + classification system + Klassifizierungssystem + + ClassificationSystem + + + + + Klassifizierungssystem + Classification System + + + + + + + SecondaryKeyTyp + https://www.hsu-hh.de/aut/aas/secondarykeytyp + + + + + + + + SecondaryKeyTyp + Typnummer des IT Systems + + SecondaryKeyTyp + + + + + Führende technische ID im IT System des Typs + SecondaryKeyTyp + + + + + + + TypThumbnail + https://www.hsu-hh.de/aut/aas/thumbnail + + + + + + + + TypThumbnail + Vorschaubild + + TypThumbnail + + + + + Darstellung des Produkttyps in kleinem Format + Small picture of the product type + + + + + + + AssetId + https://www.hsu-hh.de/aut/aas/assetid + + + + + + + + AssetId + Asset ID + + AssetId + + + + + Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. + Global unique ID of an asset, which can be read by both human and machine. + + + + + + + SerialNumber + 0173-1#02-AAM556#002 + + + + + + + + Serial number + Seriennummer + + InstanceId + + + + + eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist + unique combination of numbers and letters used to identify the device once it has been manufactured + + + + + + + BatchNumber + 0173-1#02-AAQ196#001 + + + + + + + + Batch number + Chargen-Nummer + + ChargeId + + + + + Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge + Number assigned by the manufacturer of a material to identify the manufacturer's batch + + + + + + + SecondaryKeyInstance + https://www.hsu-hh.de/aut/aas/secondarykeyinstance + + + + + + + + SecondaryKeyInstance + Instanznummer des IT Systems + + SecondaryKeyInstance + + + + + Führende technische ID im IT System der Instanz + SecondaryKeyInstance + + + + + + + DateOfManufacture + 0173-1#02-AAR972#002 + + + + + + + + Date of manufacture + Herstellungsdatum + + Date of manufacture + + + DATE + + Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist + Date from which the production and / or development process is completed or from which a service is provided completely + + + + + + + DeviceRevision + https://www.hsu-hh.de/aut/aas/devicerevision + + + + + + + + DeviceRevision + DeviceRevision + + DeviceRevision + + + + + DeviceRevision + DeviceRevision + + + + + + + SoftwareRevision + https://www.hsu-hh.de/aut/aas/softwarerevision + + + + + + + + SoftwareRevision + SoftwareRevision + + SoftwareRevision + + + + + SoftwareRevision + SoftwareRevision + + + + + + + HardwareRevision + https://www.hsu-hh.de/aut/aas/hardwarerevision + + + + + + + + HardwareRevision + HardwareRevision + + HardwareRevision + + + + + HardwareRevision + HardwareRevision + + + + + + + QrCode + https://www.hsu-hh.de/aut/aas/qrcode + + + + + + + + QrCode + QrCode + + QrCode + + + + + In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. + QrCode + + + + + + + OrganisationContactInfo + https://www.hsu-hh.de/aut/aas/contactinfo + + + + + + + + Contact Info + Kontakt Info + + OrganisationContactInfo + + + + + Sammlung für die allgemeinen Kontaktdaten + Collection for general contact data + + + + + + + PhysicalAddress + https://www.hsu-hh.de/aut/aas/physicaladdress + + + + + + + + PhysicalAddress + Physische Adresse + + PhysicalAddress + + + + + Sammlung für reale physische Adresse + Collection for real physical address + + + + + + + CountryCode + 0173-1#02-AAO730#001 + + + + + + + + + + + + Landeskennung + Country code + + Country code + + + + + Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes + agreed upon symbol for unambiguous identification of a country + + + + + + + Street + 0173-1#02-AAO128#001 + + + + + + + + Strasse + Street + + Street + + + + + Name der Strasse und Hausnummer + Street name and house number + + + + + + + Zip + 0173-1#02-AAO129#002 + + + + + + + + Zip + Postleitzahl + + PostalCode + + + + + ZIP code of address + Postleitzahl der Anschrift + + + + + + + CityTown + 0173-1#02-AAO132#001 + + + + + + + + Ort + City/town + + City/town + + + + + Town or city of the company + Ortsangabe + + + + + + + StateCounty + 0173-1#02-AAO133#002 + + + + + + + + state/county + Bundesland + + StateCounty + + + + + Bundesland + state/county + + + + + + + Email + https://www.hsu-hh.de/aut/aas/email + + + + + + + + Emailadresse + Email address + + Email + + + + + Emailadresse + Email address + + + + + + + TelephoneContact + https://www.hsu-hh.de/aut/aas/ContactInfo/TelephoneContact + + + + + + + + Telephone Contact + Telefonkontakt + + TelephoneContact + + + + + Sammlung für Kontaktdaten über Telefon + Collection for contact data via telephone + + + + + + + PhoneNumber + 0173-1#02-AAO136#002 + + + + + + + + Telefonnummer + telephone number + + Phone + + + + + vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist + complete telephone number to be called to reach a business partner + + + + + + + CompanyLogo + https://www.hsu-hh.de/aut/aas/companylogo + + + + + + + + Firmenlogo + CompanyLogo + + CompanyLogo + + + + + Firmenlogo + CompanyLogo + + + + + + + URL + 0173-1#02-AAO694#001 + + + + + + + + Internetadresse + Internet address + + URL + + + + + stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html + Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html + + + + + + + ProductCountryOfOrigin + 0173-1#02-AAO841#001 + + + + + + + + Produkt Ursprungsland + Product country of origin + + CountryOfOrigin + + + + + Land in dem das Produkt hergestellt wurde (Hersteller Land) + Country in which the product is manufactured (manufacturer country) + + + + + + + YearOfConstruction + 0173-1#02-AAP906#001 + + + + + + + + Year of construction + Baujahr + + YearOfConstruction + + + + + Jahreszahl als Datumsangabe für die Fertigstellung des Objektes + Year as completion date of object + + + + + + + File + 0173-1#02-AAD005#008 + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Enthaltene Doku. Datei + Embedded Doc. file + + File + + + + + Verweis/ BLOB auf enthaltene Dokumentations-Datei. + Reference/ BLOB to embedded documentation file. + + + + + + + ProductMarking + https://www.hsu-hh.de/aut/aas/productmarking + + + + + + + + Produktkennzeichnung + Product Marking + + ProductMarking + + + + + Sammlungsdatei für Produktkennzeichnung + Collection file for product marking + + + + + + + CEQualificationPresent + 0173-1#02-BAF053#008 + + + + + + + + CE-Kennzeichnung vorhanden + CE- qualification present + + CEMarkingPresent + + + BOOLEAN + + whether CE- qualification is present + Angabe, ob CE-Kennzeichnung vorhanden ist + + + + + + + CRUUSLabelingPresent + 0173-1#02-AAR528#005 + + + + + + + + Kennzeichnung (RCM) vorhanden + RCM labeling present + + CRUUSLabelingPresent + + + BOOLEAN + + indication whether the product is equipped with a specified RCM labeling + Angabe, ob das Produkt mit einer spezifizierten RCM-Kennzeichnung ausgestattet ist + + + + + + + DocumentClassification_ClassId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + + + + Dokumentkategorie + Document category + + DocCategory + + + + + Dokumentkategorie nach VDI 2770:2018/10 + Document category after VDI 2770:2018/10 + + + + + + + DocumentId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + + + + + + DocumentId + Dokumenten-Nummer + + DocumentId + + + + + Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. + TBD + + + + + + + VDI2770_DomainId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + + + + + + Domain-Nummer + DomainId + + DomainId + + + + + Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. + TBD + + + + + + + VDI2770_IdType + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + + + + + + Nummerntyp + IdType + + IdType + + + + + Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. + TBD + + + + + + + ValString + www.company.com/ids/cd/4490_8182_7091_6124 + + + + + + + + Wert + Value String + + ValString + + + + + Ausdruck für den Wert der übergeordneten Collection. + Value string for the collection value on the next superordinate level + + + + + + + DocumentationItem + 0173-1#02-AAD001#001 + + + + + + + + Dokumentationsgruppe + Documentation item + + DocumentationItem + + + + + Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. + Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. + + + + + + + DocumentIdDomain + www.company.com/ids/cd/6003_8182_7091_9350 + + + + + + + + DocumentIdDomain + DocumentIdDomain + + DocumentIdDomain + + + + + Angabe einer Liste von Domänen, in de-nen die DocumentIds des Dokuments eindeutig sind + TBD + + + + + + + DocumentDomainId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + + + + + + DocumentDomainId + DocumentDomainId + + DocumentDomainId + + + + + Kennung oder Kennzeichen einer Domäne + TBD + + + + + + + VDI2770_Party + www.company.com/ids/cd/3153_8182_7091_4327 + + + + + + + + Party + Party + + Party + + + + + Verweis auf eine Party (siehe VDI 2770 Anhang C1.17), die für diese Domäne verantwortlich ist + TBD + + + + + + + VDI2770_Role + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + + + + + + Rolle + Role + + Role + + + + + Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) + TBD + + + + + + + VDI2770_Organisation + www.company.com/ids/cd/9214_8182_7091_6391 + + + + + + + + Organisation + Organisation + + Organisation + + + + + Angabe einer Organisation + TBD + + + + + + + VDI2770_OrganisationId + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + + + + + + Organisation ID + Organisation ID + + OrganisationId + + + + + eindeutige ID für die Organisation + TBD + + + + + + + VDI2770_OrganisationName + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + + + + + + OrganisationName + OrganisationName + + OrganisationName + + + + + gebräuchliche Bezeichnung für die Organisation + TBD + + + + + + + VDI2770_OrganisationOfficialName + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + + + + + + Offizieller Name der Organisation + Organisation Official Name + + OrganisationOfficialName + + + + + offizieller Name der Organisation + TBD + + + + + + + DocumentPartId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + + + + + + Dokumenten-Teilnummer + DocumentPartId + + DocumentPartId + + + + + Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. + TBD + + + + + + + VDI2770_Description + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + + + + + + Beschreibung + Description + + Description + + + + + Beschreibung für die nächste übergeordnete Collection + TBD + + + + + + + VDI2770_ClassName + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + + + + + + Klassenname + Class Name + + ClassName + + + + + Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. + TBD + + + + + + + DocumentVersion_LanguageCode + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + + + + + + Sprachenschlüssel + LanguageCode + + LanguageCode + + + + + Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 + TBD + + + + + + + VDI2770_ClassificationSystem + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + + + + + + Klassifizierungssystem + classification system + + ClassificationSystem + + + + + Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. + TBD + + + + + + + DocumentVersion + www.company.com/ids/cd/2580_0282_7091_6213 + + + + + + + + Dokumenten-Version + DocumentVersion + + DocumentVersion + + + + + Zu jedem Dokument muss eine Menge von mindestens einer Dokumentenversion existieren. Es können auch mehrere Dokumentenversionen ausgeliefert werden. + TBD + + + + + + + DocumentVersionId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + + + + + + Dokumenten-Versionsnummer + DocumentVersionId + + DocumentVersionId + + + + + Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. + TBD + + + + + + + VDI2770_Language + www.company.com/ids/cd/0231_0282_7091_5062 + + + + + + + + Sprache + Language + + Language + + + + + Liste der im Dokument verwendeten Sprachen + TBD + + + + + + + DocumentVersion_Description + www.company.com/ids/cd/9151_0282_7091_8032 + + + + + + + + Beschreibung zur DocumentVersion + DocumentVersion Description + + DocumentVersion_Description + + + + + Zusammenfassende Beschreibungen zur Dokumentenversion in ggf. unterschiedlichen Sprachen. + TBD + + + + + + + VDI2770_Title + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + + + + + + Titel + Title + + VDI2770_Title + + + + + sprachabhängiger Titel des Dokuments + TBD + + + + + + + VDI2770_Summary + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + + + + + + Zusammenfassung + Summary + + Summary + + + + + sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts + TBD + + + + + + + VDI2770_Keywords + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + + + + + + Schlagwörter + Keywords + + Keywords + + + + + sprachabhängige, durch Komma getrennte Liste von Schlagwörtern + TBD + + + + + + + VDI2770_LifeCycleStatus + www.company.com/ids/cd/0282_0282_7091_7878 + + + + + + + + Lebenszyklus Status + LifeCycleStatus + + LifeCycleStatus + + + + + Liste von Statusdefinitionen mit Bezug zum Dokumentenlebenszyklus inklusive der Angabe der Beteiligten und einem zugehörigen Zeitstempel + TBD + + + + + + + VDI2770_StatusValue + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + + + + + + Statuswert + StatusValue + + StatusValue + + + + + Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) + TBD + + + + + + + VDI2770_SetDate + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + + + + + + Erstellungsdatum + Set Date + + SetDate + + + + + Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). + TBD + + + + + + + VDI2770_Purpose + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + + + + + + Zweck + Purpose + + Purpose + + + + + Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. + TBD + + + + + + + VDI2770_BasedOnProcedure + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + + + + + + Prozedur + Procedure + + BasedOnProcedure + + + + + textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt + TBD + + + + + + + VDI2770_Comments + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + + + + + + Kommentar + Comments + + Comments + + + + + textuelle Bemerkungen und Anmerkungen zum Status + TBD + + + + + + + DocumentRelationship + www.company.com/ids/cd/1204_0282_7091_7896 + + + + + + + + Dokumenten-Beziehung + Document Relationship + + DocumentRelationship + + + + + Liste von Beziehungen zu anderen Dokumenten. Es ist möglich, auf einen Dokument, ein Dokument in einer spezifischen Dokumentenversion oder auch ein Teildokument zu verweisen. + TBD + + + + + + + DocumentRelationship_Type + www.company.com/ids/cd/5044_0282_7091_6924 + + + + + + + + Typ der Dokumenten-Beziehung + DocumentRelationship_Type + + DocumentRelationship_Type + + + + + Typisierung der Beziehung zwischen den beiden DocumentVersions. Folgende Beziehungsarten können verwendet werden: Affecting (hat Auswirkungen auf), ReferesTo (bezieht sich auf), BasedOn (basiert auf) + TBD + + + + + + + StoredDocumentRepresentation + www.company.com/ids/cd/3094_0282_7091_2090 + + + + + + + + StoredDocumentRepresentation + StoredDocumentRepresentation + + StoredDocumentRepresentation + + + + + Liste von digitalen Repräsentationen zur DocumentVersion + TBD + + + + + + + VDI2770_DigitalFile + www.company.com/ids/cd/2305_0282_7091_2077 + + + + + + + + Digitaler-File + DigitalFile + + DigitalFile + + + + + Datei, die die DocumentVersion (siehe VDI 2770:2018 Anhang C1.5) repräsentiert Neben der obligatorischen PDF/A-Datei können weitere Dateien angegeben werden. + TBD + + + + + + + VDI2770_FileId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + + + + + + ID der Datei + File ID + + FileId + + + + + eindeutige ID für die Datei + TBD + + + + + + + VDI2770_FileName + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + + + + + + Dateiname + File name + + FileName + + + + + Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. + TBD + + + + + + + VDI2770_FileFormat + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + + + + + + Datei Format + File format + + FileFormat + + + + + Angabe eines Media Typs gemäß der Liste der IANA + TBD + + + + + + + DocumentType + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + + + + + + Dokumententyp + Document Type + + DocumentType + + + + + Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) + TBD + + + + + + + VDI2770_ReferencedObject + www.company.com/ids/cd/2570_2282_7091_0055 + + + + + + + + ReferencedObject + ReferencedObject + + ReferencedObject + + + + + Liste von IDs für ein Objekt, auf das sich das Dokument bezieht + TBD + + + + + + + VDI2770_ReferencedObject_Type + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + + + + + + Typ + Type + + Type + + + + + Für Type des Objekts muss immer Product angegeben werden. + TBD + + + + + + + VDI2770_ReferencedObject_RefType + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + + + + + + RefType + RefType + + RefType + + + + + Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) + TBD + + + + + + + VDI2770_ReferencedObject_ObjectId + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + + + + + + ObjectId + ObjectId + + ObjectId + + + + + Angabe der Identifikationsnummer zum Objekt + TBD + + + + + + + ContactInfo_Role + https://www.hsu-hh.de/aut/aas/role + + + + + + + + Rolle + Role + + Role + + + + + Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt + Information to specify the role which the organisation of ContactInfo plays + + + + + + + Fax + https://www.hsu-hh.de/aut/aas/fax + + + + + + + + Fax + Fax + + Fax + + + + + Faxnummer + Fax number + + + + + + + 0173-1#02-AAO136#002 + + + + + DocGroup_01 + www.company.com/ids/cd/1420_0113_7091_0891 + + + + + + + + 01 Identifikation + 01 Identification + + DocGroup_01 + + + + + Der Gruppe „Identifikation“ werden alle Dokumente zugeordnet, die der Identifikation des Objekts dienen, zu dem die Herstellerdokumentation gehört. Sie enthält insbesondere Informationen, die die elektronische Datenverarbeitung unterstützen und die es dem Hersteller und dem Nutzer erlauben, das Objekt in ihren jeweiligen elektronischen Datenverarbeitungssystemen zu identifizieren. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocGroup_02 + www.company.com/ids/cd/4323_0113_7091_2591 + + + + + + + + 02 Technische Beschaffenheit + 02 Technical characteristics + + DocGroup_02 + + + + + Die Gruppe „Technische Beschaffenheit“ beinhaltet alle Dokumente, die die technischen Anforderungen, deren Erfüllung und die Bescheinigung der Eigenschaften eines Objekts betreffen. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocGroup_03 + www.company.com/ids/cd/5053_0113_7091_5741 + + + + + + + + 03 Tätigkeitsbezogene Dokumente + 03 Work-related documents + + DocGroup_03 + + + + + Die Gruppe „Tätigkeitsbezogene Dokumente“ beinhaltet alle Dokumente, die Anforderungen, Hinweise und Hilfestellungen für Tätigkeiten an und mit dem Objekt nach der Übergabe an den Nutzer betreffen. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocGroup_04 + www.company.com/ids/cd/5473_0113_7091_1588 + + + + + + + + 04 Vertragsunterlagen + 04 Contract documents + + DocGroup_04 + + + + + Der Gruppe „Vertragsunterlagen“ werden alle Dokumente zugeordnet, die im Zusammenhang mit der kaufmännischen Abwicklung eines Vertrages stehen, aber nicht selbst Gegenstand des Vertrags sind und lediglich zur Erfüllung des Vertrags dienen. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocCategory_01-01 + www.company.com/ids/cd/9593_0113_7091_2401 + + + + + + + + 01-01 Identifikation + 01-01 Identification + + DocCategory_01-01 + + + + + Der Kategorie „Identifikation“ werden alle Dokumente zugeordnet, die der Identifikation des Objekts dienen, zu dem die Herstellerdokumentation gehört. Sie enthält insbesondere Informationen, die die elektronische Datenverarbeitung unterstützen und die es dem Hersteller und dem Nutzer erlauben, das Objekt in ihren jeweiligen elektronischen Datenverarbeitungssystemen zu identifizieren. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocCategory_02-01 + www.company.com/ids/cd/5314_0113_7091_8640 + + + + + + + + 02-01 Techn. Spezifikation + 02-01 Technical specification + + DocCategory_02-01 + + + + + Der Kategorie „Technische Spezifikation“ werden alle Dokumente zugeordnet, die die Anforderungen an ein Objekt sowie dessen Eigenschaften beschreiben. Dazu gehören die Auslegungsdaten, Berechnungen (Verfahrenstechnik, Festigkeit usw.) sowie alle relevanten Eigenschaften des übergebenen Objekts. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocCategory_02-02 + www.company.com/ids/cd/5515_0113_7091_8581 + + + + + + + + 02-02 Zeichnungen, Pläne + 02-02 Drawings and diagrams + + DocCategory_02-02 + + + + + Der Kategorie „Zeichnungen, Pläne“ werden alle Dokumente zugeordnet, die Zeichnungscharakter haben, das heißt eine grafische Darstellung zur Übermittlung von Information nutzen. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocCategory_02-03 + www.company.com/ids/cd/0335_0113_7091_0312 + + + + + + + + 02-03 Bauteile + 02-03 Components + + DocCategory_02-03 + + + + + Der Kategorie „Bauteile“ werden alle Dokumente zugeordnet, die eine strukturierte Auflistung der Teile eines Objekts beinhalten. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocCategory_02-04 + www.company.com/ids/cd/2155_0113_7091_3955 + + + + + + + + 02-04 Zeugnisse, Zertifikate, Bescheinigungen + 02-04 Reports, Certificates, declarations + + DocCategory_02-04 + + + + + Der Kategorie „Zeugnisse, Zertifikate, Bescheinigungen“ werden alle Dokumente zugeordnet, die Urkundencharakter haben. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocCategory_03-01 + www.company.com/ids/cd/3565_0113_7091_2704 + + + + + + + + 03-01 Montage, Inbetriebnahme, Demontage + 03-01 Assembly, commissioning, disassembly + + DocCategory_03-01 + + + + + Der Kategorie „Montage, Demontage“ werden alle Dokumente zugeordnet, die Tätigkeiten und Maßnahmen beschreiben, die erforderlich sind, um ein Objekt: zu transportieren oder zu lagern, als Ganzes in ein übergeordnetes Objekt einzubauen, auszubauen oder an dieses anzuschließen, so weit vorzubereiten, dass es zur Inbetriebnahme bereitsteht, nach Abschluss der Nutzungsphase zu demontieren und zu entsorgen + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocCategory_03-02 + www.company.com/ids/cd/4290_1113_7091_7266 + + + + + + + + 03-02 Bedienung + 03-02 Operation + + DocCategory_03-02 + + + + + Der Kategorie „Bedienung“ werden Dokumente zur bestimmungsgemäßen Verwendung und sicheren Bedienung eines Objekts zugeordnet. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocCategory_03-03 + www.company.com/ids/cd/2211_1113_7091_3911 + + + + + + + + 03-03 Allgemeine Sicherheit + 03-03 Safety in general + + DocCategory_03-03 + + + + + Der Kategorie „Allgemeine Sicherheit“ werden Dokumente zugeordnet, die Sicherheitshinweise auf mögliche Gefährdungen bei der Verwendung des Objekts geben. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocCategory_03-04 + www.company.com/ids/cd/7521_1113_7091_4471 + + + + + + + + 03-04 Inspektion, Wartung, Prüfung + 03-04 Inspection, maintenance, test + + DocCategory_03-04 + + + + + Der Kategorie „Inspektion, Wartung, Prüfung“ werden alle Dokumente zugeordnet, die vom Hersteller vorgeschlagene wiederkehrende Maßnahmen zur Feststellung oder zum Erhalt des funktionsfähigen Zustands beschreiben. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocCategory_03-05 + www.company.com/ids/cd/5161_1113_7091_0458 + + + + + + + + 03-05 Instandsetzung + 03-05 Repair + + DocCategory_03-05 + + + + + Der Kategorie „Instandsetzung“ werden alle Dokumente zugeordnet, die Maßnahmen zur Wiederherstellung der Funktion eines Objekts betreffen. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocCategory_03-06 + www.company.com/ids/cd/2181_1113_7091_5948 + + + + + + + + 03-06 Ersatzteile + 03-06 Spare parts + + DocCategory_03-06 + + + + + Der Kategorie „Ersatzteile“ werden Dokumente zugeordnet, die Informationen zu Ersatzteilen und Hilfs- und Betriebsstoffen enthalten. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocCategory_04-01 + www.company.com/ids/cd/5391_1113_7091_8996 + + + + + + + + 04-01 Vertragsunterlagen + 04-01 Contract documents + + DocCategory_04-01 + + + + + Der Kategorie „Vertragsunterlagen“ werden alle Dokumente zugeordnet, die im Zusammenhang mit der kaufmännischen Abwicklung eines Vertrages stehen, aber nicht selbst Gegenstand des Vertrags sind und lediglich zur Erfüllung des Vertrags dienen. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/02_Bosch.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/02_Bosch.aasx.xml new file mode 100644 index 000000000..43b134291 --- /dev/null +++ b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/02_Bosch.aasx.xml @@ -0,0 +1,6811 @@ + + + + + Bosch_NexoPistolGripNutrunner + http://boschrexroth.com/shells/0608842005/917004878 + + + http://dc-qr.com?m=0608842005&s=917004878 + + + + + + http://boschrexroth.com/shells/0608842005/917004878/submodels/nameplate + + + + + http://boschrexroth.com/shells/0608842005/917004878/submodels/document + + + + + http://boschrexroth.com/shells/0608842005/917004878/submodels/service + + + + + http://boschrexroth.com/shells/0608842005/917004878/submodels/identification + + + + + + + + + M0608842005_S917004878 + http://dc-qr.com?m=0608842005&s=917004878 + Instance + + + + + Nameplate + http://boschrexroth.com/shells/0608842005/917004878/submodels/nameplate + + + https://www.hsu-hh.de/aut/aas/nameplate + + + Instance + + + + + ManufacturerName + PARAMETER + + + 0173-1#02-AAO677#002 + + + Instance + + string + Bosch Rexroth AG + + + + + ManufacturerProductDesignation + PARAMETER + + + 0173-1#02-AAW338#001 + + + Instance + + string + Nexo Wi-Fi Cordless Nutrunner + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Fornsbacher Straße 92 + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 71540 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Murrhardt + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Baden-Württemberg + + + + false + false + + + + + ManufacturerProductFamily + PARAMETER + + + 0173-1#02-AAU731#001 + + + Instance + + string + Cordless Nutrunner + + + + + SerialNumber + PARAMETER + + + 0173-1#02-AAM556#002 + + + Instance + + string + 917004878 + + + + + BatchNumber + PARAMETER + + + 0173-1#02-AAQ196#001 + + + Instance + + + + + + + + ProductCountryOfOrigin + PARAMETER + + + 0173-1#02-AAO841#001 + + + Instance + + string + DE + + + + + YearOfConstruction + PARAMETER + + + 0173-1#02-AAP906#001 + + + Instance + + string + xxxxxxxxxxxxxxxxxxxxxxx + + + + + Marking_CE + PARAMETER + + + https://www.hsu-hh.de/aut/aas/productmarking + + + Instance + + + + + CEQualificationPresent + PARAMETER + + + 0173-1#02-BAF053#008 + + + Instance + + boolean + 1 + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + image/png + /aasx/Nameplate/marking_ce.png + + + + false + false + + + + + + Document + http://boschrexroth.com/shells/0608842005/917004878/submodels/document + + + https://www.hsu-hh.de/aut/aas/document + + + Instance + + + + + DeclarationCEMarking + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + DCTC-30434-002_KOE_M_NN_2019-01-01 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 02-04 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Zeugnisse, Zertifikate, Bescheinigungen + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + 2019-01-01 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + de + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + EG-Konformitätserklärung + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + DCTC-30434-002_KOE_M_NN_2019-01-01.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/DCTC-30434-002_KOE_M_NN_2019-01-01.pdf + + + + false + false + + + + + EU_Declaration_of_Conformity + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + DCTC-30434-002:2019-01-01 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 02-04 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Zeugnisse, Zertifikate, Bescheinigungen + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + 2019-01-01 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + de/en/fr/es/pt/it/pl/cs/sk/hu/bg/da/et/fi/el/hr/lv/lt/nl/ro/sv/sl/ru/zh/ar/id/ja/ko/no/th/tr/vi + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + EU-Konformitätserklärung (DE) EU Declaration of Conformity (EN) + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + EU_Declaration_of_Conformity.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/EU_Declaration_of_Conformity.pdf + + + + false + false + + + + + Certificat_ISO_9001_2015 + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 02-04 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Zeugnisse, Zertifikate, Bescheinigungen + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + de + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Zertifikat für Bosch Rexroth AG Normen ISO 9001:2015 + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + DCMC-01001-000_KOB_N_EN_2019-06-14.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/DCMC-01001-000_KOB_N_EN_2019-06-14.pdf + + + + false + false + + + + + 3608870EF2_OperatingInstructions + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + 3608870EF2 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-02 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Bedienung (DE) Operating Instructions (EN) + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + AC / 01.2018 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en-US/​cs-CZ/​de-DE/​es-ES/​fr-FR/​hu-HU/​it-IT/​pl-PL/​pt-BR/​sl-SI/​ru-RU/​zh-CN + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + NXA, NXP, NXV012T + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + 3608870EF2_AC.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/3608870EF2_AC.pdf + + + + false + false + + + + + 3608870A47_ProjectPlanning_DE + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + 3 608 870 A47_DE + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-02 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Bedienung + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + A47/05.2017 DE + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + de + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Rexroth Funk-Akkuschrauber Nexo + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + 3608870A47_AE_DE.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/3608870A47_AE_DE.pdf + + + + false + false + + + + + 3608870A47_ProjectPlanning_EN + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + 3 608 870 A47_EN + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-02 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Operating + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + A47/05.2017 EN + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Nexo cordless Wi-Fi nutrunner by Rexroth + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + 3608870A47_AE_EN.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/3608870A47_AE_EN.pdf + + + + false + false + + + + + 36088702_SafetyInstructions_DE + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + 3 608 870 2DE + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-03 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Allgemeine Sicherheit + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + AA/01.2010 DE + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + de + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Sicherheitshinweise für Rexroth Schraubsysteme + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + 36088702DE_AA.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/36088702DE_AA.pdf + + + + false + false + + + + + 36088702_SafetyInstructions_EN + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + 3 608 870 2EN + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-03 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + General Safety + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + AA/01.2010 EN + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Safety Instructions for Rexroth Tightening Systems + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + 36088702EN_AA.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/36088702EN_AA.pdf + + + + false + false + + + + + + Service + http://boschrexroth.com/shells/0608842005/917004878/submodels/service + + + https://www.hsu-hh.de/aut/aas/service + + + Instance + + + + + ContactInfo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/contactinfo + + + Instance + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + Bosch Rexroth AG Service Tightening Systems + + + + + ContactInfo_Role + PARAMETER + + + https://www.hsu-hh.de/aut/aas/role + + + Instance + + string + Manufacturer + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Bgm.-Dr.-Nebel-Str. 8 + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 97816 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Lohr + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Bayern + + + + false + false + + + + + Email + PARAMETER + + + https://www.hsu-hh.de/aut/aas/email + + + Instance + + string + service@boschrexroth.de + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://www.boschrexroth.com/de/de/service/startseite-service + + + + + PhoneNumber + PARAMETER + + + 0173-1#02-AAO136#002 + + + Instance + + string + +499352405060 + + + + + Fax + PARAMETER + + + https://www.hsu-hh.de/aut/aas/fax + + + Instance + + string + + + + + false + false + + + + + + Identification + http://boschrexroth.com/shells/0608842005/917004878/submodels/identification + + + https://www.hsu-hh.de/aut/aas/identification + + + Instance + + + + + ManufacturerName + PARAMETER + + + 0173-1#02-AAO677#002 + + + Instance + + string + Bosch Rexroth AG + + + + + GLNOfManufacturer + PARAMETER + + + 0173-1#02-AAY812#001 + + + Instance + + string + 4048118000006 + + + + + SupplierOfTheIdentifier + + + 0173-1#02-AAP796#004 + + + Instance + + string + GLN GS1 + + + + + MAN_PROD_NUM + + + 0173-1#02-AAO676#003 + + + Instance + + string + 0608842005 + + + + + ManufacturerProductDesignation + PARAMETER + + + 0173-1#02-AAW338#001 + + + Instance + + string + NXP012QD-36V + + + + + ManufacturerProductDescription + PARAMETER + + + 0173-1#02-AAU734#001 + + + Instance + + langString + The most intelligent hand-held nutrunner in the world + + + + + ManufacturerProductFamily + PARAMETER + + + 0173-1#02-AAU731#001 + + + Instance + + string + Cordless Nutrunner + + + + + ClassificationSystem + PARAMETER + + + 0173-1#02-AAO715#002 + + + Instance + + string + eCl@ss + + + + + SecondaryKeyTyp + + + https://www.hsu-hh.de/aut/aas/secondarykeytyp + + + Instance + + + + + + + + TypThumbnail + PARAMETER + + + www.company.com/ids/cd/4401_1272_7091_3437 + + + Instance + + image/jpeg + /ST_Mittelgriffschrauber_NXP_Produktbild_V01_20160822_161306.jpg + + + + + AssetId + PARAMETER + + + https://www.hsu-hh.de/aut/aas/assetid + + + Instance + + string + http://dc-qr.com?m=0608842005&s=917004878 + + + + + SerialNumber + PARAMETER + + + 0173-1#02-AAM556#002 + + + Instance + + string + 917004878 + + + + + BatchNumber + PARAMETER + + + 0173-1#02-AAQ196#001 + + + Instance + + + + + + + + SecondaryKeyInstance + PARAMETER + + + https://www.hsu-hh.de/aut/aas/secondarykeyinstance + + + Instance + + + + + + + + DateOfManufacture + PARAMETER + + + 0173-1#02-AAR972#002 + + + Instance + + + 2019 + + + + + DeviceRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/devicerevision + + + Instance + + + + + + + + SoftwareRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/softwarerevision + + + Instance + + + + + + + + HardwareRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/hardwarerevision + + + Instance + + + + + + + + ContactInfo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/contactinfo + + + Instance + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + Bosch Rexroth AG + + + + + ContactInfo_Role + PARAMETER + + + https://www.hsu-hh.de/aut/aas/role + + + Instance + + string + Manufacturer + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Zum Eisengießer 1 + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 97816 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Lohr am Main + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Bayern + + + + false + false + + + + + Email + PARAMETER + + + https://www.hsu-hh.de/aut/aas/email + + + Instance + + string + service@boschrexroth.de + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://www.boschrexroth.com/de/de/home/index + + + + + PhoneNumber + PARAMETER + + + 0173-1#02-AAO136#002 + + + Instance + + string + +499352405060 + + + + + Fax + PARAMETER + + + https://www.hsu-hh.de/aut/aas/fax + + + Instance + + string + + + + + false + false + + + + + CompanyLogo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/companylogo + + + Instance + + image/png + /aasx/Identification/logo.png + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + http://dc-qr.com?m=0608842005&s=917004878 + + + + + + + + ManufacturerName + 0173-1#02-AAO677#002 + + + + + + + + Herstellername + Manufacturer Name + + Manufacturer Name + + + + + Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist + 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 + + + + + + + ManufacturerProductDesignation + 0173-1#02-AAW338#001 + + + + + + + + Manufacturer product designation + Herstellerproduktbezeichnung + + ManufacturerTypName + + + STRING_TRANSLATABLE + + Kurze Beschreibung des Produktes (Kurztext) + Short description of the product (short text) + + + + + + + PhysicalAddress + https://www.hsu-hh.de/aut/aas/physicaladdress + + + + + + + + PhysicalAddress + Physische Adresse + + PhysicalAddress + + + + + Sammlung für reale physische Adresse + Collection for real physical address + + + + + + + CountryCode + 0173-1#02-AAO730#001 + + + + + + + + + + + + Landeskennung + Country code + + Country code + + + + + Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes + agreed upon symbol for unambiguous identification of a country + + + + + + + Street + 0173-1#02-AAO128#001 + + + + + + + + Strasse + Street + + Street + + + + + Name der Strasse und Hausnummer + Street name and house number + + + + + + + Zip + 0173-1#02-AAO129#002 + + + + + + + + Zip + Postleitzahl + + PostalCode + + + + + ZIP code of address + Postleitzahl der Anschrift + + + + + + + CityTown + 0173-1#02-AAO132#001 + + + + + + + + Ort + City/town + + City/town + + + + + Town or city of the company + Ortsangabe + + + + + + + StateCounty + 0173-1#02-AAO133#002 + + + + + + + + state/county + Bundesland + + StateCounty + + + + + Bundesland + state/county + + + + + + + ManufacturerProductFamily + 0173-1#02-AAU731#001 + + + + + + + + Manufacturer product family + Herstellerproduktfamilie + + TypClass + + + + + 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie + 2nd level of a 3 level manufacturer specific product hierarchy + + + + + + + SerialNumber + 0173-1#02-AAM556#002 + + + + + + + + Serial number + Seriennummer + + InstanceId + + + + + eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist + unique combination of numbers and letters used to identify the device once it has been manufactured + + + + + + + BatchNumber + 0173-1#02-AAQ196#001 + + + + + + + + Batch number + Chargen-Nummer + + ChargeId + + + + + Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge + Number assigned by the manufacturer of a material to identify the manufacturer's batch + + + + + + + ProductCountryOfOrigin + 0173-1#02-AAO841#001 + + + + + + + + Produkt Ursprungsland + Product country of origin + + CountryOfOrigin + + + + + Land in dem das Produkt hergestellt wurde (Hersteller Land) + Country in which the product is manufactured (manufacturer country) + + + + + + + YearOfConstruction + 0173-1#02-AAP906#001 + + + + + + + + Year of construction + Baujahr + + YearOfConstruction + + + + + Jahreszahl als Datumsangabe für die Fertigstellung des Objektes + Year as completion date of object + + + + + + + ProductMarking + https://www.hsu-hh.de/aut/aas/productmarking + + + + + + + + Produktkennzeichnung + Product Marking + + ProductMarking + + + + + Sammlungsdatei für Produktkennzeichnung + Collection file for product marking + + + + + + + CEQualificationPresent + 0173-1#02-BAF053#008 + + + + + + + + CE-Kennzeichnung vorhanden + CE- qualification present + + CEMarkingPresent + + + BOOLEAN + + whether CE- qualification is present + Angabe, ob CE-Kennzeichnung vorhanden ist + + + + + + + File + 0173-1#02-AAD005#008 + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Enthaltene Doku. Datei + Embedded Doc. file + + File + + + + + Verweis/ BLOB auf enthaltene Dokumentations-Datei. + Reference/ BLOB to embedded documentation file. + + + + + + + DocumentationItem + 0173-1#02-AAD001#001 + + + + + + + + Dokumentationsgruppe + Documentation item + + DocumentationItem + + + + + Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. + Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. + + + + + + + DocumentType + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + + + + + + Dokumententyp + Document Type + + DocumentType + + + + + Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) + TBD + + + + + + + VDI2770_DomainId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + + + + + + Domain-Nummer + DomainId + + DomainId + + + + + Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. + TBD + + + + + + + VDI2770_IdType + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + + + + + + Nummerntyp + IdType + + IdType + + + + + Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. + TBD + + + + + + + DocumentId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + + + + + + DocumentId + Dokumenten-Nummer + + DocumentId + + + + + Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. + TBD + + + + + + + DocumentDomainId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + + + + + + DocumentDomainId + DocumentDomainId + + DocumentDomainId + + + + + Kennung oder Kennzeichen einer Domäne + TBD + + + + + + + VDI2770_Role + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + + + + + + Rolle + Role + + Role + + + + + Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) + TBD + + + + + + + VDI2770_OrganisationId + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + + + + + + Organisation ID + Organisation ID + + OrganisationId + + + + + eindeutige ID für die Organisation + TBD + + + + + + + VDI2770_OrganisationName + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + + + + + + OrganisationName + OrganisationName + + OrganisationName + + + + + gebräuchliche Bezeichnung für die Organisation + TBD + + + + + + + VDI2770_OrganisationOfficialName + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + + + + + + Offizieller Name der Organisation + Organisation Official Name + + OrganisationOfficialName + + + + + offizieller Name der Organisation + TBD + + + + + + + VDI2770_Description + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + + + + + + Beschreibung + Description + + Description + + + + + Beschreibung für die nächste übergeordnete Collection + TBD + + + + + + + DocumentPartId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + + + + + + Dokumenten-Teilnummer + DocumentPartId + + DocumentPartId + + + + + Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. + TBD + + + + + + + DocumentClassification_ClassId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + + + + Dokumentkategorie + Document category + + DocCategory + + + + + Dokumentkategorie nach VDI 2770:2018/10 + Document category after VDI 2770:2018/10 + + + + + + + VDI2770_ClassName + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + + + + + + Klassenname + Class Name + + ClassName + + + + + Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. + TBD + + + + + + + VDI2770_ClassificationSystem + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + + + + + + Klassifizierungssystem + classification system + + ClassificationSystem + + + + + Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. + TBD + + + + + + + DocumentVersionId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + + + + + + Dokumenten-Versionsnummer + DocumentVersionId + + DocumentVersionId + + + + + Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. + TBD + + + + + + + DocumentVersion_LanguageCode + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + + + + + + Sprachenschlüssel + LanguageCode + + LanguageCode + + + + + Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 + TBD + + + + + + + VDI2770_Title + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + + + + + + Titel + Title + + VDI2770_Title + + + + + sprachabhängiger Titel des Dokuments + TBD + + + + + + + VDI2770_Summary + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + + + + + + Zusammenfassung + Summary + + Summary + + + + + sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts + TBD + + + + + + + VDI2770_Keywords + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + + + + + + Schlagwörter + Keywords + + Keywords + + + + + sprachabhängige, durch Komma getrennte Liste von Schlagwörtern + TBD + + + + + + + VDI2770_StatusValue + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + + + + + + Statuswert + StatusValue + + StatusValue + + + + + Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) + TBD + + + + + + + VDI2770_SetDate + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + + + + + + Erstellungsdatum + Set Date + + SetDate + + + + + Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). + TBD + + + + + + + VDI2770_Purpose + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + + + + + + Zweck + Purpose + + Purpose + + + + + Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. + TBD + + + + + + + VDI2770_BasedOnProcedure + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + + + + + + Prozedur + Procedure + + BasedOnProcedure + + + + + textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt + TBD + + + + + + + VDI2770_Comments + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + + + + + + Kommentar + Comments + + Comments + + + + + textuelle Bemerkungen und Anmerkungen zum Status + TBD + + + + + + + VDI2770_ReferencedObject_Type + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + + + + + + Typ + Type + + Type + + + + + Für Type des Objekts muss immer Product angegeben werden. + TBD + + + + + + + VDI2770_ReferencedObject_RefType + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + + + + + + RefType + RefType + + RefType + + + + + Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) + TBD + + + + + + + VDI2770_ReferencedObject_ObjectId + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + + + + + + ObjectId + ObjectId + + ObjectId + + + + + Angabe der Identifikationsnummer zum Objekt + TBD + + + + + + + VDI2770_FileId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + + + + + + ID der Datei + File ID + + FileId + + + + + eindeutige ID für die Datei + TBD + + + + + + + VDI2770_FileName + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + + + + + + Dateiname + File name + + FileName + + + + + Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. + TBD + + + + + + + VDI2770_FileFormat + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + + + + + + Datei Format + File format + + FileFormat + + + + + Angabe eines Media Typs gemäß der Liste der IANA + TBD + + + + + + + OrganisationContactInfo + https://www.hsu-hh.de/aut/aas/contactinfo + + + + + + + + Contact Info + Kontakt Info + + OrganisationContactInfo + + + + + Sammlung für die allgemeinen Kontaktdaten + Collection for general contact data + + + + + + + NameOfSupplier + 0173-1#02-AAO735#003 + + + + + + + + + + + + name of supplier + Lieferantenname + + name of supplier + + + + + Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt + name of supplier which provides the customer with a product or a service + + + + + + + ContactInfo_Role + https://www.hsu-hh.de/aut/aas/role + + + + + + + + Rolle + Role + + Role + + + + + Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt + Information to specify the role which the organisation of ContactInfo plays + + + + + + + Email + https://www.hsu-hh.de/aut/aas/email + + + + + + + + Emailadresse + Email address + + Email + + + + + Emailadresse + Email address + + + + + + + URL + 0173-1#02-AAO694#001 + + + + + + + + Internetadresse + Internet address + + URL + + + + + stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html + Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html + + + + + + + PhoneNumber + 0173-1#02-AAO136#002 + + + + + + + + Telefonnummer + telephone number + + Phone + + + + + vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist + complete telephone number to be called to reach a business partner + + + + + + + Fax + https://www.hsu-hh.de/aut/aas/fax + + + + + + + + Fax + Fax + + Fax + + + + + Faxnummer + Fax number + + + + + + + 0173-1#02-AAO136#002 + + + + + GLNOfManufacturer + 0173-1#02-AAY812#001 + + + + + + + + GLN of manufacturer + GLN des Herstellers + + GLN of manufacturer + + + + + international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort + internationally unique identification number for the manufacturer of the device or the product and for the physical location + + + + + + + SupplierOfTheIdentifier + 0173-1#02-AAP796#004 + + + + + + + + Supplier of the identifier + Anbieter der Identifikationsnummer für Hersteller + + Supplier of the identifier + + + STRING_TRANSLATABLE + + DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification + DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer + + + + + + + MAN_PROD_NUM + + product article number of manufacturer + + 0173-1#02-AAO676#003 + + + + + + + + product article number of manufacturer + Herstellerartikelnummer + + MAN_PROD_NUM + + + STRING_TRANSLATABLE + + eindeutiger Bestellschlüssel des Herstellers + unique product identifier of the manufacturer + + + + + + + ManufacturerProductDescription + 0173-1#02-AAU734#001 + + + + + + + + Manufacturer product description + Herstellerproduktbeschreibung + + Manufacturer product description + + + + + Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) + Description of the product, it's technical features and implementation if needed (long text) + + + + + + + GLNOfSupplier + 0173-1#02-AAY813#001 + + + + + + + + GLN of supplier + GLN des Lieferanten + + GLN of supplier + + + + + international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort + internationally unique identification number for the supplier of the device or the product and for the physical location + + + + + + + SupplierIdProvider + https://www.hsu-hh.de/aut/aas/supplieridprovider + + + + + + + + SupplierIdProvider + Anbieter der Identifikationsnummer + + SupplierIdProvider + + + STRING_TRANSLATABLE + + DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer + DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification + + + + + + + SUP_PROD_NUM + 0173-1#02-AAO736#004 + + + + + + + + product article number of supplier + Lieferantenartikelnummer + + product article number of supplier + + + + + eindeutiger Bestellschlüssel des Lieferanten + unique product order identifier of the supplier + + + + + + + SupplierProductDesignation + 0173-1#02-AAM551#002 + + + + + + + + Supplier product designation + Lieferantenproduktbezeichnung + + SupplierTypName + + + STRING_TRANSLATABLE + + Kurze Beschreibung des Produktes (Kurztext) + Short description of the product (short text) + + + + + + + SupplierProductDescription + 0173-1#02-AAU730#001 + + + + + + + + Supplier product description + Lieferantenproduktbeschreibung + + Supplier product description + + + + + Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) + Description of the product, it's technical features and implementation if needed (long text) + + + + + + + ClassificationSystem + 0173-1#02-AAO715#002 + + + + + + + + classification system + Klassifizierungssystem + + ClassificationSystem + + + + + Klassifizierungssystem + Classification System + + + + + + + SecondaryKeyTyp + https://www.hsu-hh.de/aut/aas/secondarykeytyp + + + + + + + + SecondaryKeyTyp + Typnummer des IT Systems + + SecondaryKeyTyp + + + + + Führende technische ID im IT System des Typs + SecondaryKeyTyp + + + + + + + TypThumbnail + www.company.com/ids/cd/4401_1272_7091_3437 + + + + + + + + TypThumbnail + Vorschaubild + + TypThumbnail + + + + + Darstellung des Produkttyps in kleinem Format + Small picture of the product type + + + + + + + AssetId + https://www.hsu-hh.de/aut/aas/assetid + + + + + + + + AssetId + Asset ID + + AssetId + + + + + Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. + Global unique ID of an asset, which can be read by both human and machine. + + + + + + + SecondaryKeyInstance + https://www.hsu-hh.de/aut/aas/secondarykeyinstance + + + + + + + + SecondaryKeyInstance + Instanznummer des IT Systems + + SecondaryKeyInstance + + + + + Führende technische ID im IT System der Instanz + SecondaryKeyInstance + + + + + + + DateOfManufacture + 0173-1#02-AAR972#002 + + + + + + + + Date of manufacture + Herstellungsdatum + + Date of manufacture + + + DATE + + Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist + Date from which the production and / or development process is completed or from which a service is provided completely + + + + + + + DeviceRevision + https://www.hsu-hh.de/aut/aas/devicerevision + + + + + + + + DeviceRevision + DeviceRevision + + DeviceRevision + + + + + DeviceRevision + DeviceRevision + + + + + + + SoftwareRevision + https://www.hsu-hh.de/aut/aas/softwarerevision + + + + + + + + SoftwareRevision + SoftwareRevision + + SoftwareRevision + + + + + SoftwareRevision + SoftwareRevision + + + + + + + HardwareRevision + https://www.hsu-hh.de/aut/aas/hardwarerevision + + + + + + + + HardwareRevision + HardwareRevision + + HardwareRevision + + + + + HardwareRevision + HardwareRevision + + + + + + + QrCode + https://www.hsu-hh.de/aut/aas/qrcode + + + + + + + + QrCode + QrCode + + QrCode + + + + + In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. + QrCode + + + + + + + CompanyLogo + https://www.hsu-hh.de/aut/aas/companylogo + + + + + + + + Firmenlogo + CompanyLogo + + CompanyLogo + + + + + Firmenlogo + CompanyLogo + + + + + + + \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/03_Bosch.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/03_Bosch.aasx.xml new file mode 100644 index 000000000..59ae3d081 --- /dev/null +++ b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/03_Bosch.aasx.xml @@ -0,0 +1,13753 @@ + + + + + Bosch_R901509807_1201694127 + https://boschrexroth.com/ids/aas?p=p652370&m=R90150807&s=1201694127 + + + http://dc-qr.com?m=R901509807&s=1&f=1202044787 + + + + + + http://boschrexroth.com/ids/sm/4343_5072_7091_3242 + + + + + http://boschrexroth.com/ids/sm/2543_5072_7091_2660 + + + + + http://boschrexroth.com/ids/sm/6053_5072_7091_5102 + + + + + http://boschrexroth.com/ids/sm/6563_5072_7091_4267 + + + + + + + + + R901509807_1202044787 + http://dc-qr.com?m=R901509807&s=1&f=1202044787 + Instance + + + + + Nameplate + http://boschrexroth.com/ids/sm/4343_5072_7091_3242 + + + https://www.hsu-hh.de/aut/aas/nameplate + + + Instance + + + + + ManufacturerName + PARAMETER + + + 0173-1#02-AAO677#002 + + + Instance + + string + Bosch Rexroth AG + + + + + ManufacturerProductDesignation + PARAMETER + + + 0173-1#02-AAW338#001 + + + Instance + + string + 4WRPEH 6 C3 B40L-3X/M/24L1 + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Zum Eisengießer 1 + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 97816 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Lohr am Main + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Bayern + + + + false + false + + + + + ManufacturerProductFamily + PARAMETER + + + 0173-1#02-AAU731#001 + + + Instance + + + High-respones directional valve, direct operated + + + + + SerialNumber + PARAMETER + + + 0173-1#02-AAM556#002 + + + Instance + + string + 1201694127 + + + + + BatchNumber + PARAMETER + + + 0173-1#02-AAQ196#001 + + + Instance + + + + + + + + ProductCountryOfOrigin + PARAMETER + + + 0173-1#02-AAO841#001 + + + Instance + + string + DE + + + + + YearOfConstruction + PARAMETER + + + 0173-1#02-AAP906#001 + + + Instance + + string + 2019 + + + + + Marking_CE + PARAMETER + + + https://www.hsu-hh.de/aut/aas/productmarking + + + Instance + + + + + CEQualificationPresent + PARAMETER + + + 0173-1#02-BAF053#008 + + + Instance + + boolean + 1 + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + image/png + /aasx/Nameplate/marking_ce.png + + + + false + false + + + + + Marking_IO-Link + PARAMETER + + + https://www.hsu-hh.de/aut/aas/productmarking + + + Instance + + + + + IO-LinkMarkingPresent + PARAMETER + + + 0173-1#02-BAF053#008 + + + Instance + + boolean + 1 + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + image/png + /aasx/Nameplate/Logo_IO-link.jpg + + + + false + false + + + + + Connector_IO-Link + PARAMETER + + + https://www.hsu-hh.de/aut/aas/productmarking + + + Instance + + + + + IO-LinkConnectorPresent + PARAMETER + + + 0173-1#02-BAF053#008 + + + Instance + + boolean + 1 + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + image/png + /aasx/Nameplate/IO_Link_Steckerbelegung.png + + + + false + false + + + + + + Document + http://boschrexroth.com/ids/sm/2543_5072_7091_2660 + + + https://www.hsu-hh.de/aut/aas/document + + + Instance + + + + + DeclarationCEMarking + PARAMETER + + + www.company.com/ids/sm/2543_5072_7091_2660 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + DCTC-31003-003_KOE_N_DE_2016-07-20 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 02-04 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Zeugnisse, Zertifikate, Bescheinigungen + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + 2016-07-20 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + de + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + EG-Konformitatserklarung + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + SerialId + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + 1201694127 + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + DCTC-31003-003_KOE_N_DE_2016-07-20.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/DCTC-31003-003_KOE_N_DE_2016-07-20.pdf + + + + false + false + + + + + Declaration_IO-Link + PARAMETER + + + www.company.com/ids/sm/2543_5072_7091_2660 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + DCTC-31000-136_HEK_N_EN_2019-09-18 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 02-04 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Zeugnisse, Zertifikate, Bescheinigungen + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + 2019-09-18 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + de + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + HerstellererklärungIO-Link + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + SerialId + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + 1201694127 + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + DCTC-31000-136_HEK_N_EN_2019-09-18.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/DCTC-31000-136_HEK_N_EN_2019-09-18.pdf + + + + false + false + + + + + Certificat_DIN_EN_ISO_14001_2015 + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + string + Lohr_Bosch-Rexroth-AG_ISO_14001_BR_Matrix_en_20090723 + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 02-04 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Zeugnisse, Zertifikate, Bescheinigungen + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + de + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Zertifikat für Bosch Rexroth AG Normen DIN EN ISO 14001:2015 + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + SerialId + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + 1201694127 + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + Lohr_Bosch-Rexroth-AG_ISO_14001_BR_Matrix_en_20090723 + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/Lohr_Bosch-Rexroth-AG_ISO_14001_BR_Matrix_en_20090723.pdf + + + + false + false + + + + + Datasheet_4WRPEH6-3x-EN + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + RE29131 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 02-01 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Technische Spezifikation + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + 2019-02 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Datasheet: Directional control valves, direct operated, with electrical position feedback and integrated electronics (OBE) + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + SerialId + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + 1201694127 + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + re29121_2019-02 + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/re29121_2019-02.pdf + + + + false + false + + + + + UserManual_4WRPEH6-3x_EN + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + RE07600 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-01 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Montage, Demontage + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + 2019-01 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + SerialId + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + 1201694127 + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + RE07600-B_web_01_2019 + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/RE07600-B_web_01_2019.pdf + + + + false + false + + + + + Parameter_IO-Link_EN + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + RE29400 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + string + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 02-01 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Technische Spezifikation + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + 2019-01 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Parameter description: High-response directional valves with electrical position feedback and IO-Link interface + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + SerialId + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + 1201694127 + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + RE29400_01-2019 + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/RE29400_01-2019.pdf + + + + false + false + + + + + UserManual_4WRPEH6-3x_DE + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + RD07600 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-01 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Montage, Demontage + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + 2019-01 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + de + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + SerialId + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + 1201694127 + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + RD07600-B_web_01_2019 + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/RD07600_web_01_2019.pdf + + + + false + false + + + + + UserManual_4WRPEH6-3x_RO + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + RU07600 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-01 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Montage, Demontage + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + 2019-01 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + ro + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + SerialId + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + 1201694127 + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + RU07600-B_web_01_2019 + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/RU07600-B_web_01_2019.pdf + + + + false + false + + + + + UserManual_4WRPEH6-3x_ES + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + RS07600 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-01 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Montage, Demontage + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + 2019-01 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + es + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + SerialId + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + 1201694127 + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + RS07600-B_web_01_2019 + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/RS07600-B_web_01_2019.pdf + + + + false + false + + + + + UserManual_4WRPEH6-3x_FI + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + R-SF07600 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-01 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Montage, Demontage + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + 2019-01 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + fi + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + SerialId + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + 1201694127 + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + R-SF07600-B_web_01_2019 + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/R-SF07600_01_2019_web.pdf + + + + false + false + + + + + UserManual_4WRPEH6-3x_FR + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + RF07600 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-01 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Montage, Demontage + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + 2019-01 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + fr + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + SerialId + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + 1201694127 + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + RF07600-B_web_01_2019 + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/RF07600-B_web_01_2019.pdf + + + + false + false + + + + + UserManual_4WRPEH6-3x_NL + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + R-NL07600 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-01 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Montage, Demontage + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + 2019-01 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + nl + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + SerialId + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + 1201694127 + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + R-NL07600-B_web_01_2019 + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/R-NL07600-B_web_01_2019.pdf + + + + false + false + + + + + UserManual_4WRPEH6-3x_PL + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + R-PL07600 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-01 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Montage, Demontage + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + 2019-01 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + pl + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + SerialId + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + 1201694127 + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + R-PL07600-B_web_01_2019 + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/R-PL07600-B_web_01_2019 + + + + false + false + + + + + UserManual_4WRPEH6-3x_PT + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + RP07600 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-01 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Montage, Demontage + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + 2019-01 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + pt + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + SerialId + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + 1201694127 + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + RP07600-B_web_01_2019 + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/RP07600-B_web_01_2019.pdf + + + + false + false + + + + + UserManual_4WRPEH6-3x_RU + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + R-RS07600 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-01 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Montage, Demontage + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + 2019-01 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + ru + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + SerialId + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + 1201694127 + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + R-RS07600-B_web_01_2019 + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/R-RS07600-B_web_30_03_2016.pdf + + + + false + false + + + + + UserManual_4WRPEH6-3x_SV + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + R-SK07600 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-01 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Montage, Demontage + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + 2019-01 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + sv + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + SerialId + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + 1201694127 + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + R-SK07600-B_web_01_2019 + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/R-SK07600_web_B_01_2019.pdf + + + + false + false + + + + + UserManual_4WRPEH6-3x_TR + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + RT07600 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-01 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Montage, Demontage + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + 2019-01 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + tr + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + SerialId + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + 1201694127 + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + RT07600-B_web_01_2019 + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/RT07600_web_01_2019.pdf + + + + false + false + + + + + UserManual_4WRPEH6-3x_IT + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + RI07600 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-01 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Montage, Demontage + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + 2019-01 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + it + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + SerialId + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + 1201694127 + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + RI07600-B_web_01_2019 + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/RI07600-B_web_01_2019.pdf + + + + false + false + + + + + UserManual_4WRPEH6-3x_CS + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + R-CZ07600 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-01 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Montage, Demontage + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + 2019-01 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + cs + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + SerialId + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + 1201694127 + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + R-CZ07600-B_web_01_2019 + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/R-CZ 07600-B_web_01_2019.pdf + + + + false + false + + + + + Datasheet_4WRPEH6-3x_DE + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + RD29131 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 02-01 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Technische Spezifikation + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + 2019-02 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + de + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Datasheet: Directional control valves, direct operated, with electrical position feedback and integrated electronics (OBE) + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + SerialId + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + 1201694127 + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + rd29121_2019-02 + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/rd29121_2019-02.pdf + + + + false + false + + + + + Datasheet_4WRPEH6-3x-zh + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + RC29131 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 02-01 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Technische Spezifikation + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + 2019-02 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + zh + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Datasheet: Directional control valves, direct operated, with electrical position feedback and integrated electronics (OBE) + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + SerialId + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + 1201694127 + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + rc29121_2019-02 + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/rc29121_2019-02.pdf + + + + false + false + + + + + Parameter_IO-Link-DE + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + RD29400 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + string + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 02-01 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Technische Spezifikation + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + 2019-01 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + de + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Parameter description: High-response directional valves with electrical position feedback and IO-Link interface + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + SerialId + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + 1201694127 + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + RD29400_01-2019 + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/RD29400_01_2019_web.pdf + + + + false + false + + + + + + Service + http://boschrexroth.com/ids/sm/6053_5072_7091_5102 + + + https://www.hsu-hh.de/aut/aas/service + + + Instance + + + + + ContactInfo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/contactinfo + + + Instance + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + Bosch Rexroth AG + + + + + ContactInfo_Role + PARAMETER + + + https://www.hsu-hh.de/aut/aas/role + + + Instance + + string + Manufacturer + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Bgm.-Dr.-Nebel-Str. 8 + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 97816 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Lohr + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Bayern + + + + false + false + + + + + Email + PARAMETER + + + https://www.hsu-hh.de/aut/aas/email + + + Instance + + string + service@boschrexroth.de + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://www.boschrexroth.com/de/de/service/startseite-service + + + + + PhoneNumber + PARAMETER + + + 0173-1#02-AAO136#002 + + + Instance + + string + +499352405060 + + + + + Fax + PARAMETER + + + https://www.hsu-hh.de/aut/aas/fax + + + Instance + + string + + + + + false + false + + + + + + Identification + http://boschrexroth.com/ids/sm/6563_5072_7091_4267 + + + https://www.hsu-hh.de/aut/aas/identification + + + Instance + + + + + ManufacturerName + PARAMETER + + + 0173-1#02-AAO677#002 + + + Instance + + string + Bosch Rexroth AG + + + + + GLNOfManufacturer + PARAMETER + + + 0173-1#02-AAY812#001 + + + Instance + + string + 4048118000006 + + + + + SupplierOfTheIdentifier + + + 0173-1#02-AAP796#004 + + + Instance + + string + GLN GS1 + + + + + MAN_PROD_NUM + + + 0173-1#02-AAO676#003 + + + Instance + + string + R901509807 + + + + + ManufacturerProductDesignation + PARAMETER + + + 0173-1#02-AAW338#001 + + + Instance + + string + 4WRPEH 6 C3 B40L-3X/M/24L1 + + + + + ManufacturerProductDescription + PARAMETER + + + 0173-1#02-AAU734#001 + + + Instance + + langString + High-response directional valves, direct operated, with electrical position feedback and integrated electronics (OBE)“ oder auch „• Size 6 • Component series 3X • Maximum operating pressure 350 bar • Nominal flow 4 … 40 l/min • Digital interface IO-Link + + + + + ManufacturerProductFamily + PARAMETER + + + 0173-1#02-AAU731#001 + + + Instance + + string + Proportional directional control valve, spool design (hydraulics) + + + + + ClassificationSystem + PARAMETER + + + 0173-1#02-AAO715#002 + + + Instance + + string + eCl@ss + + + + + SecondaryKeyTyp + + + https://www.hsu-hh.de/aut/aas/secondarykeytyp + + + Instance + + + + + + + + TypThumbnail + PARAMETER + + + www.company.com/ids/cd/4401_1272_7091_3437 + + + Instance + + image/jpeg + /aasx/4WRPEH6_3X.png + + + + + AssetId + PARAMETER + + + https://www.hsu-hh.de/aut/aas/assetid + + + Instance + + string + http://dc-qr.com?m=R901509807&s=1&f=1202044787 + + + + + SerialNumber + PARAMETER + + + 0173-1#02-AAM556#002 + + + Instance + + string + 1202044787 + + + + + BatchNumber + PARAMETER + + + 0173-1#02-AAQ196#001 + + + Instance + + + + + + + + SecondaryKeyInstance + PARAMETER + + + https://www.hsu-hh.de/aut/aas/secondarykeyinstance + + + Instance + + + + + + + + DateOfManufacture + PARAMETER + + + 0173-1#02-AAR972#002 + + + Instance + + + 2018 + + + + + DeviceRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/devicerevision + + + Instance + + + 30 + + + + + SoftwareRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/softwarerevision + + + Instance + + string + 02V08 + + + + + HardwareRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/hardwarerevision + + + Instance + + string + P.017.0014 + + + + + QrCode + PARAMETER + + + https://www.hsu-hh.de/aut/aas/qrcode + + + Instance + + image/jpeg + /aasx/Identification/QR-Code.jpg + + + + + ContactInfo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/contactinfo + + + Instance + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + Bosch Rexroth AG + + + + + ContactInfo_Role + PARAMETER + + + https://www.hsu-hh.de/aut/aas/role + + + Instance + + string + Manufacturer + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Zum Eisengießer 1 + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 97816 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Lohr am Main + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Bayern + + + + false + false + + + + + Email + PARAMETER + + + https://www.hsu-hh.de/aut/aas/email + + + Instance + + string + service@boschrexroth.de + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://www.boschrexroth.com/de/de/home/index + + + + + PhoneNumber + PARAMETER + + + 0173-1#02-AAO136#002 + + + Instance + + string + +499352405060 + + + + + Fax + PARAMETER + + + https://www.hsu-hh.de/aut/aas/fax + + + Instance + + string + + + + + false + false + + + + + CompanyLogo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/companylogo + + + Instance + + image/png + /aasx/Identification/Rexroth-Logo_RGB_M.jpg + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + http://dc-qr.com?m=R901509807&s=1&f=1202044787 + + + + + + + + ManufacturerName + 0173-1#02-AAO677#002 + + + + + + + + Herstellername + Manufacturer Name + + Manufacturer Name + + + + + Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist + 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 + + + + + + + ManufacturerProductDesignation + 0173-1#02-AAW338#001 + + + + + + + + Manufacturer product designation + Herstellerproduktbezeichnung + + ManufacturerTypName + + + STRING_TRANSLATABLE + + Kurze Beschreibung des Produktes (Kurztext) + Short description of the product (short text) + + + + + + + PhysicalAddress + https://www.hsu-hh.de/aut/aas/physicaladdress + + + + + + + + PhysicalAddress + Physische Adresse + + PhysicalAddress + + + + + Sammlung für reale physische Adresse + Collection for real physical address + + + + + + + CountryCode + 0173-1#02-AAO730#001 + + + + + + + + + + + + Landeskennung + Country code + + Country code + + + + + Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes + agreed upon symbol for unambiguous identification of a country + + + + + + + Street + 0173-1#02-AAO128#001 + + + + + + + + Strasse + Street + + Street + + + + + Name der Strasse und Hausnummer + Street name and house number + + + + + + + Zip + 0173-1#02-AAO129#002 + + + + + + + + Zip + Postleitzahl + + PostalCode + + + + + ZIP code of address + Postleitzahl der Anschrift + + + + + + + CityTown + 0173-1#02-AAO132#001 + + + + + + + + Ort + City/town + + City/town + + + + + Town or city of the company + Ortsangabe + + + + + + + StateCounty + 0173-1#02-AAO133#002 + + + + + + + + state/county + Bundesland + + StateCounty + + + + + Bundesland + state/county + + + + + + + ManufacturerProductFamily + 0173-1#02-AAU731#001 + + + + + + + + Manufacturer product family + Herstellerproduktfamilie + + TypClass + + + + + 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie + 2nd level of a 3 level manufacturer specific product hierarchy + + + + + + + SerialNumber + 0173-1#02-AAM556#002 + + + + + + + + Serial number + Seriennummer + + InstanceId + + + + + eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist + unique combination of numbers and letters used to identify the device once it has been manufactured + + + + + + + BatchNumber + 0173-1#02-AAQ196#001 + + + + + + + + Batch number + Chargen-Nummer + + ChargeId + + + + + Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge + Number assigned by the manufacturer of a material to identify the manufacturer's batch + + + + + + + ProductCountryOfOrigin + 0173-1#02-AAO841#001 + + + + + + + + Produkt Ursprungsland + Product country of origin + + CountryOfOrigin + + + + + Land in dem das Produkt hergestellt wurde (Hersteller Land) + Country in which the product is manufactured (manufacturer country) + + + + + + + YearOfConstruction + 0173-1#02-AAP906#001 + + + + + + + + Year of construction + Baujahr + + YearOfConstruction + + + + + Jahreszahl als Datumsangabe für die Fertigstellung des Objektes + Year as completion date of object + + + + + + + ProductMarking + https://www.hsu-hh.de/aut/aas/productmarking + + + + + + + + Produktkennzeichnung + Product Marking + + ProductMarking + + + + + Sammlungsdatei für Produktkennzeichnung + Collection file for product marking + + + + + + + CEQualificationPresent + 0173-1#02-BAF053#008 + + + + + + + + IO-Link-Kennzeichnung vorhanden + IO-Link marking present + + CEMarkingPresent + + + BOOLEAN + + whether CE- qualification is present + Angabe, ob CE-Kennzeichnung vorhanden ist + + + + + + + File + 0173-1#02-AAD005#008 + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Enthaltene Doku. Datei + Embedded Doc. file + + File + + + + + Verweis/ BLOB auf enthaltene Dokumentations-Datei. + Reference/ BLOB to embedded documentation file. + + + + + + + DocumentationItem + + 0173-1#02-AAD001#001 + + + + + + + + Dokumentationsgruppe + Documentation item + + DocumentationItem + + + + + Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. + Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. + + + + + + + DocumentType + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + + + + + + Dokumententyp + Document Type + + DocumentType + + + + + Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) + TBD + + + + + + + VDI2770_DomainId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + + + + + + Domain-Nummer + DomainId + + DomainId + + + + + Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. + TBD + + + + + + + VDI2770_IdType + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + + + + + + Nummerntyp + IdType + + IdType + + + + + Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. + TBD + + + + + + + DocumentId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + + + + + + DocumentId + Dokumenten-Nummer + + DocumentId + + + + + Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. + TBD + + + + + + + DocumentDomainId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + + + + + + DocumentDomainId + DocumentDomainId + + DocumentDomainId + + + + + Kennung oder Kennzeichen einer Domäne + TBD + + + + + + + VDI2770_Role + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + + + + + + Rolle + Role + + Role + + + + + Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) + TBD + + + + + + + VDI2770_OrganisationId + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + + + + + + Organisation ID + Organisation ID + + OrganisationId + + + + + eindeutige ID für die Organisation + TBD + + + + + + + VDI2770_OrganisationName + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + + + + + + OrganisationName + OrganisationName + + OrganisationName + + + + + gebräuchliche Bezeichnung für die Organisation + TBD + + + + + + + VDI2770_OrganisationOfficialName + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + + + + + + Offizieller Name der Organisation + Organisation Official Name + + OrganisationOfficialName + + + + + offizieller Name der Organisation + TBD + + + + + + + VDI2770_Description + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + + + + + + Beschreibung + Description + + Description + + + + + Beschreibung für die nächste übergeordnete Collection + TBD + + + + + + + DocumentPartId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + + + + + + Dokumenten-Teilnummer + DocumentPartId + + DocumentPartId + + + + + Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. + TBD + + + + + + + DocumentClassification_ClassId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + + + + Dokumentkategorie + Document category + + DocCategory + + + + + Dokumentkategorie nach VDI 2770:2018/10 + Document category after VDI 2770:2018/10 + + + + + + + VDI2770_ClassName + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + + + + + + Klassenname + Class Name + + ClassName + + + + + Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. + TBD + + + + + + + VDI2770_ClassificationSystem + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + + + + + + Klassifizierungssystem + classification system + + ClassificationSystem + + + + + Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. + TBD + + + + + + + DocumentVersionId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + + + + + + Dokumenten-Versionsnummer + DocumentVersionId + + DocumentVersionId + + + + + Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. + TBD + + + + + + + DocumentVersion_LanguageCode + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + + + + + + Sprachenschlüssel + LanguageCode + + LanguageCode + + + + + Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 + TBD + + + + + + + VDI2770_Title + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + + + + + + Titel + Title + + VDI2770_Title + + + + + sprachabhängiger Titel des Dokuments + TBD + + + + + + + VDI2770_Summary + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + + + + + + Zusammenfassung + Summary + + Summary + + + + + sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts + TBD + + + + + + + VDI2770_Keywords + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + + + + + + Schlagwörter + Keywords + + Keywords + + + + + sprachabhängige, durch Komma getrennte Liste von Schlagwörtern + TBD + + + + + + + VDI2770_StatusValue + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + + + + + + Statuswert + StatusValue + + StatusValue + + + + + Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) + TBD + + + + + + + VDI2770_SetDate + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + + + + + + Erstellungsdatum + Set Date + + SetDate + + + + + Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). + TBD + + + + + + + VDI2770_Purpose + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + + + + + + Zweck + Purpose + + Purpose + + + + + Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. + TBD + + + + + + + VDI2770_BasedOnProcedure + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + + + + + + Prozedur + Procedure + + BasedOnProcedure + + + + + textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt + TBD + + + + + + + VDI2770_Comments + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + + + + + + Kommentar + Comments + + Comments + + + + + textuelle Bemerkungen und Anmerkungen zum Status + TBD + + + + + + + VDI2770_ReferencedObject_Type + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + + + + + + Typ + Type + + Type + + + + + Für Type des Objekts muss immer Product angegeben werden. + TBD + + + + + + + VDI2770_ReferencedObject_RefType + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + + + + + + RefType + RefType + + RefType + + + + + Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) + TBD + + + + + + + VDI2770_ReferencedObject_ObjectId + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + + + + + + ObjectId + ObjectId + + ObjectId + + + + + Angabe der Identifikationsnummer zum Objekt + TBD + + + + + + + VDI2770_FileId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + + + + + + ID der Datei + File ID + + FileId + + + + + eindeutige ID für die Datei + TBD + + + + + + + VDI2770_FileName + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + + + + + + Dateiname + File name + + FileName + + + + + Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. + TBD + + + + + + + VDI2770_FileFormat + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + + + + + + Datei Format + File format + + FileFormat + + + + + Angabe eines Media Typs gemäß der Liste der IANA + TBD + + + + + + + OrganisationContactInfo + https://www.hsu-hh.de/aut/aas/contactinfo + + + + + + + + Contact Info + Kontakt Info + + OrganisationContactInfo + + + + + Sammlung für die allgemeinen Kontaktdaten + Collection for general contact data + + + + + + + NameOfSupplier + 0173-1#02-AAO735#003 + + + + + + + + + + + + name of supplier + Lieferantenname + + name of supplier + + + + + Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt + name of supplier which provides the customer with a product or a service + + + + + + + ContactInfo_Role + https://www.hsu-hh.de/aut/aas/role + + + + + + + + Rolle + Role + + Role + + + + + Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt + Information to specify the role which the organisation of ContactInfo plays + + + + + + + Email + https://www.hsu-hh.de/aut/aas/email + + + + + + + + Emailadresse + Email address + + Email + + + + + Emailadresse + Email address + + + + + + + URL + 0173-1#02-AAO694#001 + + + + + + + + Internetadresse + Internet address + + URL + + + + + stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html + Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html + + + + + + + PhoneNumber + 0173-1#02-AAO136#002 + + + + + + + + Telefonnummer + telephone number + + Phone + + + + + vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist + complete telephone number to be called to reach a business partner + + + + + + + Fax + https://www.hsu-hh.de/aut/aas/fax + + + + + + + + Fax + Fax + + Fax + + + + + Faxnummer + Fax number + + + + + + + 0173-1#02-AAO136#002 + + + + + GLNOfManufacturer + 0173-1#02-AAY812#001 + + + + + + + + GLN of manufacturer + GLN des Herstellers + + GLN of manufacturer + + + + + international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort + internationally unique identification number for the manufacturer of the device or the product and for the physical location + + + + + + + SupplierOfTheIdentifier + 0173-1#02-AAP796#004 + + + + + + + + Supplier of the identifier + Anbieter der Identifikationsnummer für Hersteller + + Supplier of the identifier + + + STRING_TRANSLATABLE + + DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification + DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer + + + + + + + MAN_PROD_NUM + + product article number of manufacturer + + 0173-1#02-AAO676#003 + + + + + + + + product article number of manufacturer + Herstellerartikelnummer + + MAN_PROD_NUM + + + STRING_TRANSLATABLE + + eindeutiger Bestellschlüssel des Herstellers + unique product identifier of the manufacturer + + + + + + + ManufacturerProductDescription + 0173-1#02-AAU734#001 + + + + + + + + Manufacturer product description + Herstellerproduktbeschreibung + + Manufacturer product description + + + + + Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) + Description of the product, it's technical features and implementation if needed (long text) + + + + + + + GLNOfSupplier + 0173-1#02-AAY813#001 + + + + + + + + GLN of supplier + GLN des Lieferanten + + GLN of supplier + + + + + international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort + internationally unique identification number for the supplier of the device or the product and for the physical location + + + + + + + SupplierIdProvider + https://www.hsu-hh.de/aut/aas/supplieridprovider + + + + + + + + SupplierIdProvider + Anbieter der Identifikationsnummer + + SupplierIdProvider + + + STRING_TRANSLATABLE + + DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer + DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification + + + + + + + SUP_PROD_NUM + 0173-1#02-AAO736#004 + + + + + + + + product article number of supplier + Lieferantenartikelnummer + + product article number of supplier + + + + + eindeutiger Bestellschlüssel des Lieferanten + unique product order identifier of the supplier + + + + + + + SupplierProductDesignation + 0173-1#02-AAM551#002 + + + + + + + + Supplier product designation + Lieferantenproduktbezeichnung + + SupplierTypName + + + STRING_TRANSLATABLE + + Kurze Beschreibung des Produktes (Kurztext) + Short description of the product (short text) + + + + + + + SupplierProductDescription + 0173-1#02-AAU730#001 + + + + + + + + Supplier product description + Lieferantenproduktbeschreibung + + Supplier product description + + + + + Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) + Description of the product, it's technical features and implementation if needed (long text) + + + + + + + ClassificationSystem + 0173-1#02-AAO715#002 + + + + + + + + classification system + Klassifizierungssystem + + ClassificationSystem + + + + + Klassifizierungssystem + Classification System + + + + + + + SecondaryKeyTyp + https://www.hsu-hh.de/aut/aas/secondarykeytyp + + + + + + + + SecondaryKeyTyp + Typnummer des IT Systems + + SecondaryKeyTyp + + + + + Führende technische ID im IT System des Typs + SecondaryKeyTyp + + + + + + + TypThumbnail + www.company.com/ids/cd/4401_1272_7091_3437 + + + + + + + + TypThumbnail + Vorschaubild + + TypThumbnail + + + + + Darstellung des Produkttyps in kleinem Format + Small picture of the product type + + + + + + + AssetId + https://www.hsu-hh.de/aut/aas/assetid + + + + + + + + AssetId + Asset ID + + AssetId + + + + + Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. + Global unique ID of an asset, which can be read by both human and machine. + + + + + + + SecondaryKeyInstance + https://www.hsu-hh.de/aut/aas/secondarykeyinstance + + + + + + + + SecondaryKeyInstance + Instanznummer des IT Systems + + SecondaryKeyInstance + + + + + Führende technische ID im IT System der Instanz + SecondaryKeyInstance + + + + + + + DateOfManufacture + 0173-1#02-AAR972#002 + + + + + + + + Date of manufacture + Herstellungsdatum + + Date of manufacture + + + DATE + + Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist + Date from which the production and / or development process is completed or from which a service is provided completely + + + + + + + DeviceRevision + https://www.hsu-hh.de/aut/aas/devicerevision + + + + + + + + DeviceRevision + DeviceRevision + + DeviceRevision + + + + + DeviceRevision + DeviceRevision + + + + + + + SoftwareRevision + https://www.hsu-hh.de/aut/aas/softwarerevision + + + + + + + + SoftwareRevision + SoftwareRevision + + SoftwareRevision + + + + + SoftwareRevision + SoftwareRevision + + + + + + + HardwareRevision + https://www.hsu-hh.de/aut/aas/hardwarerevision + + + + + + + + HardwareRevision + HardwareRevision + + HardwareRevision + + + + + HardwareRevision + HardwareRevision + + + + + + + QrCode + https://www.hsu-hh.de/aut/aas/qrcode + + + + + + + + QrCode + QrCode + + QrCode + + + + + In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. + QrCode + + + + + + + CompanyLogo + https://www.hsu-hh.de/aut/aas/companylogo + + + + + + + + Firmenlogo + CompanyLogo + + CompanyLogo + + + + + Firmenlogo + CompanyLogo + + + + + + + \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/04_Bosch.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/04_Bosch.aasx.xml new file mode 100644 index 000000000..eb7d7280c --- /dev/null +++ b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/04_Bosch.aasx.xml @@ -0,0 +1,6691 @@ + + + + + Bosch_CompactModuleBallRailSystem + http://boschrexroth.com/shells/R036037000/1005625831090001 + + + http://dc-qr.com?m=R036037000&s=1005625831090001&vc=CKK-090-NN-1 + + + + + + http://boschrexroth.com/shells/R036037000/1005625831090001/submodels/nameplate/ + + + + + http://boschrexroth.com/shells/R036037000/1005625831090001/submodels/document/ + + + + + http://boschrexroth.com/shells/R036037000/1005625831090001/submodels/service/ + + + + + http://boschrexroth.com/shells/R036037000/1005625831090001/submodels/identification/ + + + + + http://boschrexroth.com/shells/R036037000/1005625831090001/submodels/technicalSpecification/ + + + + + + + + + MR036037000_S1005625831090001 + CONSTANT + http://dc-qr.com?m=R036037000&s=1005625831090001&vc=CKK-090-NN-1 + Instance + + + + + Nameplate + http://boschrexroth.com/shells/R036037000/1005625831090001/submodels/nameplate/ + + + https://www.hsu-hh.de/aut/aas/nameplate + + + Instance + + + + + ManufacturerName + PARAMETER + + + 0173-1#02-AAO677#002 + + + Instance + + string + Bosch Rexroth AG + + + + + ManufacturerProductDesignation + PARAMETER + + + 0173-1#02-AAW338#001 + + + Instance + + string + Compact Module with ball screw drive (CKK) + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Zum Eisengießer 1 + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 97816 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Lohr am Main + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Bayern + + + + false + false + + + + + ManufacturerProductFamily + PARAMETER + + + 0173-1#02-AAU731#001 + + + Instance + + string + Compact module + + + + + SerialNumber + PARAMETER + + + 0173-1#02-AAM556#002 + + + Instance + + string + 1005625831090001 + + + + + BatchNumber + PARAMETER + + + 0173-1#02-AAQ196#001 + + + Instance + + + + + + + + ProductCountryOfOrigin + PARAMETER + + + 0173-1#02-AAO841#001 + + + Instance + + string + DE + + + + + YearOfConstruction + PARAMETER + + + 0173-1#02-AAP906#001 + + + Instance + + string + 2019 + + + + + Marking_CE + PARAMETER + + + https://www.hsu-hh.de/aut/aas/productmarking + + + Instance + + + + + CEQualificationPresent + PARAMETER + + + 0173-1#02-BAF053#008 + + + Instance + + boolean + 1 + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + image/png + /aasx/Nameplate/marking_ce.png + + + + false + false + + + + + + Document + http://boschrexroth.com/shells/R036037000/1005625831090001/submodels/document/ + + + https://www.hsu-hh.de/aut/aas/document + + + Instance + + + + + Doku_Schmierung_CKx_V01_R320103051_2017_03 + PARAMETER + + + + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + R320103051 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-02 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Bedienung (DE) Operating Instructions (EN) + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + 2017-03 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + de/en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Erweiterungsdokumentation Schmierung CKK und CRK (de) / Extension instructions lubrication of CKK and CKR (en) + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + Doku_Schmierung_CKx_V01_R320103051_2017_03.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/Doku_Schmierung_CKx_V01_R320103051_2017_03.pdf + + + + false + false + + + + + R320103141_2015_06_Einbauerklaerung_einachsig + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + R320103141 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-02 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Bedienung (DE) Operating Instructions (EN) + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + 2015-06 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + de/en/es/fr/it/pt/bg/cs/da/et/el/fi/ga/hu/is/lt/lv/mt/nl/no/pl/ro/sk/sl/sv/tr + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Einbauerklärung für einachsige Linearsysteme + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + R320103141_2015_06_Einbauerklaerung_einachsig.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/R320103141_2015_06_Einbauerklaerung_einachsig.pdf + + + + false + false + + + + + R320103152_2015_01_DE_Safety_LS_Media_22_01_2015 + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + R320103152 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-03 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Allgemeine Sicherheit (DE) General Security (EN) + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + 2015-01 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + de + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Sicherheitshinweise für Linearsysteme + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + R320103152_2015_01_DE_Safety_LS_Media_22_01_2015.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/R320103152_2015_01_DE_Safety_LS_Media_22_01_2015.pdf + + + + false + false + + + + + R320103152_2015_01_EN_Safety_LS_22_01_2015_web + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + R320103152 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-03 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Allgemeine Sicherheit (DE) General Security (EN) + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + 2015-01 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Sicherheitshinweise für Linearsysteme + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + R320103152_2015_01_EN_Safety_LS_22_01_2015_web.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/R320103152_2015_01_EN_Safety_LS_22_01_2015_web.pdf + + + + false + false + + + + + R320103982_DE_EN_FR_IT_2015-05_CKK + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + R320103982 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-02 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Bedienung (DE) Operating Instructions (EN) + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + 2015-05 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + de/en/fr/it + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Anleitung / Instructions / Instructions / Istruzioni + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + R320103982_DE_EN_FR_IT_(2015_05)_CKK.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/R320103982_DE_EN_FR_IT_(2015_05)_CKK.pdf + + + + false + false + + + + + R999000479_2019_03_DE_18_07_2019_CKx + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + R999000479 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-02 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Bedienung (DE) Operating Instructions (EN) + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + 2019-03 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + de + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Katalog CKK / CKR + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + R999000479_2019_03_DE_18_07_2019_CKx.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/R999000479_2019_03_DE_18_07_2019_CKx.pdf + + + + false + false + + + + + R999000499_2019_03_EN_18_07_2019_CKx + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + R999000499 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-02 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Bedienung (DE) Operating Instructions (EN) + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + 2019-03 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Catalog CKK / CKR + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + R999000499_2019_03_EN_18_07_2019_CKx.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/R999000499_2019_03_EN_18_07_2019_CKx.pdf + + + + false + false + + + + + + Service + http://boschrexroth.com/shells/R036037000/1005625831090001/submodels/service/ + + + https://www.hsu-hh.de/aut/aas/service + + + Instance + + + + + ContactInfo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/contactinfo + + + Instance + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + Bosch Rexroth AG Linear Motion Technologies + + + + + ContactInfo_Role + PARAMETER + + + https://www.hsu-hh.de/aut/aas/role + + + Instance + + string + Manufacturer + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Röntgenstraße 5 + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 97424 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Schweinfurt + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Bayern + + + + false + false + + + + + Email + PARAMETER + + + https://www.hsu-hh.de/aut/aas/email + + + Instance + + string + service.lt@boschrexroth.de + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://www.boschrexroth.com/en/xc/products/product-groups/linear-motion-technology/service-linear-motion-technology + + + + + PhoneNumber + PARAMETER + + + 0173-1#02-AAO136#002 + + + Instance + + string + +49 9721 937 8617 + + + + false + false + + + + + + Identification + http://boschrexroth.com/shells/R036037000/1005625831090001/submodels/identification/ + + + https://www.hsu-hh.de/aut/aas/identification + + + Instance + + + + + ManufacturerName + PARAMETER + + + 0173-1#02-AAO677#002 + + + Instance + + string + Bosch Rexroth AG + + + + + GLNOfManufacturer + PARAMETER + + + 0173-1#02-AAY812#001 + + + Instance + + string + 4048118000006 + + + + + SupplierOfTheIdentifier + + + 0173-1#02-AAP796#004 + + + Instance + + string + GLN GS1 + + + + + MAN_PROD_NUM + + + 0173-1#02-AAO676#003 + + + Instance + + string + R036037000 + + + + + ManufacturerProductDesignation + PARAMETER + + + 0173-1#02-AAW338#001 + + + Instance + + string + CKK-090-NN-1 + + + + + ManufacturerProductDescription + PARAMETER + + + 0173-1#02-AAU734#001 + + + Instance + + langString + Compact Module with ball screw drive (CKK) + + + + + ManufacturerProductFamily + PARAMETER + + + 0173-1#02-AAU731#001 + + + Instance + + string + Compact Module + + + + + ClassificationSystem + PARAMETER + + + 0173-1#02-AAO715#002 + + + Instance + + string + eCl@ss + + + + + SecondaryKeyTyp + + + https://www.hsu-hh.de/aut/aas/secondarykeytyp + + + Instance + + + + + + + + TypThumbnail + PARAMETER + + + www.company.com/ids/cd/4401_1272_7091_3437 + + + Instance + + image/jpeg + /CKK.jpg + + + + + AssetId + PARAMETER + + + https://www.hsu-hh.de/aut/aas/assetid + + + Instance + + string + http://dc-qr.com?m=R036037000&s=1005625831090001&vc=CKK-090-NN-1 + + + + + SerialNumber + PARAMETER + + + 0173-1#02-AAM556#002 + + + Instance + + string + 1005625831090001 + + + + + BatchNumber + PARAMETER + + + 0173-1#02-AAQ196#001 + + + Instance + + + + + + + + SecondaryKeyInstance + PARAMETER + + + https://www.hsu-hh.de/aut/aas/secondarykeyinstance + + + Instance + + + + + + + + DateOfManufacture + PARAMETER + + + 0173-1#02-AAR972#002 + + + Instance + + + 2019 + + + + + DeviceRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/devicerevision + + + Instance + + + + + + + + SoftwareRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/softwarerevision + + + Instance + + + + + + + + HardwareRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/hardwarerevision + + + Instance + + + + + + + + ContactInfo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/contactinfo + + + Instance + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + Bosch Rexroth AG + + + + + ContactInfo_Role + PARAMETER + + + https://www.hsu-hh.de/aut/aas/role + + + Instance + + string + Manufacturer + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Zum Eisengießer 1 + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 97816 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Lohr am Main + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Bayern + + + + false + false + + + + + Email + PARAMETER + + + https://www.hsu-hh.de/aut/aas/email + + + Instance + + string + service@boschrexroth.de + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://www.boschrexroth.com/de/de/home/index + + + + + PhoneNumber + PARAMETER + + + 0173-1#02-AAO136#002 + + + Instance + + string + +499352405060 + + + + + Fax + PARAMETER + + + https://www.hsu-hh.de/aut/aas/fax + + + Instance + + string + + + + + false + false + + + + + CompanyLogo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/companylogo + + + Instance + + image/png + /aasx/Identification/logo.png + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + http://dc-qr.com?m=R036037000&s=1005625831090001&vc=CKK-090-NN-1 + + + + + + TechnicalSpecification + http://boschrexroth.com/shells/R036037000/1005625831090001/submodels/technicalSpecification/ + + + https://www.hsu-hh.de/aut/aas/technicalspecification + + + Instance + + + + + MaxTraversePath + PARAMETER + + + + http://boschrexroth.com/cds/lt/maxTraversePath + + + Instance + + float + 210 + + + + + FormFeedConstant + PARAMETER + + + + http://boschrexroth.com/cds/lt/formFeedConstant + + + Instance + + float + 10,00 + + + + + MaxPermissibleSpeed + PARAMETER + + + + http://boschrexroth.com/cds/lt/maxPermissibleSpeed + + + Instance + + float + 1,13 + + + + + MaxPermissibleAcceleration + PARAMETER + + + + http://boschrexroth.com/cds/lt/maxPermissibleAcceleration + + + Instance + + float + 50,00 + + + + + MaxPermissibleTorque + PARAMETER + + + + http://boschrexroth.com/cds/lt/maxPermissibleTorque + + + Instance + + float + 4,42 + + + + + RotationDirectionPositiveMovement + PARAMETER + + + + http://boschrexroth.com/cds/lt/RotationDirectionPositiveMovement + + + Instance + + string + CW + + + + + GearTransmissionRatio + PARAMETER + + + + http://boschrexroth.com/cds/lt/GearTransmissionRatio + + + Instance + + float + 1,00 + + + + + + + + ManufacturerName + 0173-1#02-AAO677#002 + + + + + + + + Herstellername + Manufacturer Name + + Manufacturer Name + + + + + Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist + 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 + + + + + + + ManufacturerProductDesignation + 0173-1#02-AAW338#001 + + + + + + + + Manufacturer product designation + Herstellerproduktbezeichnung + + ManufacturerTypName + + + STRING_TRANSLATABLE + + Kurze Beschreibung des Produktes (Kurztext) + Short description of the product (short text) + + + + + + + PhysicalAddress + https://www.hsu-hh.de/aut/aas/physicaladdress + + + + + + + + PhysicalAddress + Physische Adresse + + PhysicalAddress + + + + + Sammlung für reale physische Adresse + Collection for real physical address + + + + + + + CountryCode + 0173-1#02-AAO730#001 + + + + + + + + + + + + Landeskennung + Country code + + Country code + + + + + Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes + agreed upon symbol for unambiguous identification of a country + + + + + + + Street + 0173-1#02-AAO128#001 + + + + + + + + Strasse + Street + + Street + + + + + Name der Strasse und Hausnummer + Street name and house number + + + + + + + Zip + 0173-1#02-AAO129#002 + + + + + + + + Zip + Postleitzahl + + PostalCode + + + + + ZIP code of address + Postleitzahl der Anschrift + + + + + + + CityTown + 0173-1#02-AAO132#001 + + + + + + + + Ort + City/town + + City/town + + + + + Town or city of the company + Ortsangabe + + + + + + + StateCounty + 0173-1#02-AAO133#002 + + + + + + + + state/county + Bundesland + + StateCounty + + + + + Bundesland + state/county + + + + + + + ManufacturerProductFamily + 0173-1#02-AAU731#001 + + + + + + + + Manufacturer product family + Herstellerproduktfamilie + + TypClass + + + + + 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie + 2nd level of a 3 level manufacturer specific product hierarchy + + + + + + + SerialNumber + 0173-1#02-AAM556#002 + + + + + + + + Serial number + Seriennummer + + InstanceId + + + + + eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist + unique combination of numbers and letters used to identify the device once it has been manufactured + + + + + + + BatchNumber + 0173-1#02-AAQ196#001 + + + + + + + + Batch number + Chargen-Nummer + + ChargeId + + + + + Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge + Number assigned by the manufacturer of a material to identify the manufacturer's batch + + + + + + + ProductCountryOfOrigin + 0173-1#02-AAO841#001 + + + + + + + + Produkt Ursprungsland + Product country of origin + + CountryOfOrigin + + + + + Land in dem das Produkt hergestellt wurde (Hersteller Land) + Country in which the product is manufactured (manufacturer country) + + + + + + + YearOfConstruction + 0173-1#02-AAP906#001 + + + + + + + + Year of construction + Baujahr + + YearOfConstruction + + + + + Jahreszahl als Datumsangabe für die Fertigstellung des Objektes + Year as completion date of object + + + + + + + ProductMarking + https://www.hsu-hh.de/aut/aas/productmarking + + + + + + + + Produktkennzeichnung + Product Marking + + ProductMarking + + + + + Sammlungsdatei für Produktkennzeichnung + Collection file for product marking + + + + + + + CEQualificationPresent + 0173-1#02-BAF053#008 + + + + + + + + CE-Kennzeichnung vorhanden + CE- qualification present + + CEMarkingPresent + + + BOOLEAN + + whether CE- qualification is present + Angabe, ob CE-Kennzeichnung vorhanden ist + + + + + + + File + 0173-1#02-AAD005#008 + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Enthaltene Doku. Datei + Embedded Doc. file + + File + + + + + Verweis/ BLOB auf enthaltene Dokumentations-Datei. + Reference/ BLOB to embedded documentation file. + + + + + + + DocumentationItem + 0173-1#02-AAD001#001 + + + + + + + + Dokumentationsgruppe + Documentation item + + DocumentationItem + + + + + Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. + Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. + + + + + + + DocumentType + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + + + + + + Dokumententyp + Document Type + + DocumentType + + + + + Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) + TBD + + + + + + + VDI2770_DomainId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + + + + + + Domain-Nummer + DomainId + + DomainId + + + + + Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. + TBD + + + + + + + VDI2770_IdType + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + + + + + + Nummerntyp + IdType + + IdType + + + + + Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. + TBD + + + + + + + DocumentId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + + + + + + DocumentId + Dokumenten-Nummer + + DocumentId + + + + + Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. + TBD + + + + + + + DocumentDomainId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + + + + + + DocumentDomainId + DocumentDomainId + + DocumentDomainId + + + + + Kennung oder Kennzeichen einer Domäne + TBD + + + + + + + VDI2770_Role + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + + + + + + Rolle + Role + + Role + + + + + Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) + TBD + + + + + + + VDI2770_OrganisationId + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + + + + + + Organisation ID + Organisation ID + + OrganisationId + + + + + eindeutige ID für die Organisation + TBD + + + + + + + VDI2770_OrganisationName + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + + + + + + OrganisationName + OrganisationName + + OrganisationName + + + + + gebräuchliche Bezeichnung für die Organisation + TBD + + + + + + + VDI2770_OrganisationOfficialName + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + + + + + + Offizieller Name der Organisation + Organisation Official Name + + OrganisationOfficialName + + + + + offizieller Name der Organisation + TBD + + + + + + + VDI2770_Description + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + + + + + + Beschreibung + Description + + Description + + + + + Beschreibung für die nächste übergeordnete Collection + TBD + + + + + + + DocumentPartId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + + + + + + Dokumenten-Teilnummer + DocumentPartId + + DocumentPartId + + + + + Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. + TBD + + + + + + + DocumentClassification_ClassId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + + + + Dokumentkategorie + Document category + + DocCategory + + + + + Dokumentkategorie nach VDI 2770:2018/10 + Document category after VDI 2770:2018/10 + + + + + + + VDI2770_ClassName + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + + + + + + Klassenname + Class Name + + ClassName + + + + + Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. + TBD + + + + + + + VDI2770_ClassificationSystem + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + + + + + + Klassifizierungssystem + classification system + + ClassificationSystem + + + + + Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. + TBD + + + + + + + DocumentVersionId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + + + + + + Dokumenten-Versionsnummer + DocumentVersionId + + DocumentVersionId + + + + + Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. + TBD + + + + + + + DocumentVersion_LanguageCode + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + + + + + + Sprachenschlüssel + LanguageCode + + LanguageCode + + + + + Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 + TBD + + + + + + + VDI2770_Title + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + + + + + + Titel + Title + + VDI2770_Title + + + + + sprachabhängiger Titel des Dokuments + TBD + + + + + + + VDI2770_Summary + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + + + + + + Zusammenfassung + Summary + + Summary + + + + + sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts + TBD + + + + + + + VDI2770_Keywords + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + + + + + + Schlagwörter + Keywords + + Keywords + + + + + sprachabhängige, durch Komma getrennte Liste von Schlagwörtern + TBD + + + + + + + VDI2770_StatusValue + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + + + + + + Statuswert + StatusValue + + StatusValue + + + + + Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) + TBD + + + + + + + VDI2770_SetDate + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + + + + + + Erstellungsdatum + Set Date + + SetDate + + + + + Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). + TBD + + + + + + + VDI2770_Purpose + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + + + + + + Zweck + Purpose + + Purpose + + + + + Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. + TBD + + + + + + + VDI2770_BasedOnProcedure + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + + + + + + Prozedur + Procedure + + BasedOnProcedure + + + + + textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt + TBD + + + + + + + VDI2770_Comments + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + + + + + + Kommentar + Comments + + Comments + + + + + textuelle Bemerkungen und Anmerkungen zum Status + TBD + + + + + + + VDI2770_ReferencedObject_Type + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + + + + + + Typ + Type + + Type + + + + + Für Type des Objekts muss immer Product angegeben werden. + TBD + + + + + + + VDI2770_ReferencedObject_RefType + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + + + + + + RefType + RefType + + RefType + + + + + Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) + TBD + + + + + + + VDI2770_ReferencedObject_ObjectId + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + + + + + + ObjectId + ObjectId + + ObjectId + + + + + Angabe der Identifikationsnummer zum Objekt + TBD + + + + + + + VDI2770_FileId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + + + + + + ID der Datei + File ID + + FileId + + + + + eindeutige ID für die Datei + TBD + + + + + + + VDI2770_FileName + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + + + + + + Dateiname + File name + + FileName + + + + + Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. + TBD + + + + + + + VDI2770_FileFormat + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + + + + + + Datei Format + File format + + FileFormat + + + + + Angabe eines Media Typs gemäß der Liste der IANA + TBD + + + + + + + OrganisationContactInfo + https://www.hsu-hh.de/aut/aas/contactinfo + + + + + + + + Contact Info + Kontakt Info + + OrganisationContactInfo + + + + + Sammlung für die allgemeinen Kontaktdaten + Collection for general contact data + + + + + + + NameOfSupplier + 0173-1#02-AAO735#003 + + + + + + + + + + + + name of supplier + Lieferantenname + + name of supplier + + + + + Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt + name of supplier which provides the customer with a product or a service + + + + + + + ContactInfo_Role + https://www.hsu-hh.de/aut/aas/role + + + + + + + + Rolle + Role + + Role + + + + + Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt + Information to specify the role which the organisation of ContactInfo plays + + + + + + + Email + https://www.hsu-hh.de/aut/aas/email + + + + + + + + Emailadresse + Email address + + Email + + + + + Emailadresse + Email address + + + + + + + URL + 0173-1#02-AAO694#001 + + + + + + + + Internetadresse + Internet address + + URL + + + + + stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html + Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html + + + + + + + PhoneNumber + 0173-1#02-AAO136#002 + + + + + + + + Telefonnummer + telephone number + + Phone + + + + + vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist + complete telephone number to be called to reach a business partner + + + + + + + Fax + https://www.hsu-hh.de/aut/aas/fax + + + + + + + + Fax + Fax + + Fax + + + + + Faxnummer + Fax number + + + + + + + 0173-1#02-AAO136#002 + + + + + GLNOfManufacturer + 0173-1#02-AAY812#001 + + + + + + + + GLN of manufacturer + GLN des Herstellers + + GLN of manufacturer + + + + + international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort + internationally unique identification number for the manufacturer of the device or the product and for the physical location + + + + + + + SupplierOfTheIdentifier + 0173-1#02-AAP796#004 + + + + + + + + Supplier of the identifier + Anbieter der Identifikationsnummer für Hersteller + + Supplier of the identifier + + + STRING_TRANSLATABLE + + DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification + DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer + + + + + + + MAN_PROD_NUM + + product article number of manufacturer + + 0173-1#02-AAO676#003 + + + + + + + + product article number of manufacturer + Herstellerartikelnummer + + MAN_PROD_NUM + + + STRING_TRANSLATABLE + + eindeutiger Bestellschlüssel des Herstellers + unique product identifier of the manufacturer + + + + + + + ManufacturerProductDescription + 0173-1#02-AAU734#001 + + + + + + + + Manufacturer product description + Herstellerproduktbeschreibung + + Manufacturer product description + + + + + Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) + Description of the product, it's technical features and implementation if needed (long text) + + + + + + + GLNOfSupplier + 0173-1#02-AAY813#001 + + + + + + + + GLN of supplier + GLN des Lieferanten + + GLN of supplier + + + + + international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort + internationally unique identification number for the supplier of the device or the product and for the physical location + + + + + + + SupplierIdProvider + https://www.hsu-hh.de/aut/aas/supplieridprovider + + + + + + + + SupplierIdProvider + Anbieter der Identifikationsnummer + + SupplierIdProvider + + + STRING_TRANSLATABLE + + DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer + DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification + + + + + + + SUP_PROD_NUM + 0173-1#02-AAO736#004 + + + + + + + + product article number of supplier + Lieferantenartikelnummer + + product article number of supplier + + + + + eindeutiger Bestellschlüssel des Lieferanten + unique product order identifier of the supplier + + + + + + + SupplierProductDesignation + 0173-1#02-AAM551#002 + + + + + + + + Supplier product designation + Lieferantenproduktbezeichnung + + SupplierTypName + + + STRING_TRANSLATABLE + + Kurze Beschreibung des Produktes (Kurztext) + Short description of the product (short text) + + + + + + + SupplierProductDescription + 0173-1#02-AAU730#001 + + + + + + + + Supplier product description + Lieferantenproduktbeschreibung + + Supplier product description + + + + + Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) + Description of the product, it's technical features and implementation if needed (long text) + + + + + + + ClassificationSystem + 0173-1#02-AAO715#002 + + + + + + + + classification system + Klassifizierungssystem + + ClassificationSystem + + + + + Klassifizierungssystem + Classification System + + + + + + + SecondaryKeyTyp + https://www.hsu-hh.de/aut/aas/secondarykeytyp + + + + + + + + SecondaryKeyTyp + Typnummer des IT Systems + + SecondaryKeyTyp + + + + + Führende technische ID im IT System des Typs + SecondaryKeyTyp + + + + + + + TypThumbnail + www.company.com/ids/cd/4401_1272_7091_3437 + + + + + + + + TypThumbnail + Vorschaubild + + TypThumbnail + + + + + Darstellung des Produkttyps in kleinem Format + Small picture of the product type + + + + + + + AssetId + https://www.hsu-hh.de/aut/aas/assetid + + + + + + + + AssetId + Asset ID + + AssetId + + + + + Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. + Global unique ID of an asset, which can be read by both human and machine. + + + + + + + SecondaryKeyInstance + https://www.hsu-hh.de/aut/aas/secondarykeyinstance + + + + + + + + SecondaryKeyInstance + Instanznummer des IT Systems + + SecondaryKeyInstance + + + + + Führende technische ID im IT System der Instanz + SecondaryKeyInstance + + + + + + + DateOfManufacture + 0173-1#02-AAR972#002 + + + + + + + + Date of manufacture + Herstellungsdatum + + Date of manufacture + + + DATE + + Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist + Date from which the production and / or development process is completed or from which a service is provided completely + + + + + + + DeviceRevision + https://www.hsu-hh.de/aut/aas/devicerevision + + + + + + + + DeviceRevision + DeviceRevision + + DeviceRevision + + + + + DeviceRevision + DeviceRevision + + + + + + + SoftwareRevision + https://www.hsu-hh.de/aut/aas/softwarerevision + + + + + + + + SoftwareRevision + SoftwareRevision + + SoftwareRevision + + + + + SoftwareRevision + SoftwareRevision + + + + + + + HardwareRevision + https://www.hsu-hh.de/aut/aas/hardwarerevision + + + + + + + + HardwareRevision + HardwareRevision + + HardwareRevision + + + + + HardwareRevision + HardwareRevision + + + + + + + QrCode + https://www.hsu-hh.de/aut/aas/qrcode + + + + + + + + QrCode + QrCode + + QrCode + + + + + In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. + QrCode + + + + + + + CompanyLogo + https://www.hsu-hh.de/aut/aas/companylogo + + + + + + + + Firmenlogo + CompanyLogo + + CompanyLogo + + + + + Firmenlogo + CompanyLogo + + + + + + + MaxTraversePath + http://boschrexroth.com/cds/lt/MaxTraversePath + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Max. Verfahrweg (mm) + Max. traverse path (mm) + + MaxTraversePath + mm + + + 0173-1#05-AAA480#003 + + + + smax_mm + REAL_MEASURE + + + + + + + FormFeedConstant + http://boschrexroth.com/cds/lt/FormFeedConstant + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Vorschubkonstante (mm/U) + Form feed constant (mm/U) + + FormFeedConstant + mm/U + + + + + u_mmpU + REAL_MEASURE + + + + + + + MaxPermissibleSpeed + http://boschrexroth.com/cds/lt/MaxPermissibleSpeed + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Maximal zulässige Geschwindigkeit (m/s) + Maximum permissible speed (m/s) + + MaxPermissibleSpeed + m/s + + + 0173-1#05-AAA434#003 + + + + vmax_mps + REAL_MEASURE + + + + + + + MaxPermissibleAcceleration + http://boschrexroth.com/cds/lt/MaxPermissibleAcceleration + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Maximal zulässige Beschleunigung (m/s²) + Maximum permissible acceleration (m/s²) + + MaxPermissibleAcceleration + m/s² + + + 0173-1#05-AAA597#003 + + + + amax_mps2 + REAL_MEASURE + + + + + + + MaxPermissibleTorque + http://boschrexroth.com/cds/lt/MaxPermissibleTorque + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Maximal zulässiges Drehmoment (Nm) + Maximum permissible torque (Nm) + + MaxPermissibleTorque + Nm + + + + + M1max_Nm + REAL_MEASURE + + + + + + + RotationDirectionPositiveMovement + http://boschrexroth.com/cds/lt/RotationDirectionPositiveMovement + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Drehrichtung für positive Fahrrichtung (weg vom Motor) + Rotation direction for positive movement + + RotationDirectionPositiveMovement + + + + + + d + STRING + + + + + + + GearTransmissionRatio + http://boschrexroth.com/cds/lt/GearTransmissionRatio + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Getriebeübersetzung + Gear transmission ratio + + GearTransmissionRatio + + + + + + i + REAL_MEASURE + + + + + + + CEQualificationPresent + 0173-1#02-BAF053#008 + + + + + + + + CE-Kennzeichnung vorhanden + CE- qualification present + + CEMarkingPresent + + + BOOLEAN + + whether CE- qualification is present + Angabe, ob CE-Kennzeichnung vorhanden ist + + + + + + + ProductMarking + https://www.hsu-hh.de/aut/aas/productmarking + + + + + + + + Produktkennzeichnung + Product Marking + + ProductMarking + + + + + Sammlungsdatei für Produktkennzeichnung + Collection file for product marking + + + + + + + \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/05_Bosch.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/05_Bosch.aasx.xml new file mode 100644 index 000000000..ebf6a52ff --- /dev/null +++ b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/05_Bosch.aasx.xml @@ -0,0 +1,6177 @@ + + + + + Bosch_CompactModuleToothedBeltDrive + http://boschrexroth.com/shells/R036447000/1005625831070001 + + + http://dc-qr.com?m=R036447000&s=1005625831070001 + + + + + + http://boschrexroth.com/shells/R036447000/1005625831070001/submodels/nameplate/ + + + + + http://boschrexroth.com/shells/R036447000/1005625831070001/submodels/document/ + + + + + http://boschrexroth.com/shells/R036447000/1005625831070001/submodels/service/ + + + + + http://boschrexroth.com/shells/R036447000/1005625831070001/submodels/identification/ + + + + + http://boschrexroth.com/shells/R036447000/1005625831070001/submodels/technicalSpecification/ + + + + + + + + + MR036447000_S1005625831070001 + http://dc-qr.com?m=R036447000&s=1005625831070001 + Instance + + + + + Nameplate + http://boschrexroth.com/shells/R036447000/1005625831070001/submodels/nameplate/ + + + https://www.hsu-hh.de/aut/aas/nameplate + + + Instance + + + + + ManufacturerName + PARAMETER + + + 0173-1#02-AAO677#002 + + + Instance + + string + Bosch Rexroth AG + + + + + ManufacturerProductDesignation + PARAMETER + + + 0173-1#02-AAW338#001 + + + Instance + + string + Compact Module with toothed belt drive (CKR) + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Zum Eisengießer 1 + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 97816 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Lohr am Main + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Bayern + + + + false + false + + + + + ManufacturerProductFamily + PARAMETER + + + 0173-1#02-AAU731#001 + + + Instance + + string + Compact Module + + + + + SerialNumber + PARAMETER + + + 0173-1#02-AAM556#002 + + + Instance + + string + 1005625831070001 + + + + + BatchNumber + PARAMETER + + + 0173-1#02-AAQ196#001 + + + Instance + + + + + + + + ProductCountryOfOrigin + PARAMETER + + + 0173-1#02-AAO841#001 + + + Instance + + string + DE + + + + + YearOfConstruction + PARAMETER + + + 0173-1#02-AAP906#001 + + + Instance + + string + 2019 + + + + + Marking_CE + PARAMETER + + + https://www.hsu-hh.de/aut/aas/productmarking + + + Instance + + + + + CEQualificationPresent + PARAMETER + + + 0173-1#02-BAF053#008 + + + Instance + + boolean + 1 + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + image/png + /aasx/Nameplate/marking_ce.png + + + + false + false + + + + + + Service + http://boschrexroth.com/shells/R036447000/1005625831070001/submodels/service/ + + + https://www.hsu-hh.de/aut/aas/service + + + Instance + + + + + ContactInfo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/contactinfo + + + Instance + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + Bosch Rexroth AG Linear Motion Technologies + + + + + ContactInfo_Role + PARAMETER + + + https://www.hsu-hh.de/aut/aas/role + + + Instance + + string + Manufacturer + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Röntgenstraße 5 + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 97424 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Schweinfurt + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Bayern + + + + false + false + + + + + Email + PARAMETER + + + https://www.hsu-hh.de/aut/aas/email + + + Instance + + string + service.lt@boschrexroth.de + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://www.boschrexroth.com/en/xc/products/product-groups/linear-motion-technology/service-linear-motion-technology + + + + + PhoneNumber + PARAMETER + + + 0173-1#02-AAO136#002 + + + Instance + + string + +49 9721 937 8617 + + + + false + false + + + + + + Identification + http://boschrexroth.com/shells/R036447000/1005625831070001/submodels/identification/ + + + https://www.hsu-hh.de/aut/aas/identification + + + Instance + + + + + ManufacturerName + PARAMETER + + + 0173-1#02-AAO677#002 + + + Instance + + string + Bosch Rexroth AG + + + + + GLNOfManufacturer + PARAMETER + + + 0173-1#02-AAY812#001 + + + Instance + + string + 4048118000006 + + + + + SupplierOfTheIdentifier + + + 0173-1#02-AAP796#004 + + + Instance + + string + GLN GS1 + + + + + MAN_PROD_NUM + + + 0173-1#02-AAO676#003 + + + Instance + + string + R036447000 + + + + + ManufacturerProductDesignation + PARAMETER + + + 0173-1#02-AAW338#001 + + + Instance + + string + CKR-110-NN-1 + + + + + ManufacturerProductDescription + PARAMETER + + + 0173-1#02-AAU734#001 + + + Instance + + langString + Compact Modules with toothed belt drive (CKR) + + + + + ManufacturerProductFamily + PARAMETER + + + 0173-1#02-AAU731#001 + + + Instance + + string + Compact Module + + + + + ClassificationSystem + PARAMETER + + + 0173-1#02-AAO715#002 + + + Instance + + string + eCl@ss + + + + + SecondaryKeyTyp + + + https://www.hsu-hh.de/aut/aas/secondarykeytyp + + + Instance + + + + + + + + TypThumbnail + PARAMETER + + + www.company.com/ids/cd/4401_1272_7091_3437 + + + Instance + + image/jpeg + /CKR.jpg + + + + + AssetId + PARAMETER + + + https://www.hsu-hh.de/aut/aas/assetid + + + Instance + + string + http://dc-qr.com?m=R036447000&s=1005625831070001 + + + + + SerialNumber + PARAMETER + + + 0173-1#02-AAM556#002 + + + Instance + + string + 1005625831070001 + + + + + BatchNumber + PARAMETER + + + 0173-1#02-AAQ196#001 + + + Instance + + + + + + + + SecondaryKeyInstance + PARAMETER + + + https://www.hsu-hh.de/aut/aas/secondarykeyinstance + + + Instance + + + + + + + + DateOfManufacture + PARAMETER + + + 0173-1#02-AAR972#002 + + + Instance + + + 2019 + + + + + DeviceRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/devicerevision + + + Instance + + + + + + + + SoftwareRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/softwarerevision + + + Instance + + + + + + + + HardwareRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/hardwarerevision + + + Instance + + + + + + + + ContactInfo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/contactinfo + + + Instance + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + Bosch Rexroth AG + + + + + ContactInfo_Role + PARAMETER + + + https://www.hsu-hh.de/aut/aas/role + + + Instance + + string + Manufacturer + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Zum Eisengießer 1 + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 97816 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Lohr am Main + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Bayern + + + + false + false + + + + + Email + PARAMETER + + + https://www.hsu-hh.de/aut/aas/email + + + Instance + + string + service@boschrexroth.de + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://www.boschrexroth.com/de/de/home/index + + + + + PhoneNumber + PARAMETER + + + 0173-1#02-AAO136#002 + + + Instance + + string + +499352405060 + + + + + Fax + PARAMETER + + + https://www.hsu-hh.de/aut/aas/fax + + + Instance + + string + + + + + false + false + + + + + CompanyLogo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/companylogo + + + Instance + + image/png + /aasx/Identification/logo.png + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + http://dc-qr.com?m=R036447000&s=1005625831070001 + + + + + + TechnicalSpecification + http://boschrexroth.com/shells/R036447000/1005625831070001/submodels/technicalSpecification/ + + + https://www.hsu-hh.de/aut/aas/technicalspecification + + + Instance + + + + + MaxTraversePath + PARAMETER + + + + http://boschrexroth.com/cds/lt/maxTraversePath + + + Instance + + float + 280 + + + + + FormFeedConstant + PARAMETER + + + + http://boschrexroth.com/cds/lt/formFeedConstant + + + Instance + + float + 120,00 + + + + + MaxPermissibleSpeed + PARAMETER + + + + http://boschrexroth.com/cds/lt/maxPermissibleSpeed + + + Instance + + float + 2,00 + + + + + MaxPermissibleAcceleration + PARAMETER + + + + http://boschrexroth.com/cds/lt/maxPermissibleAcceleration + + + Instance + + float + 50,00 + + + + + MaxPermissibleTorque + PARAMETER + + + + http://boschrexroth.com/cds/lt/maxPermissibleTorque + + + Instance + + float + 1,30 + + + + + RotationDirectionPositiveMovement + PARAMETER + + + + http://boschrexroth.com/cds/lt/RotationDirectionPositiveMovement + + + Instance + + string + CCW + + + + + GearTransmissionRatio + PARAMETER + + + + http://boschrexroth.com/cds/lt/GearTransmissionRatio + + + Instance + + float + 10,00 + + + + + + Document + http://boschrexroth.com/shells/R036447000/1005625831070001/submodels/document/ + + + https://www.hsu-hh.de/aut/aas/document + + + Instance + + + + + Doku_Schmierung_CKx_V01_R320103051_2017_03 + PARAMETER + + + + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + R320103051 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-02 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Bedienung (DE) Operating Instructions (EN) + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + 2017-03 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + de/en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Erweiterungsdokumentation Schmierung CKK und CRK (DE) / Extension instructions lubrication of CKK and CKR (EN) + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + Doku_Schmierung_CKx_V01_R320103051_2017_03.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/Doku_Schmierung_CKx_V01_R320103051_2017_03.pdf + + + + false + false + + + + + R320103141_2015_06_Einbauerklaerung_einachsig + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + R320103141 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-02 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Bedienung (DE) Operating Instructions (EN) + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + 2015-06 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + de/en/es/fr/it/pt/bg/cs/da/et/el/fi/ga/hu/is/lt/lv/mt/nl/no/pl/ro/sk/sl/sv/tr + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Einbauerklärung für einachsige Linearsysteme + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + R320103141_2015_06_Einbauerklaerung_einachsig.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/R320103141_2015_06_Einbauerklaerung_einachsig.pdf + + + + false + false + + + + + R320103152_2015_01_DE_Safety_LS_Media_22_01_2015 + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + R320103152 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-03 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Allgemeine Sicherheit (DE) General Security (EN) + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + 2015-01 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + de + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Sicherheitshinweise für Linearsysteme + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + R320103152_2015_01_DE_Safety_LS_Media_22_01_2015.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/R320103152_2015_01_DE_Safety_LS_Media_22_01_2015.pdf + + + + false + false + + + + + R320103152_2015_01_EN_Safety_LS_22_01_2015_web + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + R320103152 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-03 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Allgemeine Sicherheit (DE) General Security (EN) + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + 2015-01 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Safety Instructions for Linear Motion Systems + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + R320103152_2015_01_EN_Safety_LS_22_01_2015_web.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/R320103152_2015_01_EN_Safety_LS_22_01_2015_web.pdf + + + + false + false + + + + + R999000479_2019_03_DE_18_07_2019_CKx + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + R999000479 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-02 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Bedienung (DE) Operating Instructions (EN) + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + 2019-03 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + de + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Compactmodule CKK / CKR + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + R999000479_2019_03_DE_18_07_2019_CKx.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/R999000479_2019_03_DE_18_07_2019_CKx.pdf + + + + false + false + + + + + R999000499_2019_03_EN_18_07_2019_CKx + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + R999000499 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-02 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Bedienung (DE) Operating Instructions (EN) + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + 2019-03 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Compact Modules CKK / CKR + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + R999000499_2019_03_EN_18_07_2019_CKx_(1).pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/R999000499_2019_03_EN_18_07_2019_CKx_(1).pdf + + + + false + false + + + + + + + + ManufacturerName + 0173-1#02-AAO677#002 + + + + + + + + Herstellername + Manufacturer Name + + Manufacturer Name + + + + + Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist + 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 + + + + + + + ManufacturerProductDesignation + 0173-1#02-AAW338#001 + + + + + + + + Manufacturer product designation + Herstellerproduktbezeichnung + + ManufacturerTypName + + + STRING_TRANSLATABLE + + Kurze Beschreibung des Produktes (Kurztext) + Short description of the product (short text) + + + + + + + PhysicalAddress + https://www.hsu-hh.de/aut/aas/physicaladdress + + + + + + + + PhysicalAddress + Physische Adresse + + PhysicalAddress + + + + + Sammlung für reale physische Adresse + Collection for real physical address + + + + + + + CountryCode + 0173-1#02-AAO730#001 + + + + + + + + + + + + Landeskennung + Country code + + Country code + + + + + Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes + agreed upon symbol for unambiguous identification of a country + + + + + + + Street + 0173-1#02-AAO128#001 + + + + + + + + Strasse + Street + + Street + + + + + Name der Strasse und Hausnummer + Street name and house number + + + + + + + Zip + 0173-1#02-AAO129#002 + + + + + + + + Zip + Postleitzahl + + PostalCode + + + + + ZIP code of address + Postleitzahl der Anschrift + + + + + + + CityTown + 0173-1#02-AAO132#001 + + + + + + + + Ort + City/town + + City/town + + + + + Town or city of the company + Ortsangabe + + + + + + + StateCounty + 0173-1#02-AAO133#002 + + + + + + + + state/county + Bundesland + + StateCounty + + + + + Bundesland + state/county + + + + + + + ManufacturerProductFamily + 0173-1#02-AAU731#001 + + + + + + + + Manufacturer product family + Herstellerproduktfamilie + + TypClass + + + + + 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie + 2nd level of a 3 level manufacturer specific product hierarchy + + + + + + + SerialNumber + 0173-1#02-AAM556#002 + + + + + + + + Serial number + Seriennummer + + InstanceId + + + + + eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist + unique combination of numbers and letters used to identify the device once it has been manufactured + + + + + + + BatchNumber + 0173-1#02-AAQ196#001 + + + + + + + + Batch number + Chargen-Nummer + + ChargeId + + + + + Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge + Number assigned by the manufacturer of a material to identify the manufacturer's batch + + + + + + + ProductCountryOfOrigin + 0173-1#02-AAO841#001 + + + + + + + + Produkt Ursprungsland + Product country of origin + + CountryOfOrigin + + + + + Land in dem das Produkt hergestellt wurde (Hersteller Land) + Country in which the product is manufactured (manufacturer country) + + + + + + + YearOfConstruction + 0173-1#02-AAP906#001 + + + + + + + + Year of construction + Baujahr + + YearOfConstruction + + + + + Jahreszahl als Datumsangabe für die Fertigstellung des Objektes + Year as completion date of object + + + + + + + ProductMarking + https://www.hsu-hh.de/aut/aas/productmarking + + + + + + + + Produktkennzeichnung + Product Marking + + ProductMarking + + + + + Sammlungsdatei für Produktkennzeichnung + Collection file for product marking + + + + + + + CEQualificationPresent + 0173-1#02-BAF053#008 + + + + + + + + CE-Kennzeichnung vorhanden + CE- qualification present + + CEMarkingPresent + + + BOOLEAN + + whether CE- qualification is present + Angabe, ob CE-Kennzeichnung vorhanden ist + + + + + + + File + 0173-1#02-AAD005#008 + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Enthaltene Doku. Datei + Embedded Doc. file + + File + + + + + Verweis/ BLOB auf enthaltene Dokumentations-Datei. + Reference/ BLOB to embedded documentation file. + + + + + + + DocumentationItem + + + + + + + + + Dokumentationsgruppe + Documentation item + + DocumentationItem + + + + + Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. + Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. + + + + + + + DocumentType + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + + + + + + Dokumententyp + Document Type + + DocumentType + + + + + Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) + TBD + + + + + + + VDI2770_DomainId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + + + + + + Domain-Nummer + DomainId + + DomainId + + + + + Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. + TBD + + + + + + + VDI2770_IdType + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + + + + + + Nummerntyp + IdType + + IdType + + + + + Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. + TBD + + + + + + + DocumentId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + + + + + + DocumentId + Dokumenten-Nummer + + DocumentId + + + + + Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. + TBD + + + + + + + DocumentDomainId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + + + + + + DocumentDomainId + DocumentDomainId + + DocumentDomainId + + + + + Kennung oder Kennzeichen einer Domäne + TBD + + + + + + + VDI2770_Role + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + + + + + + Rolle + Role + + Role + + + + + Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) + TBD + + + + + + + VDI2770_OrganisationId + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + + + + + + Organisation ID + Organisation ID + + OrganisationId + + + + + eindeutige ID für die Organisation + TBD + + + + + + + VDI2770_OrganisationName + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + + + + + + OrganisationName + OrganisationName + + OrganisationName + + + + + gebräuchliche Bezeichnung für die Organisation + TBD + + + + + + + VDI2770_OrganisationOfficialName + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + + + + + + Offizieller Name der Organisation + Organisation Official Name + + OrganisationOfficialName + + + + + offizieller Name der Organisation + TBD + + + + + + + VDI2770_Description + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + + + + + + Beschreibung + Description + + Description + + + + + Beschreibung für die nächste übergeordnete Collection + TBD + + + + + + + DocumentPartId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + + + + + + Dokumenten-Teilnummer + DocumentPartId + + DocumentPartId + + + + + Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. + TBD + + + + + + + DocumentClassification_ClassId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + + + + Dokumentkategorie + Document category + + DocCategory + + + + + Dokumentkategorie nach VDI 2770:2018/10 + Document category after VDI 2770:2018/10 + + + + + + + VDI2770_ClassName + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + + + + + + Klassenname + Class Name + + ClassName + + + + + Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. + TBD + + + + + + + VDI2770_ClassificationSystem + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + + + + + + Klassifizierungssystem + classification system + + ClassificationSystem + + + + + Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. + TBD + + + + + + + DocumentVersionId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + + + + + + Dokumenten-Versionsnummer + DocumentVersionId + + DocumentVersionId + + + + + Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. + TBD + + + + + + + DocumentVersion_LanguageCode + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + + + + + + Sprachenschlüssel + LanguageCode + + LanguageCode + + + + + Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 + TBD + + + + + + + VDI2770_Title + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + + + + + + Titel + Title + + VDI2770_Title + + + + + sprachabhängiger Titel des Dokuments + TBD + + + + + + + VDI2770_Summary + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + + + + + + Zusammenfassung + Summary + + Summary + + + + + sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts + TBD + + + + + + + VDI2770_Keywords + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + + + + + + Schlagwörter + Keywords + + Keywords + + + + + sprachabhängige, durch Komma getrennte Liste von Schlagwörtern + TBD + + + + + + + VDI2770_StatusValue + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + + + + + + Statuswert + StatusValue + + StatusValue + + + + + Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) + TBD + + + + + + + VDI2770_SetDate + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + + + + + + Erstellungsdatum + Set Date + + SetDate + + + + + Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). + TBD + + + + + + + VDI2770_Purpose + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + + + + + + Zweck + Purpose + + Purpose + + + + + Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. + TBD + + + + + + + VDI2770_BasedOnProcedure + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + + + + + + Prozedur + Procedure + + BasedOnProcedure + + + + + textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt + TBD + + + + + + + VDI2770_Comments + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + + + + + + Kommentar + Comments + + Comments + + + + + textuelle Bemerkungen und Anmerkungen zum Status + TBD + + + + + + + VDI2770_ReferencedObject_Type + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + + + + + + Typ + Type + + Type + + + + + Für Type des Objekts muss immer Product angegeben werden. + TBD + + + + + + + VDI2770_ReferencedObject_RefType + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + + + + + + RefType + RefType + + RefType + + + + + Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) + TBD + + + + + + + VDI2770_ReferencedObject_ObjectId + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + + + + + + ObjectId + ObjectId + + ObjectId + + + + + Angabe der Identifikationsnummer zum Objekt + TBD + + + + + + + VDI2770_FileId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + + + + + + ID der Datei + File ID + + FileId + + + + + eindeutige ID für die Datei + TBD + + + + + + + VDI2770_FileName + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + + + + + + Dateiname + File name + + FileName + + + + + Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. + TBD + + + + + + + VDI2770_FileFormat + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + + + + + + Datei Format + File format + + FileFormat + + + + + Angabe eines Media Typs gemäß der Liste der IANA + TBD + + + + + + + OrganisationContactInfo + https://www.hsu-hh.de/aut/aas/contactinfo + + + + + + + + Contact Info + Kontakt Info + + OrganisationContactInfo + + + + + Sammlung für die allgemeinen Kontaktdaten + Collection for general contact data + + + + + + + NameOfSupplier + 0173-1#02-AAO735#003 + + + + + + + + + + + + name of supplier + Lieferantenname + + name of supplier + + + + + Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt + name of supplier which provides the customer with a product or a service + + + + + + + ContactInfo_Role + https://www.hsu-hh.de/aut/aas/role + + + + + + + + Rolle + Role + + Role + + + + + Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt + Information to specify the role which the organisation of ContactInfo plays + + + + + + + Email + https://www.hsu-hh.de/aut/aas/email + + + + + + + + Emailadresse + Email address + + Email + + + + + Emailadresse + Email address + + + + + + + URL + 0173-1#02-AAO694#001 + + + + + + + + Internetadresse + Internet address + + URL + + + + + stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html + Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html + + + + + + + PhoneNumber + 0173-1#02-AAO136#002 + + + + + + + + Telefonnummer + telephone number + + Phone + + + + + vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist + complete telephone number to be called to reach a business partner + + + + + + + Fax + https://www.hsu-hh.de/aut/aas/fax + + + + + + + + Fax + Fax + + Fax + + + + + Faxnummer + Fax number + + + + + + + 0173-1#02-AAO136#002 + + + + + GLNOfManufacturer + 0173-1#02-AAY812#001 + + + + + + + + GLN of manufacturer + GLN des Herstellers + + GLN of manufacturer + + + + + international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort + internationally unique identification number for the manufacturer of the device or the product and for the physical location + + + + + + + SupplierOfTheIdentifier + 0173-1#02-AAP796#004 + + + + + + + + Supplier of the identifier + Anbieter der Identifikationsnummer für Hersteller + + Supplier of the identifier + + + STRING_TRANSLATABLE + + DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification + DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer + + + + + + + MAN_PROD_NUM + + product article number of manufacturer + + 0173-1#02-AAO676#003 + + + + + + + + product article number of manufacturer + Herstellerartikelnummer + + MAN_PROD_NUM + + + STRING_TRANSLATABLE + + eindeutiger Bestellschlüssel des Herstellers + unique product identifier of the manufacturer + + + + + + + ManufacturerProductDescription + 0173-1#02-AAU734#001 + + + + + + + + Manufacturer product description + Herstellerproduktbeschreibung + + Manufacturer product description + + + + + Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) + Description of the product, it's technical features and implementation if needed (long text) + + + + + + + GLNOfSupplier + 0173-1#02-AAY813#001 + + + + + + + + GLN of supplier + GLN des Lieferanten + + GLN of supplier + + + + + international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort + internationally unique identification number for the supplier of the device or the product and for the physical location + + + + + + + SupplierIdProvider + https://www.hsu-hh.de/aut/aas/supplieridprovider + + + + + + + + SupplierIdProvider + Anbieter der Identifikationsnummer + + SupplierIdProvider + + + STRING_TRANSLATABLE + + DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer + DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification + + + + + + + SUP_PROD_NUM + 0173-1#02-AAO736#004 + + + + + + + + product article number of supplier + Lieferantenartikelnummer + + product article number of supplier + + + + + eindeutiger Bestellschlüssel des Lieferanten + unique product order identifier of the supplier + + + + + + + SupplierProductDesignation + 0173-1#02-AAM551#002 + + + + + + + + Supplier product designation + Lieferantenproduktbezeichnung + + SupplierTypName + + + STRING_TRANSLATABLE + + Kurze Beschreibung des Produktes (Kurztext) + Short description of the product (short text) + + + + + + + SupplierProductDescription + 0173-1#02-AAU730#001 + + + + + + + + Supplier product description + Lieferantenproduktbeschreibung + + Supplier product description + + + + + Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) + Description of the product, it's technical features and implementation if needed (long text) + + + + + + + ClassificationSystem + 0173-1#02-AAO715#002 + + + + + + + + classification system + Klassifizierungssystem + + ClassificationSystem + + + + + Klassifizierungssystem + Classification System + + + + + + + SecondaryKeyTyp + https://www.hsu-hh.de/aut/aas/secondarykeytyp + + + + + + + + SecondaryKeyTyp + Typnummer des IT Systems + + SecondaryKeyTyp + + + + + Führende technische ID im IT System des Typs + SecondaryKeyTyp + + + + + + + TypThumbnail + www.company.com/ids/cd/4401_1272_7091_3437 + + + + + + + + TypThumbnail + Vorschaubild + + TypThumbnail + + + + + Darstellung des Produkttyps in kleinem Format + Small picture of the product type + + + + + + + AssetId + https://www.hsu-hh.de/aut/aas/assetid + + + + + + + + AssetId + Asset ID + + AssetId + + + + + Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. + Global unique ID of an asset, which can be read by both human and machine. + + + + + + + SecondaryKeyInstance + https://www.hsu-hh.de/aut/aas/secondarykeyinstance + + + + + + + + SecondaryKeyInstance + Instanznummer des IT Systems + + SecondaryKeyInstance + + + + + Führende technische ID im IT System der Instanz + SecondaryKeyInstance + + + + + + + DateOfManufacture + 0173-1#02-AAR972#002 + + + + + + + + Date of manufacture + Herstellungsdatum + + Date of manufacture + + + DATE + + Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist + Date from which the production and / or development process is completed or from which a service is provided completely + + + + + + + DeviceRevision + https://www.hsu-hh.de/aut/aas/devicerevision + + + + + + + + DeviceRevision + DeviceRevision + + DeviceRevision + + + + + DeviceRevision + DeviceRevision + + + + + + + SoftwareRevision + https://www.hsu-hh.de/aut/aas/softwarerevision + + + + + + + + SoftwareRevision + SoftwareRevision + + SoftwareRevision + + + + + SoftwareRevision + SoftwareRevision + + + + + + + HardwareRevision + https://www.hsu-hh.de/aut/aas/hardwarerevision + + + + + + + + HardwareRevision + HardwareRevision + + HardwareRevision + + + + + HardwareRevision + HardwareRevision + + + + + + + QrCode + https://www.hsu-hh.de/aut/aas/qrcode + + + + + + + + QrCode + QrCode + + QrCode + + + + + In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. + QrCode + + + + + + + CompanyLogo + https://www.hsu-hh.de/aut/aas/companylogo + + + + + + + + Firmenlogo + CompanyLogo + + CompanyLogo + + + + + Firmenlogo + CompanyLogo + + + + + + + MaxTraversePath + http://boschrexroth.com/cds/lt/MaxTraversePath + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Max. Verfahrweg (mm) + Max. traverse path (mm) + + MaxTraversePath + mm + + + 0173-1#05-AAA480#003 + + + + smax_mm + REAL_MEASURE + + + + + + + FormFeedConstant + http://boschrexroth.com/cds/lt/FormFeedConstant + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Vorschubkonstante (mm/U) + Form feed constant (mm/U) + + FormFeedConstant + mm/U + + + + + u_mmpU + REAL_MEASURE + + + + + + + MaxPermissibleSpeed + http://boschrexroth.com/cds/lt/MaxPermissibleSpeed + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Maximal zulässige Geschwindigkeit (m/s) + Maximum permissible speed (m/s) + + MaxPermissibleSpeed + m/s + + + 0173-1#05-AAA434#003 + + + + vmax_mps + REAL_MEASURE + + + + + + + MaxPermissibleAcceleration + http://boschrexroth.com/cds/lt/MaxPermissibleAcceleration + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Maximal zulässige Beschleunigung (m/s²) + Maximum permissible acceleration (m/s²) + + MaxPermissibleAcceleration + m/s² + + + 0173-1#05-AAA597#003 + + + + amax_mps2 + REAL_MEASURE + + + + + + + MaxPermissibleTorque + http://boschrexroth.com/cds/lt/MaxPermissibleTorque + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Maximal zulässiges Drehmoment (Nm) + Maximum permissible torque (Nm) + + MaxPermissibleTorque + Nm + + + + + M1max_Nm + REAL_MEASURE + + + + + + + RotationDirectionPositiveMovement + http://boschrexroth.com/cds/lt/RotationDirectionPositiveMovement + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Drehrichtung für positive Fahrrichtung (weg vom Motor) + Rotation direction for positive movement + + RotationDirectionPositiveMovement + + + + + + d + STRING + + + + + + + GearTransmissionRatio + http://boschrexroth.com/cds/lt/GearTransmissionRatio + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Getriebeübersetzung + Gear transmission ratio + + GearTransmissionRatio + + + + + + i + REAL_MEASURE + + + + + + + DocumentationItem + 0173-1#02-AAD001#001 + + + + + + + + Dokumentationsgruppe + Documentation item + + DocumentationItem + + + + + Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. + Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. + + + + + + + \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/06_Bosch.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/06_Bosch.aasx.xml new file mode 100644 index 000000000..067ccce55 --- /dev/null +++ b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/06_Bosch.aasx.xml @@ -0,0 +1,6640 @@ + + + + + Bosch_PrecisionModulePSK + http://boschrexroth.com/shells/R055732577/1012160102010001 + + + http://dc-qr.com?m=R055732577&t=PSK-060-NN-1&s=1012160102010001 + + + + + + http://boschrexroth.com/shells/R055732577/1012160102010001/submodels/nameplate/ + + + + + http://boschrexroth.com/shells/R055732577/1012160102010001/submodels/document/ + + + + + http://boschrexroth.com/shells/R055732577/1012160102010001/submodels/service/ + + + + + http://boschrexroth.com/shells/R055732577/1012160102010001/submodels/identification/ + + + + + http://boschrexroth.com/shells/R055732577/1012160102010001/submodels/technicalSpecification/ + + + + + + + + + MR055732577_S1012160102010001 + http://dc-qr.com?m=R055732577&t=PSK-060-NN-1&s=1012160102010001 + Instance + + + + + Nameplate + http://boschrexroth.com/shells/R055732577/1012160102010001/submodels/nameplate/ + + + https://www.hsu-hh.de/aut/aas/nameplate + + + Instance + + + + + ManufacturerName + PARAMETER + + + 0173-1#02-AAO677#002 + + + Instance + + string + Bosch Rexroth AG + + + + + ManufacturerProductDesignation + PARAMETER + + + 0173-1#02-AAW338#001 + + + Instance + + string + Precision Module PSK + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Zum Eisengießer 1 + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 97816 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Lohr am Main + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Bayern + + + + false + false + + + + + ManufacturerProductFamily + PARAMETER + + + 0173-1#02-AAU731#001 + + + Instance + + string + Precision Module PSK + + + + + SerialNumber + PARAMETER + + + 0173-1#02-AAM556#002 + + + Instance + + string + 1012160102010001 + + + + + BatchNumber + PARAMETER + + + 0173-1#02-AAQ196#001 + + + Instance + + + + + + + + ProductCountryOfOrigin + PARAMETER + + + 0173-1#02-AAO841#001 + + + Instance + + string + DE + + + + + YearOfConstruction + PARAMETER + + + 0173-1#02-AAP906#001 + + + Instance + + string + 2019 + + + + + Marking_CE + PARAMETER + + + https://www.hsu-hh.de/aut/aas/productmarking + + + Instance + + + + + CEQualificationPresent + PARAMETER + + + 0173-1#02-BAF053#008 + + + Instance + + boolean + 1 + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + image/png + /aasx/Nameplate/marking_ce.png + + + + false + false + + + + + + Service + http://boschrexroth.com/shells/R055732577/1012160102010001/submodels/service/ + + + https://www.hsu-hh.de/aut/aas/service + + + Instance + + + + + ContactInfo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/contactinfo + + + Instance + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + Bosch Rexroth AG Service Linear Motion Technologies + + + + + ContactInfo_Role + PARAMETER + + + https://www.hsu-hh.de/aut/aas/role + + + Instance + + string + Manufacturer + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Röntgenstraße 5 + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 97424 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Schweinfurt + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Bayern + + + + false + false + + + + + Email + PARAMETER + + + https://www.hsu-hh.de/aut/aas/email + + + Instance + + string + service.lt@boschrexroth.de + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://www.boschrexroth.com/en/xc/products/product-groups/linear-motion-technology/service-linear-motion-technology + + + + + PhoneNumber + PARAMETER + + + 0173-1#02-AAO136#002 + + + Instance + + string + +49 9721 937 8617 + + + + false + false + + + + + + Identification + http://boschrexroth.com/shells/R055732577/1012160102010001/submodels/identification/ + + + https://www.hsu-hh.de/aut/aas/identification + + + Instance + + + + + ManufacturerName + PARAMETER + + + 0173-1#02-AAO677#002 + + + Instance + + string + Bosch Rexroth AG + + + + + GLNOfManufacturer + PARAMETER + + + 0173-1#02-AAY812#001 + + + Instance + + string + 4048118000006 + + + + + SupplierOfTheIdentifier + + + 0173-1#02-AAP796#004 + + + Instance + + string + GLN GS1 + + + + + MAN_PROD_NUM + + + 0173-1#02-AAO676#003 + + + Instance + + string + PSK-060-NN-1 + + + + + ManufacturerProductDesignation + PARAMETER + + + 0173-1#02-AAW338#001 + + + Instance + + string + Precision Module + + + + + ManufacturerProductDescription + PARAMETER + + + 0173-1#02-AAU734#001 + + + Instance + + langString + Precision Module + Integrated Ball Rail System + Precision Ball Screw Assembly + + + + + ManufacturerProductFamily + PARAMETER + + + 0173-1#02-AAU731#001 + + + Instance + + string + Linear motion system + + + + + ClassificationSystem + PARAMETER + + + 0173-1#02-AAO715#002 + + + Instance + + string + eCl@ss + + + + + SecondaryKeyTyp + + + https://www.hsu-hh.de/aut/aas/secondarykeytyp + + + Instance + + + + + + + + TypThumbnail + PARAMETER + + + www.company.com/ids/cd/4401_1272_7091_3437 + + + Instance + + image/jpeg + /PSK.jpg + + + + + AssetId + PARAMETER + + + https://www.hsu-hh.de/aut/aas/assetid + + + Instance + + string + http://dc-qr.com?m=R055732577&s=1012160102010001&t=PSK-060-NN-1 + + + + + SerialNumber + PARAMETER + + + 0173-1#02-AAM556#002 + + + Instance + + string + 1012160102010001 + + + + + BatchNumber + PARAMETER + + + 0173-1#02-AAQ196#001 + + + Instance + + + + + + + + SecondaryKeyInstance + PARAMETER + + + https://www.hsu-hh.de/aut/aas/secondarykeyinstance + + + Instance + + + + + + + + DateOfManufacture + PARAMETER + + + 0173-1#02-AAR972#002 + + + Instance + + + 2019 + + + + + DeviceRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/devicerevision + + + Instance + + + + + + + + SoftwareRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/softwarerevision + + + Instance + + + + + + + + HardwareRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/hardwarerevision + + + Instance + + + + + + + + ContactInfo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/contactinfo + + + Instance + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + Bosch Rexroth AG + + + + + ContactInfo_Role + PARAMETER + + + https://www.hsu-hh.de/aut/aas/role + + + Instance + + string + Manufacturer + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Zum Eisengießer 1 + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 97816 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Lohr am Main + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Bayern + + + + false + false + + + + + Email + PARAMETER + + + https://www.hsu-hh.de/aut/aas/email + + + Instance + + string + service@boschrexroth.de + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://www.boschrexroth.com/de/de/home/index + + + + + PhoneNumber + PARAMETER + + + 0173-1#02-AAO136#002 + + + Instance + + string + +499352405060 + + + + + Fax + PARAMETER + + + https://www.hsu-hh.de/aut/aas/fax + + + Instance + + string + + + + + false + false + + + + + CompanyLogo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/companylogo + + + Instance + + image/png + /aasx/Identification/logo.png + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + http://dc-qr.com?m=R055732577&s=1012160102010001 + + + + + + TechnicalSpecification + http://boschrexroth.com/shells/R055732577/1012160102010001/submodels/technicalSpecification/ + + + https://www.hsu-hh.de/aut/aas/technicalspecification + + + Instance + + + + + MaxTraversePath + PARAMETER + + + + http://boschrexroth.com/cds/lt/maxTraversePath + + + Instance + + float + 140,00 + + + + + FormFeedConstant + PARAMETER + + + + http://boschrexroth.com/cds/lt/formFeedConstant + + + Instance + + float + 10,00 + + + + + MaxPermissibleSpeed + PARAMETER + + + + http://boschrexroth.com/cds/lt/maxPermissibleSpeed + + + Instance + + float + 1,17 + + + + + MaxPermissibleAcceleration + PARAMETER + + + + http://boschrexroth.com/cds/lt/maxPermissibleAcceleration + + + Instance + + float + 50,00 + + + + + MaxPermissibleTorque + PARAMETER + + + + http://boschrexroth.com/cds/lt/maxPermissibleTorque + + + Instance + + float + 3,20 + + + + + RotationDirectionPositiveMovement + PARAMETER + + + + http://boschrexroth.com/cds/lt/RotationDirectionPositiveMovement + + + Instance + + string + CW + + + + + GearTransmissionRatio + PARAMETER + + + + http://boschrexroth.com/cds/lt/GearTransmissionRatio + + + Instance + + float + 1,00 + + + + + + Document + http://boschrexroth.com/shells/R055732577/1012160102010001/submodels/document/ + + + https://www.hsu-hh.de/aut/aas/document + + + Instance + + + + + EU_Declaration_of_Conformity + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + DCTC-30434-002:2019-01-01 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 02-04 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Zeugnisse, Zertifikate, Bescheinigungen + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + 2019-01-01 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + de/en/fr/es/pt/it/pl/cs/sk/hu/bg/da/et/fi/el/hr/lv/lt/nl/ro/sv/sl/ru/zh/ar/id/ja/ko/no/th/tr/vi + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + EU-Konformitätserklärung (DE) EU Declaration of Conformity (EN) + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + EU_Declaration_of_Conformity.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/EU_Declaration_of_Conformity.pdf + + + + false + false + + + + + Katalog-DE_R999000480_2015-12_PSK_24_10_2018_Gy + PARAMETER + + + + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + R999000480 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-02 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Bedienung (DE) Operating Instructions (EN) + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + 2015-12 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + de + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Präzisionsmodule PSK + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + Katalog-DE_R999000480_2015-12_PSK_24_10_2018_Gy.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/Katalog-DE_R999000480_2015-12_PSK_24_10_2018_Gy.pdf + + + + false + false + + + + + Katalog-EN_R999000500_2015-12_PSK_24_10_2018_Gy + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + R999000500 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-02 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Bedienung (DE) Operating Instructions (EN) + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + 2015-12 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Precision Modules PSK + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + Katalog-EN_R999000500_2015-12_PSK_24_10_2018_Gy.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/Katalog-EN_R999000500_2015-12_PSK_24_10_2018_Gy.pdf + + + + false + false + + + + + Anleitung-R320103187_2006_09_2 + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + R320103187 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-02 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Bedienung (DE) Operating Instructions (EN) + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + 2006-09 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + de/en/fr/it + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Anleitung Präzisionsmodule (EN) Instructions Precision Module PSK (EN) + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + Anleitung-R320103187_2006_09_2.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/Anleitung-R320103187_2006_09_2.pdf + + + + false + false + + + + + R320103141_2015_06_Einbauerklaerung_einachsig + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + R320103141 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-02 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Bedienung (DE) Operating Instructions (EN) + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + 2015-06 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + de/en/es/fr/it/pt/bg/cs/da/et/el/fi/ga/hu/is/lt/lv/mt/nl/no/pl/ro/sk/sl/sv/tr + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Einbauerklärung für einachsige Linearsysteme (DE) Declaration of Incorporation for single axis Linear Motion Systems (EN) + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + R320103141_2015_06_Einbauerklaerung_einachsig.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/R320103141_2015_06_Einbauerklaerung_einachsig.pdf + + + + false + false + + + + + R320103152_2015_01_DE_Safety_LS_Media_22_01_2015 + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + R320103152 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-03 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Allgemeine Sicherheit (DE) General Security (EN) + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + 2015-01 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + de + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Sicherheitshinweise für Linearsysteme + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + R320103152_2015_01_DE_Safety_LS_Media_22_01_2015.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/R320103152_2015_01_DE_Safety_LS_Media_22_01_2015.pdf + + + + false + false + + + + + R320103152_2015_01_EN_Safety_LS_22_01_2015_web + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + Bosch Rexroth + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + R320103152 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Bosch Rexroth + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Bosch Rexroth AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-03 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Allgemeine Sicherheit (DE) General Security (EN) + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + string + 2015-01 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Safety Instructions for Linear Motion Systems + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + R320103152_2015_01_EN_Safety_LS_22_01_2015_web.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/R320103152_2015_01_EN_Safety_LS_22_01_2015_web.pdf + + + + false + false + + + + + + + + ManufacturerName + 0173-1#02-AAO677#002 + + + + + + + + Herstellername + Manufacturer Name + + Manufacturer Name + + + + + Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist + 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 + + + + + + + ManufacturerProductDesignation + 0173-1#02-AAW338#001 + + + + + + + + Manufacturer product designation + Herstellerproduktbezeichnung + + ManufacturerTypName + + + STRING_TRANSLATABLE + + Kurze Beschreibung des Produktes (Kurztext) + Short description of the product (short text) + + + + + + + PhysicalAddress + https://www.hsu-hh.de/aut/aas/physicaladdress + + + + + + + + PhysicalAddress + Physische Adresse + + PhysicalAddress + + + + + Sammlung für reale physische Adresse + Collection for real physical address + + + + + + + CountryCode + 0173-1#02-AAO730#001 + + + + + + + + + + + + Landeskennung + Country code + + Country code + + + + + Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes + agreed upon symbol for unambiguous identification of a country + + + + + + + Street + 0173-1#02-AAO128#001 + + + + + + + + Strasse + Street + + Street + + + + + Name der Strasse und Hausnummer + Street name and house number + + + + + + + Zip + 0173-1#02-AAO129#002 + + + + + + + + Zip + Postleitzahl + + PostalCode + + + + + ZIP code of address + Postleitzahl der Anschrift + + + + + + + CityTown + 0173-1#02-AAO132#001 + + + + + + + + Ort + City/town + + City/town + + + + + Town or city of the company + Ortsangabe + + + + + + + StateCounty + 0173-1#02-AAO133#002 + + + + + + + + state/county + Bundesland + + StateCounty + + + + + Bundesland + state/county + + + + + + + ManufacturerProductFamily + 0173-1#02-AAU731#001 + + + + + + + + Manufacturer product family + Herstellerproduktfamilie + + TypClass + + + + + 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie + 2nd level of a 3 level manufacturer specific product hierarchy + + + + + + + SerialNumber + 0173-1#02-AAM556#002 + + + + + + + + Serial number + Seriennummer + + InstanceId + + + + + eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist + unique combination of numbers and letters used to identify the device once it has been manufactured + + + + + + + BatchNumber + 0173-1#02-AAQ196#001 + + + + + + + + Batch number + Chargen-Nummer + + ChargeId + + + + + Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge + Number assigned by the manufacturer of a material to identify the manufacturer's batch + + + + + + + ProductCountryOfOrigin + 0173-1#02-AAO841#001 + + + + + + + + Produkt Ursprungsland + Product country of origin + + CountryOfOrigin + + + + + Land in dem das Produkt hergestellt wurde (Hersteller Land) + Country in which the product is manufactured (manufacturer country) + + + + + + + YearOfConstruction + 0173-1#02-AAP906#001 + + + + + + + + Year of construction + Baujahr + + YearOfConstruction + + + + + Jahreszahl als Datumsangabe für die Fertigstellung des Objektes + Year as completion date of object + + + + + + + ProductMarking + https://www.hsu-hh.de/aut/aas/productmarking + + + + + + + + Produktkennzeichnung + Product Marking + + ProductMarking + + + + + Sammlungsdatei für Produktkennzeichnung + Collection file for product marking + + + + + + + CEQualificationPresent + 0173-1#02-BAF053#008 + + + + + + + + CE-Kennzeichnung vorhanden + CE- qualification present + + CEMarkingPresent + + + BOOLEAN + + whether CE- qualification is present + Angabe, ob CE-Kennzeichnung vorhanden ist + + + + + + + File + 0173-1#02-AAD005#008 + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Enthaltene Doku. Datei + Embedded Doc. file + + File + + + + + Verweis/ BLOB auf enthaltene Dokumentations-Datei. + Reference/ BLOB to embedded documentation file. + + + + + + + DocumentationItem + 0173-1#02-AAD001#001 + + + + + + + + Dokumentationsgruppe + Documentation item + + DocumentationItem + + + + + Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. + Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. + + + + + + + DocumentType + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + + + + + + Dokumententyp + Document Type + + DocumentType + + + + + Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) + TBD + + + + + + + VDI2770_DomainId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + + + + + + Domain-Nummer + DomainId + + DomainId + + + + + Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. + TBD + + + + + + + VDI2770_IdType + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + + + + + + Nummerntyp + IdType + + IdType + + + + + Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. + TBD + + + + + + + DocumentId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + + + + + + DocumentId + Dokumenten-Nummer + + DocumentId + + + + + Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. + TBD + + + + + + + DocumentDomainId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + + + + + + DocumentDomainId + DocumentDomainId + + DocumentDomainId + + + + + Kennung oder Kennzeichen einer Domäne + TBD + + + + + + + VDI2770_Role + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + + + + + + Rolle + Role + + Role + + + + + Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) + TBD + + + + + + + VDI2770_OrganisationId + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + + + + + + Organisation ID + Organisation ID + + OrganisationId + + + + + eindeutige ID für die Organisation + TBD + + + + + + + VDI2770_OrganisationName + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + + + + + + OrganisationName + OrganisationName + + OrganisationName + + + + + gebräuchliche Bezeichnung für die Organisation + TBD + + + + + + + VDI2770_OrganisationOfficialName + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + + + + + + Offizieller Name der Organisation + Organisation Official Name + + OrganisationOfficialName + + + + + offizieller Name der Organisation + TBD + + + + + + + VDI2770_Description + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + + + + + + Beschreibung + Description + + Description + + + + + Beschreibung für die nächste übergeordnete Collection + TBD + + + + + + + DocumentPartId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + + + + + + Dokumenten-Teilnummer + DocumentPartId + + DocumentPartId + + + + + Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. + TBD + + + + + + + DocumentClassification_ClassId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + + + + Dokumentkategorie + Document category + + DocCategory + + + + + Dokumentkategorie nach VDI 2770:2018/10 + Document category after VDI 2770:2018/10 + + + + + + + VDI2770_ClassName + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + + + + + + Klassenname + Class Name + + ClassName + + + + + Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. + TBD + + + + + + + VDI2770_ClassificationSystem + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + + + + + + Klassifizierungssystem + classification system + + ClassificationSystem + + + + + Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. + TBD + + + + + + + DocumentVersionId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + + + + + + Dokumenten-Versionsnummer + DocumentVersionId + + DocumentVersionId + + + + + Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. + TBD + + + + + + + DocumentVersion_LanguageCode + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + + + + + + Sprachenschlüssel + LanguageCode + + LanguageCode + + + + + Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 + TBD + + + + + + + VDI2770_Title + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + + + + + + Titel + Title + + VDI2770_Title + + + + + sprachabhängiger Titel des Dokuments + TBD + + + + + + + VDI2770_Summary + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + + + + + + Zusammenfassung + Summary + + Summary + + + + + sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts + TBD + + + + + + + VDI2770_Keywords + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + + + + + + Schlagwörter + Keywords + + Keywords + + + + + sprachabhängige, durch Komma getrennte Liste von Schlagwörtern + TBD + + + + + + + VDI2770_StatusValue + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + + + + + + Statuswert + StatusValue + + StatusValue + + + + + Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) + TBD + + + + + + + VDI2770_SetDate + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + + + + + + Erstellungsdatum + Set Date + + SetDate + + + + + Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). + TBD + + + + + + + VDI2770_Purpose + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + + + + + + Zweck + Purpose + + Purpose + + + + + Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. + TBD + + + + + + + VDI2770_BasedOnProcedure + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + + + + + + Prozedur + Procedure + + BasedOnProcedure + + + + + textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt + TBD + + + + + + + VDI2770_Comments + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + + + + + + Kommentar + Comments + + Comments + + + + + textuelle Bemerkungen und Anmerkungen zum Status + TBD + + + + + + + VDI2770_ReferencedObject_Type + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + + + + + + Typ + Type + + Type + + + + + Für Type des Objekts muss immer Product angegeben werden. + TBD + + + + + + + VDI2770_ReferencedObject_RefType + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + + + + + + RefType + RefType + + RefType + + + + + Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) + TBD + + + + + + + VDI2770_ReferencedObject_ObjectId + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + + + + + + ObjectId + ObjectId + + ObjectId + + + + + Angabe der Identifikationsnummer zum Objekt + TBD + + + + + + + VDI2770_FileId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + + + + + + ID der Datei + File ID + + FileId + + + + + eindeutige ID für die Datei + TBD + + + + + + + VDI2770_FileName + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + + + + + + Dateiname + File name + + FileName + + + + + Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. + TBD + + + + + + + VDI2770_FileFormat + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + + + + + + Datei Format + File format + + FileFormat + + + + + Angabe eines Media Typs gemäß der Liste der IANA + TBD + + + + + + + OrganisationContactInfo + https://www.hsu-hh.de/aut/aas/contactinfo + + + + + + + + Contact Info + Kontakt Info + + OrganisationContactInfo + + + + + Sammlung für die allgemeinen Kontaktdaten + Collection for general contact data + + + + + + + NameOfSupplier + 0173-1#02-AAO735#003 + + + + + + + + + + + + name of supplier + Lieferantenname + + name of supplier + + + + + Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt + name of supplier which provides the customer with a product or a service + + + + + + + ContactInfo_Role + https://www.hsu-hh.de/aut/aas/role + + + + + + + + Rolle + Role + + Role + + + + + Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt + Information to specify the role which the organisation of ContactInfo plays + + + + + + + Email + https://www.hsu-hh.de/aut/aas/email + + + + + + + + Emailadresse + Email address + + Email + + + + + Emailadresse + Email address + + + + + + + URL + 0173-1#02-AAO694#001 + + + + + + + + Internetadresse + Internet address + + URL + + + + + stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html + Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html + + + + + + + PhoneNumber + 0173-1#02-AAO136#002 + + + + + + + + Telefonnummer + telephone number + + Phone + + + + + vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist + complete telephone number to be called to reach a business partner + + + + + + + Fax + https://www.hsu-hh.de/aut/aas/fax + + + + + + + + Fax + Fax + + Fax + + + + + Faxnummer + Fax number + + + + + + + 0173-1#02-AAO136#002 + + + + + GLNOfManufacturer + 0173-1#02-AAY812#001 + + + + + + + + GLN of manufacturer + GLN des Herstellers + + GLN of manufacturer + + + + + international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort + internationally unique identification number for the manufacturer of the device or the product and for the physical location + + + + + + + SupplierOfTheIdentifier + 0173-1#02-AAP796#004 + + + + + + + + Supplier of the identifier + Anbieter der Identifikationsnummer für Hersteller + + Supplier of the identifier + + + STRING_TRANSLATABLE + + DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification + DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer + + + + + + + MAN_PROD_NUM + + product article number of manufacturer + + 0173-1#02-AAO676#003 + + + + + + + + product article number of manufacturer + Herstellerartikelnummer + + MAN_PROD_NUM + + + STRING_TRANSLATABLE + + eindeutiger Bestellschlüssel des Herstellers + unique product identifier of the manufacturer + + + + + + + ManufacturerProductDescription + 0173-1#02-AAU734#001 + + + + + + + + Manufacturer product description + Herstellerproduktbeschreibung + + Manufacturer product description + + + + + Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) + Description of the product, it's technical features and implementation if needed (long text) + + + + + + + GLNOfSupplier + 0173-1#02-AAY813#001 + + + + + + + + GLN of supplier + GLN des Lieferanten + + GLN of supplier + + + + + international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort + internationally unique identification number for the supplier of the device or the product and for the physical location + + + + + + + SupplierIdProvider + https://www.hsu-hh.de/aut/aas/supplieridprovider + + + + + + + + SupplierIdProvider + Anbieter der Identifikationsnummer + + SupplierIdProvider + + + STRING_TRANSLATABLE + + DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer + DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification + + + + + + + SUP_PROD_NUM + 0173-1#02-AAO736#004 + + + + + + + + product article number of supplier + Lieferantenartikelnummer + + product article number of supplier + + + + + eindeutiger Bestellschlüssel des Lieferanten + unique product order identifier of the supplier + + + + + + + SupplierProductDesignation + 0173-1#02-AAM551#002 + + + + + + + + Supplier product designation + Lieferantenproduktbezeichnung + + SupplierTypName + + + STRING_TRANSLATABLE + + Kurze Beschreibung des Produktes (Kurztext) + Short description of the product (short text) + + + + + + + SupplierProductDescription + 0173-1#02-AAU730#001 + + + + + + + + Supplier product description + Lieferantenproduktbeschreibung + + Supplier product description + + + + + Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) + Description of the product, it's technical features and implementation if needed (long text) + + + + + + + ClassificationSystem + 0173-1#02-AAO715#002 + + + + + + + + classification system + Klassifizierungssystem + + ClassificationSystem + + + + + Klassifizierungssystem + Classification System + + + + + + + SecondaryKeyTyp + https://www.hsu-hh.de/aut/aas/secondarykeytyp + + + + + + + + SecondaryKeyTyp + Typnummer des IT Systems + + SecondaryKeyTyp + + + + + Führende technische ID im IT System des Typs + SecondaryKeyTyp + + + + + + + TypThumbnail + www.company.com/ids/cd/4401_1272_7091_3437 + + + + + + + + TypThumbnail + Vorschaubild + + TypThumbnail + + + + + Darstellung des Produkttyps in kleinem Format + Small picture of the product type + + + + + + + AssetId + https://www.hsu-hh.de/aut/aas/assetid + + + + + + + + AssetId + Asset ID + + AssetId + + + + + Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. + Global unique ID of an asset, which can be read by both human and machine. + + + + + + + SecondaryKeyInstance + https://www.hsu-hh.de/aut/aas/secondarykeyinstance + + + + + + + + SecondaryKeyInstance + Instanznummer des IT Systems + + SecondaryKeyInstance + + + + + Führende technische ID im IT System der Instanz + SecondaryKeyInstance + + + + + + + DateOfManufacture + 0173-1#02-AAR972#002 + + + + + + + + Date of manufacture + Herstellungsdatum + + Date of manufacture + + + DATE + + Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist + Date from which the production and / or development process is completed or from which a service is provided completely + + + + + + + DeviceRevision + https://www.hsu-hh.de/aut/aas/devicerevision + + + + + + + + DeviceRevision + DeviceRevision + + DeviceRevision + + + + + DeviceRevision + DeviceRevision + + + + + + + SoftwareRevision + https://www.hsu-hh.de/aut/aas/softwarerevision + + + + + + + + SoftwareRevision + SoftwareRevision + + SoftwareRevision + + + + + SoftwareRevision + SoftwareRevision + + + + + + + HardwareRevision + https://www.hsu-hh.de/aut/aas/hardwarerevision + + + + + + + + HardwareRevision + HardwareRevision + + HardwareRevision + + + + + HardwareRevision + HardwareRevision + + + + + + + QrCode + https://www.hsu-hh.de/aut/aas/qrcode + + + + + + + + QrCode + QrCode + + QrCode + + + + + In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. + QrCode + + + + + + + CompanyLogo + https://www.hsu-hh.de/aut/aas/companylogo + + + + + + + + Firmenlogo + CompanyLogo + + CompanyLogo + + + + + Firmenlogo + CompanyLogo + + + + + + + MaxTraversePath + http://boschrexroth.com/cds/lt/MaxTraversePath + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Max. Verfahrweg (mm) + Max. traverse path (mm) + + MaxTraversePath + mm + + + 0173-1#05-AAA480#003 + + + + smax_mm + REAL_MEASURE + + + + + + + FormFeedConstant + http://boschrexroth.com/cds/lt/FormFeedConstant + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Vorschubkonstante (mm/U) + Form feed constant (mm/U) + + FormFeedConstant + mm/U + + + + + u_mmpU + REAL_MEASURE + + + + + + + MaxPermissibleSpeed + http://boschrexroth.com/cds/lt/MaxPermissibleSpeed + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Maximal zulässige Geschwindigkeit (m/s) + Maximum permissible speed (m/s) + + MaxPermissibleSpeed + m/s + + + 0173-1#05-AAA434#003 + + + + vmax_mps + REAL_MEASURE + + + + + + + MaxPermissibleAcceleration + http://boschrexroth.com/cds/lt/MaxPermissibleAcceleration + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Maximal zulässige Beschleunigung (m/s²) + Maximum permissible acceleration (m/s²) + + MaxPermissibleAcceleration + m/s² + + + 0173-1#05-AAA597#003 + + + + amax_mps2 + REAL_MEASURE + + + + + + + MaxPermissibleTorque + http://boschrexroth.com/cds/lt/MaxPermissibleTorque + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Maximal zulässiges Drehmoment (Nm) + Maximum permissible torque (Nm) + + MaxPermissibleTorque + Nm + + + + + M1max_Nm + REAL_MEASURE + + + + + + + RotationDirectionPositiveMovement + http://boschrexroth.com/cds/lt/RotationDirectionPositiveMovement + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Drehrichtung für positive Fahrrichtung (weg vom Motor) + Rotation direction for positive movement + + RotationDirectionPositiveMovement + + + + + + d + STRING + + + + + + + GearTransmissionRatio + http://boschrexroth.com/cds/lt/GearTransmissionRatio + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Getriebeübersetzung + Gear transmission ratio + + GearTransmissionRatio + + + + + + i + REAL_MEASURE + + + + + + + \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/07_PhoenixContact.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/07_PhoenixContact.aasx.xml new file mode 100644 index 000000000..b97555d7f --- /dev/null +++ b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/07_PhoenixContact.aasx.xml @@ -0,0 +1,3507 @@ + + + + + PhoenixContact_R901278815_25 + CONSTANT + www.company.com/ids/aas/2520_6010_8091_1277 + + + www.company.com/ids/asset/8220_6010_8091_3593 + + + + + + www.company.com/ids/sm/4343_5072_7091_3242 + + + + + www.company.com/ids/sm/2543_5072_7091_2660 + + + + + www.company.com/ids/sm/6053_5072_7091_5102 + + + + + www.company.com/ids/sm/6563_5072_7091_4267 + + + + + + + + + R901278815_25 + www.company.com/ids/asset/8220_6010_8091_3593 + Instance + + + + + Nameplate + www.company.com/ids/sm/4343_5072_7091_3242 + + + https://www.hsu-hh.de/aut/aas/nameplate + + + Instance + + + + + ManufacturerName + PARAMETER + + + 0173-1#02-AAO677#002 + + + Instance + + string + PHOENIX CONTACT GmbH & Co. KG + + + + + ManufacturerProductDesignation + PARAMETER + + + 0173-1#02-AAW338#001 + + + Instance + + string + QUINT4-PS/3AC/24DC/20 + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Flachsmarktstr. 8 + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 32825 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Blomberg + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Nordrhein-Westfalen + + + + false + false + + + + + ManufacturerProductFamily + PARAMETER + + + 0173-1#02-AAU731#001 + + + Instance + + + + + + + + SerialNumber + PARAMETER + + + 0173-1#02-AAM556#002 + + + Instance + + string + 2904622001634T0008 + + + + + BatchNumber + PARAMETER + + + 0173-1#02-AAQ196#001 + + + Instance + + + + + + + + ProductCountryOfOrigin + PARAMETER + + + 0173-1#02-AAO841#001 + + + Instance + + string + DE + + + + + YearOfConstruction + PARAMETER + + + 0173-1#02-AAP906#001 + + + Instance + + string + 2016 + + + + + Marking_CE + PARAMETER + + + https://www.hsu-hh.de/aut/aas/productmarking + + + Instance + + + + + CEQualificationPresent + PARAMETER + + + 0173-1#02-BAF053#008 + + + Instance + + boolean + 1 + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + image/png + /aasx/Nameplate/marking_ce.png + + + + false + false + + + + + + Document + www.company.com/ids/sm/2543_5072_7091_2660 + + + https://www.hsu-hh.de/aut/aas/document + + + Instance + + + + + DeclarationCEMarking + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Phoenix Contact + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + PHOENIX CONTACT GmbH & Co. KG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 02-04 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Zeugnisse, Zertifikate, Bescheinigungen + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en, de + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + EU_Declaration_of_Conformity.pdf + + + + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + + + + Instance + + string + EU_Declaration_of_Conformity.pdf Nr. 2904622.CE.01 + + + + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/EU_Declaration_of_Conformity.pdf + + + + false + false + + + + + + Service + www.company.com/ids/sm/6053_5072_7091_5102 + + + https://www.hsu-hh.de/aut/aas/service + + + Instance + + + + + ContactInfo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/contactinfo + + + Instance + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + PHOENIX CONTACT GmbH & Co. KG + + + + + ContactInfo_Role + PARAMETER + + + https://www.hsu-hh.de/aut/aas/role + + + Instance + + string + Manufacturer + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Flachsmarktstraße 8 + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 32825 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Blomberg + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Nordrhein-Westfalen + + + + false + false + + + + + Email + PARAMETER + + + https://www.hsu-hh.de/aut/aas/email + + + Instance + + string + aftersales@phoenixcontact.com + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://www.phoenixcontact.com/online/portal/de?1dmy&urile=wcm:path:/dede/web/main/service_and_support/entry_page/entry_page + + + + + PhoneNumber + PARAMETER + + + 0173-1#02-AAO136#002 + + + Instance + + string + +49 52 35/3-4 00 50 + + + + + Fax + PARAMETER + + + https://www.hsu-hh.de/aut/aas/fax + + + Instance + + string + + + + + false + false + + + + + + Identification + www.company.com/ids/sm/6563_5072_7091_4267 + + + https://www.hsu-hh.de/aut/aas/identification + + + Instance + + + + + ManufacturerName + PARAMETER + + + 0173-1#02-AAO677#002 + + + Instance + + string + PHOENIX CONTACT GmbH & Co. KG + + + + + GLNOfManufacturer + PARAMETER + + + 0173-1#02-AAY812#001 + + + Instance + + string + + + + + + SupplierOfTheIdentifier + + + 0173-1#02-AAP796#004 + + + Instance + + + + + + + + MAN_PROD_NUM + + + 0173-1#02-AAO676#003 + + + Instance + + + + + + + + ManufacturerProductDesignation + PARAMETER + + + 0173-1#02-AAW338#001 + + + Instance + + string + QUINT4-PS/3AC/24DC/20 + + + + + ManufacturerProductDescription + PARAMETER + + + 0173-1#02-AAU734#001 + + + Instance + + langString + Primary-switched QUINT POWER power supply with free choice of output characteristic curve, SFB (selective fuse breaking) technology, and NFC interface, input: 3-phase, output: 24 V DC/20 A + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + PHOENIX CONTACT GmbH & Co. KG + + + + + GLNOfSupplier + PARAMETER + + + 0173-1#02-AAY813#001 + + + Instance + + string + + + + + + SupplierIdProvider + PARAMETER + + + https://www.hsu-hh.de/aut/aas/supplieridprovider + + + Instance + + + + + + + + SUP_PROD_NUM + PARAMETER + + + 0173-1#02-AAO736#004 + + + Instance + + + + + + + + SupplierProductDesignation + + + 0173-1#02-AAM551#002 + + + Instance + + string + QUINT4-PS/3AC/24DC/20 + + + + + SupplierProductDescription + PARAMETER + + + 0173-1#02-AAU730#001 + + + Instance + + langString + Primary-switched QUINT POWER power supply with free choice of output characteristic curve, SFB (selective fuse breaking) technology, and NFC interface, input: 3-phase, output: 24 V DC/20 A + + + + + ManufacturerProductFamily + PARAMETER + + + 0173-1#02-AAU731#001 + + + Instance + + + + + + + + ClassificationSystem + PARAMETER + + + 0173-1#02-AAO715#002 + + + Instance + + string + eclass + + + + + SecondaryKeyTyp + + + https://www.hsu-hh.de/aut/aas/secondarykeytyp + + + Instance + + + + + + + + TypThumbnail + PARAMETER + + + + Instance + + image/jpeg + /aasx/2904622.jpeg + + + + + AssetId + PARAMETER + + + https://www.hsu-hh.de/aut/aas/assetid + + + Instance + + string + www.company.com/ids/asset/8220_6010_8091_3593 + + + + + + + + SerialNumber + PARAMETER + + + 0173-1#02-AAM556#002 + + + Instance + + string + 25 + + + + + BatchNumber + PARAMETER + + + 0173-1#02-AAQ196#001 + + + Instance + + + + + + + + SecondaryKeyInstance + PARAMETER + + + https://www.hsu-hh.de/aut/aas/secondarykeyinstance + + + Instance + + + + + + + + DateOfManufacture + PARAMETER + + + 0173-1#02-AAR972#002 + + + Instance + + + + + + + + DeviceRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/devicerevision + + + Instance + + + + + + + + SoftwareRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/softwarerevision + + + Instance + + + + + + + + HardwareRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/hardwarerevision + + + Instance + + + 02 + + + + + QrCode + PARAMETER + + + https://www.hsu-hh.de/aut/aas/qrcode + + + Instance + + image/jpeg + /aasx/2904622_QRCode.jpeg + + + + + ContactInfo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/contactinfo + + + Instance + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + PHOENIX CONTACT GmbH & Co. KG + + + + + ContactInfo_Role + PARAMETER + + + https://www.hsu-hh.de/aut/aas/role + + + Instance + + string + Manufacturer + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Flachsmarktstr. 8 + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 32825 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Blomberg + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Nordrhein-Westfalen + + + + false + false + + + + + Email + PARAMETER + + + https://www.hsu-hh.de/aut/aas/email + + + Instance + + string + info@phoenixcontact.de + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://www.phoenixcontact.com/online/portal/pc + + + + + PhoneNumber + PARAMETER + + + 0173-1#02-AAO136#002 + + + Instance + + string + +49 52 35/3-1 20 00 + + + + + Fax + PARAMETER + + + https://www.hsu-hh.de/aut/aas/fax + + + Instance + + string + + + + + false + false + + + + + CompanyLogo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/companylogo + + + Instance + + image/png + /aasx/PhoenixContact_Logo.png + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + http://phoenixcontact.net/qr/2904622 + + + + + + + + ManufacturerName + 0173-1#02-AAO677#002 + + + + + + + + Herstellername + Manufacturer Name + + Manufacturer Name + + + + + Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist + 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 + + + + + + + ManufacturerProductDesignation + 0173-1#02-AAW338#001 + + + + + + + + Manufacturer product designation + Herstellerproduktbezeichnung + + ManufacturerTypName + + + STRING_TRANSLATABLE + + Kurze Beschreibung des Produktes (Kurztext) + Short description of the product (short text) + + + + + + + PhysicalAddress + https://www.hsu-hh.de/aut/aas/physicaladdress + + + + + + + + PhysicalAddress + Physische Adresse + + PhysicalAddress + + + + + Sammlung für reale physische Adresse + Collection for real physical address + + + + + + + CountryCode + 0173-1#02-AAO730#001 + + + + + + + + + + + + Landeskennung + Country code + + Country code + + + + + Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes + agreed upon symbol for unambiguous identification of a country + + + + + + + Street + 0173-1#02-AAO128#001 + + + + + + + + Strasse + Street + + Street + + + + + Name der Strasse und Hausnummer + Street name and house number + + + + + + + Zip + 0173-1#02-AAO129#002 + + + + + + + + Zip + Postleitzahl + + PostalCode + + + + + ZIP code of address + Postleitzahl der Anschrift + + + + + + + CityTown + 0173-1#02-AAO132#001 + + + + + + + + Ort + City/town + + City/town + + + + + Town or city of the company + Ortsangabe + + + + + + + StateCounty + 0173-1#02-AAO133#002 + + + + + + + + state/county + Bundesland + + StateCounty + + + + + Bundesland + state/county + + + + + + + ManufacturerProductFamily + 0173-1#02-AAU731#001 + + + + + + + + Manufacturer product family + Herstellerproduktfamilie + + TypClass + + + + + 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie + 2nd level of a 3 level manufacturer specific product hierarchy + + + + + + + SerialNumber + 0173-1#02-AAM556#002 + + + + + + + + Serial number + Seriennummer + + InstanceId + + + + + eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist + unique combination of numbers and letters used to identify the device once it has been manufactured + + + + + + + BatchNumber + 0173-1#02-AAQ196#001 + + + + + + + + Batch number + Chargen-Nummer + + ChargeId + + + + + Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge + Number assigned by the manufacturer of a material to identify the manufacturer's batch + + + + + + + ProductCountryOfOrigin + 0173-1#02-AAO841#001 + + + + + + + + Produkt Ursprungsland + Product country of origin + + CountryOfOrigin + + + + + Land in dem das Produkt hergestellt wurde (Hersteller Land) + Country in which the product is manufactured (manufacturer country) + + + + + + + YearOfConstruction + 0173-1#02-AAP906#001 + + + + + + + + Year of construction + Baujahr + + YearOfConstruction + + + + + Jahreszahl als Datumsangabe für die Fertigstellung des Objektes + Year as completion date of object + + + + + + + ProductMarking + https://www.hsu-hh.de/aut/aas/productmarking + + + + + + + + Produktkennzeichnung + Product Marking + + ProductMarking + + + + + Sammlungsdatei für Produktkennzeichnung + Collection file for product marking + + + + + + + CEQualificationPresent + 0173-1#02-BAF053#008 + + + + + + + + CE-Kennzeichnung vorhanden + CE- qualification present + + CEMarkingPresent + + + BOOLEAN + + whether CE- qualification is present + Angabe, ob CE-Kennzeichnung vorhanden ist + + + + + + + File + 0173-1#02-AAD005#008 + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Enthaltene Doku. Datei + Embedded Doc. file + + File + + + + + Verweis/ BLOB auf enthaltene Dokumentations-Datei. + Reference/ BLOB to embedded documentation file. + + + + + + + DocumentationItem + 0173-1#02-AAD001#001 + + + + + + + + Dokumentationsgruppe + Documentation item + + DocumentationItem + + + + + Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. + Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. + + + + + + + DocumentType + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + + + + + + Dokumententyp + Document Type + + DocumentType + + + + + Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) + TBD + + + + + + + VDI2770_DomainId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + + + + + + Domain-Nummer + DomainId + + DomainId + + + + + Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. + TBD + + + + + + + VDI2770_IdType + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + + + + + + Nummerntyp + IdType + + IdType + + + + + Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. + TBD + + + + + + + DocumentId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + + + + + + DocumentId + Dokumenten-Nummer + + DocumentId + + + + + Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. + TBD + + + + + + + DocumentDomainId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + + + + + + DocumentDomainId + DocumentDomainId + + DocumentDomainId + + + + + Kennung oder Kennzeichen einer Domäne + TBD + + + + + + + VDI2770_Role + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + + + + + + Rolle + Role + + Role + + + + + Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) + TBD + + + + + + + VDI2770_OrganisationId + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + + + + + + Organisation ID + Organisation ID + + OrganisationId + + + + + eindeutige ID für die Organisation + TBD + + + + + + + VDI2770_OrganisationName + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + + + + + + OrganisationName + OrganisationName + + OrganisationName + + + + + gebräuchliche Bezeichnung für die Organisation + TBD + + + + + + + VDI2770_OrganisationOfficialName + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + + + + + + Offizieller Name der Organisation + Organisation Official Name + + OrganisationOfficialName + + + + + offizieller Name der Organisation + TBD + + + + + + + VDI2770_Description + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + + + + + + Beschreibung + Description + + Description + + + + + Beschreibung für die nächste übergeordnete Collection + TBD + + + + + + + DocumentPartId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + + + + + + Dokumenten-Teilnummer + DocumentPartId + + DocumentPartId + + + + + Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. + TBD + + + + + + + DocumentClassification_ClassId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + + + + Dokumentkategorie + Document category + + DocCategory + + + + + Dokumentkategorie nach VDI 2770:2018/10 + Document category after VDI 2770:2018/10 + + + + + + + VDI2770_ClassName + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + + + + + + Klassenname + Class Name + + ClassName + + + + + Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. + TBD + + + + + + + VDI2770_ClassificationSystem + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + + + + + + Klassifizierungssystem + classification system + + ClassificationSystem + + + + + Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. + TBD + + + + + + + DocumentVersionId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + + + + + + Dokumenten-Versionsnummer + DocumentVersionId + + DocumentVersionId + + + + + Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. + TBD + + + + + + + DocumentVersion_LanguageCode + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + + + + + + Sprachenschlüssel + LanguageCode + + LanguageCode + + + + + Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 + TBD + + + + + + + VDI2770_Title + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + + + + + + Titel + Title + + VDI2770_Title + + + + + sprachabhängiger Titel des Dokuments + TBD + + + + + + + VDI2770_Summary + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + + + + + + Zusammenfassung + Summary + + Summary + + + + + sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts + TBD + + + + + + + VDI2770_Keywords + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + + + + + + Schlagwörter + Keywords + + Keywords + + + + + sprachabhängige, durch Komma getrennte Liste von Schlagwörtern + TBD + + + + + + + VDI2770_StatusValue + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + + + + + + Statuswert + StatusValue + + StatusValue + + + + + Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) + TBD + + + + + + + VDI2770_SetDate + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + + + + + + Erstellungsdatum + Set Date + + SetDate + + + + + Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). + TBD + + + + + + + VDI2770_Purpose + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + + + + + + Zweck + Purpose + + Purpose + + + + + Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. + TBD + + + + + + + VDI2770_BasedOnProcedure + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + + + + + + Prozedur + Procedure + + BasedOnProcedure + + + + + textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt + TBD + + + + + + + VDI2770_Comments + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + + + + + + Kommentar + Comments + + Comments + + + + + textuelle Bemerkungen und Anmerkungen zum Status + TBD + + + + + + + VDI2770_ReferencedObject_Type + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + + + + + + Typ + Type + + Type + + + + + Für Type des Objekts muss immer Product angegeben werden. + TBD + + + + + + + VDI2770_ReferencedObject_RefType + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + + + + + + RefType + RefType + + RefType + + + + + Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) + TBD + + + + + + + VDI2770_ReferencedObject_ObjectId + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + + + + + + ObjectId + ObjectId + + ObjectId + + + + + Angabe der Identifikationsnummer zum Objekt + TBD + + + + + + + VDI2770_FileId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + + + + + + ID der Datei + File ID + + FileId + + + + + eindeutige ID für die Datei + TBD + + + + + + + VDI2770_FileName + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + + + + + + Dateiname + File name + + FileName + + + + + Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. + TBD + + + + + + + VDI2770_FileFormat + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + + + + + + Datei Format + File format + + FileFormat + + + + + Angabe eines Media Typs gemäß der Liste der IANA + TBD + + + + + + + OrganisationContactInfo + https://www.hsu-hh.de/aut/aas/contactinfo + + + + + + + + Contact Info + Kontakt Info + + OrganisationContactInfo + + + + + Sammlung für die allgemeinen Kontaktdaten + Collection for general contact data + + + + + + + NameOfSupplier + 0173-1#02-AAO735#003 + + + + + + + + + + + + name of supplier + Lieferantenname + + name of supplier + + + + + Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt + name of supplier which provides the customer with a product or a service + + + + + + + ContactInfo_Role + https://www.hsu-hh.de/aut/aas/role + + + + + + + + Rolle + Role + + Role + + + + + Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt + Information to specify the role which the organisation of ContactInfo plays + + + + + + + Email + https://www.hsu-hh.de/aut/aas/email + + + + + + + + Emailadresse + Email address + + Email + + + + + Emailadresse + Email address + + + + + + + URL + 0173-1#02-AAO694#001 + + + + + + + + Internetadresse + Internet address + + URL + + + + + stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html + Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html + + + + + + + PhoneNumber + 0173-1#02-AAO136#002 + + + + + + + + Telefonnummer + telephone number + + Phone + + + + + vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist + complete telephone number to be called to reach a business partner + + + + + + + Fax + https://www.hsu-hh.de/aut/aas/fax + + + + + + + + Fax + Fax + + Fax + + + + + Faxnummer + Fax number + + + + + + + 0173-1#02-AAO136#002 + + + + + GLNOfManufacturer + 0173-1#02-AAY812#001 + + + + + + + + GLN of manufacturer + GLN des Herstellers + + GLN of manufacturer + + + + + international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort + internationally unique identification number for the manufacturer of the device or the product and for the physical location + + + + + + + SupplierOfTheIdentifier + 0173-1#02-AAP796#004 + + + + + + + + Supplier of the identifier + Anbieter der Identifikationsnummer für Hersteller + + Supplier of the identifier + + + STRING_TRANSLATABLE + + DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification + DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer + + + + + + + MAN_PROD_NUM + + product article number of manufacturer + + 0173-1#02-AAO676#003 + + + + + + + + product article number of manufacturer + Herstellerartikelnummer + + MAN_PROD_NUM + + + STRING_TRANSLATABLE + + eindeutiger Bestellschlüssel des Herstellers + unique product identifier of the manufacturer + + + + + + + ManufacturerProductDescription + 0173-1#02-AAU734#001 + + + + + + + + Manufacturer product description + Herstellerproduktbeschreibung + + Manufacturer product description + + + + + Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) + Description of the product, it's technical features and implementation if needed (long text) + + + + + + + GLNOfSupplier + 0173-1#02-AAY813#001 + + + + + + + + GLN of supplier + GLN des Lieferanten + + GLN of supplier + + + + + international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort + internationally unique identification number for the supplier of the device or the product and for the physical location + + + + + + + SupplierIdProvider + https://www.hsu-hh.de/aut/aas/supplieridprovider + + + + + + + + SupplierIdProvider + Anbieter der Identifikationsnummer + + SupplierIdProvider + + + STRING_TRANSLATABLE + + DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer + DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification + + + + + + + SUP_PROD_NUM + 0173-1#02-AAO736#004 + + + + + + + + product article number of supplier + Lieferantenartikelnummer + + product article number of supplier + + + + + eindeutiger Bestellschlüssel des Lieferanten + unique product order identifier of the supplier + + + + + + + SupplierProductDesignation + 0173-1#02-AAM551#002 + + + + + + + + Supplier product designation + Lieferantenproduktbezeichnung + + SupplierTypName + + + STRING_TRANSLATABLE + + Kurze Beschreibung des Produktes (Kurztext) + Short description of the product (short text) + + + + + + + SupplierProductDescription + 0173-1#02-AAU730#001 + + + + + + + + Supplier product description + Lieferantenproduktbeschreibung + + Supplier product description + + + + + Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) + Description of the product, it's technical features and implementation if needed (long text) + + + + + + + ClassificationSystem + 0173-1#02-AAO715#002 + + + + + + + + classification system + Klassifizierungssystem + + ClassificationSystem + + + + + Klassifizierungssystem + Classification System + + + + + + + SecondaryKeyTyp + https://www.hsu-hh.de/aut/aas/secondarykeytyp + + + + + + + + SecondaryKeyTyp + Typnummer des IT Systems + + SecondaryKeyTyp + + + + + Führende technische ID im IT System des Typs + SecondaryKeyTyp + + + + + + + TypThumbnail + www.company.com/ids/cd/4401_1272_7091_3437 + + + + + + + + TypThumbnail + Vorschaubild + + TypThumbnail + + + + + Darstellung des Produkttyps in kleinem Format + Small picture of the product type + + + + + + + AssetId + https://www.hsu-hh.de/aut/aas/assetid + + + + + + + + AssetId + Asset ID + + AssetId + + + + + Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. + Global unique ID of an asset, which can be read by both human and machine. + + + + + + + SecondaryKeyInstance + https://www.hsu-hh.de/aut/aas/secondarykeyinstance + + + + + + + + SecondaryKeyInstance + Instanznummer des IT Systems + + SecondaryKeyInstance + + + + + Führende technische ID im IT System der Instanz + SecondaryKeyInstance + + + + + + + DateOfManufacture + 0173-1#02-AAR972#002 + + + + + + + + Date of manufacture + Herstellungsdatum + + Date of manufacture + + + DATE + + Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist + Date from which the production and / or development process is completed or from which a service is provided completely + + + + + + + DeviceRevision + https://www.hsu-hh.de/aut/aas/devicerevision + + + + + + + + DeviceRevision + DeviceRevision + + DeviceRevision + + + + + DeviceRevision + DeviceRevision + + + + + + + SoftwareRevision + https://www.hsu-hh.de/aut/aas/softwarerevision + + + + + + + + SoftwareRevision + SoftwareRevision + + SoftwareRevision + + + + + SoftwareRevision + SoftwareRevision + + + + + + + HardwareRevision + https://www.hsu-hh.de/aut/aas/hardwarerevision + + + + + + + + HardwareRevision + HardwareRevision + + HardwareRevision + + + + + HardwareRevision + HardwareRevision + + + + + + + QrCode + https://www.hsu-hh.de/aut/aas/qrcode + + + + + + + + QrCode + QrCode + + QrCode + + + + + In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. + QrCode + + + + + + + CompanyLogo + https://www.hsu-hh.de/aut/aas/companylogo + + + + + + + + Firmenlogo + CompanyLogo + + CompanyLogo + + + + + Firmenlogo + CompanyLogo + + + + + + + \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/08_SchneiderElectric.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/08_SchneiderElectric.aasx.xml new file mode 100644 index 000000000..b85815050 --- /dev/null +++ b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/08_SchneiderElectric.aasx.xml @@ -0,0 +1,4570 @@ + + + + + SE_Tesys_Island_Header + www.company.com/ids/aas/2520_6010_8091_1277 + + + www.company.com/ids/asset/8220_6010_8091_3593 + + + + + + www.company.com/ids/sm/4343_5072_7091_3242 + + + + + www.company.com/ids/sm/2543_5072_7091_2660 + + + + + www.company.com/ids/sm/6053_5072_7091_5102 + + + + + www.company.com/ids/sm/6563_5072_7091_4267 + + + + + + + + + SE_Tesys_Island_Header + www.company.com/ids/asset/8220_6010_8091_3593 + Instance + + + + + Nameplate + www.company.com/ids/sm/4343_5072_7091_3242 + + + https://www.hsu-hh.de/aut/aas/nameplate + + + Instance + + + + + ManufacturerName + PARAMETER + + + 0173-1#02-AAO677#002 + + + Instance + + string + Schneider Electric + + + + + ManufacturerProductDesignation + PARAMETER + + + 0173-1#02-AAW338#001 + + + Instance + + string + Bus coupler TeSys island, Ethernet switch (EtherNet IP / Modbus TCP) + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + FR + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Rue Joseph Monier + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 92506 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Rueil Malmaison + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Hauts de Seine + + + + false + false + + + + + ManufacturerProductFamily + PARAMETER + + + 0173-1#02-AAU731#001 + + + Instance + + + + + + + + SerialNumber + PARAMETER + + + 0173-1#02-AAM556#002 + + + Instance + + string + 1x14F4023C + + + + + BatchNumber + PARAMETER + + + 0173-1#02-AAQ196#001 + + + Instance + + + + + + + + ProductCountryOfOrigin + PARAMETER + + + 0173-1#02-AAO841#001 + + + Instance + + string + FR + + + + + YearOfConstruction + PARAMETER + + + 0173-1#02-AAP906#001 + + + Instance + + string + 2019 + + + + + Marking_CE + PARAMETER + + + https://www.hsu-hh.de/aut/aas/productmarking + + + Instance + + + + + CEQualificationPresent + PARAMETER + + + 0173-1#02-BAF053#008 + + + Instance + + boolean + 1 + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + image/png + /aasx/Nameplate/marking_ce.png + + + + false + false + + + + + Marking_UL + PARAMETER + + + https://www.hsu-hh.de/aut/aas/productmarking + + + Instance + + + + + CEQualificationPresent + PARAMETER + + + 0173-1#02-BAF053#008 + + + Instance + + boolean + 1 + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + image/png + /aasx/Nameplate/UL.png + + + + false + false + + + + + Marking_WEEE + PARAMETER + + + https://www.hsu-hh.de/aut/aas/productmarking + + + Instance + + + + + CEQualificationPresent + PARAMETER + + + 0173-1#02-BAF053#008 + + + Instance + + boolean + 1 + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + image/png + /aasx/Nameplate/Marking_WEEE.png + + + + false + false + + + + + + Document + www.company.com/ids/sm/2543_5072_7091_2660 + + + https://www.hsu-hh.de/aut/aas/document + + + Instance + + + + + DeclarationCEMarking + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Schneider Electric + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Schneider Electric SAS + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + SC19062501 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + EU - Declaration of conformity + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + EU - Declaration of conformity + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + string + Bus Coupler for TeSys Island offer + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + string + TPRBCEIP, TPRBCPFN, TPRBETC + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + CE_TPRBC_SC19062501.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/CE_TPRBC_SC19062501.pdf + + + + false + false + + + + + DeclarationULMarking + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Schneider Electric + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Schneider Electric Automation SAS + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + NRAQ.E3220218 - PROGRAMMABLE CONTROLLERS + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + string + 2019 + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + PROGRAMMABLE_CONTROLLERS___UL_Product_iQ.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/PROGRAMMABLE_CONTROLLERS___UL_Product_iQ.pdf + + + + false + false + + + + + Instruction Bulletin + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Technical Documentation + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Schneider Electric + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Schneider Electric SAS + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 8536IB1901EN + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + System Guide + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Instruction bulletin + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + string + This instruction bulletin introduces and describes the main functions of TeSys island. + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + string + TeSys Island + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + instal_EN.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/Instal_EN.pdf + + + + false + false + + + + + + Service + www.company.com/ids/sm/6053_5072_7091_5102 + + + https://www.hsu-hh.de/aut/aas/service + + + Instance + + + + + ContactInfo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/contactinfo + + + Instance + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + Schneider Elcetric + + + + + ContactInfo_Role + PARAMETER + + + https://www.hsu-hh.de/aut/aas/role + + + Instance + + string + Manufacturer + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Schneider Platz + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 97816 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Marktheidenfeld + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + + + + + false + false + + + + + Email + PARAMETER + + + https://www.hsu-hh.de/aut/aas/email + + + Instance + + string + + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://www.schneider-electric.com/en/work/support/ + + + + + PhoneNumber + PARAMETER + + + 0173-1#02-AAO136#002 + + + Instance + + string + + + + + + Fax + PARAMETER + + + https://www.hsu-hh.de/aut/aas/fax + + + Instance + + string + + + + + false + false + + + + + + Identification + www.company.com/ids/sm/6563_5072_7091_4267 + + + https://www.hsu-hh.de/aut/aas/identification + + + Instance + + + + + ManufacturerName + PARAMETER + + + 0173-1#02-AAO677#002 + + + Instance + + string + Schneider Electric + + + + + GLNOfManufacturer + PARAMETER + + + 0173-1#02-AAY812#001 + + + Instance + + string + TPRBCEIP + + + + + SupplierOfTheIdentifier + + + 0173-1#02-AAP796#004 + + + Instance + + + + + + + + MAN_PROD_NUM + + + 0173-1#02-AAO676#003 + + + Instance + + + + + + + + ManufacturerProductDesignation + PARAMETER + + + 0173-1#02-AAW338#001 + + + Instance + + string + Bus coupler TeSys island, Ethernet switch (EtherNet IP / Modbus TCP) + + + + + ManufacturerProductDescription + PARAMETER + + + 0173-1#02-AAU734#001 + + + Instance + + langString + Bus coupler Ethernet IP / Modbus TCP, point of connection between a group of starters and an automation controller + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + Schneider Electric + + + + + GLNOfSupplier + PARAMETER + + + 0173-1#02-AAY813#001 + + + Instance + + string + TPRBCEIP + + + + + SupplierIdProvider + PARAMETER + + + https://www.hsu-hh.de/aut/aas/supplieridprovider + + + Instance + + + + + + + + SUP_PROD_NUM + PARAMETER + + + 0173-1#02-AAO736#004 + + + Instance + + + + + + + + SupplierProductDesignation + + + 0173-1#02-AAM551#002 + + + Instance + + string + Bus coupler TeSys island, Ethernet switch (EtherNet IP / Modbus TCP) + + + + + SupplierProductDescription + PARAMETER + + + 0173-1#02-AAU730#001 + + + Instance + + langString + Bus coupler Ethernet IP / Modbus TCP, point of connection between a group of starters and an automation controller + + + + + ManufacturerProductFamily + PARAMETER + + + 0173-1#02-AAU731#001 + + + Instance + + + + + + + + ClassificationSystem + PARAMETER + + + 0173-1#02-AAO715#002 + + + Instance + + string + eclass + + + + + SecondaryKeyTyp + + + https://www.hsu-hh.de/aut/aas/secondarykeytyp + + + Instance + + + + + + + + TypThumbnail + PARAMETER + + + www.company.com/ids/cd/4401_1272_7091_3437 + + + Instance + + image/jpeg + /aasx/Identification/TPRBCEIP.PNG + + + + + AssetId + PARAMETER + + + https://www.hsu-hh.de/aut/aas/assetid + + + Instance + + string + www.company.com/ids/asset/8220_6010_8091_3593 + + + + + SerialNumber + PARAMETER + + + 0173-1#02-AAM556#002 + + + Instance + + string + 1x14F4023C + + + + + BatchNumber + PARAMETER + + + 0173-1#02-AAQ196#001 + + + Instance + + + + + + + + SecondaryKeyInstance + PARAMETER + + + https://www.hsu-hh.de/aut/aas/secondarykeyinstance + + + Instance + + + + + + + + DateOfManufacture + PARAMETER + + + 0173-1#02-AAR972#002 + + + Instance + + + + + + + + DeviceRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/devicerevision + + + Instance + + + + + + + + SoftwareRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/softwarerevision + + + Instance + + + + + + + + HardwareRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/hardwarerevision + + + Instance + + + + + + + + QrCode + PARAMETER + + + https://www.hsu-hh.de/aut/aas/qrcode + + + Instance + + image/jpeg + /aasx/Identification/QRCode_Tesys_Island_Header.jpg + + + + + ContactInfo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/contactinfo + + + Instance + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + Schneider Electric + + + + + ContactInfo_Role + PARAMETER + + + https://www.hsu-hh.de/aut/aas/role + + + Instance + + string + Manufacturer + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + FR + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Rue Joseph Monier + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 92506 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Rueil Malmaison + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Hauts de Seine + + + + false + false + + + + + Email + PARAMETER + + + https://www.hsu-hh.de/aut/aas/email + + + Instance + + string + + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://www.se.com/ww/en/ + + + + + PhoneNumber + PARAMETER + + + 0173-1#02-AAO136#002 + + + Instance + + string + + + + + + Fax + PARAMETER + + + https://www.hsu-hh.de/aut/aas/fax + + + Instance + + string + + + + + false + false + + + + + CompanyLogo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/companylogo + + + Instance + + image/png + /aasx/Identification/logo_SE.png + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://www.schneider-electric.com/en/product-range-presentation/65746-tesys-island/?parent-category-id=3000&parent-subcategory-id=3080&filter=business-4-low-voltage-products-and-systems#tabs-top + + + + + + + + ManufacturerName + 0173-1#02-AAO677#002 + + + + + + + + Herstellername + Manufacturer Name + + Manufacturer Name + + + + + Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist + 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 + + + + + + + ManufacturerProductDesignation + 0173-1#02-AAW338#001 + + + + + + + + Manufacturer product designation + Herstellerproduktbezeichnung + + + ManufacturerTypName + + + STRING_TRANSLATABLE + + Kurze Beschreibung des Produktes (Kurztext) + Short description of the product (short text) + + + + + + + PhysicalAddress + https://www.hsu-hh.de/aut/aas/physicaladdress + + + + + + + + PhysicalAddress + Physische Adresse + + PhysicalAddress + + + + + Sammlung für reale physische Adresse + Collection for real physical address + + + + + + + CountryCode + 0173-1#02-AAO730#001 + + + + + + + + + + + + Landeskennung + Country code + + Country code + + + + + Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes + agreed upon symbol for unambiguous identification of a country + + + + + + + Street + 0173-1#02-AAO128#001 + + + + + + + + Strasse + Street + + Street + + + + + Name der Strasse und Hausnummer + Street name and house number + + + + + + + Zip + 0173-1#02-AAO129#002 + + + + + + + + Zip + Postleitzahl + + PostalCode + + + + + ZIP code of address + Postleitzahl der Anschrift + + + + + + + CityTown + 0173-1#02-AAO132#001 + + + + + + + + Ort + City/town + + City/town + + + + + Town or city of the company + Ortsangabe + + + + + + + StateCounty + 0173-1#02-AAO133#002 + + + + + + + + state/county + Bundesland + + StateCounty + + + + + Bundesland + state/county + + + + + + + ManufacturerProductFamily + 0173-1#02-AAU731#001 + + + + + + + + Manufacturer product family + Herstellerproduktfamilie + + TypClass + + + + + 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie + 2nd level of a 3 level manufacturer specific product hierarchy + + + + + + + SerialNumber + 0173-1#02-AAM556#002 + + + + + + + + Serial number + Seriennummer + + InstanceId + + + + + eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist + unique combination of numbers and letters used to identify the device once it has been manufactured + + + + + + + BatchNumber + 0173-1#02-AAQ196#001 + + + + + + + + Batch number + Chargen-Nummer + + ChargeId + + + + + Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge + Number assigned by the manufacturer of a material to identify the manufacturer's batch + + + + + + + ProductCountryOfOrigin + 0173-1#02-AAO841#001 + + + + + + + + Produkt Ursprungsland + Product country of origin + + CountryOfOrigin + + + + + Land in dem das Produkt hergestellt wurde (Hersteller Land) + Country in which the product is manufactured (manufacturer country) + + + + + + + YearOfConstruction + 0173-1#02-AAP906#001 + + + + + + + + Year of construction + Baujahr + + YearOfConstruction + + + + + Jahreszahl als Datumsangabe für die Fertigstellung des Objektes + Year as completion date of object + + + + + + + ProductMarking + https://www.hsu-hh.de/aut/aas/productmarking + + + + + + + + Produktkennzeichnung + Product Marking + + ProductMarking + + + + + Sammlungsdatei für Produktkennzeichnung + Collection file for product marking + + + + + + + CEQualificationPresent + 0173-1#02-BAF053#008 + + + + + + + + CE-Kennzeichnung vorhanden + CE- qualification present + + CEMarkingPresent + + + BOOLEAN + + whether CE- qualification is present + Angabe, ob CE-Kennzeichnung vorhanden ist + + + + + + + File + 0173-1#02-AAD005#008 + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Enthaltene Doku. Datei + Embedded Doc. file + + File + + + + + Verweis/ BLOB auf enthaltene Dokumentations-Datei. + Reference/ BLOB to embedded documentation file. + + + + + + + DocumentationItem + 0173-1#02-AAD001#001 + + + + + + + + Dokumentationsgruppe + Documentation item + + DocumentationItem + + + + + Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. + Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. + + + + + + + DocumentType + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + + + + + + Dokumententyp + Document Type + + DocumentType + + + + + Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) + TBD + + + + + + + VDI2770_DomainId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + + + + + + Domain-Nummer + DomainId + + DomainId + + + + + Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. + TBD + + + + + + + VDI2770_IdType + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + + + + + + Nummerntyp + IdType + + IdType + + + + + Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. + TBD + + + + + + + DocumentId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + + + + + + DocumentId + Dokumenten-Nummer + + DocumentId + + + + + Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. + TBD + + + + + + + DocumentDomainId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + + + + + + DocumentDomainId + DocumentDomainId + + DocumentDomainId + + + + + Kennung oder Kennzeichen einer Domäne + TBD + + + + + + + VDI2770_Role + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + + + + + + Rolle + Role + + Role + + + + + Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) + TBD + + + + + + + VDI2770_OrganisationId + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + + + + + + Organisation ID + Organisation ID + + OrganisationId + + + + + eindeutige ID für die Organisation + TBD + + + + + + + VDI2770_OrganisationName + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + + + + + + OrganisationName + OrganisationName + + OrganisationName + + + + + gebräuchliche Bezeichnung für die Organisation + TBD + + + + + + + VDI2770_OrganisationOfficialName + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + + + + + + Offizieller Name der Organisation + Organisation Official Name + + OrganisationOfficialName + + + + + offizieller Name der Organisation + TBD + + + + + + + VDI2770_Description + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + + + + + + Beschreibung + Description + + Description + + + + + Beschreibung für die nächste übergeordnete Collection + TBD + + + + + + + DocumentPartId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + + + + + + Dokumenten-Teilnummer + DocumentPartId + + DocumentPartId + + + + + Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. + TBD + + + + + + + DocumentClassification_ClassId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + + + + Dokumentkategorie + Document category + + DocCategory + + + + + Dokumentkategorie nach VDI 2770:2018/10 + Document category after VDI 2770:2018/10 + + + + + + + VDI2770_ClassName + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + + + + + + Klassenname + Class Name + + ClassName + + + + + Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. + TBD + + + + + + + VDI2770_ClassificationSystem + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + + + + + + Klassifizierungssystem + classification system + + ClassificationSystem + + + + + Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. + TBD + + + + + + + DocumentVersionId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + + + + + + Dokumenten-Versionsnummer + DocumentVersionId + + DocumentVersionId + + + + + Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. + TBD + + + + + + + DocumentVersion_LanguageCode + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + + + + + + Sprachenschlüssel + LanguageCode + + LanguageCode + + + + + Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 + TBD + + + + + + + VDI2770_Title + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + + + + + + Titel + Title + + VDI2770_Title + + + + + sprachabhängiger Titel des Dokuments + TBD + + + + + + + VDI2770_Summary + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + + + + + + Zusammenfassung + Summary + + Summary + + + + + sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts + TBD + + + + + + + VDI2770_Keywords + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + + + + + + Schlagwörter + Keywords + + Keywords + + + + + sprachabhängige, durch Komma getrennte Liste von Schlagwörtern + TBD + + + + + + + VDI2770_StatusValue + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + + + + + + Statuswert + StatusValue + + StatusValue + + + + + Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) + TBD + + + + + + + VDI2770_SetDate + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + + + + + + Erstellungsdatum + Set Date + + SetDate + + + + + Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). + TBD + + + + + + + VDI2770_Purpose + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + + + + + + Zweck + Purpose + + Purpose + + + + + Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. + TBD + + + + + + + VDI2770_BasedOnProcedure + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + + + + + + Prozedur + Procedure + + BasedOnProcedure + + + + + textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt + TBD + + + + + + + VDI2770_Comments + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + + + + + + Kommentar + Comments + + Comments + + + + + textuelle Bemerkungen und Anmerkungen zum Status + TBD + + + + + + + VDI2770_ReferencedObject_Type + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + + + + + + Typ + Type + + Type + + + + + Für Type des Objekts muss immer Product angegeben werden. + TBD + + + + + + + VDI2770_ReferencedObject_RefType + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + + + + + + RefType + RefType + + RefType + + + + + Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) + TBD + + + + + + + VDI2770_ReferencedObject_ObjectId + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + + + + + + ObjectId + ObjectId + + ObjectId + + + + + Angabe der Identifikationsnummer zum Objekt + TBD + + + + + + + VDI2770_FileId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + + + + + + ID der Datei + File ID + + FileId + + + + + eindeutige ID für die Datei + TBD + + + + + + + VDI2770_FileName + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + + + + + + Dateiname + File name + + FileName + + + + + Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. + TBD + + + + + + + VDI2770_FileFormat + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + + + + + + Datei Format + File format + + FileFormat + + + + + Angabe eines Media Typs gemäß der Liste der IANA + TBD + + + + + + + OrganisationContactInfo + https://www.hsu-hh.de/aut/aas/contactinfo + + + + + + + + Contact Info + Kontakt Info + + OrganisationContactInfo + + + + + Sammlung für die allgemeinen Kontaktdaten + Collection for general contact data + + + + + + + NameOfSupplier + 0173-1#02-AAO735#003 + + + + + + + + + + + + name of supplier + Lieferantenname + + name of supplier + + + + + Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt + name of supplier which provides the customer with a product or a service + + + + + + + ContactInfo_Role + https://www.hsu-hh.de/aut/aas/role + + + + + + + + Rolle + Role + + Role + + + + + Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt + Information to specify the role which the organisation of ContactInfo plays + + + + + + + Email + https://www.hsu-hh.de/aut/aas/email + + + + + + + + Emailadresse + Email address + + Email + + + + + Emailadresse + Email address + + + + + + + URL + 0173-1#02-AAO694#001 + + + + + + + + Internetadresse + Internet address + + URL + + + + + stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html + Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html + + + + + + + PhoneNumber + 0173-1#02-AAO136#002 + + + + + + + + Telefonnummer + telephone number + + Phone + + + + + vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist + complete telephone number to be called to reach a business partner + + + + + + + Fax + https://www.hsu-hh.de/aut/aas/fax + + + + + + + + Fax + Fax + + Fax + + + + + Faxnummer + Fax number + + + + + + + 0173-1#02-AAO136#002 + + + + + GLNOfManufacturer + 0173-1#02-AAY812#001 + + + + + + + + GLN of manufacturer + GLN des Herstellers + + GLN of manufacturer + + + + + international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort + internationally unique identification number for the manufacturer of the device or the product and for the physical location + + + + + + + SupplierOfTheIdentifier + 0173-1#02-AAP796#004 + + + + + + + + Supplier of the identifier + Anbieter der Identifikationsnummer für Hersteller + + Supplier of the identifier + + + STRING_TRANSLATABLE + + DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification + DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer + + + + + + + MAN_PROD_NUM + + product article number of manufacturer + + 0173-1#02-AAO676#003 + + + + + + + + product article number of manufacturer + Herstellerartikelnummer + + MAN_PROD_NUM + + + STRING_TRANSLATABLE + + eindeutiger Bestellschlüssel des Herstellers + unique product identifier of the manufacturer + + + + + + + ManufacturerProductDescription + 0173-1#02-AAU734#001 + + + + + + + + Manufacturer product description + Herstellerproduktbeschreibung + + Manufacturer product description + + + + + Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) + Description of the product, it's technical features and implementation if needed (long text) + + + + + + + GLNOfSupplier + 0173-1#02-AAY813#001 + + + + + + + + GLN of supplier + GLN des Lieferanten + + GLN of supplier + + + + + international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort + internationally unique identification number for the supplier of the device or the product and for the physical location + + + + + + + SupplierIdProvider + https://www.hsu-hh.de/aut/aas/supplieridprovider + + + + + + + + SupplierIdProvider + Anbieter der Identifikationsnummer + + SupplierIdProvider + + + STRING_TRANSLATABLE + + DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer + DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification + + + + + + + SUP_PROD_NUM + 0173-1#02-AAO736#004 + + + + + + + + product article number of supplier + Lieferantenartikelnummer + + product article number of supplier + + + + + eindeutiger Bestellschlüssel des Lieferanten + unique product order identifier of the supplier + + + + + + + SupplierProductDesignation + 0173-1#02-AAM551#002 + + + + + + + + Supplier product designation + Lieferantenproduktbezeichnung + + SupplierTypName + + + STRING_TRANSLATABLE + + Kurze Beschreibung des Produktes (Kurztext) + Short description of the product (short text) + + + + + + + SupplierProductDescription + 0173-1#02-AAU730#001 + + + + + + + + Supplier product description + Lieferantenproduktbeschreibung + + Supplier product description + + + + + Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) + Description of the product, it's technical features and implementation if needed (long text) + + + + + + + ClassificationSystem + 0173-1#02-AAO715#002 + + + + + + + + classification system + Klassifizierungssystem + + ClassificationSystem + + + + + Klassifizierungssystem + Classification System + + + + + + + SecondaryKeyTyp + https://www.hsu-hh.de/aut/aas/secondarykeytyp + + + + + + + + SecondaryKeyTyp + Typnummer des IT Systems + + SecondaryKeyTyp + + + + + Führende technische ID im IT System des Typs + SecondaryKeyTyp + + + + + + + TypThumbnail + www.company.com/ids/cd/6044_0150_1191_5121 + + + + + + + + TypThumbnail + Vorschaubild + + TypThumbnail + + + + + Darstellung des Produkttyps in kleinem Format + Small picture of the product type + + + + + + + AssetId + https://www.hsu-hh.de/aut/aas/assetid + + + + + + + + AssetId + Asset ID + + AssetId + + + + + Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. + Global unique ID of an asset, which can be read by both human and machine. + + + + + + + SecondaryKeyInstance + https://www.hsu-hh.de/aut/aas/secondarykeyinstance + + + + + + + + SecondaryKeyInstance + Instanznummer des IT Systems + + SecondaryKeyInstance + + + + + Führende technische ID im IT System der Instanz + SecondaryKeyInstance + + + + + + + DateOfManufacture + 0173-1#02-AAR972#002 + + + + + + + + Date of manufacture + Herstellungsdatum + + Date of manufacture + + + DATE + + Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist + Date from which the production and / or development process is completed or from which a service is provided completely + + + + + + + DeviceRevision + https://www.hsu-hh.de/aut/aas/devicerevision + + + + + + + + DeviceRevision + DeviceRevision + + DeviceRevision + + + + + DeviceRevision + DeviceRevision + + + + + + + SoftwareRevision + https://www.hsu-hh.de/aut/aas/softwarerevision + + + + + + + + SoftwareRevision + SoftwareRevision + + SoftwareRevision + + + + + SoftwareRevision + SoftwareRevision + + + + + + + HardwareRevision + https://www.hsu-hh.de/aut/aas/hardwarerevision + + + + + + + + HardwareRevision + HardwareRevision + + HardwareRevision + + + + + HardwareRevision + HardwareRevision + + + + + + + QrCode + https://www.hsu-hh.de/aut/aas/qrcode + + + + + + + + QrCode + QrCode + + QrCode + + + + + In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. + QrCode + + + + + + + CompanyLogo + https://www.hsu-hh.de/aut/aas/companylogo + + + + + + + + Firmenlogo + CompanyLogo + + CompanyLogo + + + + + Firmenlogo + CompanyLogo + + + + + + + \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/09_SchneiderElectric.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/09_SchneiderElectric.aasx.xml new file mode 100644 index 000000000..89372c86b --- /dev/null +++ b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/09_SchneiderElectric.aasx.xml @@ -0,0 +1,4570 @@ + + + + + SE_Tesys_Island_Power + www.company.com/ids/aas/2520_6010_8091_1277 + + + www.company.com/ids/asset/8220_6010_8091_3593 + + + + + + www.company.com/ids/sm/4343_5072_7091_3242 + + + + + www.company.com/ids/sm/2543_5072_7091_2660 + + + + + www.company.com/ids/sm/6053_5072_7091_5102 + + + + + www.company.com/ids/sm/6563_5072_7091_4267 + + + + + + + + + SE_Tesys_Island_Power + www.company.com/ids/asset/8220_6010_8091_3593 + Instance + + + + + Nameplate + www.company.com/ids/sm/4343_5072_7091_3242 + + + https://www.hsu-hh.de/aut/aas/nameplate + + + Instance + + + + + ManufacturerName + PARAMETER + + + 0173-1#02-AAO677#002 + + + Instance + + string + Schneider Electric + + + + + ManufacturerProductDesignation + PARAMETER + + + 0173-1#02-AAW338#001 + + + Instance + + string + Voltage interface Module, TeSys island + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + FR + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Rue Joseph Monier + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 92506 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Rueil Malmaison + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Hauts de Seine + + + + false + false + + + + + ManufacturerProductFamily + PARAMETER + + + 0173-1#02-AAU731#001 + + + Instance + + + + + + + + SerialNumber + PARAMETER + + + 0173-1#02-AAM556#002 + + + Instance + + string + 190730000777 + + + + + BatchNumber + PARAMETER + + + 0173-1#02-AAQ196#001 + + + Instance + + + + + + + + ProductCountryOfOrigin + PARAMETER + + + 0173-1#02-AAO841#001 + + + Instance + + string + FR + + + + + YearOfConstruction + PARAMETER + + + 0173-1#02-AAP906#001 + + + Instance + + string + 2019 + + + + + Marking_CE + PARAMETER + + + https://www.hsu-hh.de/aut/aas/productmarking + + + Instance + + + + + CEQualificationPresent + PARAMETER + + + 0173-1#02-BAF053#008 + + + Instance + + boolean + 1 + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + image/png + /aasx/Nameplate/marking_ce.png + + + + false + false + + + + + Marking_UL + PARAMETER + + + https://www.hsu-hh.de/aut/aas/productmarking + + + Instance + + + + + CEQualificationPresent + PARAMETER + + + 0173-1#02-BAF053#008 + + + Instance + + boolean + 1 + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + image/png + /aasx/Nameplate/UL.png + + + + false + false + + + + + Marking_WEEE + PARAMETER + + + https://www.hsu-hh.de/aut/aas/productmarking + + + Instance + + + + + CEQualificationPresent + PARAMETER + + + 0173-1#02-BAF053#008 + + + Instance + + boolean + 1 + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + image/png + /aasx/Nameplate/Marking_WEEE.png + + + + false + false + + + + + + Document + www.company.com/ids/sm/2543_5072_7091_2660 + + + https://www.hsu-hh.de/aut/aas/document + + + Instance + + + + + DeclarationCEMarking + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Schneider Electric + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Schneider Electric SAS + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + SC19062503 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + EU - Declaration of conformity + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + EU - Declaration of conformity + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + string + Voltage Measurement Module for TeSys Island offer + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + string + TPRVM001 + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + CE_TPRVM_SC19062503.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/CE_TPRVM_SC19062503.pdf + + + + false + false + + + + + DeclarationULMarking + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Schneider Electric + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Schneider Electric Automation SAS + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + NRAQ.E3220218 - PROGRAMMABLE CONTROLLERS + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + string + 2019 + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + PROGRAMMABLE_CONTROLLERS___UL_Product_iQ.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/PROGRAMMABLE_CONTROLLERS___UL_Product_iQ.pdf + + + + false + false + + + + + Instruction Bulletin + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Technical Documentation + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Schneider Electric + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Schneider Electric SAS + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 8536IB1901EN + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + System Guide + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Instruction bulletin + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + string + This instruction bulletin introduces and describes the main functions of TeSys island. + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + string + TeSys Island + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + instal_EN.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/Instal_EN.pdf + + + + false + false + + + + + + Service + www.company.com/ids/sm/6053_5072_7091_5102 + + + https://www.hsu-hh.de/aut/aas/service + + + Instance + + + + + ContactInfo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/contactinfo + + + Instance + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + Schneider Elcetric + + + + + ContactInfo_Role + PARAMETER + + + https://www.hsu-hh.de/aut/aas/role + + + Instance + + string + Manufacturer + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Schneider Platz + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 97816 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Marktheidenfeld + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + + + + + false + false + + + + + Email + PARAMETER + + + https://www.hsu-hh.de/aut/aas/email + + + Instance + + string + + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://www.schneider-electric.com/en/work/support/ + + + + + PhoneNumber + PARAMETER + + + 0173-1#02-AAO136#002 + + + Instance + + string + + + + + + Fax + PARAMETER + + + https://www.hsu-hh.de/aut/aas/fax + + + Instance + + string + + + + + false + false + + + + + + Identification + www.company.com/ids/sm/6563_5072_7091_4267 + + + https://www.hsu-hh.de/aut/aas/identification + + + Instance + + + + + ManufacturerName + PARAMETER + + + 0173-1#02-AAO677#002 + + + Instance + + string + Schneider Electric + + + + + GLNOfManufacturer + PARAMETER + + + 0173-1#02-AAY812#001 + + + Instance + + string + TPRVM001 + + + + + SupplierOfTheIdentifier + + + 0173-1#02-AAP796#004 + + + Instance + + + + + + + + MAN_PROD_NUM + + + 0173-1#02-AAO676#003 + + + Instance + + + + + + + + ManufacturerProductDesignation + PARAMETER + + + 0173-1#02-AAW338#001 + + + Instance + + string + Voltage interface Module, TeSys island + + + + + ManufacturerProductDescription + PARAMETER + + + 0173-1#02-AAU734#001 + + + Instance + + langString + Monitoring of the mains voltage powering the island and Reporting of the voltage to the bus coupler to enable power & energy monitoring + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + Schneider Electric + + + + + GLNOfSupplier + PARAMETER + + + 0173-1#02-AAY813#001 + + + Instance + + string + TPRVM001 + + + + + SupplierIdProvider + PARAMETER + + + https://www.hsu-hh.de/aut/aas/supplieridprovider + + + Instance + + + + + + + + SUP_PROD_NUM + PARAMETER + + + 0173-1#02-AAO736#004 + + + Instance + + + + + + + + SupplierProductDesignation + + + 0173-1#02-AAM551#002 + + + Instance + + string + Voltage interface Module, TeSys island + + + + + SupplierProductDescription + PARAMETER + + + 0173-1#02-AAU730#001 + + + Instance + + langString + Monitoring of the mains voltage powering the island and Reporting of the voltage to the bus coupler to enable power & energy monitoring + + + + + ManufacturerProductFamily + PARAMETER + + + 0173-1#02-AAU731#001 + + + Instance + + + + + + + + ClassificationSystem + PARAMETER + + + 0173-1#02-AAO715#002 + + + Instance + + string + eclass + + + + + SecondaryKeyTyp + + + https://www.hsu-hh.de/aut/aas/secondarykeytyp + + + Instance + + + + + + + + TypThumbnail + PARAMETER + + + www.company.com/ids/cd/4401_1272_7091_3437 + + + Instance + + image/jpeg + /aasx/Identification/TPRVM001.PNG + + + + + AssetId + PARAMETER + + + https://www.hsu-hh.de/aut/aas/assetid + + + Instance + + string + www.company.com/ids/asset/8220_6010_8091_3593 + + + + + SerialNumber + PARAMETER + + + 0173-1#02-AAM556#002 + + + Instance + + string + 190730000777 + + + + + BatchNumber + PARAMETER + + + 0173-1#02-AAQ196#001 + + + Instance + + + + + + + + SecondaryKeyInstance + PARAMETER + + + https://www.hsu-hh.de/aut/aas/secondarykeyinstance + + + Instance + + + + + + + + DateOfManufacture + PARAMETER + + + 0173-1#02-AAR972#002 + + + Instance + + + + + + + + DeviceRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/devicerevision + + + Instance + + + + + + + + SoftwareRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/softwarerevision + + + Instance + + + + + + + + HardwareRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/hardwarerevision + + + Instance + + + + + + + + QrCode + PARAMETER + + + https://www.hsu-hh.de/aut/aas/qrcode + + + Instance + + image/jpeg + /aasx/Identification/QRCode_Tesys_Island_Power.jpg + + + + + ContactInfo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/contactinfo + + + Instance + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + Schneider Electric + + + + + ContactInfo_Role + PARAMETER + + + https://www.hsu-hh.de/aut/aas/role + + + Instance + + string + Manufacturer + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + FR + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Rue Joseph Monier + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 92506 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Rueil Malmaison + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Hauts de Seine + + + + false + false + + + + + Email + PARAMETER + + + https://www.hsu-hh.de/aut/aas/email + + + Instance + + string + + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://www.schneider-electric.com/en/ + + + + + PhoneNumber + PARAMETER + + + 0173-1#02-AAO136#002 + + + Instance + + string + + + + + + Fax + PARAMETER + + + https://www.hsu-hh.de/aut/aas/fax + + + Instance + + string + + + + + false + false + + + + + CompanyLogo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/companylogo + + + Instance + + image/png + /aasx/Identification/logo_SE.png + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://www.schneider-electric.com/en/product-range-presentation/65746-tesys-island/?parent-category-id=3000&parent-subcategory-id=3080&filter=business-4-low-voltage-products-and-systems#tabs-top + + + + + + + + ManufacturerName + 0173-1#02-AAO677#002 + + + + + + + + Herstellername + Manufacturer Name + + Manufacturer Name + + + + + Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist + 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 + + + + + + + ManufacturerProductDesignation + 0173-1#02-AAW338#001 + + + + + + + + Manufacturer product designation + Herstellerproduktbezeichnung + + + ManufacturerTypName + + + STRING_TRANSLATABLE + + Kurze Beschreibung des Produktes (Kurztext) + Short description of the product (short text) + + + + + + + PhysicalAddress + https://www.hsu-hh.de/aut/aas/physicaladdress + + + + + + + + PhysicalAddress + Physische Adresse + + PhysicalAddress + + + + + Sammlung für reale physische Adresse + Collection for real physical address + + + + + + + CountryCode + 0173-1#02-AAO730#001 + + + + + + + + + + + + Landeskennung + Country code + + Country code + + + + + Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes + agreed upon symbol for unambiguous identification of a country + + + + + + + Street + 0173-1#02-AAO128#001 + + + + + + + + Strasse + Street + + Street + + + + + Name der Strasse und Hausnummer + Street name and house number + + + + + + + Zip + 0173-1#02-AAO129#002 + + + + + + + + Zip + Postleitzahl + + PostalCode + + + + + ZIP code of address + Postleitzahl der Anschrift + + + + + + + CityTown + 0173-1#02-AAO132#001 + + + + + + + + Ort + City/town + + City/town + + + + + Town or city of the company + Ortsangabe + + + + + + + StateCounty + 0173-1#02-AAO133#002 + + + + + + + + state/county + Bundesland + + StateCounty + + + + + Bundesland + state/county + + + + + + + ManufacturerProductFamily + 0173-1#02-AAU731#001 + + + + + + + + Manufacturer product family + Herstellerproduktfamilie + + TypClass + + + + + 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie + 2nd level of a 3 level manufacturer specific product hierarchy + + + + + + + SerialNumber + 0173-1#02-AAM556#002 + + + + + + + + Serial number + Seriennummer + + InstanceId + + + + + eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist + unique combination of numbers and letters used to identify the device once it has been manufactured + + + + + + + BatchNumber + 0173-1#02-AAQ196#001 + + + + + + + + Batch number + Chargen-Nummer + + ChargeId + + + + + Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge + Number assigned by the manufacturer of a material to identify the manufacturer's batch + + + + + + + ProductCountryOfOrigin + 0173-1#02-AAO841#001 + + + + + + + + Produkt Ursprungsland + Product country of origin + + CountryOfOrigin + + + + + Land in dem das Produkt hergestellt wurde (Hersteller Land) + Country in which the product is manufactured (manufacturer country) + + + + + + + YearOfConstruction + 0173-1#02-AAP906#001 + + + + + + + + Year of construction + Baujahr + + YearOfConstruction + + + + + Jahreszahl als Datumsangabe für die Fertigstellung des Objektes + Year as completion date of object + + + + + + + ProductMarking + https://www.hsu-hh.de/aut/aas/productmarking + + + + + + + + Produktkennzeichnung + Product Marking + + ProductMarking + + + + + Sammlungsdatei für Produktkennzeichnung + Collection file for product marking + + + + + + + CEQualificationPresent + 0173-1#02-BAF053#008 + + + + + + + + CE-Kennzeichnung vorhanden + CE- qualification present + + CEMarkingPresent + + + BOOLEAN + + whether CE- qualification is present + Angabe, ob CE-Kennzeichnung vorhanden ist + + + + + + + File + 0173-1#02-AAD005#008 + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Enthaltene Doku. Datei + Embedded Doc. file + + File + + + + + Verweis/ BLOB auf enthaltene Dokumentations-Datei. + Reference/ BLOB to embedded documentation file. + + + + + + + DocumentationItem + 0173-1#02-AAD001#001 + + + + + + + + Dokumentationsgruppe + Documentation item + + DocumentationItem + + + + + Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. + Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. + + + + + + + DocumentType + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + + + + + + Dokumententyp + Document Type + + DocumentType + + + + + Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) + TBD + + + + + + + VDI2770_DomainId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + + + + + + Domain-Nummer + DomainId + + DomainId + + + + + Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. + TBD + + + + + + + VDI2770_IdType + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + + + + + + Nummerntyp + IdType + + IdType + + + + + Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. + TBD + + + + + + + DocumentId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + + + + + + DocumentId + Dokumenten-Nummer + + DocumentId + + + + + Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. + TBD + + + + + + + DocumentDomainId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + + + + + + DocumentDomainId + DocumentDomainId + + DocumentDomainId + + + + + Kennung oder Kennzeichen einer Domäne + TBD + + + + + + + VDI2770_Role + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + + + + + + Rolle + Role + + Role + + + + + Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) + TBD + + + + + + + VDI2770_OrganisationId + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + + + + + + Organisation ID + Organisation ID + + OrganisationId + + + + + eindeutige ID für die Organisation + TBD + + + + + + + VDI2770_OrganisationName + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + + + + + + OrganisationName + OrganisationName + + OrganisationName + + + + + gebräuchliche Bezeichnung für die Organisation + TBD + + + + + + + VDI2770_OrganisationOfficialName + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + + + + + + Offizieller Name der Organisation + Organisation Official Name + + OrganisationOfficialName + + + + + offizieller Name der Organisation + TBD + + + + + + + VDI2770_Description + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + + + + + + Beschreibung + Description + + Description + + + + + Beschreibung für die nächste übergeordnete Collection + TBD + + + + + + + DocumentPartId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + + + + + + Dokumenten-Teilnummer + DocumentPartId + + DocumentPartId + + + + + Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. + TBD + + + + + + + DocumentClassification_ClassId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + + + + Dokumentkategorie + Document category + + DocCategory + + + + + Dokumentkategorie nach VDI 2770:2018/10 + Document category after VDI 2770:2018/10 + + + + + + + VDI2770_ClassName + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + + + + + + Klassenname + Class Name + + ClassName + + + + + Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. + TBD + + + + + + + VDI2770_ClassificationSystem + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + + + + + + Klassifizierungssystem + classification system + + ClassificationSystem + + + + + Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. + TBD + + + + + + + DocumentVersionId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + + + + + + Dokumenten-Versionsnummer + DocumentVersionId + + DocumentVersionId + + + + + Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. + TBD + + + + + + + DocumentVersion_LanguageCode + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + + + + + + Sprachenschlüssel + LanguageCode + + LanguageCode + + + + + Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 + TBD + + + + + + + VDI2770_Title + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + + + + + + Titel + Title + + VDI2770_Title + + + + + sprachabhängiger Titel des Dokuments + TBD + + + + + + + VDI2770_Summary + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + + + + + + Zusammenfassung + Summary + + Summary + + + + + sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts + TBD + + + + + + + VDI2770_Keywords + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + + + + + + Schlagwörter + Keywords + + Keywords + + + + + sprachabhängige, durch Komma getrennte Liste von Schlagwörtern + TBD + + + + + + + VDI2770_StatusValue + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + + + + + + Statuswert + StatusValue + + StatusValue + + + + + Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) + TBD + + + + + + + VDI2770_SetDate + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + + + + + + Erstellungsdatum + Set Date + + SetDate + + + + + Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). + TBD + + + + + + + VDI2770_Purpose + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + + + + + + Zweck + Purpose + + Purpose + + + + + Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. + TBD + + + + + + + VDI2770_BasedOnProcedure + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + + + + + + Prozedur + Procedure + + BasedOnProcedure + + + + + textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt + TBD + + + + + + + VDI2770_Comments + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + + + + + + Kommentar + Comments + + Comments + + + + + textuelle Bemerkungen und Anmerkungen zum Status + TBD + + + + + + + VDI2770_ReferencedObject_Type + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + + + + + + Typ + Type + + Type + + + + + Für Type des Objekts muss immer Product angegeben werden. + TBD + + + + + + + VDI2770_ReferencedObject_RefType + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + + + + + + RefType + RefType + + RefType + + + + + Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) + TBD + + + + + + + VDI2770_ReferencedObject_ObjectId + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + + + + + + ObjectId + ObjectId + + ObjectId + + + + + Angabe der Identifikationsnummer zum Objekt + TBD + + + + + + + VDI2770_FileId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + + + + + + ID der Datei + File ID + + FileId + + + + + eindeutige ID für die Datei + TBD + + + + + + + VDI2770_FileName + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + + + + + + Dateiname + File name + + FileName + + + + + Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. + TBD + + + + + + + VDI2770_FileFormat + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + + + + + + Datei Format + File format + + FileFormat + + + + + Angabe eines Media Typs gemäß der Liste der IANA + TBD + + + + + + + OrganisationContactInfo + https://www.hsu-hh.de/aut/aas/contactinfo + + + + + + + + Contact Info + Kontakt Info + + OrganisationContactInfo + + + + + Sammlung für die allgemeinen Kontaktdaten + Collection for general contact data + + + + + + + NameOfSupplier + 0173-1#02-AAO735#003 + + + + + + + + + + + + name of supplier + Lieferantenname + + name of supplier + + + + + Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt + name of supplier which provides the customer with a product or a service + + + + + + + ContactInfo_Role + https://www.hsu-hh.de/aut/aas/role + + + + + + + + Rolle + Role + + Role + + + + + Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt + Information to specify the role which the organisation of ContactInfo plays + + + + + + + Email + https://www.hsu-hh.de/aut/aas/email + + + + + + + + Emailadresse + Email address + + Email + + + + + Emailadresse + Email address + + + + + + + URL + 0173-1#02-AAO694#001 + + + + + + + + Internetadresse + Internet address + + URL + + + + + stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html + Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html + + + + + + + PhoneNumber + 0173-1#02-AAO136#002 + + + + + + + + Telefonnummer + telephone number + + Phone + + + + + vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist + complete telephone number to be called to reach a business partner + + + + + + + Fax + https://www.hsu-hh.de/aut/aas/fax + + + + + + + + Fax + Fax + + Fax + + + + + Faxnummer + Fax number + + + + + + + 0173-1#02-AAO136#002 + + + + + GLNOfManufacturer + 0173-1#02-AAY812#001 + + + + + + + + GLN of manufacturer + GLN des Herstellers + + GLN of manufacturer + + + + + international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort + internationally unique identification number for the manufacturer of the device or the product and for the physical location + + + + + + + SupplierOfTheIdentifier + 0173-1#02-AAP796#004 + + + + + + + + Supplier of the identifier + Anbieter der Identifikationsnummer für Hersteller + + Supplier of the identifier + + + STRING_TRANSLATABLE + + DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification + DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer + + + + + + + MAN_PROD_NUM + + product article number of manufacturer + + 0173-1#02-AAO676#003 + + + + + + + + product article number of manufacturer + Herstellerartikelnummer + + MAN_PROD_NUM + + + STRING_TRANSLATABLE + + eindeutiger Bestellschlüssel des Herstellers + unique product identifier of the manufacturer + + + + + + + ManufacturerProductDescription + 0173-1#02-AAU734#001 + + + + + + + + Manufacturer product description + Herstellerproduktbeschreibung + + Manufacturer product description + + + + + Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) + Description of the product, it's technical features and implementation if needed (long text) + + + + + + + GLNOfSupplier + 0173-1#02-AAY813#001 + + + + + + + + GLN of supplier + GLN des Lieferanten + + GLN of supplier + + + + + international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort + internationally unique identification number for the supplier of the device or the product and for the physical location + + + + + + + SupplierIdProvider + https://www.hsu-hh.de/aut/aas/supplieridprovider + + + + + + + + SupplierIdProvider + Anbieter der Identifikationsnummer + + SupplierIdProvider + + + STRING_TRANSLATABLE + + DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer + DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification + + + + + + + SUP_PROD_NUM + 0173-1#02-AAO736#004 + + + + + + + + product article number of supplier + Lieferantenartikelnummer + + product article number of supplier + + + + + eindeutiger Bestellschlüssel des Lieferanten + unique product order identifier of the supplier + + + + + + + SupplierProductDesignation + 0173-1#02-AAM551#002 + + + + + + + + Supplier product designation + Lieferantenproduktbezeichnung + + SupplierTypName + + + STRING_TRANSLATABLE + + Kurze Beschreibung des Produktes (Kurztext) + Short description of the product (short text) + + + + + + + SupplierProductDescription + 0173-1#02-AAU730#001 + + + + + + + + Supplier product description + Lieferantenproduktbeschreibung + + Supplier product description + + + + + Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) + Description of the product, it's technical features and implementation if needed (long text) + + + + + + + ClassificationSystem + 0173-1#02-AAO715#002 + + + + + + + + classification system + Klassifizierungssystem + + ClassificationSystem + + + + + Klassifizierungssystem + Classification System + + + + + + + SecondaryKeyTyp + https://www.hsu-hh.de/aut/aas/secondarykeytyp + + + + + + + + SecondaryKeyTyp + Typnummer des IT Systems + + SecondaryKeyTyp + + + + + Führende technische ID im IT System des Typs + SecondaryKeyTyp + + + + + + + TypThumbnail + www.company.com/ids/cd/6044_0150_1191_5121 + + + + + + + + TypThumbnail + Vorschaubild + + TypThumbnail + + + + + Darstellung des Produkttyps in kleinem Format + Small picture of the product type + + + + + + + AssetId + https://www.hsu-hh.de/aut/aas/assetid + + + + + + + + AssetId + Asset ID + + AssetId + + + + + Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. + Global unique ID of an asset, which can be read by both human and machine. + + + + + + + SecondaryKeyInstance + https://www.hsu-hh.de/aut/aas/secondarykeyinstance + + + + + + + + SecondaryKeyInstance + Instanznummer des IT Systems + + SecondaryKeyInstance + + + + + Führende technische ID im IT System der Instanz + SecondaryKeyInstance + + + + + + + DateOfManufacture + 0173-1#02-AAR972#002 + + + + + + + + Date of manufacture + Herstellungsdatum + + Date of manufacture + + + DATE + + Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist + Date from which the production and / or development process is completed or from which a service is provided completely + + + + + + + DeviceRevision + https://www.hsu-hh.de/aut/aas/devicerevision + + + + + + + + DeviceRevision + DeviceRevision + + DeviceRevision + + + + + DeviceRevision + DeviceRevision + + + + + + + SoftwareRevision + https://www.hsu-hh.de/aut/aas/softwarerevision + + + + + + + + SoftwareRevision + SoftwareRevision + + SoftwareRevision + + + + + SoftwareRevision + SoftwareRevision + + + + + + + HardwareRevision + https://www.hsu-hh.de/aut/aas/hardwarerevision + + + + + + + + HardwareRevision + HardwareRevision + + HardwareRevision + + + + + HardwareRevision + HardwareRevision + + + + + + + QrCode + https://www.hsu-hh.de/aut/aas/qrcode + + + + + + + + QrCode + QrCode + + QrCode + + + + + In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. + QrCode + + + + + + + CompanyLogo + https://www.hsu-hh.de/aut/aas/companylogo + + + + + + + + Firmenlogo + CompanyLogo + + CompanyLogo + + + + + Firmenlogo + CompanyLogo + + + + + + + \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/10_SchneiderElectric.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/10_SchneiderElectric.aasx.xml new file mode 100644 index 000000000..90a9a45d2 --- /dev/null +++ b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/10_SchneiderElectric.aasx.xml @@ -0,0 +1,4570 @@ + + + + + SE_Tesys_Island_Starter + www.company.com/ids/aas/2520_6010_8091_1277 + + + www.company.com/ids/asset/8220_6010_8091_3593 + + + + + + www.company.com/ids/sm/4343_5072_7091_3242 + + + + + www.company.com/ids/sm/2543_5072_7091_2660 + + + + + www.company.com/ids/sm/6053_5072_7091_5102 + + + + + www.company.com/ids/sm/6563_5072_7091_4267 + + + + + + + + + SE_Tesys_Island_Starter + www.company.com/ids/asset/8220_6010_8091_3593 + Instance + + + + + Nameplate + www.company.com/ids/sm/4343_5072_7091_3242 + + + https://www.hsu-hh.de/aut/aas/nameplate + + + Instance + + + + + ManufacturerName + PARAMETER + + + 0173-1#02-AAO677#002 + + + Instance + + string + Schneider Electric + + + + + ManufacturerProductDesignation + PARAMETER + + + 0173-1#02-AAW338#001 + + + Instance + + string + Motor Starter, TeSys island + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + FR + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Rue Joseph Monier + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 92506 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Rueil Malmaison + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Hauts de Seine + + + + false + false + + + + + ManufacturerProductFamily + PARAMETER + + + 0173-1#02-AAU731#001 + + + Instance + + + + + + + + SerialNumber + PARAMETER + + + 0173-1#02-AAM556#002 + + + Instance + + string + 2F184031001 + + + + + BatchNumber + PARAMETER + + + 0173-1#02-AAQ196#001 + + + Instance + + + + + + + + ProductCountryOfOrigin + PARAMETER + + + 0173-1#02-AAO841#001 + + + Instance + + string + FR + + + + + YearOfConstruction + PARAMETER + + + 0173-1#02-AAP906#001 + + + Instance + + string + 2019 + + + + + Marking_CE + PARAMETER + + + https://www.hsu-hh.de/aut/aas/productmarking + + + Instance + + + + + CEQualificationPresent + PARAMETER + + + 0173-1#02-BAF053#008 + + + Instance + + boolean + 1 + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + image/png + /aasx/Nameplate/marking_ce.png + + + + false + false + + + + + Marking_UL + PARAMETER + + + https://www.hsu-hh.de/aut/aas/productmarking + + + Instance + + + + + CEQualificationPresent + PARAMETER + + + 0173-1#02-BAF053#008 + + + Instance + + boolean + 1 + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + image/png + /aasx/Nameplate/UL.png + + + + false + false + + + + + Marking_WEEE + PARAMETER + + + https://www.hsu-hh.de/aut/aas/productmarking + + + Instance + + + + + CEQualificationPresent + PARAMETER + + + 0173-1#02-BAF053#008 + + + Instance + + boolean + 1 + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + image/png + /aasx/Nameplate/Marking_WEEE.png + + + + false + false + + + + + + Document + www.company.com/ids/sm/2543_5072_7091_2660 + + + https://www.hsu-hh.de/aut/aas/document + + + Instance + + + + + DeclarationCEMarking + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Schneider Electric + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Schneider Electric SAS + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + SC19062505 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + EU - Declaration of conformity + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + EU - Declaration of conformity + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + string + Motor Starters for TeSys Island offer + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + string + TPRSx009, TPRSx025, TPRSx038, TPRSx065, TPRSx080, *where x can be T or S + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + CE_TPRSx_SC19062505.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/CE_TPRSx_SC19062505.pdf + + + + false + false + + + + + DeclarationULMarking + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Schneider Electric + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Schneider Electric Automation SAS + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + NRAQ.E3220218 - PROGRAMMABLE CONTROLLERS + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + string + 2019 + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + PROGRAMMABLE_CONTROLLERS___UL_Product_iQ.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/PROGRAMMABLE_CONTROLLERS___UL_Product_iQ.pdf + + + + false + false + + + + + Instruction Bulletin + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Technical Documentation + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Schneider Electric + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Schneider Electric SAS + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 8536IB1901EN + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + System Guide + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Instruction bulletin + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + string + This instruction bulletin introduces and describes the main functions of TeSys island. + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + string + TeSys Island + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + instal_EN.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/Instal_EN.pdf + + + + false + false + + + + + + Service + www.company.com/ids/sm/6053_5072_7091_5102 + + + https://www.hsu-hh.de/aut/aas/service + + + Instance + + + + + ContactInfo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/contactinfo + + + Instance + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + Schneider Elcetric + + + + + ContactInfo_Role + PARAMETER + + + https://www.hsu-hh.de/aut/aas/role + + + Instance + + string + Manufacturer + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Schneider Platz + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 97816 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Marktheidenfeld + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + + + + + false + false + + + + + Email + PARAMETER + + + https://www.hsu-hh.de/aut/aas/email + + + Instance + + string + + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://www.schneider-electric.com/en/work/support/ + + + + + PhoneNumber + PARAMETER + + + 0173-1#02-AAO136#002 + + + Instance + + string + + + + + + Fax + PARAMETER + + + https://www.hsu-hh.de/aut/aas/fax + + + Instance + + string + + + + + false + false + + + + + + Identification + www.company.com/ids/sm/6563_5072_7091_4267 + + + https://www.hsu-hh.de/aut/aas/identification + + + Instance + + + + + ManufacturerName + PARAMETER + + + 0173-1#02-AAO677#002 + + + Instance + + string + Schneider Electric + + + + + GLNOfManufacturer + PARAMETER + + + 0173-1#02-AAY812#001 + + + Instance + + string + TPRST009 + + + + + SupplierOfTheIdentifier + + + 0173-1#02-AAP796#004 + + + Instance + + + + + + + + MAN_PROD_NUM + + + 0173-1#02-AAO676#003 + + + Instance + + + + + + + + ManufacturerProductDesignation + PARAMETER + + + 0173-1#02-AAW338#001 + + + Instance + + string + Motor Starter, TeSys island + + + + + ManufacturerProductDescription + PARAMETER + + + 0173-1#02-AAU734#001 + + + Instance + + langString + Direct starter connected to an automation controller through a bus coupler, Operational only when connected to a bus coupler + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + Schneider Electric + + + + + GLNOfSupplier + PARAMETER + + + 0173-1#02-AAY813#001 + + + Instance + + string + TPRST009 + + + + + SupplierIdProvider + PARAMETER + + + https://www.hsu-hh.de/aut/aas/supplieridprovider + + + Instance + + + + + + + + SUP_PROD_NUM + PARAMETER + + + 0173-1#02-AAO736#004 + + + Instance + + + + + + + + SupplierProductDesignation + + + 0173-1#02-AAM551#002 + + + Instance + + string + Motor Starter, TeSys island + + + + + SupplierProductDescription + PARAMETER + + + 0173-1#02-AAU730#001 + + + Instance + + langString + Direct starter connected to an automation controller through a bus coupler, Operational only when connected to a bus coupler + + + + + ManufacturerProductFamily + PARAMETER + + + 0173-1#02-AAU731#001 + + + Instance + + + + + + + + ClassificationSystem + PARAMETER + + + 0173-1#02-AAO715#002 + + + Instance + + string + eclass + + + + + SecondaryKeyTyp + + + https://www.hsu-hh.de/aut/aas/secondarykeytyp + + + Instance + + + + + + + + TypThumbnail + PARAMETER + + + www.company.com/ids/cd/4401_1272_7091_3437 + + + Instance + + image/jpeg + /TPRST009.PNG + + + + + AssetId + PARAMETER + + + https://www.hsu-hh.de/aut/aas/assetid + + + Instance + + string + www.company.com/ids/asset/8220_6010_8091_3593 + + + + + SerialNumber + PARAMETER + + + 0173-1#02-AAM556#002 + + + Instance + + string + 2F184031001 + + + + + BatchNumber + PARAMETER + + + 0173-1#02-AAQ196#001 + + + Instance + + + + + + + + SecondaryKeyInstance + PARAMETER + + + https://www.hsu-hh.de/aut/aas/secondarykeyinstance + + + Instance + + + + + + + + DateOfManufacture + PARAMETER + + + 0173-1#02-AAR972#002 + + + Instance + + string + 2019 + + + + + DeviceRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/devicerevision + + + Instance + + + + + + + + SoftwareRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/softwarerevision + + + Instance + + + + + + + + HardwareRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/hardwarerevision + + + Instance + + + + + + + + QrCode + PARAMETER + + + https://www.hsu-hh.de/aut/aas/qrcode + + + Instance + + image/jpeg + /aasx/Identification/QRCode_Tesys_Island_Starter.jpg + + + + + ContactInfo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/contactinfo + + + Instance + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + Schneider Electric + + + + + ContactInfo_Role + PARAMETER + + + https://www.hsu-hh.de/aut/aas/role + + + Instance + + string + Manufacturer + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + FR + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Rue Joseph Monier + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 92506 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Rueil Malmaison + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Hauts de Seine + + + + false + false + + + + + Email + PARAMETER + + + https://www.hsu-hh.de/aut/aas/email + + + Instance + + string + + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://www.schneider-electric.com/en/ + + + + + PhoneNumber + PARAMETER + + + 0173-1#02-AAO136#002 + + + Instance + + string + + + + + + Fax + PARAMETER + + + https://www.hsu-hh.de/aut/aas/fax + + + Instance + + string + + + + + false + false + + + + + CompanyLogo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/companylogo + + + Instance + + image/png + /aasx/Identification/logo_SE.png + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://www.schneider-electric.com/en/product-range-presentation/65746-tesys-island/?parent-category-id=3000&parent-subcategory-id=3080&filter=business-4-low-voltage-products-and-systems#tabs-top + + + + + + + + ManufacturerName + 0173-1#02-AAO677#002 + + + + + + + + Herstellername + Manufacturer Name + + Manufacturer Name + + + + + Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist + 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 + + + + + + + ManufacturerProductDesignation + 0173-1#02-AAW338#001 + + + + + + + + Manufacturer product designation + Herstellerproduktbezeichnung + + + ManufacturerTypName + + + STRING_TRANSLATABLE + + Kurze Beschreibung des Produktes (Kurztext) + Short description of the product (short text) + + + + + + + PhysicalAddress + https://www.hsu-hh.de/aut/aas/physicaladdress + + + + + + + + PhysicalAddress + Physische Adresse + + PhysicalAddress + + + + + Sammlung für reale physische Adresse + Collection for real physical address + + + + + + + CountryCode + 0173-1#02-AAO730#001 + + + + + + + + + + + + Landeskennung + Country code + + Country code + + + + + Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes + agreed upon symbol for unambiguous identification of a country + + + + + + + Street + 0173-1#02-AAO128#001 + + + + + + + + Strasse + Street + + Street + + + + + Name der Strasse und Hausnummer + Street name and house number + + + + + + + Zip + 0173-1#02-AAO129#002 + + + + + + + + Zip + Postleitzahl + + PostalCode + + + + + ZIP code of address + Postleitzahl der Anschrift + + + + + + + CityTown + 0173-1#02-AAO132#001 + + + + + + + + Ort + City/town + + City/town + + + + + Town or city of the company + Ortsangabe + + + + + + + StateCounty + 0173-1#02-AAO133#002 + + + + + + + + state/county + Bundesland + + StateCounty + + + + + Bundesland + state/county + + + + + + + ManufacturerProductFamily + 0173-1#02-AAU731#001 + + + + + + + + Manufacturer product family + Herstellerproduktfamilie + + TypClass + + + + + 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie + 2nd level of a 3 level manufacturer specific product hierarchy + + + + + + + SerialNumber + 0173-1#02-AAM556#002 + + + + + + + + Serial number + Seriennummer + + InstanceId + + + + + eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist + unique combination of numbers and letters used to identify the device once it has been manufactured + + + + + + + BatchNumber + 0173-1#02-AAQ196#001 + + + + + + + + Batch number + Chargen-Nummer + + ChargeId + + + + + Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge + Number assigned by the manufacturer of a material to identify the manufacturer's batch + + + + + + + ProductCountryOfOrigin + 0173-1#02-AAO841#001 + + + + + + + + Produkt Ursprungsland + Product country of origin + + CountryOfOrigin + + + + + Land in dem das Produkt hergestellt wurde (Hersteller Land) + Country in which the product is manufactured (manufacturer country) + + + + + + + YearOfConstruction + 0173-1#02-AAP906#001 + + + + + + + + Year of construction + Baujahr + + YearOfConstruction + + + + + Jahreszahl als Datumsangabe für die Fertigstellung des Objektes + Year as completion date of object + + + + + + + ProductMarking + https://www.hsu-hh.de/aut/aas/productmarking + + + + + + + + Produktkennzeichnung + Product Marking + + ProductMarking + + + + + Sammlungsdatei für Produktkennzeichnung + Collection file for product marking + + + + + + + CEQualificationPresent + 0173-1#02-BAF053#008 + + + + + + + + CE-Kennzeichnung vorhanden + CE- qualification present + + CEMarkingPresent + + + BOOLEAN + + whether CE- qualification is present + Angabe, ob CE-Kennzeichnung vorhanden ist + + + + + + + File + 0173-1#02-AAD005#008 + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Enthaltene Doku. Datei + Embedded Doc. file + + File + + + + + Verweis/ BLOB auf enthaltene Dokumentations-Datei. + Reference/ BLOB to embedded documentation file. + + + + + + + DocumentationItem + 0173-1#02-AAD001#001 + + + + + + + + Dokumentationsgruppe + Documentation item + + DocumentationItem + + + + + Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. + Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. + + + + + + + DocumentType + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + + + + + + Dokumententyp + Document Type + + DocumentType + + + + + Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) + TBD + + + + + + + VDI2770_DomainId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + + + + + + Domain-Nummer + DomainId + + DomainId + + + + + Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. + TBD + + + + + + + VDI2770_IdType + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + + + + + + Nummerntyp + IdType + + IdType + + + + + Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. + TBD + + + + + + + DocumentId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + + + + + + DocumentId + Dokumenten-Nummer + + DocumentId + + + + + Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. + TBD + + + + + + + DocumentDomainId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + + + + + + DocumentDomainId + DocumentDomainId + + DocumentDomainId + + + + + Kennung oder Kennzeichen einer Domäne + TBD + + + + + + + VDI2770_Role + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + + + + + + Rolle + Role + + Role + + + + + Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) + TBD + + + + + + + VDI2770_OrganisationId + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + + + + + + Organisation ID + Organisation ID + + OrganisationId + + + + + eindeutige ID für die Organisation + TBD + + + + + + + VDI2770_OrganisationName + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + + + + + + OrganisationName + OrganisationName + + OrganisationName + + + + + gebräuchliche Bezeichnung für die Organisation + TBD + + + + + + + VDI2770_OrganisationOfficialName + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + + + + + + Offizieller Name der Organisation + Organisation Official Name + + OrganisationOfficialName + + + + + offizieller Name der Organisation + TBD + + + + + + + VDI2770_Description + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + + + + + + Beschreibung + Description + + Description + + + + + Beschreibung für die nächste übergeordnete Collection + TBD + + + + + + + DocumentPartId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + + + + + + Dokumenten-Teilnummer + DocumentPartId + + DocumentPartId + + + + + Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. + TBD + + + + + + + DocumentClassification_ClassId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + + + + Dokumentkategorie + Document category + + DocCategory + + + + + Dokumentkategorie nach VDI 2770:2018/10 + Document category after VDI 2770:2018/10 + + + + + + + VDI2770_ClassName + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + + + + + + Klassenname + Class Name + + ClassName + + + + + Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. + TBD + + + + + + + VDI2770_ClassificationSystem + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + + + + + + Klassifizierungssystem + classification system + + ClassificationSystem + + + + + Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. + TBD + + + + + + + DocumentVersionId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + + + + + + Dokumenten-Versionsnummer + DocumentVersionId + + DocumentVersionId + + + + + Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. + TBD + + + + + + + DocumentVersion_LanguageCode + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + + + + + + Sprachenschlüssel + LanguageCode + + LanguageCode + + + + + Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 + TBD + + + + + + + VDI2770_Title + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + + + + + + Titel + Title + + VDI2770_Title + + + + + sprachabhängiger Titel des Dokuments + TBD + + + + + + + VDI2770_Summary + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + + + + + + Zusammenfassung + Summary + + Summary + + + + + sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts + TBD + + + + + + + VDI2770_Keywords + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + + + + + + Schlagwörter + Keywords + + Keywords + + + + + sprachabhängige, durch Komma getrennte Liste von Schlagwörtern + TBD + + + + + + + VDI2770_StatusValue + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + + + + + + Statuswert + StatusValue + + StatusValue + + + + + Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) + TBD + + + + + + + VDI2770_SetDate + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + + + + + + Erstellungsdatum + Set Date + + SetDate + + + + + Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). + TBD + + + + + + + VDI2770_Purpose + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + + + + + + Zweck + Purpose + + Purpose + + + + + Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. + TBD + + + + + + + VDI2770_BasedOnProcedure + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + + + + + + Prozedur + Procedure + + BasedOnProcedure + + + + + textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt + TBD + + + + + + + VDI2770_Comments + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + + + + + + Kommentar + Comments + + Comments + + + + + textuelle Bemerkungen und Anmerkungen zum Status + TBD + + + + + + + VDI2770_ReferencedObject_Type + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + + + + + + Typ + Type + + Type + + + + + Für Type des Objekts muss immer Product angegeben werden. + TBD + + + + + + + VDI2770_ReferencedObject_RefType + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + + + + + + RefType + RefType + + RefType + + + + + Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) + TBD + + + + + + + VDI2770_ReferencedObject_ObjectId + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + + + + + + ObjectId + ObjectId + + ObjectId + + + + + Angabe der Identifikationsnummer zum Objekt + TBD + + + + + + + VDI2770_FileId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + + + + + + ID der Datei + File ID + + FileId + + + + + eindeutige ID für die Datei + TBD + + + + + + + VDI2770_FileName + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + + + + + + Dateiname + File name + + FileName + + + + + Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. + TBD + + + + + + + VDI2770_FileFormat + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + + + + + + Datei Format + File format + + FileFormat + + + + + Angabe eines Media Typs gemäß der Liste der IANA + TBD + + + + + + + OrganisationContactInfo + https://www.hsu-hh.de/aut/aas/contactinfo + + + + + + + + Contact Info + Kontakt Info + + OrganisationContactInfo + + + + + Sammlung für die allgemeinen Kontaktdaten + Collection for general contact data + + + + + + + NameOfSupplier + 0173-1#02-AAO735#003 + + + + + + + + + + + + name of supplier + Lieferantenname + + name of supplier + + + + + Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt + name of supplier which provides the customer with a product or a service + + + + + + + ContactInfo_Role + https://www.hsu-hh.de/aut/aas/role + + + + + + + + Rolle + Role + + Role + + + + + Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt + Information to specify the role which the organisation of ContactInfo plays + + + + + + + Email + https://www.hsu-hh.de/aut/aas/email + + + + + + + + Emailadresse + Email address + + Email + + + + + Emailadresse + Email address + + + + + + + URL + 0173-1#02-AAO694#001 + + + + + + + + Internetadresse + Internet address + + URL + + + + + stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html + Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html + + + + + + + PhoneNumber + 0173-1#02-AAO136#002 + + + + + + + + Telefonnummer + telephone number + + Phone + + + + + vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist + complete telephone number to be called to reach a business partner + + + + + + + Fax + https://www.hsu-hh.de/aut/aas/fax + + + + + + + + Fax + Fax + + Fax + + + + + Faxnummer + Fax number + + + + + + + 0173-1#02-AAO136#002 + + + + + GLNOfManufacturer + 0173-1#02-AAY812#001 + + + + + + + + GLN of manufacturer + GLN des Herstellers + + GLN of manufacturer + + + + + international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort + internationally unique identification number for the manufacturer of the device or the product and for the physical location + + + + + + + SupplierOfTheIdentifier + 0173-1#02-AAP796#004 + + + + + + + + Supplier of the identifier + Anbieter der Identifikationsnummer für Hersteller + + Supplier of the identifier + + + STRING_TRANSLATABLE + + DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification + DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer + + + + + + + MAN_PROD_NUM + + product article number of manufacturer + + 0173-1#02-AAO676#003 + + + + + + + + product article number of manufacturer + Herstellerartikelnummer + + MAN_PROD_NUM + + + STRING_TRANSLATABLE + + eindeutiger Bestellschlüssel des Herstellers + unique product identifier of the manufacturer + + + + + + + ManufacturerProductDescription + 0173-1#02-AAU734#001 + + + + + + + + Manufacturer product description + Herstellerproduktbeschreibung + + Manufacturer product description + + + + + Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) + Description of the product, it's technical features and implementation if needed (long text) + + + + + + + GLNOfSupplier + 0173-1#02-AAY813#001 + + + + + + + + GLN of supplier + GLN des Lieferanten + + GLN of supplier + + + + + international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort + internationally unique identification number for the supplier of the device or the product and for the physical location + + + + + + + SupplierIdProvider + https://www.hsu-hh.de/aut/aas/supplieridprovider + + + + + + + + SupplierIdProvider + Anbieter der Identifikationsnummer + + SupplierIdProvider + + + STRING_TRANSLATABLE + + DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer + DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification + + + + + + + SUP_PROD_NUM + 0173-1#02-AAO736#004 + + + + + + + + product article number of supplier + Lieferantenartikelnummer + + product article number of supplier + + + + + eindeutiger Bestellschlüssel des Lieferanten + unique product order identifier of the supplier + + + + + + + SupplierProductDesignation + 0173-1#02-AAM551#002 + + + + + + + + Supplier product designation + Lieferantenproduktbezeichnung + + SupplierTypName + + + STRING_TRANSLATABLE + + Kurze Beschreibung des Produktes (Kurztext) + Short description of the product (short text) + + + + + + + SupplierProductDescription + 0173-1#02-AAU730#001 + + + + + + + + Supplier product description + Lieferantenproduktbeschreibung + + Supplier product description + + + + + Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) + Description of the product, it's technical features and implementation if needed (long text) + + + + + + + ClassificationSystem + 0173-1#02-AAO715#002 + + + + + + + + classification system + Klassifizierungssystem + + ClassificationSystem + + + + + Klassifizierungssystem + Classification System + + + + + + + SecondaryKeyTyp + https://www.hsu-hh.de/aut/aas/secondarykeytyp + + + + + + + + SecondaryKeyTyp + Typnummer des IT Systems + + SecondaryKeyTyp + + + + + Führende technische ID im IT System des Typs + SecondaryKeyTyp + + + + + + + TypThumbnail + www.company.com/ids/cd/6044_0150_1191_5121 + + + + + + + + TypThumbnail + Vorschaubild + + TypThumbnail + + + + + Darstellung des Produkttyps in kleinem Format + Small picture of the product type + + + + + + + AssetId + https://www.hsu-hh.de/aut/aas/assetid + + + + + + + + AssetId + Asset ID + + AssetId + + + + + Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. + Global unique ID of an asset, which can be read by both human and machine. + + + + + + + SecondaryKeyInstance + https://www.hsu-hh.de/aut/aas/secondarykeyinstance + + + + + + + + SecondaryKeyInstance + Instanznummer des IT Systems + + SecondaryKeyInstance + + + + + Führende technische ID im IT System der Instanz + SecondaryKeyInstance + + + + + + + DateOfManufacture + 0173-1#02-AAR972#002 + + + + + + + + Date of manufacture + Herstellungsdatum + + Date of manufacture + + + DATE + + Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist + Date from which the production and / or development process is completed or from which a service is provided completely + + + + + + + DeviceRevision + https://www.hsu-hh.de/aut/aas/devicerevision + + + + + + + + DeviceRevision + DeviceRevision + + DeviceRevision + + + + + DeviceRevision + DeviceRevision + + + + + + + SoftwareRevision + https://www.hsu-hh.de/aut/aas/softwarerevision + + + + + + + + SoftwareRevision + SoftwareRevision + + SoftwareRevision + + + + + SoftwareRevision + SoftwareRevision + + + + + + + HardwareRevision + https://www.hsu-hh.de/aut/aas/hardwarerevision + + + + + + + + HardwareRevision + HardwareRevision + + HardwareRevision + + + + + HardwareRevision + HardwareRevision + + + + + + + QrCode + https://www.hsu-hh.de/aut/aas/qrcode + + + + + + + + QrCode + QrCode + + QrCode + + + + + In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. + QrCode + + + + + + + CompanyLogo + https://www.hsu-hh.de/aut/aas/companylogo + + + + + + + + Firmenlogo + CompanyLogo + + CompanyLogo + + + + + Firmenlogo + CompanyLogo + + + + + + + \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/11_SchneiderElectric.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/11_SchneiderElectric.aasx.xml new file mode 100644 index 000000000..8912f73c0 --- /dev/null +++ b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/11_SchneiderElectric.aasx.xml @@ -0,0 +1,4570 @@ + + + + + SE_Modicon_M262 + www.company.com/ids/aas/2520_6010_8091_1277 + + + www.company.com/ids/asset/8220_6010_8091_3593 + + + + + + www.company.com/ids/sm/4343_5072_7091_3242 + + + + + www.company.com/ids/sm/2543_5072_7091_2660 + + + + + www.company.com/ids/sm/6053_5072_7091_5102 + + + + + www.company.com/ids/sm/6563_5072_7091_4267 + + + + + + + + + SE_Modicon_M262 + www.company.com/ids/asset/8220_6010_8091_3593 + Instance + + + + + Nameplate + www.company.com/ids/sm/4343_5072_7091_3242 + + + https://www.hsu-hh.de/aut/aas/nameplate + + + Instance + + + + + ManufacturerName + PARAMETER + + + 0173-1#02-AAO677#002 + + + Instance + + string + Schneider Electric + + + + + ManufacturerProductDesignation + PARAMETER + + + 0173-1#02-AAW338#001 + + + Instance + + string + IIOT ready Logic and Motion Controller + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + FR + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Rue Joseph Monier + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 92506 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Rueil Malmaison + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Hauts de Seine + + + + false + false + + + + + ManufacturerProductFamily + PARAMETER + + + 0173-1#02-AAU731#001 + + + Instance + + string + Logic/Motion controller + + + + + SerialNumber + PARAMETER + + + 0173-1#02-AAM556#002 + + + Instance + + string + 8B192700462 + + + + + BatchNumber + PARAMETER + + + 0173-1#02-AAQ196#001 + + + Instance + + + + + + + + ProductCountryOfOrigin + PARAMETER + + + 0173-1#02-AAO841#001 + + + Instance + + string + FR + + + + + YearOfConstruction + PARAMETER + + + 0173-1#02-AAP906#001 + + + Instance + + string + 2019 + + + + + Marking_CE + PARAMETER + + + https://www.hsu-hh.de/aut/aas/productmarking + + + Instance + + + + + CEQualificationPresent + PARAMETER + + + 0173-1#02-BAF053#008 + + + Instance + + boolean + 1 + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + image/png + /aasx/Nameplate/marking_ce.png + + + + false + false + + + + + Marking_UL + PARAMETER + + + https://www.hsu-hh.de/aut/aas/productmarking + + + Instance + + + + + CEQualificationPresent + PARAMETER + + + 0173-1#02-BAF053#008 + + + Instance + + boolean + 1 + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + image/png + /aasx/Nameplate/UL.png + + + + false + false + + + + + Marking_WEEE + PARAMETER + + + https://www.hsu-hh.de/aut/aas/productmarking + + + Instance + + + + + CEQualificationPresent + PARAMETER + + + 0173-1#02-BAF053#008 + + + Instance + + boolean + 1 + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + image/png + /aasx/Nameplate/Marking_WEEE.png + + + + false + false + + + + + + Document + www.company.com/ids/sm/2543_5072_7091_2660 + + + https://www.hsu-hh.de/aut/aas/document + + + Instance + + + + + DeclarationCEMarking + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Schneider Electric SE + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Schneider Electric Automation GmbH + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 02.00 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + EU - Declaration of conformity + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + MOD2019002.00_DeclarationOfConformity_TM262_TMS_TM3XHSC_signed.pdf + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + MOD2019002.00_DeclarationOfConformity_TM262_TMS_TM3XHSC_signed.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/MOD2019002.00_DeclarationOfConformity_TM262_TMS_TM3XHSC_signed.pdf + + + + false + false + + + + + DeclarationULMarking + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Schneider Electric SE + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Schneider Electric Automation GmbH + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Notice of Completion and autorization to apply the UL mark + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + M262_20190513_Notice of Authorization.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/M262_20190513_Notice_of_Authorization.pdf + + + + false + false + + + + + InstructionSheet + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + QGH5583101 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Schneider Electric SE + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Schneider Electric Automation GmbH + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Instruction Sheet + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + IS_M262.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/IS_M262.pdf + + + + false + false + + + + + + Service + www.company.com/ids/sm/6053_5072_7091_5102 + + + https://www.hsu-hh.de/aut/aas/service + + + Instance + + + + + ContactInfo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/contactinfo + + + Instance + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + Schneider Elcetric + + + + + ContactInfo_Role + PARAMETER + + + https://www.hsu-hh.de/aut/aas/role + + + Instance + + string + Manufacturer + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Schneider Platz + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 97816 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Marktheidenfeld + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + + + + + false + false + + + + + Email + PARAMETER + + + https://www.hsu-hh.de/aut/aas/email + + + Instance + + string + + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://www.schneider-electric.com/en/work/support/ + + + + + PhoneNumber + PARAMETER + + + 0173-1#02-AAO136#002 + + + Instance + + string + + + + + + Fax + PARAMETER + + + https://www.hsu-hh.de/aut/aas/fax + + + Instance + + string + + + + + false + false + + + + + + Identification + www.company.com/ids/sm/6563_5072_7091_4267 + + + https://www.hsu-hh.de/aut/aas/identification + + + Instance + + + + + ManufacturerName + PARAMETER + + + 0173-1#02-AAO677#002 + + + Instance + + string + Schneider Electric + + + + + GLNOfManufacturer + PARAMETER + + + 0173-1#02-AAY812#001 + + + Instance + + string + TM262L20MESE8T + + + + + SupplierOfTheIdentifier + + + 0173-1#02-AAP796#004 + + + Instance + + + + + + + + MAN_PROD_NUM + + + 0173-1#02-AAO676#003 + + + Instance + + + + + + + + ManufacturerProductDesignation + PARAMETER + + + 0173-1#02-AAW338#001 + + + Instance + + string + IIOT Ready Logic and Motion Controller + + + + + ManufacturerProductDescription + PARAMETER + + + 0173-1#02-AAU734#001 + + + Instance + + langString + Logic/Motion controller Modicon M262 IIoT-ready logic & motion controller for performance machines. Modicon M262 controllers embed Industrial Internet of Things (IIoT) protocols and encryption to provide direct cloud connectivity & digital services. + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + Schneider Electric + + + + + GLNOfSupplier + PARAMETER + + + 0173-1#02-AAY813#001 + + + Instance + + string + TM262L20MESE8T + + + + + SupplierIdProvider + PARAMETER + + + https://www.hsu-hh.de/aut/aas/supplieridprovider + + + Instance + + + + + + + + SUP_PROD_NUM + PARAMETER + + + 0173-1#02-AAO736#004 + + + Instance + + + + + + + + SupplierProductDesignation + + + 0173-1#02-AAM551#002 + + + Instance + + string + IIOT Ready Logic and Motion Controller + + + + + SupplierProductDescription + PARAMETER + + + 0173-1#02-AAU730#001 + + + Instance + + langString + Logic/Motion controller Modicon M262 IIoT-ready logic & motion controller for performance machines. Modicon M262 controllers embed Industrial Internet of Things (IIoT) protocols and encryption to provide direct cloud connectivity & digital services. + + + + + ManufacturerProductFamily + PARAMETER + + + 0173-1#02-AAU731#001 + + + Instance + + string + Logic/Motion controller + + + + + ClassificationSystem + PARAMETER + + + 0173-1#02-AAO715#002 + + + Instance + + string + + + + + + SecondaryKeyTyp + + + https://www.hsu-hh.de/aut/aas/secondarykeytyp + + + Instance + + + + + + + + TypThumbnail + PARAMETER + + + www.company.com/ids/cd/4401_1272_7091_3437 + + + Instance + + image/jpeg + /aasx/Identification/M262.PNG + + + + + AssetId + PARAMETER + + + https://www.hsu-hh.de/aut/aas/assetid + + + Instance + + string + www.company.com/ids/asset/8220_6010_8091_3593 + + + + + SerialNumber + PARAMETER + + + 0173-1#02-AAM556#002 + + + Instance + + string + 8B192700462 + + + + + BatchNumber + PARAMETER + + + 0173-1#02-AAQ196#001 + + + Instance + + + + + + + + SecondaryKeyInstance + PARAMETER + + + https://www.hsu-hh.de/aut/aas/secondarykeyinstance + + + Instance + + + + + + + + DateOfManufacture + PARAMETER + + + 0173-1#02-AAR972#002 + + + Instance + + + + + + + + DeviceRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/devicerevision + + + Instance + + + + + + + + SoftwareRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/softwarerevision + + + Instance + + + + + + + + HardwareRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/hardwarerevision + + + Instance + + + + + + + + QrCode + PARAMETER + + + https://www.hsu-hh.de/aut/aas/qrcode + + + Instance + + image/jpeg + /aasx/Identification/QRCode_M262.JPG + + + + + ContactInfo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/contactinfo + + + Instance + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + Schneider Electric + + + + + ContactInfo_Role + PARAMETER + + + https://www.hsu-hh.de/aut/aas/role + + + Instance + + string + Manufacturer + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + FR + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Rue Joseph Monier + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 92506 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Rueil Malmaison + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Hauts de Seine + + + + false + false + + + + + Email + PARAMETER + + + https://www.hsu-hh.de/aut/aas/email + + + Instance + + string + + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://www.schneider-electric.com/en/ + + + + + PhoneNumber + PARAMETER + + + 0173-1#02-AAO136#002 + + + Instance + + string + + + + + + Fax + PARAMETER + + + https://www.hsu-hh.de/aut/aas/fax + + + Instance + + string + + + + + false + false + + + + + CompanyLogo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/companylogo + + + Instance + + image/png + /aasx/Identification/logo_SE.png + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://www.schneider-electric.com/en/product-range-presentation/65771-logic-motion-controller-modicon-m262/?filter=business-1-industrial-automation-and-control#tabs-top + + + + + + + + ManufacturerName + 0173-1#02-AAO677#002 + + + + + + + + Herstellername + Manufacturer Name + + Manufacturer Name + + + + + Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist + 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 + + + + + + + ManufacturerProductDesignation + 0173-1#02-AAW338#001 + + + + + + + + Manufacturer product designation + Herstellerproduktbezeichnung + + + ManufacturerTypName + + + STRING_TRANSLATABLE + + Kurze Beschreibung des Produktes (Kurztext) + Short description of the product (short text) + + + + + + + PhysicalAddress + https://www.hsu-hh.de/aut/aas/physicaladdress + + + + + + + + PhysicalAddress + Physische Adresse + + PhysicalAddress + + + + + Sammlung für reale physische Adresse + Collection for real physical address + + + + + + + CountryCode + 0173-1#02-AAO730#001 + + + + + + + + + + + + Landeskennung + Country code + + Country code + + + + + Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes + agreed upon symbol for unambiguous identification of a country + + + + + + + Street + 0173-1#02-AAO128#001 + + + + + + + + Strasse + Street + + Street + + + + + Name der Strasse und Hausnummer + Street name and house number + + + + + + + Zip + 0173-1#02-AAO129#002 + + + + + + + + Zip + Postleitzahl + + PostalCode + + + + + ZIP code of address + Postleitzahl der Anschrift + + + + + + + CityTown + 0173-1#02-AAO132#001 + + + + + + + + Ort + City/town + + City/town + + + + + Town or city of the company + Ortsangabe + + + + + + + StateCounty + 0173-1#02-AAO133#002 + + + + + + + + state/county + Bundesland + + StateCounty + + + + + Bundesland + state/county + + + + + + + ManufacturerProductFamily + 0173-1#02-AAU731#001 + + + + + + + + Manufacturer product family + Herstellerproduktfamilie + + TypClass + + + + + 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie + 2nd level of a 3 level manufacturer specific product hierarchy + + + + + + + SerialNumber + 0173-1#02-AAM556#002 + + + + + + + + Serial number + Seriennummer + + InstanceId + + + + + eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist + unique combination of numbers and letters used to identify the device once it has been manufactured + + + + + + + BatchNumber + 0173-1#02-AAQ196#001 + + + + + + + + Batch number + Chargen-Nummer + + ChargeId + + + + + Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge + Number assigned by the manufacturer of a material to identify the manufacturer's batch + + + + + + + ProductCountryOfOrigin + 0173-1#02-AAO841#001 + + + + + + + + Produkt Ursprungsland + Product country of origin + + CountryOfOrigin + + + + + Land in dem das Produkt hergestellt wurde (Hersteller Land) + Country in which the product is manufactured (manufacturer country) + + + + + + + YearOfConstruction + 0173-1#02-AAP906#001 + + + + + + + + Year of construction + Baujahr + + YearOfConstruction + + + + + Jahreszahl als Datumsangabe für die Fertigstellung des Objektes + Year as completion date of object + + + + + + + ProductMarking + https://www.hsu-hh.de/aut/aas/productmarking + + + + + + + + Produktkennzeichnung + Product Marking + + ProductMarking + + + + + Sammlungsdatei für Produktkennzeichnung + Collection file for product marking + + + + + + + CEQualificationPresent + 0173-1#02-BAF053#008 + + + + + + + + CE-Kennzeichnung vorhanden + CE- qualification present + + CEMarkingPresent + + + BOOLEAN + + whether CE- qualification is present + Angabe, ob CE-Kennzeichnung vorhanden ist + + + + + + + File + 0173-1#02-AAD005#008 + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Enthaltene Doku. Datei + Embedded Doc. file + + File + + + + + Verweis/ BLOB auf enthaltene Dokumentations-Datei. + Reference/ BLOB to embedded documentation file. + + + + + + + DocumentationItem + 0173-1#02-AAD001#001 + + + + + + + + Dokumentationsgruppe + Documentation item + + DocumentationItem + + + + + Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. + Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. + + + + + + + DocumentType + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + + + + + + Dokumententyp + Document Type + + DocumentType + + + + + Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) + TBD + + + + + + + VDI2770_DomainId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + + + + + + Domain-Nummer + DomainId + + DomainId + + + + + Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. + TBD + + + + + + + VDI2770_IdType + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + + + + + + Nummerntyp + IdType + + IdType + + + + + Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. + TBD + + + + + + + DocumentId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + + + + + + DocumentId + Dokumenten-Nummer + + DocumentId + + + + + Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. + TBD + + + + + + + DocumentDomainId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + + + + + + DocumentDomainId + DocumentDomainId + + DocumentDomainId + + + + + Kennung oder Kennzeichen einer Domäne + TBD + + + + + + + VDI2770_Role + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + + + + + + Rolle + Role + + Role + + + + + Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) + TBD + + + + + + + VDI2770_OrganisationId + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + + + + + + Organisation ID + Organisation ID + + OrganisationId + + + + + eindeutige ID für die Organisation + TBD + + + + + + + VDI2770_OrganisationName + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + + + + + + OrganisationName + OrganisationName + + OrganisationName + + + + + gebräuchliche Bezeichnung für die Organisation + TBD + + + + + + + VDI2770_OrganisationOfficialName + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + + + + + + Offizieller Name der Organisation + Organisation Official Name + + OrganisationOfficialName + + + + + offizieller Name der Organisation + TBD + + + + + + + VDI2770_Description + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + + + + + + Beschreibung + Description + + Description + + + + + Beschreibung für die nächste übergeordnete Collection + TBD + + + + + + + DocumentPartId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + + + + + + Dokumenten-Teilnummer + DocumentPartId + + DocumentPartId + + + + + Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. + TBD + + + + + + + DocumentClassification_ClassId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + + + + Dokumentkategorie + Document category + + DocCategory + + + + + Dokumentkategorie nach VDI 2770:2018/10 + Document category after VDI 2770:2018/10 + + + + + + + VDI2770_ClassName + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + + + + + + Klassenname + Class Name + + ClassName + + + + + Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. + TBD + + + + + + + VDI2770_ClassificationSystem + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + + + + + + Klassifizierungssystem + classification system + + ClassificationSystem + + + + + Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. + TBD + + + + + + + DocumentVersionId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + + + + + + Dokumenten-Versionsnummer + DocumentVersionId + + DocumentVersionId + + + + + Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. + TBD + + + + + + + DocumentVersion_LanguageCode + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + + + + + + Sprachenschlüssel + LanguageCode + + LanguageCode + + + + + Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 + TBD + + + + + + + VDI2770_Title + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + + + + + + Titel + Title + + VDI2770_Title + + + + + sprachabhängiger Titel des Dokuments + TBD + + + + + + + VDI2770_Summary + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + + + + + + Zusammenfassung + Summary + + Summary + + + + + sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts + TBD + + + + + + + VDI2770_Keywords + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + + + + + + Schlagwörter + Keywords + + Keywords + + + + + sprachabhängige, durch Komma getrennte Liste von Schlagwörtern + TBD + + + + + + + VDI2770_StatusValue + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + + + + + + Statuswert + StatusValue + + StatusValue + + + + + Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) + TBD + + + + + + + VDI2770_SetDate + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + + + + + + Erstellungsdatum + Set Date + + SetDate + + + + + Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). + TBD + + + + + + + VDI2770_Purpose + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + + + + + + Zweck + Purpose + + Purpose + + + + + Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. + TBD + + + + + + + VDI2770_BasedOnProcedure + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + + + + + + Prozedur + Procedure + + BasedOnProcedure + + + + + textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt + TBD + + + + + + + VDI2770_Comments + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + + + + + + Kommentar + Comments + + Comments + + + + + textuelle Bemerkungen und Anmerkungen zum Status + TBD + + + + + + + VDI2770_ReferencedObject_Type + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + + + + + + Typ + Type + + Type + + + + + Für Type des Objekts muss immer Product angegeben werden. + TBD + + + + + + + VDI2770_ReferencedObject_RefType + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + + + + + + RefType + RefType + + RefType + + + + + Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) + TBD + + + + + + + VDI2770_ReferencedObject_ObjectId + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + + + + + + ObjectId + ObjectId + + ObjectId + + + + + Angabe der Identifikationsnummer zum Objekt + TBD + + + + + + + VDI2770_FileId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + + + + + + ID der Datei + File ID + + FileId + + + + + eindeutige ID für die Datei + TBD + + + + + + + VDI2770_FileName + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + + + + + + Dateiname + File name + + FileName + + + + + Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. + TBD + + + + + + + VDI2770_FileFormat + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + + + + + + Datei Format + File format + + FileFormat + + + + + Angabe eines Media Typs gemäß der Liste der IANA + TBD + + + + + + + OrganisationContactInfo + https://www.hsu-hh.de/aut/aas/contactinfo + + + + + + + + Contact Info + Kontakt Info + + OrganisationContactInfo + + + + + Sammlung für die allgemeinen Kontaktdaten + Collection for general contact data + + + + + + + NameOfSupplier + 0173-1#02-AAO735#003 + + + + + + + + + + + + name of supplier + Lieferantenname + + name of supplier + + + + + Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt + name of supplier which provides the customer with a product or a service + + + + + + + ContactInfo_Role + https://www.hsu-hh.de/aut/aas/role + + + + + + + + Rolle + Role + + Role + + + + + Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt + Information to specify the role which the organisation of ContactInfo plays + + + + + + + Email + https://www.hsu-hh.de/aut/aas/email + + + + + + + + Emailadresse + Email address + + Email + + + + + Emailadresse + Email address + + + + + + + URL + 0173-1#02-AAO694#001 + + + + + + + + Internetadresse + Internet address + + URL + + + + + stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html + Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html + + + + + + + PhoneNumber + 0173-1#02-AAO136#002 + + + + + + + + Telefonnummer + telephone number + + Phone + + + + + vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist + complete telephone number to be called to reach a business partner + + + + + + + Fax + https://www.hsu-hh.de/aut/aas/fax + + + + + + + + Fax + Fax + + Fax + + + + + Faxnummer + Fax number + + + + + + + 0173-1#02-AAO136#002 + + + + + GLNOfManufacturer + 0173-1#02-AAY812#001 + + + + + + + + GLN of manufacturer + GLN des Herstellers + + GLN of manufacturer + + + + + international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort + internationally unique identification number for the manufacturer of the device or the product and for the physical location + + + + + + + SupplierOfTheIdentifier + 0173-1#02-AAP796#004 + + + + + + + + Supplier of the identifier + Anbieter der Identifikationsnummer für Hersteller + + Supplier of the identifier + + + STRING_TRANSLATABLE + + DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification + DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer + + + + + + + MAN_PROD_NUM + + product article number of manufacturer + + 0173-1#02-AAO676#003 + + + + + + + + product article number of manufacturer + Herstellerartikelnummer + + MAN_PROD_NUM + + + STRING_TRANSLATABLE + + eindeutiger Bestellschlüssel des Herstellers + unique product identifier of the manufacturer + + + + + + + ManufacturerProductDescription + 0173-1#02-AAU734#001 + + + + + + + + Manufacturer product description + Herstellerproduktbeschreibung + + Manufacturer product description + + + + + Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) + Description of the product, it's technical features and implementation if needed (long text) + + + + + + + GLNOfSupplier + 0173-1#02-AAY813#001 + + + + + + + + GLN of supplier + GLN des Lieferanten + + GLN of supplier + + + + + international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort + internationally unique identification number for the supplier of the device or the product and for the physical location + + + + + + + SupplierIdProvider + https://www.hsu-hh.de/aut/aas/supplieridprovider + + + + + + + + SupplierIdProvider + Anbieter der Identifikationsnummer + + SupplierIdProvider + + + STRING_TRANSLATABLE + + DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer + DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification + + + + + + + SUP_PROD_NUM + 0173-1#02-AAO736#004 + + + + + + + + product article number of supplier + Lieferantenartikelnummer + + product article number of supplier + + + + + eindeutiger Bestellschlüssel des Lieferanten + unique product order identifier of the supplier + + + + + + + SupplierProductDesignation + 0173-1#02-AAM551#002 + + + + + + + + Supplier product designation + Lieferantenproduktbezeichnung + + SupplierTypName + + + STRING_TRANSLATABLE + + Kurze Beschreibung des Produktes (Kurztext) + Short description of the product (short text) + + + + + + + SupplierProductDescription + 0173-1#02-AAU730#001 + + + + + + + + Supplier product description + Lieferantenproduktbeschreibung + + Supplier product description + + + + + Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) + Description of the product, it's technical features and implementation if needed (long text) + + + + + + + ClassificationSystem + 0173-1#02-AAO715#002 + + + + + + + + classification system + Klassifizierungssystem + + ClassificationSystem + + + + + Klassifizierungssystem + Classification System + + + + + + + SecondaryKeyTyp + https://www.hsu-hh.de/aut/aas/secondarykeytyp + + + + + + + + SecondaryKeyTyp + Typnummer des IT Systems + + SecondaryKeyTyp + + + + + Führende technische ID im IT System des Typs + SecondaryKeyTyp + + + + + + + TypThumbnail + www.company.com/ids/cd/4401_1272_7091_3437 + + + + + + + + TypThumbnail + Vorschaubild + + TypThumbnail + + + + + Darstellung des Produkttyps in kleinem Format + Small picture of the product type + + + + + + + AssetId + https://www.hsu-hh.de/aut/aas/assetid + + + + + + + + AssetId + Asset ID + + AssetId + + + + + Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. + Global unique ID of an asset, which can be read by both human and machine. + + + + + + + SecondaryKeyInstance + https://www.hsu-hh.de/aut/aas/secondarykeyinstance + + + + + + + + SecondaryKeyInstance + Instanznummer des IT Systems + + SecondaryKeyInstance + + + + + Führende technische ID im IT System der Instanz + SecondaryKeyInstance + + + + + + + DateOfManufacture + 0173-1#02-AAR972#002 + + + + + + + + Date of manufacture + Herstellungsdatum + + Date of manufacture + + + DATE + + Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist + Date from which the production and / or development process is completed or from which a service is provided completely + + + + + + + DeviceRevision + https://www.hsu-hh.de/aut/aas/devicerevision + + + + + + + + DeviceRevision + DeviceRevision + + DeviceRevision + + + + + DeviceRevision + DeviceRevision + + + + + + + SoftwareRevision + https://www.hsu-hh.de/aut/aas/softwarerevision + + + + + + + + SoftwareRevision + SoftwareRevision + + SoftwareRevision + + + + + SoftwareRevision + SoftwareRevision + + + + + + + HardwareRevision + https://www.hsu-hh.de/aut/aas/hardwarerevision + + + + + + + + HardwareRevision + HardwareRevision + + HardwareRevision + + + + + HardwareRevision + HardwareRevision + + + + + + + QrCode + https://www.hsu-hh.de/aut/aas/qrcode + + + + + + + + QrCode + QrCode + + QrCode + + + + + In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. + QrCode + + + + + + + CompanyLogo + https://www.hsu-hh.de/aut/aas/companylogo + + + + + + + + Firmenlogo + CompanyLogo + + CompanyLogo + + + + + Firmenlogo + CompanyLogo + + + + + + + \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/12_Pepperl+Fuchs.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/12_Pepperl+Fuchs.aasx.xml new file mode 100644 index 000000000..b11a4a11a --- /dev/null +++ b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/12_Pepperl+Fuchs.aasx.xml @@ -0,0 +1,3973 @@ + + + + + PeFu_267075_100078 + www.company.com/ids/aas/8403_3140_0191_8844 + + + www.company.com/ids/asset/1595_3140_0191_3961 + + + + + + www.company.com/ids/sm/4343_5072_7091_3242 + + + + + www.company.com/ids/sm/2543_5072_7091_2660 + + + + + www.company.com/ids/sm/6053_5072_7091_5102 + + + + + www.company.com/ids/sm/6563_5072_7091_4267 + + + + + + + + + 267075_100078 + CONSTANT + www.company.com/ids/asset/1595_3140_0191_3961 + Instance + + + + + Nameplate + www.company.com/ids/sm/4343_5072_7091_3242 + + + https://www.hsu-hh.de/aut/aas/nameplate + + + Instance + + + + + ManufacturerName + PARAMETER + + + 0173-1#02-AAO677#002 + + + Instance + + string + Pepperl+Fuchs + + + + + ManufacturerProductDesignation + PARAMETER + + + 0173-1#02-AAW338#001 + + + Instance + + string + Distance Sensor + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Lilienthalstr. 200 + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 68307 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Mannheim + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Baden-Wuertemberg + + + + false + false + + + + + ManufacturerProductFamily + PARAMETER + + + 0173-1#02-AAU731#001 + + + Instance + + + + + + + + SerialNumber + PARAMETER + + + 0173-1#02-AAM556#002 + + + Instance + + string + 40000089327054 + + + + + BatchNumber + PARAMETER + + + 0173-1#02-AAQ196#001 + + + Instance + + + + + + + + ProductCountryOfOrigin + PARAMETER + + + 0173-1#02-AAO841#001 + + + Instance + + string + DE + + + + + YearOfConstruction + PARAMETER + + + 0173-1#02-AAP906#001 + + + Instance + + string + 2018 + + + + + Marking_CE + PARAMETER + + + https://www.hsu-hh.de/aut/aas/productmarking + + + Instance + + + + + CEQualificationPresent + PARAMETER + + + 0173-1#02-BAF053#008 + + + Instance + + boolean + 1 + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + image/png + /aasx/Nameplate/marking_ce.png + + + + false + false + + + + + + Document + www.company.com/ids/sm/2543_5072_7091_2660 + + + https://www.hsu-hh.de/aut/aas/document + + + Instance + + + + + DeclarationCEMarking + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Pepperl+Fuchs + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Pepperl+Fuchs + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 02-04 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Zeugnisse, Zertifikate, Bescheinigungen + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + de + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + EU-Konformitätserklärung + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + EU-Konformitaetserklaerung.pdf.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/EU-Konformitaetserklaerung.pdf + + + + false + false + + + + + Certificat_DIN_EN_ISO_14001_2015 + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Pepperl+Fuchs + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Pepperl+Fuchs + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 02-04 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Zeugnisse, Zertifikate, Bescheinigungen + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Data Sheet OMT100-R100-2EP-IO-V31 + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + 267075-100078_eng.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/267075-100078_eng.pdf + + + + false + false + + + + + + Service + www.company.com/ids/sm/6053_5072_7091_5102 + + + https://www.hsu-hh.de/aut/aas/service + + + Instance + + + + + ContactInfo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/contactinfo + + + Instance + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + Pepperl+Fuchs + + + + + ContactInfo_Role + PARAMETER + + + https://www.hsu-hh.de/aut/aas/role + + + Instance + + string + Manufacturer + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Lilienthalstr. 200 + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 68307 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Mannheim + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Baden-Würtemberg + + + + false + false + + + + + Email + PARAMETER + + + https://www.hsu-hh.de/aut/aas/email + + + Instance + + string + info@pepperl-fuchs.com + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://www.pepperl-fuchs.com + + + + + PhoneNumber + PARAMETER + + + 0173-1#02-AAO136#002 + + + Instance + + string + +496217760 + + + + + Fax + PARAMETER + + + https://www.hsu-hh.de/aut/aas/fax + + + Instance + + + + + + + false + false + + + + + + Identification + www.company.com/ids/sm/6563_5072_7091_4267 + + + https://www.hsu-hh.de/aut/aas/identification + + + Instance + + + + + ManufacturerName + PARAMETER + + + 0173-1#02-AAO677#002 + + + Instance + + string + Pepperl+Fuchs + + + + + GLNOfManufacturer + PARAMETER + + + 0173-1#02-AAY812#001 + + + Instance + + + + + + + + SupplierOfTheIdentifier + + + 0173-1#02-AAP796#004 + + + Instance + + + + + + + + MAN_PROD_NUM + + + 0173-1#02-AAO676#003 + + + Instance + + string + 267075-100078 + + + + + ManufacturerProductDesignation + PARAMETER + + + 0173-1#02-AAW338#001 + + + Instance + + string + OMT100-R100-2EP-IO-V31 + + + + + ManufacturerProductDescription + PARAMETER + + + 0173-1#02-AAU734#001 + + + Instance + + string + Distance Sensor, Measurement to object, 100 mm detection range, red light, measured value via IO-Link, 2 x push-pull output, M8 plug + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + Pepperl+Fuchs + + + + + GLNOfSupplier + PARAMETER + + + 0173-1#02-AAY813#001 + + + Instance + + + + + + + + SupplierIdProvider + PARAMETER + + + https://www.hsu-hh.de/aut/aas/supplieridprovider + + + Instance + + + + + + + + SUP_PROD_NUM + PARAMETER + + + 0173-1#02-AAO736#004 + + + Instance + + string + 267075-100078 + + + + + SupplierProductDesignation + + + 0173-1#02-AAM551#002 + + + Instance + + string + OMT100-R100-2EP-IO-V31 + + + + + SupplierProductDescription + PARAMETER + + + 0173-1#02-AAU730#001 + + + Instance + + string + Distance Sensor + + + + + ManufacturerProductFamily + PARAMETER + + + 0173-1#02-AAU731#001 + + + Instance + + + + + + + + ClassificationSystem + PARAMETER + + + 0173-1#02-AAO715#002 + + + Instance + + string + eclass + + + + + SecondaryKeyTyp + + + https://www.hsu-hh.de/aut/aas/secondarykeytyp + + + Instance + + + + + + + + TypThumbnail + PARAMETER + + + www.company.com/ids/cd/4401_1272_7091_3437 + + + Instance + + image/jpeg + /MAC0007059_rgb.jpg + + + + + AssetId + PARAMETER + + + https://www.hsu-hh.de/aut/aas/assetid + + + Instance + + string + www.company.com/ids/asset/1595_3140_0191_3961 + + + + + SerialNumber + PARAMETER + + + 0173-1#02-AAM556#002 + + + Instance + + string + 40000089327054 + + + + + BatchNumber + PARAMETER + + + 0173-1#02-AAQ196#001 + + + Instance + + + + + + + + SecondaryKeyInstance + PARAMETER + + + https://www.hsu-hh.de/aut/aas/secondarykeyinstance + + + Instance + + + + + + + + DateOfManufacture + PARAMETER + + + 0173-1#02-AAR972#002 + + + Instance + + + + + + + + DeviceRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/devicerevision + + + Instance + + + + + + + + SoftwareRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/softwarerevision + + + Instance + + + + + + + + HardwareRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/hardwarerevision + + + Instance + + + + + + + + ContactInfo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/contactinfo + + + Instance + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + Pepperl+Fuchs + + + + + ContactInfo_Role + PARAMETER + + + https://www.hsu-hh.de/aut/aas/role + + + Instance + + string + Manufacturer + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Lilienthalstr. 200 + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 68307 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Mannheim + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Baden-Würtemberg + + + + false + false + + + + + Email + PARAMETER + + + https://www.hsu-hh.de/aut/aas/email + + + Instance + + string + info@pepperl-fuchs.com + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://www.pepperl-fuchs.com + + + + + PhoneNumber + PARAMETER + + + 0173-1#02-AAO136#002 + + + Instance + + string + +496217760 + + + + + Fax + PARAMETER + + + https://www.hsu-hh.de/aut/aas/fax + + + Instance + + + + + + + false + false + + + + + CompanyLogo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/companylogo + + + Instance + + image/png + /aasx/Identification/PF_Logo_RGB.jpg + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://www.pepperl-fuchs.com/usa/en/classid_53.htm?view=productdetails&prodid=66664 + + + + + + + + ManufacturerName + 0173-1#02-AAO677#002 + + + + + + + + Herstellername + Manufacturer Name + + Manufacturer Name + + + + + Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist + 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 + + + + + + + ManufacturerProductDesignation + 0173-1#02-AAW338#001 + + + + + + + + Manufacturer product designation + Herstellerproduktbezeichnung + + ManufacturerTypName + + + STRING_TRANSLATABLE + + Kurze Beschreibung des Produktes (Kurztext) + Short description of the product (short text) + + + + + + + PhysicalAddress + https://www.hsu-hh.de/aut/aas/physicaladdress + + + + + + + + PhysicalAddress + Physische Adresse + + PhysicalAddress + + + + + Sammlung für reale physische Adresse + Collection for real physical address + + + + + + + CountryCode + 0173-1#02-AAO730#001 + + + + + + + + + + + + Landeskennung + Country code + + Country code + + + + + Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes + agreed upon symbol for unambiguous identification of a country + + + + + + + Street + 0173-1#02-AAO128#001 + + + + + + + + Strasse + Street + + Street + + + + + Name der Strasse und Hausnummer + Street name and house number + + + + + + + Zip + 0173-1#02-AAO129#002 + + + + + + + + Zip + Postleitzahl + + PostalCode + + + + + ZIP code of address + Postleitzahl der Anschrift + + + + + + + CityTown + 0173-1#02-AAO132#001 + + + + + + + + Ort + City/town + + City/town + + + + + Town or city of the company + Ortsangabe + + + + + + + StateCounty + 0173-1#02-AAO133#002 + + + + + + + + state/county + Bundesland + + StateCounty + + + + + Bundesland + state/county + + + + + + + ManufacturerProductFamily + 0173-1#02-AAU731#001 + + + + + + + + Manufacturer product family + Herstellerproduktfamilie + + TypClass + + + + + 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie + 2nd level of a 3 level manufacturer specific product hierarchy + + + + + + + SerialNumber + 0173-1#02-AAM556#002 + + + + + + + + Serial number + Seriennummer + + InstanceId + + + + + eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist + unique combination of numbers and letters used to identify the device once it has been manufactured + + + + + + + BatchNumber + 0173-1#02-AAQ196#001 + + + + + + + + Batch number + Chargen-Nummer + + ChargeId + + + + + Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge + Number assigned by the manufacturer of a material to identify the manufacturer's batch + + + + + + + ProductCountryOfOrigin + 0173-1#02-AAO841#001 + + + + + + + + Produkt Ursprungsland + Product country of origin + + CountryOfOrigin + + + + + Land in dem das Produkt hergestellt wurde (Hersteller Land) + Country in which the product is manufactured (manufacturer country) + + + + + + + YearOfConstruction + 0173-1#02-AAP906#001 + + + + + + + + Year of construction + Baujahr + + YearOfConstruction + + + + + Jahreszahl als Datumsangabe für die Fertigstellung des Objektes + Year as completion date of object + + + + + + + ProductMarking + https://www.hsu-hh.de/aut/aas/productmarking + + + + + + + + Produktkennzeichnung + Product Marking + + ProductMarking + + + + + Sammlungsdatei für Produktkennzeichnung + Collection file for product marking + + + + + + + CEQualificationPresent + 0173-1#02-BAF053#008 + + + + + + + + CE-Kennzeichnung vorhanden + CE- qualification present + + CEMarkingPresent + + + BOOLEAN + + whether CE- qualification is present + Angabe, ob CE-Kennzeichnung vorhanden ist + + + + + + + File + 0173-1#02-AAD005#008 + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Enthaltene Doku. Datei + Embedded Doc. file + + File + + + + + Verweis/ BLOB auf enthaltene Dokumentations-Datei. + Reference/ BLOB to embedded documentation file. + + + + + + + DocumentationItem + 0173-1#02-AAD001#001 + + + + + + + + Dokumentationsgruppe + Documentation item + + DocumentationItem + + + + + Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. + Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. + + + + + + + DocumentType + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + + + + + + Dokumententyp + Document Type + + DocumentType + + + + + Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) + TBD + + + + + + + VDI2770_DomainId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + + + + + + Domain-Nummer + DomainId + + DomainId + + + + + Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. + TBD + + + + + + + VDI2770_IdType + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + + + + + + Nummerntyp + IdType + + IdType + + + + + Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. + TBD + + + + + + + DocumentId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + + + + + + DocumentId + Dokumenten-Nummer + + DocumentId + + + + + Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. + TBD + + + + + + + DocumentDomainId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + + + + + + DocumentDomainId + DocumentDomainId + + DocumentDomainId + + + + + Kennung oder Kennzeichen einer Domäne + TBD + + + + + + + VDI2770_Role + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + + + + + + Rolle + Role + + Role + + + + + Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) + TBD + + + + + + + VDI2770_OrganisationId + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + + + + + + Organisation ID + Organisation ID + + OrganisationId + + + + + eindeutige ID für die Organisation + TBD + + + + + + + VDI2770_OrganisationName + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + + + + + + OrganisationName + OrganisationName + + OrganisationName + + + + + gebräuchliche Bezeichnung für die Organisation + TBD + + + + + + + VDI2770_OrganisationOfficialName + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + + + + + + Offizieller Name der Organisation + Organisation Official Name + + OrganisationOfficialName + + + + + offizieller Name der Organisation + TBD + + + + + + + VDI2770_Description + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + + + + + + Beschreibung + Description + + Description + + + + + Beschreibung für die nächste übergeordnete Collection + TBD + + + + + + + DocumentPartId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + + + + + + Dokumenten-Teilnummer + DocumentPartId + + DocumentPartId + + + + + Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. + TBD + + + + + + + DocumentClassification_ClassId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + + + + Dokumentkategorie + Document category + + DocCategory + + + + + Dokumentkategorie nach VDI 2770:2018/10 + Document category after VDI 2770:2018/10 + + + + + + + VDI2770_ClassName + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + + + + + + Klassenname + Class Name + + ClassName + + + + + Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. + TBD + + + + + + + VDI2770_ClassificationSystem + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + + + + + + Klassifizierungssystem + classification system + + ClassificationSystem + + + + + Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. + TBD + + + + + + + DocumentVersionId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + + + + + + Dokumenten-Versionsnummer + DocumentVersionId + + DocumentVersionId + + + + + Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. + TBD + + + + + + + DocumentVersion_LanguageCode + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + + + + + + Sprachenschlüssel + LanguageCode + + LanguageCode + + + + + Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 + TBD + + + + + + + VDI2770_Title + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + + + + + + Titel + Title + + VDI2770_Title + + + + + sprachabhängiger Titel des Dokuments + TBD + + + + + + + VDI2770_Summary + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + + + + + + Zusammenfassung + Summary + + Summary + + + + + sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts + TBD + + + + + + + VDI2770_Keywords + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + + + + + + Schlagwörter + Keywords + + Keywords + + + + + sprachabhängige, durch Komma getrennte Liste von Schlagwörtern + TBD + + + + + + + VDI2770_StatusValue + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + + + + + + Statuswert + StatusValue + + StatusValue + + + + + Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) + TBD + + + + + + + VDI2770_SetDate + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + + + + + + Erstellungsdatum + Set Date + + SetDate + + + + + Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). + TBD + + + + + + + VDI2770_Purpose + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + + + + + + Zweck + Purpose + + Purpose + + + + + Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. + TBD + + + + + + + VDI2770_BasedOnProcedure + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + + + + + + Prozedur + Procedure + + BasedOnProcedure + + + + + textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt + TBD + + + + + + + VDI2770_Comments + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + + + + + + Kommentar + Comments + + Comments + + + + + textuelle Bemerkungen und Anmerkungen zum Status + TBD + + + + + + + VDI2770_ReferencedObject_Type + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + + + + + + Typ + Type + + Type + + + + + Für Type des Objekts muss immer Product angegeben werden. + TBD + + + + + + + VDI2770_ReferencedObject_RefType + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + + + + + + RefType + RefType + + RefType + + + + + Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) + TBD + + + + + + + VDI2770_ReferencedObject_ObjectId + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + + + + + + ObjectId + ObjectId + + ObjectId + + + + + Angabe der Identifikationsnummer zum Objekt + TBD + + + + + + + VDI2770_FileId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + + + + + + ID der Datei + File ID + + FileId + + + + + eindeutige ID für die Datei + TBD + + + + + + + VDI2770_FileName + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + + + + + + Dateiname + File name + + FileName + + + + + Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. + TBD + + + + + + + VDI2770_FileFormat + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + + + + + + Datei Format + File format + + FileFormat + + + + + Angabe eines Media Typs gemäß der Liste der IANA + TBD + + + + + + + OrganisationContactInfo + https://www.hsu-hh.de/aut/aas/contactinfo + + + + + + + + Contact Info + Kontakt Info + + OrganisationContactInfo + + + + + Sammlung für die allgemeinen Kontaktdaten + Collection for general contact data + + + + + + + NameOfSupplier + 0173-1#02-AAO735#003 + + + + + + + + + + + + name of supplier + Lieferantenname + + name of supplier + + + + + Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt + name of supplier which provides the customer with a product or a service + + + + + + + ContactInfo_Role + https://www.hsu-hh.de/aut/aas/role + + + + + + + + Rolle + Role + + Role + + + + + Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt + Information to specify the role which the organisation of ContactInfo plays + + + + + + + Email + https://www.hsu-hh.de/aut/aas/email + + + + + + + + Emailadresse + Email address + + Email + + + + + Emailadresse + Email address + + + + + + + URL + 0173-1#02-AAO694#001 + + + + + + + + Internetadresse + Internet address + + URL + + + + + stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html + Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html + + + + + + + PhoneNumber + 0173-1#02-AAO136#002 + + + + + + + + Telefonnummer + telephone number + + Phone + + + + + vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist + complete telephone number to be called to reach a business partner + + + + + + + Fax + https://www.hsu-hh.de/aut/aas/fax + + + + + + + + Fax + Fax + + Fax + + + + + Faxnummer + Fax number + + + + + + + 0173-1#02-AAO136#002 + + + + + GLNOfManufacturer + 0173-1#02-AAY812#001 + + + + + + + + GLN of manufacturer + GLN des Herstellers + + GLN of manufacturer + + + + + international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort + internationally unique identification number for the manufacturer of the device or the product and for the physical location + + + + + + + SupplierOfTheIdentifier + 0173-1#02-AAP796#004 + + + + + + + + Supplier of the identifier + Anbieter der Identifikationsnummer für Hersteller + + Supplier of the identifier + + + STRING_TRANSLATABLE + + DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification + DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer + + + + + + + MAN_PROD_NUM + + product article number of manufacturer + + 0173-1#02-AAO676#003 + + + + + + + + product article number of manufacturer + Herstellerartikelnummer + + MAN_PROD_NUM + + + STRING_TRANSLATABLE + + eindeutiger Bestellschlüssel des Herstellers + unique product identifier of the manufacturer + + + + + + + ManufacturerProductDescription + 0173-1#02-AAU734#001 + + + + + + + + Manufacturer product description + Herstellerproduktbeschreibung + + Manufacturer product description + + + + + Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) + Description of the product, it's technical features and implementation if needed (long text) + + + + + + + GLNOfSupplier + 0173-1#02-AAY813#001 + + + + + + + + GLN of supplier + GLN des Lieferanten + + GLN of supplier + + + + + international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort + internationally unique identification number for the supplier of the device or the product and for the physical location + + + + + + + SupplierIdProvider + https://www.hsu-hh.de/aut/aas/supplieridprovider + + + + + + + + SupplierIdProvider + Anbieter der Identifikationsnummer + + SupplierIdProvider + + + STRING_TRANSLATABLE + + DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer + DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification + + + + + + + SUP_PROD_NUM + 0173-1#02-AAO736#004 + + + + + + + + product article number of supplier + Lieferantenartikelnummer + + product article number of supplier + + + + + eindeutiger Bestellschlüssel des Lieferanten + unique product order identifier of the supplier + + + + + + + SupplierProductDesignation + 0173-1#02-AAM551#002 + + + + + + + + Supplier product designation + Lieferantenproduktbezeichnung + + SupplierTypName + + + STRING_TRANSLATABLE + + Kurze Beschreibung des Produktes (Kurztext) + Short description of the product (short text) + + + + + + + SupplierProductDescription + 0173-1#02-AAU730#001 + + + + + + + + Supplier product description + Lieferantenproduktbeschreibung + + Supplier product description + + + + + Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) + Description of the product, it's technical features and implementation if needed (long text) + + + + + + + ClassificationSystem + 0173-1#02-AAO715#002 + + + + + + + + classification system + Klassifizierungssystem + + ClassificationSystem + + + + + Klassifizierungssystem + Classification System + + + + + + + SecondaryKeyTyp + https://www.hsu-hh.de/aut/aas/secondarykeytyp + + + + + + + + SecondaryKeyTyp + Typnummer des IT Systems + + SecondaryKeyTyp + + + + + Führende technische ID im IT System des Typs + SecondaryKeyTyp + + + + + + + TypThumbnail + www.company.com/ids/cd/4401_1272_7091_3437 + + + + + + + + TypThumbnail + Vorschaubild + + TypThumbnail + + + + + Darstellung des Produkttyps in kleinem Format + Small picture of the product type + + + + + + + AssetId + https://www.hsu-hh.de/aut/aas/assetid + + + + + + + + AssetId + Asset ID + + AssetId + + + + + Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. + Global unique ID of an asset, which can be read by both human and machine. + + + + + + + SecondaryKeyInstance + https://www.hsu-hh.de/aut/aas/secondarykeyinstance + + + + + + + + SecondaryKeyInstance + Instanznummer des IT Systems + + SecondaryKeyInstance + + + + + Führende technische ID im IT System der Instanz + SecondaryKeyInstance + + + + + + + DateOfManufacture + 0173-1#02-AAR972#002 + + + + + + + + Date of manufacture + Herstellungsdatum + + Date of manufacture + + + DATE + + Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist + Date from which the production and / or development process is completed or from which a service is provided completely + + + + + + + DeviceRevision + https://www.hsu-hh.de/aut/aas/devicerevision + + + + + + + + DeviceRevision + DeviceRevision + + DeviceRevision + + + + + DeviceRevision + DeviceRevision + + + + + + + SoftwareRevision + https://www.hsu-hh.de/aut/aas/softwarerevision + + + + + + + + SoftwareRevision + SoftwareRevision + + SoftwareRevision + + + + + SoftwareRevision + SoftwareRevision + + + + + + + HardwareRevision + https://www.hsu-hh.de/aut/aas/hardwarerevision + + + + + + + + HardwareRevision + HardwareRevision + + HardwareRevision + + + + + HardwareRevision + HardwareRevision + + + + + + + QrCode + https://www.hsu-hh.de/aut/aas/qrcode + + + + + + + + QrCode + QrCode + + QrCode + + + + + In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. + QrCode + + + + + + + CompanyLogo + https://www.hsu-hh.de/aut/aas/companylogo + + + + + + + + Firmenlogo + CompanyLogo + + CompanyLogo + + + + + Firmenlogo + CompanyLogo + + + + + + + \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/13_DKE.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/13_DKE.aasx.xml new file mode 100644 index 000000000..9c4ff996e --- /dev/null +++ b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/13_DKE.aasx.xml @@ -0,0 +1,4210 @@ + + + + + dkeNamePlate + www.dke.de/digitales-typenschild + + + + + + + www.company.com/ids/sm/4343_5072_7091_3242 + + + + + www.company.com/ids/sm/6053_5072_7091_5102 + + + + + www.company.com/ids/sm/6563_5072_7091_4267 + + + + + www.company.com/ids/sm/5171_3150_1191_6645 + + + + + www.company.com/ids/sm/7543_3150_1191_1022 + + + + + + + + + DKE1234 + + DKE peppermint dragees + DEK Pfefferminzdragees + + www.company.com/ids/asset/3240_1162_7091_2878 + Instance + + + + + Nameplate + www.company.com/ids/sm/4343_5072_7091_3242 + + + https://www.hsu-hh.de/aut/aas/nameplate + + + Instance + + + + + ManufacturerName + PARAMETER + + + 0173-1#02-AAO677#002 + + + Instance + + string + DKE Deutsche Kommission Elektrotechnik Elektronik Informationstechnik in DIN und VDE + + + + + ManufacturerProductDesignation + PARAMETER + + + 0173-1#02-AAW338#001 + + + Instance + + string + Pfefferminzdragees + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Stresemannallee 15 + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 60596 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Frankfurt + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Hessen + + + + false + false + + + + + ManufacturerProductFamily + PARAMETER + + + 0173-1#02-AAU731#001 + + + Instance + + + + + + + + SerialNumber + PARAMETER + + + 0173-1#02-AAM556#002 + + + Instance + + string + 123456 + + + + + BatchNumber + PARAMETER + + + 0173-1#02-AAQ196#001 + + + Instance + + + + + + + + ProductCountryOfOrigin + PARAMETER + + + 0173-1#02-AAO841#001 + + + Instance + + string + DE + + + + + YearOfConstruction + PARAMETER + + + 0173-1#02-AAP906#001 + + + Instance + + integer + 2019 + + + + + + Service + www.company.com/ids/sm/6053_5072_7091_5102 + + + https://www.hsu-hh.de/aut/aas/service + + + Instance + + + + + ContactInfo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/contactinfo + + + Instance + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + DKE Deutsche Kommission Elektrotechnik Elektronik Informationstechnik in DIN und VDE + + + + + ContactInfo_Role + PARAMETER + + + https://www.hsu-hh.de/aut/aas/role + + + Instance + + string + Distributor + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Stresemannallee 15 + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 60596 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Frankfurt + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Hessen + + + + false + false + + + + + Email + PARAMETER + + + https://www.hsu-hh.de/aut/aas/email + + + Instance + + string + dke@vde.com + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + string + https://www.dke.de/digitales-typenschild + + + + + PhoneNumber + PARAMETER + + + 0173-1#02-AAO136#002 + + + Instance + + string + +49 69 6308-0 + + + + + Fax + PARAMETER + + + https://www.hsu-hh.de/aut/aas/fax + + + Instance + + string + +49 69 6308-9863 + + + + false + false + + + + + + Identification + www.company.com/ids/sm/6563_5072_7091_4267 + + + https://www.hsu-hh.de/aut/aas/identification + + + Instance + + + + + ManufacturerName + PARAMETER + + + 0173-1#02-AAO677#002 + + + Instance + + string + Deutsche Kommission Elektrotechnik Elektronik Informationstechnik in DIN und VDE + + + + + GLNOfManufacturer + PARAMETER + + + 0173-1#02-AAY812#001 + + + Instance + + string + DKE123456 + + + + + SupplierOfTheIdentifier + + + 0173-1#02-AAP796#004 + + + Instance + + + + + + + + MAN_PROD_NUM + + + 0173-1#02-AAO676#003 + + + Instance + + + + + + + + ManufacturerProductDesignation + PARAMETER + + + 0173-1#02-AAW338#001 + + + Instance + + string + Pfefferminzdragees + + + + + ManufacturerProductDescription + PARAMETER + + + 0173-1#02-AAU734#001 + + + Instance + + langString + Pfefferminzdragees in Blechdose + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + DKE Deutsche Kommission Elektrotechnik Elektronik Informationstechnik in DIN und VDE + + + + + GLNOfSupplier + PARAMETER + + + 0173-1#02-AAY813#001 + + + Instance + + string + DKE123456 + + + + + SupplierIdProvider + PARAMETER + + + https://www.hsu-hh.de/aut/aas/supplieridprovider + + + Instance + + + + + + + + SUP_PROD_NUM + PARAMETER + + + 0173-1#02-AAO736#004 + + + Instance + + + + + + + + SupplierProductDesignation + + + 0173-1#02-AAM551#002 + + + Instance + + string + Pfefferminzdragees + + + + + SupplierProductDescription + PARAMETER + + + 0173-1#02-AAU730#001 + + + Instance + + langString + Pfefferminzdragees in Blechdose + + + + + ManufacturerProductFamily + PARAMETER + + + 0173-1#02-AAU731#001 + + + Instance + + + + + + + + ClassificationSystem + PARAMETER + + + 0173-1#02-AAO715#002 + + + Instance + + string + eclass + + + + + SecondaryKeyTyp + + + https://www.hsu-hh.de/aut/aas/secondarykeytyp + + + Instance + + + + + + + + TypThumbnail + PARAMETER + + + www.company.com/ids/cd/4401_1272_7091_3437 + + + Instance + + image/jpeg + /dke-dose.jpg + + + + + AssetId + PARAMETER + + + https://www.hsu-hh.de/aut/aas/assetid + + + Instance + + anyURI + www.dke.de/digitales-typenschild + + + + + SerialNumber + PARAMETER + + + 0173-1#02-AAM556#002 + + + Instance + + string + DKE123456 + + + + + BatchNumber + PARAMETER + + + 0173-1#02-AAQ196#001 + + + Instance + + + + + + + + SecondaryKeyInstance + PARAMETER + + + https://www.hsu-hh.de/aut/aas/secondarykeyinstance + + + Instance + + + + + + + + DateOfManufacture + PARAMETER + + + 0173-1#02-AAR972#002 + + + Instance + + date + 2019 + + + + + DeviceRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/devicerevision + + + Instance + + + + + + + + SoftwareRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/softwarerevision + + + Instance + + + + + + + + HardwareRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/hardwarerevision + + + Instance + + + + + + + + QrCode + PARAMETER + + + https://www.hsu-hh.de/aut/aas/qrcode + + + Instance + + image/png + /aasx/dke-qr.png + + + + + ContactInfo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/contactinfo + + + Instance + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + DKE Deutsche Kommission Elektrotechnik Elektronik Informationstechnik in DIN und VDE + + + + + ContactInfo_Role + PARAMETER + + + https://www.hsu-hh.de/aut/aas/role + + + Instance + + string + Distributor + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + langString + Stresemannallee 15 + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 60596 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Frankfurt + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Hessen + + + + false + false + + + + + Email + PARAMETER + + + https://www.hsu-hh.de/aut/aas/email + + + Instance + + string + dke@vde.com + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://www.dke.de/digitales-typenschild + + + + + PhoneNumber + PARAMETER + + + 0173-1#02-AAO136#002 + + + Instance + + string + +49 69 6308-0 + + + + + Fax + PARAMETER + + + https://www.hsu-hh.de/aut/aas/fax + + + Instance + + string + +49 69 6308-9863 + + + + false + false + + + + + CompanyLogo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/companylogo + + + Instance + + image/jpeg + /aasx/dke-logo.jpg + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://www.dke.de/digitales-typenschild + + + + + LOT + CONSTANT + + Lot + Lot + + + + + + + + Instance + + string + 696.240 + + + + + best_before + + Mindesthaltbarkeit + best before + + + + + + + Instance + + date + 11/2020 + + + + + weight + CONSTANT + + Inhalt, g + content, g + + + + + + + Instance + + decimal + 18.0 + + + + + content + + Inhalt + CONTENT + + + + + + + + + + + + Instance + + string + Pfefferminzdragees + + + + + + nutrition_facts + PARAMETER + + Nährwertangaben + Nutrition Facts + + www.company.com/ids/sm/5171_3150_1191_6645 + + + + + + + https://www.hsu-hh.de/aut/aas/nutrition-facts + + + Instance + + + + + nutrition_value + CONSTANT + + Nährwert, kJ/100g + nutrition value, kJ/100g + + + + + + + + Instance + + decimal + 1604 + + + + + fat + + Fett, g + Fat, g + + + + + + + Instance + + decimal + 0.4 + + + + + saturated_fat + + gesättigte Fette, g + saturated fats, g + + + + + + + Instance + + decimal + 0.1 + + + + + carbohydrates + + Kohlenhydrate, g + Carbohydrates,g + + + + + + + Instance + + decimal + 93.2 + + + + + sugar + CONSTANT + + Zucker, g + Sugar, g + + + + + + + Instance + + decimal + 92.6 + + + + + protein + CONSTANT + + Eiweiß, g + Protein, g + + + + + + + + Instance + + long + 0.2 + + + + + salt + CONSTANT + + Salz, g + Salt, g + + + + + + + Instance + + string + < 0.005 + + + + + + ingredients + PARAMETER + + Inhaltsstoffe + Ingredients + + www.company.com/ids/sm/7543_3150_1191_1022 + + + https://www.hsu-hh.de/aut/aas/ingredients + + + Instance + + + + + igrendient_1 + + Inhaltsstoff 1 + Ingredient 1 + + + + + + + Instance + + string + sugar + + + + + ingredient_2 + + Inhaltsstoff 2 + Ingredient 2 + + + + + + + Instance + + string + dextrose + + + + + ingredient_3 + + Inhaltsstoff 3 + Ingredient 3 + + + + + + + Instance + + string + E470b + + + + + ingredient_4 + + Inhaltsstoff 4 + Ingredient 4 + + + + + + + Instance + + string + flavour + + + + + ingredient_5 + + Inhaltsstoff 5 + Ingredient 5 + + + + + + + Instance + + string + glucose + + + + + ingredient_6 + + Inhaltsstoff 6 + Ingredient 6 + + + + + + + Instance + + string + E171 + + + + + ingredient_7 + + Inhaltsstoff 7 + Ingredient 7 + + + + + + + Instance + + + carnauba wax + + + + + ingredient_8 + CONSTANT + + Inhaltsstoff 8 + Ingredient 8 + + + + + + + Instance + + string + gummi arabicum + + + + + + + + ManufacturerName + 0173-1#02-AAO677#002 + + + + + + + + Herstellername + Manufacturer Name + + Manufacturer Name + + + + + Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist + 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 + + + + + + + GLNOfManufacturer + 0173-1#02-AAY812#001 + + + + + + + + GLN of manufacturer + GLN des Herstellers + + GLN of manufacturer + + + + + international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort + internationally unique identification number for the manufacturer of the device or the product and for the physical location + + + + + + + SupplierOfTheIdentifier + 0173-1#02-AAP796#004 + + + + + + + + Supplier of the identifier + Anbieter der Identifikationsnummer für Hersteller + + Supplier of the identifier + + + STRING_TRANSLATABLE + + DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification + DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer + + + + + + + MAN_PROD_NUM + + product article number of manufacturer + + 0173-1#02-AAO676#003 + + + + + + + + product article number of manufacturer + Herstellerartikelnummer + + MAN_PROD_NUM + + + STRING_TRANSLATABLE + + eindeutiger Bestellschlüssel des Herstellers + unique product identifier of the manufacturer + + + + + + + ManufacturerProductDesignation + 0173-1#02-AAW338#001 + + + + + + + + Manufacturer product designation + Herstellerproduktbezeichnung + + ManufacturerTypName + + + STRING_TRANSLATABLE + + Pfefferminzdragees + peppermint dragees + + + + + + + ManufacturerProductDescription + 0173-1#02-AAU734#001 + + + + + + + + Manufacturer product description + Herstellerproduktbeschreibung + + Manufacturer product description + + + + + Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) + Description of the product, it's technical features and implementation if needed (long text) + + + + + + + NameOfSupplier + 0173-1#02-AAO735#003 + + + + + + + + + + + + name of supplier + Lieferantenname + + name of supplier + + + + + Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt + name of supplier which provides the customer with a product or a service + + + + + + + GLNOfSupplier + 0173-1#02-AAY813#001 + + + + + + + + GLN of supplier + GLN des Lieferanten + + GLN of supplier + + + + + international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort + internationally unique identification number for the supplier of the device or the product and for the physical location + + + + + + + SupplierIdProvider + https://www.hsu-hh.de/aut/aas/supplieridprovider + + + + + + + + SupplierIdProvider + Anbieter der Identifikationsnummer + + SupplierIdProvider + + + STRING_TRANSLATABLE + + DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer + DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification + + + + + + + SUP_PROD_NUM + 0173-1#02-AAO736#004 + + + + + + + + product article number of supplier + Lieferantenartikelnummer + + product article number of supplier + + + + + eindeutiger Bestellschlüssel des Lieferanten + unique product order identifier of the supplier + + + + + + + SupplierProductDesignation + 0173-1#02-AAM551#002 + + + + + + + + Supplier product designation + Lieferantenproduktbezeichnung + + SupplierTypName + + + STRING_TRANSLATABLE + + Kurze Beschreibung des Produktes (Kurztext) + Short description of the product (short text) + + + + + + + SupplierProductDescription + 0173-1#02-AAU730#001 + + + + + + + + Supplier product description + Lieferantenproduktbeschreibung + + Supplier product description + + + + + Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) + Description of the product, it's technical features and implementation if needed (long text) + + + + + + + ManufacturerProductFamily + 0173-1#02-AAU731#001 + + + + + + + + Manufacturer product family + Herstellerproduktfamilie + + TypClass + + + + + 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie + 2nd level of a 3 level manufacturer specific product hierarchy + + + + + + + ClassificationSystem + 0173-1#02-AAO715#002 + + + + + + + + classification system + Klassifizierungssystem + + ClassificationSystem + + + + + Klassifizierungssystem + Classification System + + + + + + + SecondaryKeyTyp + https://www.hsu-hh.de/aut/aas/secondarykeytyp + + + + + + + + SecondaryKeyTyp + Typnummer des IT Systems + + SecondaryKeyTyp + + + + + Führende technische ID im IT System des Typs + SecondaryKeyTyp + + + + + + + TypThumbnail + www.company.com/ids/cd/4401_1272_7091_3437 + + + + + + + + TypThumbnail + Vorschaubild + + TypThumbnail + + + + + Darstellung des Produkttyps in kleinem Format + Small picture of the product type + + + + + + + AssetId + https://www.hsu-hh.de/aut/aas/assetid + + + + + + + + AssetId + Asset ID + + AssetId + + + + + Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. + Global unique ID of an asset, which can be read by both human and machine. + + + + + + + SerialNumber + 0173-1#02-AAM556#002 + + + + + + + + Serial number + Seriennummer + + InstanceId + + + + + eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist + unique combination of numbers and letters used to identify the device once it has been manufactured + + + + + + + BatchNumber + 0173-1#02-AAQ196#001 + + + + + + + + Batch number + Chargen-Nummer + + ChargeId + + + + + Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge + Number assigned by the manufacturer of a material to identify the manufacturer's batch + + + + + + + SecondaryKeyInstance + https://www.hsu-hh.de/aut/aas/secondarykeyinstance + + + + + + + + SecondaryKeyInstance + Instanznummer des IT Systems + + SecondaryKeyInstance + + + + + Führende technische ID im IT System der Instanz + SecondaryKeyInstance + + + + + + + DateOfManufacture + 0173-1#02-AAR972#002 + + + + + + + + Date of manufacture + Herstellungsdatum + + Date of manufacture + + + DATE + + Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist + Date from which the production and / or development process is completed or from which a service is provided completely + + + + + + + DeviceRevision + https://www.hsu-hh.de/aut/aas/devicerevision + + + + + + + + DeviceRevision + DeviceRevision + + DeviceRevision + + + + + DeviceRevision + DeviceRevision + + + + + + + SoftwareRevision + https://www.hsu-hh.de/aut/aas/softwarerevision + + + + + + + + SoftwareRevision + SoftwareRevision + + SoftwareRevision + + + + + SoftwareRevision + SoftwareRevision + + + + + + + HardwareRevision + https://www.hsu-hh.de/aut/aas/hardwarerevision + + + + + + + + HardwareRevision + HardwareRevision + + HardwareRevision + + + + + HardwareRevision + HardwareRevision + + + + + + + QrCode + https://www.hsu-hh.de/aut/aas/qrcode + + + + + + + + QrCode + QrCode + + QrCode + + + + + In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. + QrCode + + + + + + + OrganisationContactInfo + https://www.hsu-hh.de/aut/aas/contactinfo + + + + + + + + Contact Info + Kontakt Info + + OrganisationContactInfo + + + + + Sammlung für die allgemeinen Kontaktdaten + Collection for general contact data + + + + + + + PhysicalAddress + https://www.hsu-hh.de/aut/aas/physicaladdress + + + + + + + + PhysicalAddress + Physische Adresse + + PhysicalAddress + + + + + Sammlung für reale physische Adresse + Collection for real physical address + + + + + + + CountryCode + 0173-1#02-AAO730#001 + + + + + + + + + + + + Landeskennung + Country code + + Country code + + + + + Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes + agreed upon symbol for unambiguous identification of a country + + + + + + + Street + 0173-1#02-AAO128#001 + + + + + + + + Strasse + Street + + Street + + + + + Name der Strasse und Hausnummer + Street name and house number + + + + + + + Zip + 0173-1#02-AAO129#002 + + + + + + + + Zip + Postleitzahl + + PostalCode + + + + + ZIP code of address + Postleitzahl der Anschrift + + + + + + + CityTown + 0173-1#02-AAO132#001 + + + + + + + + Ort + City/town + + City/town + + + + + Town or city of the company + Ortsangabe + + + + + + + StateCounty + 0173-1#02-AAO133#002 + + + + + + + + state/county + Bundesland + + StateCounty + + + + + Bundesland + state/county + + + + + + + Email + https://www.hsu-hh.de/aut/aas/email + + + + + + + + Emailadresse + Email address + + Email + + + + + Emailadresse + Email address + + + + + + + TelephoneContact + https://www.hsu-hh.de/aut/aas/ContactInfo/TelephoneContact + + + + + + + + Telephone Contact + Telefonkontakt + + TelephoneContact + + + + + Sammlung für Kontaktdaten über Telefon + Collection for contact data via telephone + + + + + + + PhoneNumber + 0173-1#02-AAO136#002 + + + + + + + + Telefonnummer + telephone number + + Phone + + + + + vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist + complete telephone number to be called to reach a business partner + + + + + + + CompanyLogo + https://www.hsu-hh.de/aut/aas/companylogo + + + + + + + + Firmenlogo + CompanyLogo + + CompanyLogo + + + + + Firmenlogo + CompanyLogo + + + + + + + URL + 0173-1#02-AAO694#001 + + + + + + + + Internetadresse + Internet address + + URL + + + + + stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html + Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html + + + + + + + ProductCountryOfOrigin + 0173-1#02-AAO841#001 + + + + + + + + Produkt Ursprungsland + Product country of origin + + CountryOfOrigin + + + + + Land in dem das Produkt hergestellt wurde (Hersteller Land) + Country in which the product is manufactured (manufacturer country) + + + + + + + YearOfConstruction + 0173-1#02-AAP906#001 + + + + + + + + Year of construction + Baujahr + + YearOfConstruction + + + + + Jahreszahl als Datumsangabe für die Fertigstellung des Objektes + Year as completion date of object + + + + + + + File + 0173-1#02-AAD005#008 + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Enthaltene Doku. Datei + Embedded Doc. file + + File + + + + + Verweis/ BLOB auf enthaltene Dokumentations-Datei. + Reference/ BLOB to embedded documentation file. + + + + + + + ProductMarking + https://www.hsu-hh.de/aut/aas/productmarking + + + + + + + + Produktkennzeichnung + Product Marking + + ProductMarking + + + + + Sammlungsdatei für Produktkennzeichnung + Collection file for product marking + + + + + + + CEQualificationPresent + 0173-1#02-BAF053#008 + + + + + + + + CE-Kennzeichnung vorhanden + CE- qualification present + + CEMarkingPresent + + + BOOLEAN + + whether CE- qualification is present + Angabe, ob CE-Kennzeichnung vorhanden ist + + + + + + + WEEELabelingPresent + 0173-1#02-AAR528#005 + + + + + + + + Kennzeichnung (WEEE) vorhanden + WEEE labeling present + + WEEELabelingPresent + + + BOOLEAN + + indication whether the product is equipped with a specified WEEE labeling + Angabe, ob das Produkt mit einer spezifizierten WEEE-Kennzeichnung ausgestattet ist + + + + + + + DocumentClassification_ClassId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + + + + Dokumentkategorie + Document category + + DocCategory + + + + + Dokumentkategorie nach VDI 2770:2018/10 + Document category after VDI 2770:2018/10 + + + + + + + DocumentId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + + + + + + DocumentId + Dokumenten-Nummer + + DocumentId + + + + + Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. + TBD + + + + + + + VDI2770_DomainId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + + + + + + Domain-Nummer + DomainId + + DomainId + + + + + Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. + TBD + + + + + + + VDI2770_IdType + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + + + + + + Nummerntyp + IdType + + IdType + + + + + Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. + TBD + + + + + + + ValString + www.company.com/ids/cd/4490_8182_7091_6124 + + + + + + + + Wert + Value String + + ValString + + + + + Ausdruck für den Wert der übergeordneten Collection. + Value string for the collection value on the next superordinate level + + + + + + + DocumentationItem + 0173-1#02-AAD001#001 + + + + + + + + Dokumentationsgruppe + Documentation item + + DocumentationItem + + + + + Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. + Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. + + + + + + + DocumentIdDomain + www.company.com/ids/cd/6003_8182_7091_9350 + + + + + + + + DocumentIdDomain + DocumentIdDomain + + DocumentIdDomain + + + + + Angabe einer Liste von Domänen, in de-nen die DocumentIds des Dokuments eindeutig sind + TBD + + + + + + + DocumentDomainId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + + + + + + DocumentDomainId + DocumentDomainId + + DocumentDomainId + + + + + Kennung oder Kennzeichen einer Domäne + TBD + + + + + + + VDI2770_Party + www.company.com/ids/cd/3153_8182_7091_4327 + + + + + + + + Party + Party + + Party + + + + + Verweis auf eine Party (siehe VDI 2770 Anhang C1.17), die für diese Domäne verantwortlich ist + TBD + + + + + + + VDI2770_Role + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + + + + + + Rolle + Role + + Role + + + + + Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) + TBD + + + + + + + VDI2770_Organisation + www.company.com/ids/cd/9214_8182_7091_6391 + + + + + + + + Organisation + Organisation + + Organisation + + + + + Angabe einer Organisation + TBD + + + + + + + VDI2770_OrganisationId + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + + + + + + Organisation ID + Organisation ID + + OrganisationId + + + + + eindeutige ID für die Organisation + TBD + + + + + + + VDI2770_OrganisationName + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + + + + + + OrganisationName + OrganisationName + + OrganisationName + + + + + gebräuchliche Bezeichnung für die Organisation + TBD + + + + + + + VDI2770_OrganisationOfficialName + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + + + + + + Offizieller Name der Organisation + Organisation Official Name + + OrganisationOfficialName + + + + + offizieller Name der Organisation + TBD + + + + + + + DocumentPartId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + + + + + + Dokumenten-Teilnummer + DocumentPartId + + DocumentPartId + + + + + Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. + TBD + + + + + + + VDI2770_Description + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + + + + + + Beschreibung + Description + + Description + + + + + Beschreibung für die nächste übergeordnete Collection + TBD + + + + + + + VDI2770_ClassName + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + + + + + + Klassenname + Class Name + + ClassName + + + + + Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. + TBD + + + + + + + DocumentVersion_LanguageCode + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + + + + + + Sprachenschlüssel + LanguageCode + + LanguageCode + + + + + Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 + TBD + + + + + + + VDI2770_ClassificationSystem + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + + + + + + Klassifizierungssystem + classification system + + ClassificationSystem + + + + + Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. + TBD + + + + + + + DocumentVersion + www.company.com/ids/cd/2580_0282_7091_6213 + + + + + + + + Dokumenten-Version + DocumentVersion + + DocumentVersion + + + + + Zu jedem Dokument muss eine Menge von mindestens einer Dokumentenversion existieren. Es können auch mehrere Dokumentenversionen ausgeliefert werden. + TBD + + + + + + + DocumentVersionId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + + + + + + Dokumenten-Versionsnummer + DocumentVersionId + + DocumentVersionId + + + + + Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. + TBD + + + + + + + VDI2770_Language + www.company.com/ids/cd/0231_0282_7091_5062 + + + + + + + + Sprache + Language + + Language + + + + + Liste der im Dokument verwendeten Sprachen + TBD + + + + + + + DocumentVersion_Description + www.company.com/ids/cd/9151_0282_7091_8032 + + + + + + + + Beschreibung zur DocumentVersion + DocumentVersion Description + + DocumentVersion_Description + + + + + Zusammenfassende Beschreibungen zur Dokumentenversion in ggf. unterschiedlichen Sprachen. + TBD + + + + + + + VDI2770_Title + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + + + + + + Titel + Title + + VDI2770_Title + + + + + sprachabhängiger Titel des Dokuments + TBD + + + + + + + VDI2770_Summary + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + + + + + + Zusammenfassung + Summary + + Summary + + + + + sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts + TBD + + + + + + + VDI2770_Keywords + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + + + + + + Schlagwörter + Keywords + + Keywords + + + + + sprachabhängige, durch Komma getrennte Liste von Schlagwörtern + TBD + + + + + + + VDI2770_LifeCycleStatus + www.company.com/ids/cd/0282_0282_7091_7878 + + + + + + + + Lebenszyklus Status + LifeCycleStatus + + LifeCycleStatus + + + + + Liste von Statusdefinitionen mit Bezug zum Dokumentenlebenszyklus inklusive der Angabe der Beteiligten und einem zugehörigen Zeitstempel + TBD + + + + + + + VDI2770_StatusValue + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + + + + + + Statuswert + StatusValue + + StatusValue + + + + + Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) + TBD + + + + + + + VDI2770_SetDate + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + + + + + + Erstellungsdatum + Set Date + + SetDate + + + + + Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). + TBD + + + + + + + VDI2770_Purpose + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + + + + + + Zweck + Purpose + + Purpose + + + + + Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. + TBD + + + + + + + VDI2770_BasedOnProcedure + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + + + + + + Prozedur + Procedure + + BasedOnProcedure + + + + + textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt + TBD + + + + + + + VDI2770_Comments + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + + + + + + Kommentar + Comments + + Comments + + + + + textuelle Bemerkungen und Anmerkungen zum Status + TBD + + + + + + + DocumentRelationship + www.company.com/ids/cd/1204_0282_7091_7896 + + + + + + + + Dokumenten-Beziehung + Document Relationship + + DocumentRelationship + + + + + Liste von Beziehungen zu anderen Dokumenten. Es ist möglich, auf einen Dokument, ein Dokument in einer spezifischen Dokumentenversion oder auch ein Teildokument zu verweisen. + TBD + + + + + + + DocumentRelationship_Type + www.company.com/ids/cd/5044_0282_7091_6924 + + + + + + + + Typ der Dokumenten-Beziehung + DocumentRelationship_Type + + DocumentRelationship_Type + + + + + Typisierung der Beziehung zwischen den beiden DocumentVersions. Folgende Beziehungsarten können verwendet werden: Affecting (hat Auswirkungen auf), ReferesTo (bezieht sich auf), BasedOn (basiert auf) + TBD + + + + + + + StoredDocumentRepresentation + www.company.com/ids/cd/3094_0282_7091_2090 + + + + + + + + StoredDocumentRepresentation + StoredDocumentRepresentation + + StoredDocumentRepresentation + + + + + Liste von digitalen Repräsentationen zur DocumentVersion + TBD + + + + + + + VDI2770_DigitalFile + www.company.com/ids/cd/2305_0282_7091_2077 + + + + + + + + Digitaler-File + DigitalFile + + DigitalFile + + + + + Datei, die die DocumentVersion (siehe VDI 2770:2018 Anhang C1.5) repräsentiert Neben der obligatorischen PDF/A-Datei können weitere Dateien angegeben werden. + TBD + + + + + + + VDI2770_FileId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + + + + + + ID der Datei + File ID + + FileId + + + + + eindeutige ID für die Datei + TBD + + + + + + + VDI2770_FileName + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + + + + + + Dateiname + File name + + FileName + + + + + Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. + TBD + + + + + + + VDI2770_FileFormat + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + + + + + + Datei Format + File format + + FileFormat + + + + + Angabe eines Media Typs gemäß der Liste der IANA + TBD + + + + + + + DocumentType + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + + + + + + Dokumententyp + Document Type + + DocumentType + + + + + Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) + TBD + + + + + + + VDI2770_ReferencedObject + www.company.com/ids/cd/2570_2282_7091_0055 + + + + + + + + ReferencedObject + ReferencedObject + + ReferencedObject + + + + + Liste von IDs für ein Objekt, auf das sich das Dokument bezieht + TBD + + + + + + + VDI2770_ReferencedObject_Type + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + + + + + + Typ + Type + + Type + + + + + Für Type des Objekts muss immer Product angegeben werden. + TBD + + + + + + + VDI2770_ReferencedObject_RefType + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + + + + + + RefType + RefType + + RefType + + + + + Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) + TBD + + + + + + + VDI2770_ReferencedObject_ObjectId + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + + + + + + ObjectId + ObjectId + + ObjectId + + + + + Angabe der Identifikationsnummer zum Objekt + TBD + + + + + + + ContactInfo_Role + https://www.hsu-hh.de/aut/aas/role + + + + + + + + Rolle + Role + + Role + + + + + Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt + Information to specify the role which the organisation of ContactInfo plays + + + + + + + Fax + https://www.hsu-hh.de/aut/aas/fax + + + + + + + + Fax + Fax + + Fax + + + + + Faxnummer + Fax number + + + + + + + 0173-1#02-AAO136#002 + + + + + DocGroup_01 + www.company.com/ids/cd/1420_0113_7091_0891 + + + + + + + + 01 Identifikation + 01 Identification + + DocGroup_01 + + + + + Der Gruppe „Identifikation“ werden alle Dokumente zugeordnet, die der Identifikation des Objekts dienen, zu dem die Herstellerdokumentation gehört. Sie enthält insbesondere Informationen, die die elektronische Datenverarbeitung unterstützen und die es dem Hersteller und dem Nutzer erlauben, das Objekt in ihren jeweiligen elektronischen Datenverarbeitungssystemen zu identifizieren. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocGroup_02 + www.company.com/ids/cd/4323_0113_7091_2591 + + + + + + + + 02 Technische Beschaffenheit + 02 Technical characteristics + + DocGroup_02 + + + + + Die Gruppe „Technische Beschaffenheit“ beinhaltet alle Dokumente, die die technischen Anforderungen, deren Erfüllung und die Bescheinigung der Eigenschaften eines Objekts betreffen. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocGroup_03 + www.company.com/ids/cd/5053_0113_7091_5741 + + + + + + + + 03 Tätigkeitsbezogene Dokumente + 03 Work-related documents + + DocGroup_03 + + + + + Die Gruppe „Tätigkeitsbezogene Dokumente“ beinhaltet alle Dokumente, die Anforderungen, Hinweise und Hilfestellungen für Tätigkeiten an und mit dem Objekt nach der Übergabe an den Nutzer betreffen. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocGroup_04 + www.company.com/ids/cd/5473_0113_7091_1588 + + + + + + + + 04 Vertragsunterlagen + 04 Contract documents + + DocGroup_04 + + + + + Der Gruppe „Vertragsunterlagen“ werden alle Dokumente zugeordnet, die im Zusammenhang mit der kaufmännischen Abwicklung eines Vertrages stehen, aber nicht selbst Gegenstand des Vertrags sind und lediglich zur Erfüllung des Vertrags dienen. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocCategory_01-01 + www.company.com/ids/cd/9593_0113_7091_2401 + + + + + + + + 01-01 Identifikation + 01-01 Identification + + DocCategory_01-01 + + + + + Der Kategorie „Identifikation“ werden alle Dokumente zugeordnet, die der Identifikation des Objekts dienen, zu dem die Herstellerdokumentation gehört. Sie enthält insbesondere Informationen, die die elektronische Datenverarbeitung unterstützen und die es dem Hersteller und dem Nutzer erlauben, das Objekt in ihren jeweiligen elektronischen Datenverarbeitungssystemen zu identifizieren. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocCategory_02-01 + www.company.com/ids/cd/5314_0113_7091_8640 + + + + + + + + 02-01 Techn. Spezifikation + 02-01 Technical specification + + DocCategory_02-01 + + + + + Der Kategorie „Technische Spezifikation“ werden alle Dokumente zugeordnet, die die Anforderungen an ein Objekt sowie dessen Eigenschaften beschreiben. Dazu gehören die Auslegungsdaten, Berechnungen (Verfahrenstechnik, Festigkeit usw.) sowie alle relevanten Eigenschaften des übergebenen Objekts. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocCategory_02-02 + www.company.com/ids/cd/5515_0113_7091_8581 + + + + + + + + 02-02 Zeichnungen, Pläne + 02-02 Drawings and diagrams + + DocCategory_02-02 + + + + + Der Kategorie „Zeichnungen, Pläne“ werden alle Dokumente zugeordnet, die Zeichnungscharakter haben, das heißt eine grafische Darstellung zur Übermittlung von Information nutzen. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocCategory_02-03 + www.company.com/ids/cd/0335_0113_7091_0312 + + + + + + + + 02-03 Bauteile + 02-03 Components + + DocCategory_02-03 + + + + + Der Kategorie „Bauteile“ werden alle Dokumente zugeordnet, die eine strukturierte Auflistung der Teile eines Objekts beinhalten. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocCategory_02-04 + www.company.com/ids/cd/2155_0113_7091_3955 + + + + + + + + 02-04 Zeugnisse, Zertifikate, Bescheinigungen + 02-04 Reports, Certificates, declarations + + DocCategory_02-04 + + + + + Der Kategorie „Zeugnisse, Zertifikate, Bescheinigungen“ werden alle Dokumente zugeordnet, die Urkundencharakter haben. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocCategory_03-01 + www.company.com/ids/cd/3565_0113_7091_2704 + + + + + + + + 03-01 Montage, Inbetriebnahme, Demontage + 03-01 Assembly, commissioning, disassembly + + DocCategory_03-01 + + + + + Der Kategorie „Montage, Demontage“ werden alle Dokumente zugeordnet, die Tätigkeiten und Maßnahmen beschreiben, die erforderlich sind, um ein Objekt: zu transportieren oder zu lagern, als Ganzes in ein übergeordnetes Objekt einzubauen, auszubauen oder an dieses anzuschließen, so weit vorzubereiten, dass es zur Inbetriebnahme bereitsteht, nach Abschluss der Nutzungsphase zu demontieren und zu entsorgen + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocCategory_03-02 + www.company.com/ids/cd/4290_1113_7091_7266 + + + + + + + + 03-02 Bedienung + 03-02 Operation + + DocCategory_03-02 + + + + + Der Kategorie „Bedienung“ werden Dokumente zur bestimmungsgemäßen Verwendung und sicheren Bedienung eines Objekts zugeordnet. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocCategory_03-03 + www.company.com/ids/cd/2211_1113_7091_3911 + + + + + + + + 03-03 Allgemeine Sicherheit + 03-03 Safety in general + + DocCategory_03-03 + + + + + Der Kategorie „Allgemeine Sicherheit“ werden Dokumente zugeordnet, die Sicherheitshinweise auf mögliche Gefährdungen bei der Verwendung des Objekts geben. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocCategory_03-04 + www.company.com/ids/cd/7521_1113_7091_4471 + + + + + + + + 03-04 Inspektion, Wartung, Prüfung + 03-04 Inspection, maintenance, test + + DocCategory_03-04 + + + + + Der Kategorie „Inspektion, Wartung, Prüfung“ werden alle Dokumente zugeordnet, die vom Hersteller vorgeschlagene wiederkehrende Maßnahmen zur Feststellung oder zum Erhalt des funktionsfähigen Zustands beschreiben. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocCategory_03-05 + www.company.com/ids/cd/5161_1113_7091_0458 + + + + + + + + 03-05 Instandsetzung + 03-05 Repair + + DocCategory_03-05 + + + + + Der Kategorie „Instandsetzung“ werden alle Dokumente zugeordnet, die Maßnahmen zur Wiederherstellung der Funktion eines Objekts betreffen. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocCategory_03-06 + www.company.com/ids/cd/2181_1113_7091_5948 + + + + + + + + 03-06 Ersatzteile + 03-06 Spare parts + + DocCategory_03-06 + + + + + Der Kategorie „Ersatzteile“ werden Dokumente zugeordnet, die Informationen zu Ersatzteilen und Hilfs- und Betriebsstoffen enthalten. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocCategory_04-01 + www.company.com/ids/cd/5391_1113_7091_8996 + + + + + + + + 04-01 Vertragsunterlagen + 04-01 Contract documents + + DocCategory_04-01 + + + + + Der Kategorie „Vertragsunterlagen“ werden alle Dokumente zugeordnet, die im Zusammenhang mit der kaufmännischen Abwicklung eines Vertrages stehen, aber nicht selbst Gegenstand des Vertrags sind und lediglich zur Erfüllung des Vertrags dienen. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/14_Siemens.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/14_Siemens.aasx.xml new file mode 100644 index 000000000..4f696a0d6 --- /dev/null +++ b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/14_Siemens.aasx.xml @@ -0,0 +1,6015 @@ + + + + + SITRANS_P320 + www.company.com/ids/aas/9460_8042_0191_4407 + + + http://siemens.com/pimobile?1P=7MF0300-1QU01-5BF2-Z&S=N1L22110101185 + + + + + + www.company.com/demo/sm/instance/F9CC779860FC1039 + + + + + www.company.com/demo/sm/instance/204F677FF7D40E79 + + + + + www.company.com/demo/sm/instance/1D77CEFC25CEC482 + + + + + www.company.com/demo/sm/instance/4F44B8B32822E483 + + + + + + + + + P320 + + SITRANS P320 für Relativdruck, HART (4 ... 20 mA) + SITRANS P320 for gauge pressure, HART (4 ... 20 mA) + + http://siemens.com/pimobile?1P=7MF0300-1QU01-5BF2-Z&S=N1L22110101185 + Instance + + + + + Nameplate + www.company.com/demo/sm/instance/F9CC779860FC1039 + + + https://www.hsu-hh.de/aut/aas/nameplate + + + Instance + + + + + ManufacturerName + PARAMETER + + + 0173-1#02-AAO677#002 + + + Instance + + string + Siemens AG + + + + + ManufacturerProductDesignation + PARAMETER + + + 0173-1#02-AAW338#001 + + + Instance + + string + SITRANS P320 für Relativdruck, HART (4 ... 20 mA) + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 76181 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Karlsruhe + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Baden-Württemberg + + + + false + false + + + + + ManufacturerProductFamily + PARAMETER + + + 0173-1#02-AAU731#001 + + + Instance + + + Druckmessumformer + + + + + SerialNumber + PARAMETER + + + 0173-1#02-AAM556#002 + + + Instance + + string + N1L22110101185 + + + + + BatchNumber + PARAMETER + + + 0173-1#02-AAQ196#001 + + + Instance + + + + + + + + ProductCountryOfOrigin + PARAMETER + + + 0173-1#02-AAO841#001 + + + Instance + + string + DE + + + + + YearOfConstruction + PARAMETER + + + 0173-1#02-AAP906#001 + + + Instance + + string + 2019 + + + + + Marking_CE + PARAMETER + + + https://www.hsu-hh.de/aut/aas/productmarking + + + Instance + + + + + CEQualificationPresent + PARAMETER + + + 0173-1#02-BAF053#008 + + + Instance + + boolean + 1 + + + 0173-1#07-CAA016#001 + + + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + image/png + /aasx/Nameplate/marking_ce.png + + + + false + false + + + + + + Identification + www.company.com/demo/sm/instance/4F44B8B32822E483 + + + https://www.hsu-hh.de/aut/aas/identification + + + Instance + + + + + ManufacturerName + PARAMETER + + + 0173-1#02-AAO677#002 + + + Instance + + string + Siemens AG + + + + + GLNOfManufacturer + PARAMETER + + + 0173-1#02-AAY812#001 + + + Instance + + + 4016001000006 + + + + + SupplierOfTheIdentifier + + + 0173-1#02-AAP796#004 + + + Instance + + + + + + + + MAN_PROD_NUM + + + 0173-1#02-AAO676#003 + + + Instance + + + 7MF0300-1QU01-5BF2-Z B11+C20+D42+E20+Y01+Y17+Y21 + + + + + ManufacturerProductDesignation + PARAMETER + + + 0173-1#02-AAW338#001 + + + Instance + + string + SITRANS P320 for gauge pressure, HART (4 ... 20 mA) + + + + + + + + ManufacturerProductDescription + PARAMETER + + + 0173-1#02-AAU734#001 + + + Instance + + string + Gauge Pressure Transmitter + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + Siemens AG + + + + + GLNOfSupplier + PARAMETER + + + 0173-1#02-AAY813#001 + + + Instance + + + 4016001000006 + + + + + SupplierIdProvider + PARAMETER + + + https://www.hsu-hh.de/aut/aas/supplieridprovider + + + Instance + + + + + + + + SUP_PROD_NUM + PARAMETER + + + 0173-1#02-AAO736#004 + + + Instance + + + 7MF0300-1QU01-5BF2-Z B11+C20+D42+E20+Y01+Y17+Y21 + + + + + SupplierProductDesignation + + + 0173-1#02-AAM551#002 + + + Instance + + string + SITRANS P320 for gauge pressure, HART (4 ... 20 mA) + + + + + SupplierProductDescription + PARAMETER + + + 0173-1#02-AAU730#001 + + + Instance + + string + Gauge Pressure Transmitter + + + + + ManufacturerProductFamily + PARAMETER + + + 0173-1#02-AAU731#001 + + + Instance + + + + + + + + ClassificationSystem + PARAMETER + + + 0173-1#02-AAO715#002 + + + Instance + + string + eclass + + + + + SecondaryKeyTyp + + + https://www.hsu-hh.de/aut/aas/secondarykeytyp + + + Instance + + + + + + + + TypThumbnail + PARAMETER + + + www.company.com/ids/cd/4401_1272_7091_3437 + + + Instance + + image/jpeg + /P_FI01_XX_05457I.jpg + + + + + AssetId + PARAMETER + + + https://www.hsu-hh.de/aut/aas/assetid + + + Instance + + string + http://siemens.com/pimobile?1P=7MF0300-1QU01-5BF2-Z&S=N1L22110101185 + + + + + SerialNumber + PARAMETER + + + 0173-1#02-AAM556#002 + + + Instance + + string + N1L22110101185 + + + + + BatchNumber + PARAMETER + + + 0173-1#02-AAQ196#001 + + + Instance + + + + + + + + SecondaryKeyInstance + PARAMETER + + + https://www.hsu-hh.de/aut/aas/secondarykeyinstance + + + Instance + + + + + + + + DateOfManufacture + PARAMETER + + + 0173-1#02-AAR972#002 + + + Instance + + date + 15.04.2019 + + + + + DeviceRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/devicerevision + + + Instance + + string + + + + + + SoftwareRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/softwarerevision + + + Instance + + + + + + + + HardwareRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/hardwarerevision + + + Instance + + + 12.34.56 + + + + + QrCode + PARAMETER + + + https://www.hsu-hh.de/aut/aas/qrcode + + + Instance + + image/jpeg + /aasx/Identification/qrcode_P320.png + + + + + ContactInfo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/contactinfo + + + Instance + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + Siemens AG + + + + + ContactInfo_Role + PARAMETER + + + https://www.hsu-hh.de/aut/aas/role + + + Instance + + string + Manufacturer + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 76181 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Karlsruhe + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Baden-Württemberg + + + + false + false + + + + + Email + PARAMETER + + + https://www.hsu-hh.de/aut/aas/email + + + Instance + + string + + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://www.siemens.com/processinstrumentation + + + + + PhoneNumber + PARAMETER + + + 0173-1#02-AAO136#002 + + + Instance + + string + + + + + + Fax + PARAMETER + + + https://www.hsu-hh.de/aut/aas/fax + + + Instance + + + + + + + false + false + + + + + CompanyLogo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/companylogo + + + Instance + + image/png + /aasx/Identification/sie-logo-layer-petrol-rgb.jpg + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + http://siemens.com/pimobile?1P=7MF0300-1QU01-5BF2-Z&S=N1L22110101185 + + + + + + Service + www.company.com/demo/sm/instance/1D77CEFC25CEC482 + + + https://www.hsu-hh.de/aut/aas/service + + + Instance + + + + + ContactInfo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/contactinfo + + + Instance + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + Siemens AG + + + + + ContactInfo_Role + PARAMETER + + + https://www.hsu-hh.de/aut/aas/role + + + Instance + + string + Manufacturer + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 76181 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Karlsruhe + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Baden-Württemberg + + + + false + false + + + + + Email + PARAMETER + + + https://www.hsu-hh.de/aut/aas/email + + + Instance + + string + + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://support.industry.siemens.com/ + + + + + PhoneNumber + PARAMETER + + + 0173-1#02-AAO136#002 + + + Instance + + string + + + + + + Fax + PARAMETER + + + https://www.hsu-hh.de/aut/aas/fax + + + Instance + + + + + + + false + false + + + + + + Document + www.company.com/demo/sm/instance/204F677FF7D40E79 + + + https://www.hsu-hh.de/aut/aas/document + + + Instance + + + + + DeclarationCEMarking + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Siemens AG + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Siemens AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 02-04 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Zeugnisse, Zertifikate, Bescheinigungen + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + de + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + EU-Konformitätserklärung + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + EU Declaration of Conformity.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/cert_EU-DoC_SitP320_P420_A5E44320812A_002.pdf + + + + false + false + + + + + Certificat_DIN_EN_ISO_14001_2015 + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + BVS 18 ATEX E049X + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Siemens AG + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Siemens AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 02-04 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Zeugnisse, Zertifikate, Bescheinigungen + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + EN + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + ATEX-EC-Type-Examination-Certificate + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + cert__SIP320_P420_Exi_Exd_de_en_BVS_18_ATEX_E049X.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/cert__SIP320_P420_Exi_Exd_de_en_BVS_18_ATEX_E049X.pdf + + + + false + false + + + + + Betriebsanleitung + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + A5E41285171-AB + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Siemens AG + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Siemens AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-02 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Bedienung + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + de + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Betriebsanleitung + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + date + 01.09.2018 + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + A5E41285171-ABde_P320P420_HART_OI_de-DE.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/A5E41285171-ABde_P320P420_HART_OI_de-DE.pdf + + + + false + false + + + + + OperatingInstruction + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + A5E44852162-AB + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Siemens AG + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Siemens AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-02 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Bedienung + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Operating Instructions + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + date + 01.09.2018 + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + A5E44852162-ABen_P320P420_HART_OI_en-US.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/A5E44852162-ABen_P320P420_HART_OI_en-US.pdf + + + + false + false + + + + + Kompaktbetriebsanleitung + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + A5E38874562-AB + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Siemens AG + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Siemens AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-02 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Bedienung + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + de + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Kompaktbetriebsanleitung + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + date + 01.09.2018 + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + A5E38874562-ABde_P320P420_COI_de-DE.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/A5E38874562-ABde_P320P420_COI_de-DE.pdf + + + + false + false + + + + + CompactOperatingInstructions + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + A5E38874562-AB + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Siemens AG + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Siemens AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-02 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Bedienung + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Compact Operating Instructions + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + date + 01.09.2018 + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + A5E38874562-ABen_P320P420_COI_en-US.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/A5E38874562-ABen_P320P420_COI_en-US.pdf + + + + false + false + + + + + + + + ManufacturerName + 0173-1#02-AAO677#002 + + + + + + + + Herstellername + Manufacturer Name + + Manufacturer Name + + + + + Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist + 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 + + + + + + + ManufacturerProductDesignation + 0173-1#02-AAW338#001 + + + + + + + + Manufacturer product designation + Herstellerproduktbezeichnung + + ManufacturerTypName + + + STRING_TRANSLATABLE + + Kurze Beschreibung des Produktes (Kurztext) + Short description of the product (short text) + + + + + + + PhysicalAddress + https://www.hsu-hh.de/aut/aas/physicaladdress + + + + + + + + PhysicalAddress + Physische Adresse + + PhysicalAddress + + + + + Sammlung für reale physische Adresse + Collection for real physical address + + + + + + + CountryCode + 0173-1#02-AAO730#001 + + + + + + + + + + + + Landeskennung + Country code + + Country code + + + + + Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes + agreed upon symbol for unambiguous identification of a country + + + + + + + Street + 0173-1#02-AAO128#001 + + + + + + + + Strasse + Street + + Street + + + + + Name der Strasse und Hausnummer + Street name and house number + + + + + + + Zip + 0173-1#02-AAO129#002 + + + + + + + + Zip + Postleitzahl + + PostalCode + + + + + ZIP code of address + Postleitzahl der Anschrift + + + + + + + CityTown + 0173-1#02-AAO132#001 + + + + + + + + Ort + City/town + + City/town + + + + + Town or city of the company + Ortsangabe + + + + + + + StateCounty + 0173-1#02-AAO133#002 + + + + + + + + state/county + Bundesland + + StateCounty + + + + + Bundesland + state/county + + + + + + + ManufacturerProductFamily + 0173-1#02-AAU731#001 + + + + + + + + Manufacturer product family + Herstellerproduktfamilie + + TypClass + + + + + 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie + 2nd level of a 3 level manufacturer specific product hierarchy + + + + + + + SerialNumber + 0173-1#02-AAM556#002 + + + + + + + + Serial number + Seriennummer + + InstanceId + + + + + eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist + unique combination of numbers and letters used to identify the device once it has been manufactured + + + + + + + BatchNumber + 0173-1#02-AAQ196#001 + + + + + + + + Batch number + Chargen-Nummer + + ChargeId + + + + + Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge + Number assigned by the manufacturer of a material to identify the manufacturer's batch + + + + + + + ProductCountryOfOrigin + 0173-1#02-AAO841#001 + + + + + + + + Produkt Ursprungsland + Product country of origin + + CountryOfOrigin + + + + + Land in dem das Produkt hergestellt wurde (Hersteller Land) + Country in which the product is manufactured (manufacturer country) + + + + + + + YearOfConstruction + 0173-1#02-AAP906#001 + + + + + + + + Year of construction + Baujahr + + YearOfConstruction + + + + + Jahreszahl als Datumsangabe für die Fertigstellung des Objektes + Year as completion date of object + + + + + + + ProductMarking + https://www.hsu-hh.de/aut/aas/productmarking + + + + + + + + Produktkennzeichnung + Product Marking + + ProductMarking + + + + + Sammlungsdatei für Produktkennzeichnung + Collection file for product marking + + + + + + + CEQualificationPresent + 0173-1#02-BAF053#008 + + + + + + + + CE-Kennzeichnung vorhanden + CE- qualification present + + CEMarkingPresent + + + BOOLEAN + + whether CE- qualification is present + Angabe, ob CE-Kennzeichnung vorhanden ist + + + + + + + File + 0173-1#02-AAD005#008 + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Enthaltene Doku. Datei + Embedded Doc. file + + File + + + + + Verweis/ BLOB auf enthaltene Dokumentations-Datei. + Reference/ BLOB to embedded documentation file. + + + + + + + GLNOfManufacturer + 0173-1#02-AAY812#001 + + + + + + + + GLN of manufacturer + GLN des Herstellers + + GLN of manufacturer + + + + + international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort + internationally unique identification number for the manufacturer of the device or the product and for the physical location + + + + + + + SupplierOfTheIdentifier + 0173-1#02-AAP796#004 + + + + + + + + Supplier of the identifier + Anbieter der Identifikationsnummer für Hersteller + + Supplier of the identifier + + + STRING_TRANSLATABLE + + DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification + DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer + + + + + + + MAN_PROD_NUM + + product article number of manufacturer + + 0173-1#02-AAO676#003 + + + + + + + + product article number of manufacturer + Herstellerartikelnummer + + MAN_PROD_NUM + + + STRING_TRANSLATABLE + + eindeutiger Bestellschlüssel des Herstellers + unique product identifier of the manufacturer + + + + + + + ManufacturerProductDescription + 0173-1#02-AAU734#001 + + + + + + + + Manufacturer product description + Herstellerproduktbeschreibung + + Manufacturer product description + + + + + Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) + Description of the product, it's technical features and implementation if needed (long text) + + + + + + + NameOfSupplier + 0173-1#02-AAO735#003 + + + + + + + + + + + + name of supplier + Lieferantenname + + name of supplier + + + + + Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt + name of supplier which provides the customer with a product or a service + + + + + + + GLNOfSupplier + 0173-1#02-AAY813#001 + + + + + + + + GLN of supplier + GLN des Lieferanten + + GLN of supplier + + + + + international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort + internationally unique identification number for the supplier of the device or the product and for the physical location + + + + + + + SupplierIdProvider + https://www.hsu-hh.de/aut/aas/supplieridprovider + + + + + + + + SupplierIdProvider + Anbieter der Identifikationsnummer + + SupplierIdProvider + + + STRING_TRANSLATABLE + + DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer + DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification + + + + + + + SUP_PROD_NUM + 0173-1#02-AAO736#004 + + + + + + + + product article number of supplier + Lieferantenartikelnummer + + product article number of supplier + + + + + eindeutiger Bestellschlüssel des Lieferanten + unique product order identifier of the supplier + + + + + + + SupplierProductDesignation + 0173-1#02-AAM551#002 + + + + + + + + Supplier product designation + Lieferantenproduktbezeichnung + + SupplierTypName + + + STRING_TRANSLATABLE + + Kurze Beschreibung des Produktes (Kurztext) + Short description of the product (short text) + + + + + + + SupplierProductDescription + 0173-1#02-AAU730#001 + + + + + + + + Supplier product description + Lieferantenproduktbeschreibung + + Supplier product description + + + + + Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) + Description of the product, it's technical features and implementation if needed (long text) + + + + + + + ClassificationSystem + 0173-1#02-AAO715#002 + + + + + + + + classification system + Klassifizierungssystem + + ClassificationSystem + + + + + Klassifizierungssystem + Classification System + + + + + + + SecondaryKeyTyp + https://www.hsu-hh.de/aut/aas/secondarykeytyp + + + + + + + + SecondaryKeyTyp + Typnummer des IT Systems + + SecondaryKeyTyp + + + + + Führende technische ID im IT System des Typs + SecondaryKeyTyp + + + + + + + TypThumbnail + www.company.com/ids/cd/4401_1272_7091_3437 + + + + + + + + TypThumbnail + Vorschaubild + + TypThumbnail + + + + + Darstellung des Produkttyps in kleinem Format + Small picture of the product type + + + + + + + AssetId + https://www.hsu-hh.de/aut/aas/assetid + + + + + + + + AssetId + Asset ID + + AssetId + + + + + Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. + Global unique ID of an asset, which can be read by both human and machine. + + + + + + + SecondaryKeyInstance + https://www.hsu-hh.de/aut/aas/secondarykeyinstance + + + + + + + + SecondaryKeyInstance + Instanznummer des IT Systems + + SecondaryKeyInstance + + + + + Führende technische ID im IT System der Instanz + SecondaryKeyInstance + + + + + + + DateOfManufacture + 0173-1#02-AAR972#002 + + + + + + + + Date of manufacture + Herstellungsdatum + + Date of manufacture + + + DATE + + Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist + Date from which the production and / or development process is completed or from which a service is provided completely + + + + + + + DeviceRevision + https://www.hsu-hh.de/aut/aas/devicerevision + + + + + + + + DeviceRevision + DeviceRevision + + DeviceRevision + + + + + DeviceRevision + DeviceRevision + + + + + + + SoftwareRevision + https://www.hsu-hh.de/aut/aas/softwarerevision + + + + + + + + SoftwareRevision + SoftwareRevision + + SoftwareRevision + + + + + SoftwareRevision + SoftwareRevision + + + + + + + HardwareRevision + https://www.hsu-hh.de/aut/aas/hardwarerevision + + + + + + + + HardwareRevision + HardwareRevision + + HardwareRevision + + + + + HardwareRevision + HardwareRevision + + + + + + + QrCode + https://www.hsu-hh.de/aut/aas/qrcode + + + + + + + + QrCode + QrCode + + QrCode + + + + + In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. + QrCode + + + + + + + OrganisationContactInfo + www.company.com/demo/cd/1DEEF3CC9CF46C80 + + + + + + + + Contact Info + Kontakt Info + + OrganisationContactInfo + + + + + Sammlung für die allgemeinen Kontaktdaten + Collection for general contact data + + + + + + + ContactInfo_Role + https://www.hsu-hh.de/aut/aas/role + + + + + + + + Rolle + Role + + Role + + + + + Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt + Information to specify the role which the organisation of ContactInfo plays + + + + + + + Email + https://www.hsu-hh.de/aut/aas/email + + + + + + + + Emailadresse + Email address + + Email + + + + + Emailadresse + Email address + + + + + + + URL + 0173-1#02-AAO694#001 + + + + + + + + Internetadresse + Internet address + + URL + + + + + stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html + Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html + + + + + + + PhoneNumber + 0173-1#02-AAO136#002 + + + + + + + + Telefonnummer + telephone number + + Phone + + + + + vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist + complete telephone number to be called to reach a business partner + + + + + + + Fax + https://www.hsu-hh.de/aut/aas/fax + + + + + + + + Fax + Fax + + Fax + + + + + Faxnummer + Fax number + + + + + + + 0173-1#02-AAO136#002 + + + + + CompanyLogo + www.company.com/ids/cd/3132_1142_0191_9159 + + + + + + + + Firmenlogo + CompanyLogo + + CompanyLogo + + + + + Firmenlogo + CompanyLogo + + + + + + + DocumentationItem + + 0173-1#02-AAD001#001 + + + + + + + + Dokumentationsgruppe + Documentation item + + DocumentationItem + + + + + Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. + Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. + + + + + + + DocumentType + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + + + + + + Dokumententyp + Document Type + + DocumentType + + + + + Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) + TBD + + + + + + + VDI2770_DomainId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + + + + + + Domain-Nummer + DomainId + + DomainId + + + + + Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. + TBD + + + + + + + VDI2770_IdType + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + + + + + + Nummerntyp + IdType + + IdType + + + + + Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. + TBD + + + + + + + DocumentId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + + + + + + DocumentId + Dokumenten-Nummer + + DocumentId + + + + + Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. + TBD + + + + + + + DocumentDomainId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + + + + + + DocumentDomainId + DocumentDomainId + + DocumentDomainId + + + + + Kennung oder Kennzeichen einer Domäne + TBD + + + + + + + VDI2770_Role + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + + + + + + Rolle + Role + + Role + + + + + Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) + TBD + + + + + + + VDI2770_OrganisationId + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + + + + + + Organisation ID + Organisation ID + + OrganisationId + + + + + eindeutige ID für die Organisation + TBD + + + + + + + VDI2770_OrganisationName + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + + + + + + OrganisationName + OrganisationName + + OrganisationName + + + + + gebräuchliche Bezeichnung für die Organisation + TBD + + + + + + + VDI2770_OrganisationOfficialName + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + + + + + + Offizieller Name der Organisation + Organisation Official Name + + OrganisationOfficialName + + + + + offizieller Name der Organisation + TBD + + + + + + + VDI2770_Description + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + + + + + + Beschreibung + Description + + Description + + + + + Beschreibung für die nächste übergeordnete Collection + TBD + + + + + + + DocumentPartId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + + + + + + Dokumenten-Teilnummer + DocumentPartId + + DocumentPartId + + + + + Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. + TBD + + + + + + + DocumentClassification_ClassId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + + + + Dokumentkategorie + Document category + + DocCategory + + + + + Dokumentkategorie nach VDI 2770:2018/10 + Document category after VDI 2770:2018/10 + + + + + + + VDI2770_ClassName + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + + + + + + Klassenname + Class Name + + ClassName + + + + + Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. + TBD + + + + + + + VDI2770_ClassificationSystem + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + + + + + + Klassifizierungssystem + classification system + + ClassificationSystem + + + + + Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. + TBD + + + + + + + DocumentVersionId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + + + + + + Dokumenten-Versionsnummer + DocumentVersionId + + DocumentVersionId + + + + + Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. + TBD + + + + + + + DocumentVersion_LanguageCode + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + + + + + + Sprachenschlüssel + LanguageCode + + LanguageCode + + + + + Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 + TBD + + + + + + + VDI2770_Title + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + + + + + + Titel + Title + + VDI2770_Title + + + + + sprachabhängiger Titel des Dokuments + TBD + + + + + + + VDI2770_Summary + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + + + + + + Zusammenfassung + Summary + + Summary + + + + + sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts + TBD + + + + + + + VDI2770_Keywords + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + + + + + + Schlagwörter + Keywords + + Keywords + + + + + sprachabhängige, durch Komma getrennte Liste von Schlagwörtern + TBD + + + + + + + VDI2770_StatusValue + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + + + + + + Statuswert + StatusValue + + StatusValue + + + + + Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) + TBD + + + + + + + VDI2770_SetDate + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + + + + + + Erstellungsdatum + Set Date + + SetDate + + + + + Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). + TBD + + + + + + + VDI2770_Purpose + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + + + + + + Zweck + Purpose + + Purpose + + + + + Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. + TBD + + + + + + + VDI2770_BasedOnProcedure + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + + + + + + Prozedur + Procedure + + BasedOnProcedure + + + + + textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt + TBD + + + + + + + VDI2770_Comments + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + + + + + + Kommentar + Comments + + Comments + + + + + textuelle Bemerkungen und Anmerkungen zum Status + TBD + + + + + + + VDI2770_ReferencedObject_Type + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + + + + + + Typ + Type + + Type + + + + + Für Type des Objekts muss immer Product angegeben werden. + TBD + + + + + + + VDI2770_ReferencedObject_RefType + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + + + + + + RefType + RefType + + RefType + + + + + Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) + TBD + + + + + + + VDI2770_ReferencedObject_ObjectId + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + + + + + + ObjectId + ObjectId + + ObjectId + + + + + Angabe der Identifikationsnummer zum Objekt + TBD + + + + + + + VDI2770_FileId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + + + + + + ID der Datei + File ID + + FileId + + + + + eindeutige ID für die Datei + TBD + + + + + + + VDI2770_FileName + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + + + + + + Dateiname + File name + + FileName + + + + + Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. + TBD + + + + + + + VDI2770_FileFormat + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + + + + + + Datei Format + File format + + FileFormat + + + + + Angabe eines Media Typs gemäß der Liste der IANA + TBD + + + + + + + Her + 0173-1#02-AAO055#001 + + + 1 + + + + + + + + + Herstellername + + Her + + + STRING + + ist die Bezeichnung des Produzenten + + + + + + + 0173-1#02-AAO055#001 + + + + + 0173-1#02-AAM552#002 + + + 1 + + + + + + + + + Herstellerartikelbezeichnung + + Her + + + STRING + + vom Hersteller (oder Vertrieb) festgelegter Markenname für ein Produkt, wobei Produkt synonym für Objekt, Gegenstand oder Dienstleistung steht + + + + + + + 0173-1#02-AAM552#002 + + + + + \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/15_Siemens.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/15_Siemens.aasx.xml new file mode 100644 index 000000000..4afa75765 --- /dev/null +++ b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/15_Siemens.aasx.xml @@ -0,0 +1,5044 @@ + + + + + S7_CPU1515 + CONSTANT + www.company.com/demo/aas/1234554842136874684321 + + 1 + 0 + + + + www.siemens.com/ids/asset/MLFB=6ES7515-2FM00-0AB0&SN=C-E9S35353 + + + + + + www.company.com/demo/sm/instance/F9CC779860FC10391 + + + + + www.company.com/demo/sm/instance/4F44B8B32822E483 + + + + + www.company.com/demo/sm/instance/1D77CEFC25CEC482 + + + + + www.company.com/demo/sm/instance/204F677FF7D40E79 + + + + + + + + + S7_1515F_2PN + + + SIMATIC S7-1500F, CPU 1515F-2 PN, Zentralbaugruppe mit Arbeitsspeicher 750 KB für Programm und 3MByte für Daten, 1. Schnittstelle, PROFINET IRT mit 2 Port Switch, 2. Schnittstelle, Ethernet, 30 NS Bit-Performance, SIMATIC Memory Card notwendig + SIMATIC S7-1500F, CPU 1515F-2 PN, Central processing unit with work memory 750 KB for Program and 3 MB for data, 1st interface, PROFINET IRT with 2-port switch, 2nd interface, Ethernet, 30 ns bit performance, SIMATIC Memory Card required + + www.siemens.com/ids/asset/MLFB=6ES7515-2FM00-0AB0&SN=C-E9S35353 + Instance + + + + + Nameplate + www.company.com/demo/sm/instance/F9CC779860FC10391 + + + https://www.hsu-hh.de/aut/aas/nameplate + + + Instance + + + + + ManufacturerName + PARAMETER + + + 0173-1#02-AAO677#002 + + + Instance + + string + Siemens AG + + + + + ManufacturerProductDesignation + PARAMETER + + + 0173-1#02-AAW338#001 + + + Instance + + string + CPU 1515F-2 PN + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 90475 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Nuremberg + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Bayern + + + + false + false + + + + + ManufacturerProductFamily + PARAMETER + + + 0173-1#02-AAU731#001 + + + Instance + + + Programmable logic control (SPS) + + + + + SerialNumber + PARAMETER + + + 0173-1#02-AAM556#002 + + + Instance + + string + C-E9S35353 + + + + + BatchNumber + PARAMETER + + + 0173-1#02-AAQ196#001 + + + Instance + + + + + + + + ProductCountryOfOrigin + PARAMETER + + + 0173-1#02-AAO841#001 + + + Instance + + string + DE + + + + + YearOfConstruction + PARAMETER + + + 0173-1#02-AAP906#001 + + + Instance + + string + 2014 + + + + + Marking_CE + PARAMETER + + + https://www.hsu-hh.de/aut/aas/productmarking + + + Instance + + + + + CEQualificationPresent + PARAMETER + + + 0173-1#02-BAF053#008 + + + Instance + + boolean + 1 + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + image/png + /aasx/Nameplate/marking_ce.png + + + + false + false + + + + + Marking_UL + PARAMETER + + + + https://www.hsu-hh.de/aut/aas/productmarking + + + Instance + + + + + ULMarkingPresent + PARAMETER + + + 0173-1#02-AAW723#001 + + + Instance + + boolean + 1 + + + + + + + + File + PARAMETER + + + + + Instance + + + /aasx/Nameplate/marking_UL.jpg + + + + false + false + + + + + + Identification + www.company.com/demo/sm/instance/4F44B8B32822E483 + + + https://www.hsu-hh.de/aut/aas/identification + + + Instance + + + + + ManufacturerName + PARAMETER + + + 0173-1#02-AAO677#002 + + + Instance + + string + Siemens AG + + + + + GLNOfManufacturer + PARAMETER + + + 0173-1#02-AAY812#001 + + + Instance + + string + 4047623000006 + + + + + SupplierOfTheIdentifier + + + 0173-1#02-AAP796#004 + + + Instance + + string + GS1 + + + + + MAN_PROD_NUM + + + 0173-1#02-AAO676#003 + + + Instance + + string + 6ES7515-2FM00-0AB0 + + + + + ManufacturerProductDesignation + PARAMETER + + + 0173-1#02-AAW338#001 + + + Instance + + string + CPU 1515F-2 PN, 750KB Prog., 3MB Daten + + + + + ManufacturerProductDescription + PARAMETER + + + 0173-1#02-AAU734#001 + + + Instance + + string + SIMATIC S7-1500F, CPU 1515F-2 PN, Central processing unit with work memory 750 KB for Program and 3 MB for data, 1st interface, PROFINET IRT with 2-port switch, 2nd interface, Ethernet, 30 ns bit performance, + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + Siemens AG + + + + + GLNOfSupplier + PARAMETER + + + 0173-1#02-AAY813#001 + + + Instance + + string + 4047623000006 + + + + + SupplierIdProvider + PARAMETER + + + https://www.hsu-hh.de/aut/aas/supplieridprovider + + + Instance + + string + GS1 + + + + + SUP_PROD_NUM + PARAMETER + + + 0173-1#02-AAO736#004 + + + Instance + + string + 6ES7515-2FM00-0AB0 + + + + + SupplierProductDesignation + + + 0173-1#02-AAM551#002 + + + Instance + + string + CPU 1515F-2 PN, 750KB Prog., 3MB Daten + + + + + SupplierProductDescription + PARAMETER + + + 0173-1#02-AAU730#001 + + + Instance + + string + SIMATIC S7-1500F, CPU 1515F-2 PN, Central processing unit with work memory 750 KB for Program and 3 MB for data, 1st interface, PROFINET IRT with 2-port switch, 2nd interface, Ethernet, 30 ns bit performance, + + + + + ManufacturerProductFamily + PARAMETER + + + 0173-1#02-AAU731#001 + + + Instance + + string + Programmable logic control (SPS) + + + + + ClassificationSystem + PARAMETER + + + 0173-1#02-AAO715#002 + + + Instance + + string + eclass + + + + + SecondaryKeyTyp + + + https://www.hsu-hh.de/aut/aas/secondarykeytyp + + + Instance + + + + + + + + TypThumbnail + PARAMETER + + + www.company.com/ids/cd/4401_1272_7091_3437 + + + Instance + + image/jpeg + /P_ST70_XX_06800J.jpg + + + + + AssetId + PARAMETER + + + https://www.hsu-hh.de/aut/aas/assetid + + + Instance + + string + www.siemens.com/ids/asset/MLFB=6ES7515-2FM00-0AB0&SN=C-E9S35353 + + + + + SerialNumber + PARAMETER + + + 0173-1#02-AAM556#002 + + + Instance + + string + C-E9S35353 + + + + + BatchNumber + PARAMETER + + + 0173-1#02-AAQ196#001 + + + Instance + + + + + + + + SecondaryKeyInstance + PARAMETER + + + https://www.hsu-hh.de/aut/aas/secondarykeyinstance + + + Instance + + + + + + + + DateOfManufacture + PARAMETER + + + 0173-1#02-AAR972#002 + + + Instance + + date + 2014 + + + + + DeviceRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/devicerevision + + + Instance + + string + 01 + + + + + SoftwareRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/softwarerevision + + + Instance + + string + V1.8.5 + + + + + HardwareRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/hardwarerevision + + + Instance + + string + 01 + + + + + QrCode + PARAMETER + + + https://www.hsu-hh.de/aut/aas/qrcode + + + Instance + + image/jpeg + /aasx/Identification/dmc.gif + + + + + ContactInfo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/contactinfo + + + Instance + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + Siemens AG + + + + + ContactInfo_Role + PARAMETER + + + https://www.hsu-hh.de/aut/aas/role + + + Instance + + string + Manufacturer + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Gleiwitzer Str. 555 + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 90475 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Nuremberg + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Bavaria + + + + false + false + + + + + Email + PARAMETER + + + https://www.hsu-hh.de/aut/aas/email + + + Instance + + string + markus.kempf@siemens.com + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://www.siemens.com/automation + + + + + PhoneNumber + PARAMETER + + + 0173-1#02-AAO136#002 + + + Instance + + string + + + + + + Fax + PARAMETER + + + https://www.hsu-hh.de/aut/aas/fax + + + Instance + + + + + + + false + false + + + + + CompanyLogo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/companylogo + + + Instance + + image/png + /aasx/Identification/sie-logo-layer-petrol-rgb.jpg + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://support.industry.siemens.com/cs/pd/86475?pdti=pi&dl=en&lc=en-WW + + + + + + Service + www.company.com/demo/sm/instance/1D77CEFC25CEC482 + + + https://www.hsu-hh.de/aut/aas/service + + + Instance + + + + + ContactInfo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/contactinfo + + + Instance + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + Siemens AG + + + + + ContactInfo_Role + PARAMETER + + + https://www.hsu-hh.de/aut/aas/role + + + Instance + + string + Manufacturer + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Gleiwitzer Str. 555 + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 90475 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Nuremburg + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + bavaria + + + + false + false + + + + + Email + PARAMETER + + + https://www.hsu-hh.de/aut/aas/email + + + Instance + + string + + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://support.industry.siemens.com/ + + + + + PhoneNumber + PARAMETER + + + 0173-1#02-AAO136#002 + + + Instance + + string + + + + + + Fax + PARAMETER + + + https://www.hsu-hh.de/aut/aas/fax + + + Instance + + + + + + + false + false + + + + + + Document + www.company.com/demo/sm/instance/204F677FF7D40E79 + + + https://www.hsu-hh.de/aut/aas/document + + + Instance + + + + + DeclarationCEMarking + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Manufacturer + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Siemens AG + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Siemens AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 02-04 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Zeugnisse, Zertifikate, Bescheinigungen + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + de + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + EU-Konformitätserklärung + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + 106_CE_S7_1500_general_A3_10_2019_d_e.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/106_CE_S7_1500_general_A3_10_2019_d_e.pdf + + + + false + false + + + + + DeclarationULMarking + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Manufacturer + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Siemens AG + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Siemens AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 02-04 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Zeugnisse, Zertifikate, Bescheinigungen + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Certificate of compliance + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + S7-1500_Vol.9_Sec.1_E222109.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/S7-1500_Vol.9_Sec.1_E222109.pdf + + + + false + false + + + + + Produktinformation + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + A5E35635424-AG + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + string + Handbuch + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Manufacturer + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Siemens AG + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Siemens AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-03 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Allgemeine Sicherheit + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + DE, EN, FR, SP, IT, CH + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + SIMATIC S7-1200/S7-1500 F-CPUs Produktinformation + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + string + 11/18 + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + s71200_1500_f_cpus_product_information_x_de-DE.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/s71200_1500_f_cpus_product_information_x_de-DE.pdf + + + + false + false + + + + + Programming and Operating Manual + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + string + A5E02714440-AH + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Manufacturer + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Siemens AG + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Siemens AG + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-02 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Bedienung + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + SIMATIC Industrial Software SIMATIC Safety - Configuring and Programming + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + date + 09.26.2018 + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + ProgFAILenUS_en-US.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/ProgFAILenUS_en-US.pdf + + + + false + false + + + + + + + + ManufacturerName + 0173-1#02-AAO677#002 + + + + + + + + Herstellername + Manufacturer Name + + Manufacturer Name + + + + + Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist + 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 + + + + + + + ManufacturerProductDesignation + 0173-1#02-AAW338#001 + + + + + + + + Manufacturer product designation + Herstellerproduktbezeichnung + + ManufacturerTypName + + + STRING_TRANSLATABLE + + SIMATIC S7-1500F, CPU 1515F-2 PN, Zentralbaugruppe mit Arbeitsspeicher 750 KB für Programm und 3MByte für Daten, 1. Schnittstelle, PROFINET IRT mit 2 Port Switch, 2. Schnittstelle, Ethernet, 30 NS Bit-Performance + SIMATIC S7-1500F, CPU 1515F-2 PN, Central processing unit with work memory 750 KB for Program and 3 MB for data, 1st interface, PROFINET IRT with 2-port switch, 2nd interface, Ethernet, 30 ns bit performance + + + + + + + PhysicalAddress + https://www.hsu-hh.de/aut/aas/physicaladdress + + + + + + + + PhysicalAddress + Physische Adresse + + PhysicalAddress + + + + + Sammlung für reale physische Adresse + Collection for real physical address + + + + + + + CountryCode + 0173-1#02-AAO730#001 + + + + + + + + + + + + Landeskennung + Country code + + Country code + + + + + Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes + agreed upon symbol for unambiguous identification of a country + + + + + + + Zip + 0173-1#02-AAO129#002 + + + + + + + + Zip + Postleitzahl der Anschrift + + PostalCode + + + + + ZIP code of address + Postleitzahl der Anschrift + + + + + + + CityTown + 0173-1#02-AAO132#001 + + + + + + + + Ort + City/town + + City/town + + + + + Town or city of the company + Ortsangabe + + + + + + + StateCounty + 0173-1#02-AAO133#002 + + + + + + + + state/county + Bundesland + + StateCounty + + + + + Bundesland + state/county + + + + + + + ManufacturerProductFamily + 0173-1#02-AAU731#001 + + + + + + + + Manufacturer product family + Herstellerproduktfamilie + + TypClass + + + + + 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie + 2nd level of a 3 level manufacturer specific product hierarchy + + + + + + + SerialNumber + 0173-1#02-AAM556#002 + + + + + + + + Serial number + Seriennummer + + InstanceId + + + + + eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist + unique combination of numbers and letters used to identify the device once it has been manufactured + + + + + + + BatchNumber + 0173-1#02-AAQ196#001 + + + + + + + + Batch number + Chargen-Nummer + + ChargeId + + + + + Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge + Number assigned by the manufacturer of a material to identify the manufacturer's batch + + + + + + + ProductCountryOfOrigin + 0173-1#02-AAO841#001 + + + + + + + + Produkt Ursprungsland + Product country of origin + + CountryOfOrigin + + + + + Land in dem das Produkt hergestellt wurde (Hersteller Land) + Country in which the product is manufactured (manufacturer country) + + + + + + + YearOfConstruction + 0173-1#02-AAP906#001 + + + + + + + + Year of construction + Baujahr + + YearOfConstruction + + + + + Jahreszahl als Datumsangabe für die Fertigstellung des Objektes + Year as completion date of object + + + + + + + ProductMarking + PARAMETER + https://www.hsu-hh.de/aut/aas/productmarking + + + + + + + + Produktkennzeichnung + Product Marking + + ProductMarking + + + + + Sammlungsdatei für Produktkennzeichnung + Collection file for product marking + + + + + + + CEQualificationPresent + 0173-1#02-BAF053#008 + + + + + + + + CE-Kennzeichnung vorhanden + CE- qualification present + + CEMarkingPresent + + + BOOLEAN + + whether CE- qualification is present + Angabe, ob CE-Kennzeichnung vorhanden ist + + + + + + + File + 0173-1#02-AAD005#008 + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Enthaltene Doku. Datei + Embedded Doc. file + + File + + + + + Verweis/ BLOB auf enthaltene Dokumentations-Datei. + Reference/ BLOB to embedded documentation file. + + + + + + + GLNOfManufacturer + 0173-1#02-AAY812#001 + + + + + + + + GLN of manufacturer + GLN des Herstellers + + GLN of manufacturer + + + + + international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort + internationally unique identification number for the manufacturer of the device or the product and for the physical location + + + + + + + SupplierOfTheIdentifier + 0173-1#02-AAP796#004 + + + + + + + + Supplier of the identifier + Anbieter der Identifikationsnummer für Hersteller + + Supplier of the identifier + + + STRING_TRANSLATABLE + + DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification + DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer + + + + + + + MAN_PROD_NUM + + product article number of manufacturer + + 0173-1#02-AAO676#003 + + + + + + + + product article number of manufacturer + Herstellerartikelnummer + + MAN_PROD_NUM + + + STRING_TRANSLATABLE + + eindeutiger Bestellschlüssel des Herstellers + unique product identifier of the manufacturer + + + + + + + ManufacturerProductDescription + 0173-1#02-AAU734#001 + + + + + + + + Manufacturer product description + Herstellerproduktbeschreibung + + Manufacturer product description + + + + + Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) + Description of the product, it's technical features and implementation if needed (long text) + + + + + + + NameOfSupplier + 0173-1#02-AAO735#003 + + + + + + + + + + + + name of supplier + Lieferantenname + + name of supplier + + + + + Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt + name of supplier which provides the customer with a product or a service + + + + + + + GLNOfSupplier + 0173-1#02-AAY813#001 + + + + + + + + GLN of supplier + GLN des Lieferanten + + GLN of supplier + + + + + international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort + internationally unique identification number for the supplier of the device or the product and for the physical location + + + + + + + SupplierIdProvider + https://www.hsu-hh.de/aut/aas/supplieridprovider + + + + + + + + SupplierIdProvider + Anbieter der Identifikationsnummer + + SupplierIdProvider + + + STRING_TRANSLATABLE + + DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer + DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification + + + + + + + SUP_PROD_NUM + 0173-1#02-AAO736#004 + + + + + + + + product article number of supplier + Lieferantenartikelnummer + + product article number of supplier + + + + + eindeutiger Bestellschlüssel des Lieferanten + unique product order identifier of the supplier + + + + + + + SupplierProductDesignation + 0173-1#02-AAM551#002 + + + + + + + + Supplier product designation + Lieferantenproduktbezeichnung + + SupplierTypName + + + STRING_TRANSLATABLE + + Kurze Beschreibung des Produktes (Kurztext) + Short description of the product (short text) + + + + + + + SupplierProductDescription + 0173-1#02-AAU730#001 + + + + + + + + Supplier product description + Lieferantenproduktbeschreibung + + Supplier product description + + + + + Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) + Description of the product, it's technical features and implementation if needed (long text) + + + + + + + ClassificationSystem + 0173-1#02-AAO715#002 + + + + + + + + classification system + Klassifizierungssystem + + ClassificationSystem + + + + + Klassifizierungssystem + Classification System + + + + + + + SecondaryKeyTyp + https://www.hsu-hh.de/aut/aas/secondarykeytyp + + + + + + + + SecondaryKeyTyp + Typnummer des IT Systems + + SecondaryKeyTyp + + + + + Führende technische ID im IT System des Typs + SecondaryKeyTyp + + + + + + + TypThumbnail + www.company.com/ids/cd/4401_1272_7091_3437 + + + + + + + + TypThumbnail + Vorschaubild + + TypThumbnail + + + + + Darstellung des Produkttyps in kleinem Format + Small picture of the product type + + + + + + + AssetId + https://www.hsu-hh.de/aut/aas/assetid + + + + + + + + AssetId + Asset ID + + AssetId + + + + + Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. + Global unique ID of an asset, which can be read by both human and machine. + + + + + + + SecondaryKeyInstance + https://www.hsu-hh.de/aut/aas/secondarykeyinstance + + + + + + + + SecondaryKeyInstance + Instanznummer des IT Systems + + SecondaryKeyInstance + + + + + Führende technische ID im IT System der Instanz + SecondaryKeyInstance + + + + + + + DateOfManufacture + 0173-1#02-AAR972#002 + + + + + + + + Date of manufacture + Herstellungsdatum + + Date of manufacture + + + DATE + + Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist + Date from which the production and / or development process is completed or from which a service is provided completely + + + + + + + DeviceRevision + https://www.hsu-hh.de/aut/aas/devicerevision + + + + + + + + DeviceRevision + DeviceRevision + + DeviceRevision + + + + + DeviceRevision + DeviceRevision + + + + + + + SoftwareRevision + https://www.hsu-hh.de/aut/aas/softwarerevision + + + + + + + + SoftwareRevision + SoftwareRevision + + SoftwareRevision + + + + + SoftwareRevision + SoftwareRevision + + + + + + + HardwareRevision + https://www.hsu-hh.de/aut/aas/hardwarerevision + + + + + + + + HardwareRevision + HardwareRevision + + HardwareRevision + + + + + HardwareRevision + HardwareRevision + + + + + + + QrCode + https://www.hsu-hh.de/aut/aas/qrcode + + + + + + + + QrCode + QrCode + + QrCode + + + + + In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. + QrCode + + + + + + + URL + 0173-1#02-AAO694#001 + + + + + + + + Internetadresse + Internet address + + URL + + + + + stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html + Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html + + + + + + + DocumentationItem + + 0173-1#02-AAD001#001 + + + + + + + + Dokumentationsgruppe + Documentation item + + DocumentationItem + + + + + Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. + Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. + + + + + + + DocumentType + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + + + + + + Dokumententyp + Document Type + + DocumentType + + + + + Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) + TBD + + + + + + + VDI2770_DomainId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + + + + + + Domain-Nummer + DomainId + + DomainId + + + + + Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. + TBD + + + + + + + VDI2770_IdType + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + + + + + + Nummerntyp + IdType + + IdType + + + + + Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. + TBD + + + + + + + DocumentId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + + + + + + DocumentId + Dokumenten-Nummer + + DocumentId + + + + + Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. + TBD + + + + + + + DocumentDomainId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + + + + + + DocumentDomainId + DocumentDomainId + + DocumentDomainId + + + + + Kennung oder Kennzeichen einer Domäne + TBD + + + + + + + VDI2770_Role + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + + + + + + Rolle + Role + + Role + + + + + Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) + TBD + + + + + + + VDI2770_OrganisationId + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + + + + + + Organisation ID + Organisation ID + + OrganisationId + + + + + eindeutige ID für die Organisation + TBD + + + + + + + VDI2770_OrganisationName + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + + + + + + OrganisationName + OrganisationName + + OrganisationName + + + + + gebräuchliche Bezeichnung für die Organisation + TBD + + + + + + + VDI2770_OrganisationOfficialName + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + + + + + + Offizieller Name der Organisation + Organisation Official Name + + OrganisationOfficialName + + + + + offizieller Name der Organisation + TBD + + + + + + + VDI2770_Description + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + + + + + + Beschreibung + Description + + Description + + + + + Beschreibung für die nächste übergeordnete Collection + TBD + + + + + + + DocumentPartId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + + + + + + Dokumenten-Teilnummer + DocumentPartId + + DocumentPartId + + + + + Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. + TBD + + + + + + + DocumentClassification_ClassId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + + + + Dokumentkategorie + Document category + + DocCategory + + + + + Dokumentkategorie nach VDI 2770:2018/10 + Document category after VDI 2770:2018/10 + + + + + + + VDI2770_ClassName + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + + + + + + Klassenname + Class Name + + ClassName + + + + + Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. + TBD + + + + + + + VDI2770_ClassificationSystem + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + + + + + + Klassifizierungssystem + classification system + + ClassificationSystem + + + + + Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. + TBD + + + + + + + DocumentVersionId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + + + + + + Dokumenten-Versionsnummer + DocumentVersionId + + DocumentVersionId + + + + + Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. + TBD + + + + + + + DocumentVersion_LanguageCode + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + + + + + + Sprachenschlüssel + LanguageCode + + LanguageCode + + + + + Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 + TBD + + + + + + + VDI2770_Title + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + + + + + + Titel + Title + + VDI2770_Title + + + + + sprachabhängiger Titel des Dokuments + TBD + + + + + + + VDI2770_Summary + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + + + + + + Zusammenfassung + Summary + + Summary + + + + + sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts + TBD + + + + + + + VDI2770_Keywords + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + + + + + + Schlagwörter + Keywords + + Keywords + + + + + sprachabhängige, durch Komma getrennte Liste von Schlagwörtern + TBD + + + + + + + VDI2770_StatusValue + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + + + + + + Statuswert + StatusValue + + StatusValue + + + + + Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) + TBD + + + + + + + VDI2770_SetDate + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + + + + + + Erstellungsdatum + Set Date + + SetDate + + + + + Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). + TBD + + + + + + + VDI2770_Purpose + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + + + + + + Zweck + Purpose + + Purpose + + + + + Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. + TBD + + + + + + + VDI2770_BasedOnProcedure + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + + + + + + Prozedur + Procedure + + BasedOnProcedure + + + + + textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt + TBD + + + + + + + VDI2770_Comments + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + + + + + + Kommentar + Comments + + Comments + + + + + textuelle Bemerkungen und Anmerkungen zum Status + TBD + + + + + + + VDI2770_ReferencedObject_Type + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + + + + + + Typ + Type + + Type + + + + + Für Type des Objekts muss immer Product angegeben werden. + TBD + + + + + + + VDI2770_ReferencedObject_RefType + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + + + + + + RefType + RefType + + RefType + + + + + Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) + TBD + + + + + + + VDI2770_ReferencedObject_ObjectId + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + + + + + + ObjectId + ObjectId + + ObjectId + + + + + Angabe der Identifikationsnummer zum Objekt + TBD + + + + + + + VDI2770_FileId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + + + + + + ID der Datei + File ID + + FileId + + + + + eindeutige ID für die Datei + TBD + + + + + + + VDI2770_FileName + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + + + + + + Dateiname + File name + + FileName + + + + + Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. + Filename + + + + + + + VDI2770_FileFormat + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + + + + + + Datei Format + File format + + FileFormat + + + + + Angabe eines Media Typs gemäß der Liste der IANA + TBD + + + + + + + ULMarkingPresent + 0173-1#02-AAW723#001 + + + 1 + + + + + + + + + UL-Listing vorhanden + UL listing present + + UlLisPre + + + BOOLEAN + + Indiz und Bestätigung für das Vorhandensein von erforderlichen, zweckentsprechenden Eigenschaften (z. B. in Form einer Plakette, einer (Konformitäts-)Bescheinigung, eines Zertifikats, eines Prüfprotokolls für Bauartprüfung, etc.) / Zulassung und Zertifizierung durch Underwriter's Laboratories (alphabetische Kennzeichnung von Herstellern und Lieferanten innerhalb bestimmter Produktgruppen), dass Produkte spezifischen UL-Vorschriften (UL-Style für Material und Produkteigenschaften, NEC-Type für Flammtest und Einsatzbereich) entsprechen + Indication and acknowledgment of the existence of necessary, appropriate characteristics (eg in the form of a plaque, a (conformity) certificate, a certificate, a test report for type examination, etc.) / Approval and certification by Underwriter's Laboratories (alphabetical identification of Manufacturers and suppliers within certain product groups) that products conform to specific UL regulations (UL style for material and product characteristics, NEC type for flame test and application) + + + + + + + 0173-1#02-AAW723#001 + + + + + Email + https://www.hsu-hh.de/aut/aas/email + + + + + + + + Emailadresse + Email address + + Email + + + + + Emailadresse + Email address + + + + + + + PhoneNumber + 0173-1#02-AAO136#002 + + + + + + + + Telefonnummer + telephone number + + Phone + + + + + vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist + complete telephone number to be called to reach a business partner + + + + + + + Fax + https://www.hsu-hh.de/aut/aas/fax + + + + + + + + Fax + Fax + + Fax + + + + + Faxnummer + Fax number + + + + + + + 0173-1#02-AAO136#002 + + + + + ContactInfo_Role + https://www.hsu-hh.de/aut/aas/role + + + + + + + + Rolle + Role + + Role + + + + + Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt + Information to specify the role which the organisation of ContactInfo plays + + + + + + + Street + 0173-1#02-AAO128#001 + + + + + + + + Strasse + Street + + Street + + + + + Name der Strasse und Hausnummer + Street name and house number + + + + + + + OrganisationContactInfo + https://www.hsu-hh.de/aut/aas/contactinfo + + + + + + + + Contact Info + Kontakt Info + + OrganisationContactInfo + + + + + Sammlung für die allgemeinen Kontaktdaten + Collection for general contact data + + + + + + + CompanyLogo + https://www.hsu-hh.de/aut/aas/companylogo + + + + + + + + Firmenlogo + CompanyLogo + + CompanyLogo + + + + + Firmenlogo + CompanyLogo + + + + + + + \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/16_Lenze.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/16_Lenze.aasx.xml new file mode 100644 index 000000000..1b7e52fd8 --- /dev/null +++ b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/16_Lenze.aasx.xml @@ -0,0 +1,4017 @@ + + + + + Lenze_i950 + http://digital.lenze.com/aas/1/1/1616441908732837000002 + + + http://digital.lenze.com/asset/YVSBRHHZADF + + + + + + www.company.com/ids/sm/4343_5072_7091_3242 + + + + + www.company.com/ids/sm/2543_5072_7091_2660 + + + + + www.company.com/ids/sm/6053_5072_7091_5102 + + + + + www.company.com/ids/sm/6563_5072_7091_4267 + + + + + + + + + i950 + http://digital.lenze.com/asset/YVSBRHHZADF + Instance + + + + + Nameplate + www.company.com/ids/sm/4343_5072_7091_3242 + + + https://www.hsu-hh.de/aut/aas/nameplate + + + Instance + + + + + ManufacturerName + PARAMETER + + + 0173-1#02-AAO677#002 + + + Instance + + string + Lenze Automation GmbH + + + + + ManufacturerProductDesignation + PARAMETER + + + 0173-1#02-AAW338#001 + + + Instance + + string + i950 Inverter + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Hans-Lenze-Strasse 1 + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 31855 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Aerzen + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Niedersachsen + + + + false + false + + + + + ManufacturerProductFamily + PARAMETER + + + 0173-1#02-AAU731#001 + + + Instance + + + + + + + + SerialNumber + PARAMETER + + + 0173-1#02-AAM556#002 + + + Instance + + string + 1616441908732837000002 + + + + + BatchNumber + PARAMETER + + + 0173-1#02-AAQ196#001 + + + Instance + + + + + + + + ProductCountryOfOrigin + PARAMETER + + + 0173-1#02-AAO841#001 + + + Instance + + string + DE + + + + + YearOfConstruction + PARAMETER + + + 0173-1#02-AAP906#001 + + + Instance + + string + 2019 + + + + + Marking_CE + PARAMETER + + + https://www.hsu-hh.de/aut/aas/productmarking + + + Instance + + + + + CEQualificationPresent + PARAMETER + + + 0173-1#02-BAF053#008 + + + Instance + + boolean + 1 + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + image/png + /aasx/Nameplate/marking_ce.png + + + + false + false + + + + + Marking_UL + PARAMETER + + + https://www.hsu-hh.de/aut/aas/productmarking + + + Instance + + + + + CEQualificationPresent + + + 0173-1#02-BAF053#008 + + + Instance + + boolean + 1 + + + + + File + + + 0173-1#02-AAD005#008 + + + Instance + + image/png + /aasx/Nameplate/UL_Mark.png + + + + false + false + + + + + + Document + www.company.com/ids/sm/2543_5072_7091_2660 + + + https://www.hsu-hh.de/aut/aas/document + + + Instance + + + + + DeclarationCEMarking + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Lenze + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Lenze Automation GmbH + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 02-04 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Zeugnisse, Zertifikate, Bescheinigungen + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + de + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + EU-Konformitätserklärung + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + EU_Declaration_of_Conformity.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/EU_Declaration_of_Conformity.pdf + + + + false + false + + + + + DeclarationULMarking + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Lenze + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Lenze Automation GmbH + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 02-04 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Zeugnisse, Zertifikate, Bescheinigungen + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + de + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + UL-Approbation + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + UL-Approbation_Servoumrichter_i950_xx.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/UL-Approbation_Servoumrichter_i950_xx.pdf + + + + false + false + + + + + + Service + www.company.com/ids/sm/6053_5072_7091_5102 + + + https://www.hsu-hh.de/aut/aas/service + + + Instance + + + + + ContactInfo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/contactinfo + + + Instance + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + Lenze Service GmbH + + + + + ContactInfo_Role + PARAMETER + + + https://www.hsu-hh.de/aut/aas/role + + + Instance + + string + Manufacturer + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Breslauer Strasse 3 + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 32699 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Extertal + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + NRW + + + + false + false + + + + + Email + PARAMETER + + + https://www.hsu-hh.de/aut/aas/email + + + Instance + + string + service.de@lenze.com + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://www.lenze.com/de-de/service/ + + + + + PhoneNumber + PARAMETER + + + 0173-1#02-AAO136#002 + + + Instance + + string + +49 515482-3000 + + + + + Fax + PARAMETER + + + https://www.hsu-hh.de/aut/aas/fax + + + Instance + + + + + + + false + false + + + + + + Identification + www.company.com/ids/sm/6563_5072_7091_4267 + + + https://www.hsu-hh.de/aut/aas/identification + + + Instance + + + + + ManufacturerName + PARAMETER + + + 0173-1#02-AAO677#002 + + + Instance + + string + Lenze Automation GmbH + + + + + GLNOfManufacturer + PARAMETER + + + 0173-1#02-AAY812#001 + + + Instance + + + + + + + + SupplierOfTheIdentifier + + + 0173-1#02-AAP796#004 + + + Instance + + + + + + + + MAN_PROD_NUM + + + 0173-1#02-AAO676#003 + + + Instance + + + + + + + + ManufacturerProductDesignation + PARAMETER + + + 0173-1#02-AAW338#001 + + + Instance + + string + Servoumrichter i950 + + + + + ManufacturerProductDescription + PARAMETER + + + 0173-1#02-AAU734#001 + + + Instance + + string + Servoumrichter + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + + + + + + GLNOfSupplier + PARAMETER + + + 0173-1#02-AAY813#001 + + + Instance + + + + + + + + SupplierIdProvider + PARAMETER + + + https://www.hsu-hh.de/aut/aas/supplieridprovider + + + Instance + + + + + + + + SUP_PROD_NUM + PARAMETER + + + 0173-1#02-AAO736#004 + + + Instance + + + + + + + + SupplierProductDesignation + + + 0173-1#02-AAM551#002 + + + Instance + + string + + + + + + SupplierProductDescription + PARAMETER + + + 0173-1#02-AAU730#001 + + + Instance + + string + + + + + + ManufacturerProductFamily + PARAMETER + + + 0173-1#02-AAU731#001 + + + Instance + + + + + + + + ClassificationSystem + PARAMETER + + + 0173-1#02-AAO715#002 + + + Instance + + string + eclass + + + + + SecondaryKeyTyp + + + https://www.hsu-hh.de/aut/aas/secondarykeytyp + + + Instance + + + + + + + + TypThumbnail + PARAMETER + + + www.company.com/ids/cd/4401_1272_7091_3437 + + + Instance + + image/jpeg + /aasx/Identification/thumbnail.jpeg + + + + + AssetId + PARAMETER + + + https://www.hsu-hh.de/aut/aas/assetid + + + Instance + + string + http://digital.lenze.com/asset/YVSBRHHZADF + + + + + SerialNumber + PARAMETER + + + 0173-1#02-AAM556#002 + + + Instance + + string + 1616441908732837000002 + + + + + BatchNumber + PARAMETER + + + 0173-1#02-AAQ196#001 + + + Instance + + + + + + + + SecondaryKeyInstance + PARAMETER + + + https://www.hsu-hh.de/aut/aas/secondarykeyinstance + + + Instance + + + + + + + + DateOfManufacture + PARAMETER + + + 0173-1#02-AAR972#002 + + + Instance + + + + + + + + DeviceRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/devicerevision + + + Instance + + + + + + + + SoftwareRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/softwarerevision + + + Instance + + + + + + + + HardwareRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/hardwarerevision + + + Instance + + + + + + + + ContactInfo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/contactinfo + + + Instance + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + Lenze Automation GmbH + + + + + ContactInfo_Role + PARAMETER + + + https://www.hsu-hh.de/aut/aas/role + + + Instance + + string + Manufacturer + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Hans-Lenze-Strasse 1 + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 31855 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Aerzen + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Niedersachsen + + + + false + false + + + + + Email + PARAMETER + + + https://www.hsu-hh.de/aut/aas/email + + + Instance + + string + service.de@lenze.com + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://www.lenze.com + + + + + PhoneNumber + PARAMETER + + + 0173-1#02-AAO136#002 + + + Instance + + string + +49 515482-3000 + + + + + Fax + PARAMETER + + + https://www.hsu-hh.de/aut/aas/fax + + + Instance + + + + + + + false + false + + + + + CompanyLogo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/companylogo + + + Instance + + image/png + /aasx/Identification/logo.png + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://www.lenze.com/de-de/produkte/umrichter/schaltschrankeinbau/servoumrichter-i950/ + + + + + + + + ManufacturerName + 0173-1#02-AAO677#002 + + + + + + + + Herstellername + Manufacturer Name + + Manufacturer Name + + + + + Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist + 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 + + + + + + + ManufacturerProductDesignation + 0173-1#02-AAW338#001 + + + + + + + + Manufacturer product designation + Herstellerproduktbezeichnung + + ManufacturerTypName + + + STRING_TRANSLATABLE + + Kurze Beschreibung des Produktes (Kurztext) + Short description of the product (short text) + + + + + + + PhysicalAddress + https://www.hsu-hh.de/aut/aas/physicaladdress + + + + + + + + PhysicalAddress + Physische Adresse + + PhysicalAddress + + + + + Sammlung für reale physische Adresse + Collection for real physical address + + + + + + + CountryCode + 0173-1#02-AAO730#001 + + + + + + + + + + + + Landeskennung + Country code + + Country code + + + + + Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes + agreed upon symbol for unambiguous identification of a country + + + + + + + Street + 0173-1#02-AAO128#001 + + + + + + + + Strasse + Street + + Street + + + + + Name der Strasse und Hausnummer + Street name and house number + + + + + + + Zip + 0173-1#02-AAO129#002 + + + + + + + + Zip + Postleitzahl + + PostalCode + + + + + ZIP code of address + Postleitzahl der Anschrift + + + + + + + CityTown + 0173-1#02-AAO132#001 + + + + + + + + Ort + City/town + + City/town + + + + + Town or city of the company + Ortsangabe + + + + + + + StateCounty + 0173-1#02-AAO133#002 + + + + + + + + state/county + Bundesland + + StateCounty + + + + + Bundesland + state/county + + + + + + + ManufacturerProductFamily + 0173-1#02-AAU731#001 + + + + + + + + Manufacturer product family + Herstellerproduktfamilie + + TypClass + + + + + 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie + 2nd level of a 3 level manufacturer specific product hierarchy + + + + + + + SerialNumber + 0173-1#02-AAM556#002 + + + + + + + + Serial number + Seriennummer + + InstanceId + + + + + eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist + unique combination of numbers and letters used to identify the device once it has been manufactured + + + + + + + BatchNumber + 0173-1#02-AAQ196#001 + + + + + + + + Batch number + Chargen-Nummer + + ChargeId + + + + + Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge + Number assigned by the manufacturer of a material to identify the manufacturer's batch + + + + + + + ProductCountryOfOrigin + 0173-1#02-AAO841#001 + + + + + + + + Produkt Ursprungsland + Product country of origin + + CountryOfOrigin + + + + + Land in dem das Produkt hergestellt wurde (Hersteller Land) + Country in which the product is manufactured (manufacturer country) + + + + + + + YearOfConstruction + 0173-1#02-AAP906#001 + + + + + + + + Year of construction + Baujahr + + YearOfConstruction + + + + + Jahreszahl als Datumsangabe für die Fertigstellung des Objektes + Year as completion date of object + + + + + + + ProductMarking + https://www.hsu-hh.de/aut/aas/productmarking + + + + + + + + Produktkennzeichnung + Product Marking + + ProductMarking + + + + + Sammlungsdatei für Produktkennzeichnung + Collection file for product marking + + + + + + + CEQualificationPresent + 0173-1#02-BAF053#008 + + + + + + + + CE-Kennzeichnung vorhanden + CE- qualification present + + CEMarkingPresent + + + BOOLEAN + + whether CE- qualification is present + Angabe, ob CE-Kennzeichnung vorhanden ist + + + + + + + File + 0173-1#02-AAD005#008 + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Enthaltene Doku. Datei + Embedded Doc. file + + File + + + + + Verweis/ BLOB auf enthaltene Dokumentations-Datei. + Reference/ BLOB to embedded documentation file. + + + + + + + DocumentationItem + 0173-1#02-AAD001#001 + + + + + + + + Dokumentationsgruppe + Documentation item + + DocumentationItem + + + + + Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. + Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. + + + + + + + DocumentType + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + + + + + + Dokumententyp + Document Type + + DocumentType + + + + + Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) + TBD + + + + + + + VDI2770_DomainId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + + + + + + Domain-Nummer + DomainId + + DomainId + + + + + Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. + TBD + + + + + + + VDI2770_IdType + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + + + + + + Nummerntyp + IdType + + IdType + + + + + Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. + TBD + + + + + + + DocumentId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + + + + + + DocumentId + Dokumenten-Nummer + + DocumentId + + + + + Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. + TBD + + + + + + + DocumentDomainId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + + + + + + DocumentDomainId + DocumentDomainId + + DocumentDomainId + + + + + Kennung oder Kennzeichen einer Domäne + TBD + + + + + + + VDI2770_Role + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + + + + + + Rolle + Role + + Role + + + + + Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) + TBD + + + + + + + VDI2770_OrganisationId + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + + + + + + Organisation ID + Organisation ID + + OrganisationId + + + + + eindeutige ID für die Organisation + TBD + + + + + + + VDI2770_OrganisationName + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + + + + + + OrganisationName + OrganisationName + + OrganisationName + + + + + gebräuchliche Bezeichnung für die Organisation + TBD + + + + + + + VDI2770_OrganisationOfficialName + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + + + + + + Offizieller Name der Organisation + Organisation Official Name + + OrganisationOfficialName + + + + + offizieller Name der Organisation + TBD + + + + + + + VDI2770_Description + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + + + + + + Beschreibung + Description + + Description + + + + + Beschreibung für die nächste übergeordnete Collection + TBD + + + + + + + DocumentPartId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + + + + + + Dokumenten-Teilnummer + DocumentPartId + + DocumentPartId + + + + + Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. + TBD + + + + + + + DocumentClassification_ClassId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + + + + Dokumentkategorie + Document category + + DocCategory + + + + + Dokumentkategorie nach VDI 2770:2018/10 + Document category after VDI 2770:2018/10 + + + + + + + VDI2770_ClassName + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + + + + + + Klassenname + Class Name + + ClassName + + + + + Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. + TBD + + + + + + + VDI2770_ClassificationSystem + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + + + + + + Klassifizierungssystem + classification system + + ClassificationSystem + + + + + Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. + TBD + + + + + + + DocumentVersionId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + + + + + + Dokumenten-Versionsnummer + DocumentVersionId + + DocumentVersionId + + + + + Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. + TBD + + + + + + + DocumentVersion_LanguageCode + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + + + + + + Sprachenschlüssel + LanguageCode + + LanguageCode + + + + + Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 + TBD + + + + + + + VDI2770_Title + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + + + + + + Titel + Title + + VDI2770_Title + + + + + sprachabhängiger Titel des Dokuments + TBD + + + + + + + VDI2770_Summary + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + + + + + + Zusammenfassung + Summary + + Summary + + + + + sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts + TBD + + + + + + + VDI2770_Keywords + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + + + + + + Schlagwörter + Keywords + + Keywords + + + + + sprachabhängige, durch Komma getrennte Liste von Schlagwörtern + TBD + + + + + + + VDI2770_StatusValue + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + + + + + + Statuswert + StatusValue + + StatusValue + + + + + Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) + TBD + + + + + + + VDI2770_SetDate + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + + + + + + Erstellungsdatum + Set Date + + SetDate + + + + + Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). + TBD + + + + + + + VDI2770_Purpose + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + + + + + + Zweck + Purpose + + Purpose + + + + + Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. + TBD + + + + + + + VDI2770_BasedOnProcedure + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + + + + + + Prozedur + Procedure + + BasedOnProcedure + + + + + textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt + TBD + + + + + + + VDI2770_Comments + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + + + + + + Kommentar + Comments + + Comments + + + + + textuelle Bemerkungen und Anmerkungen zum Status + TBD + + + + + + + VDI2770_ReferencedObject_Type + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + + + + + + Typ + Type + + Type + + + + + Für Type des Objekts muss immer Product angegeben werden. + TBD + + + + + + + VDI2770_ReferencedObject_RefType + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + + + + + + RefType + RefType + + RefType + + + + + Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) + TBD + + + + + + + VDI2770_ReferencedObject_ObjectId + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + + + + + + ObjectId + ObjectId + + ObjectId + + + + + Angabe der Identifikationsnummer zum Objekt + TBD + + + + + + + VDI2770_FileId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + + + + + + ID der Datei + File ID + + FileId + + + + + eindeutige ID für die Datei + TBD + + + + + + + VDI2770_FileName + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + + + + + + Dateiname + File name + + FileName + + + + + Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. + TBD + + + + + + + VDI2770_FileFormat + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + + + + + + Datei Format + File format + + FileFormat + + + + + Angabe eines Media Typs gemäß der Liste der IANA + TBD + + + + + + + OrganisationContactInfo + https://www.hsu-hh.de/aut/aas/contactinfo + + + + + + + + Contact Info + Kontakt Info + + OrganisationContactInfo + + + + + Sammlung für die allgemeinen Kontaktdaten + Collection for general contact data + + + + + + + NameOfSupplier + 0173-1#02-AAO735#003 + + + + + + + + + + + + name of supplier + Lieferantenname + + name of supplier + + + + + Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt + name of supplier which provides the customer with a product or a service + + + + + + + ContactInfo_Role + https://www.hsu-hh.de/aut/aas/role + + + + + + + + Rolle + Role + + Role + + + + + Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt + Information to specify the role which the organisation of ContactInfo plays + + + + + + + Email + https://www.hsu-hh.de/aut/aas/email + + + + + + + + Emailadresse + Email address + + Email + + + + + Emailadresse + Email address + + + + + + + URL + 0173-1#02-AAO694#001 + + + + + + + + Internetadresse + Internet address + + URL + + + + + stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html + Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html + + + + + + + PhoneNumber + 0173-1#02-AAO136#002 + + + + + + + + Telefonnummer + telephone number + + Phone + + + + + vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist + complete telephone number to be called to reach a business partner + + + + + + + Fax + https://www.hsu-hh.de/aut/aas/fax + + + + + + + + Fax + Fax + + Fax + + + + + Faxnummer + Fax number + + + + + + + 0173-1#02-AAO136#002 + + + + + GLNOfManufacturer + 0173-1#02-AAY812#001 + + + + + + + + GLN of manufacturer + GLN des Herstellers + + GLN of manufacturer + + + + + international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort + internationally unique identification number for the manufacturer of the device or the product and for the physical location + + + + + + + SupplierOfTheIdentifier + 0173-1#02-AAP796#004 + + + + + + + + Supplier of the identifier + Anbieter der Identifikationsnummer für Hersteller + + Supplier of the identifier + + + STRING_TRANSLATABLE + + DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification + DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer + + + + + + + MAN_PROD_NUM + + product article number of manufacturer + + 0173-1#02-AAO676#003 + + + + + + + + product article number of manufacturer + Herstellerartikelnummer + + MAN_PROD_NUM + + + STRING_TRANSLATABLE + + eindeutiger Bestellschlüssel des Herstellers + unique product identifier of the manufacturer + + + + + + + ManufacturerProductDescription + 0173-1#02-AAU734#001 + + + + + + + + Manufacturer product description + Herstellerproduktbeschreibung + + Manufacturer product description + + + + + Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) + Description of the product, it's technical features and implementation if needed (long text) + + + + + + + GLNOfSupplier + 0173-1#02-AAY813#001 + + + + + + + + GLN of supplier + GLN des Lieferanten + + GLN of supplier + + + + + international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort + internationally unique identification number for the supplier of the device or the product and for the physical location + + + + + + + SupplierIdProvider + https://www.hsu-hh.de/aut/aas/supplieridprovider + + + + + + + + SupplierIdProvider + Anbieter der Identifikationsnummer + + SupplierIdProvider + + + STRING_TRANSLATABLE + + DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer + DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification + + + + + + + SUP_PROD_NUM + 0173-1#02-AAO736#004 + + + + + + + + product article number of supplier + Lieferantenartikelnummer + + product article number of supplier + + + + + eindeutiger Bestellschlüssel des Lieferanten + unique product order identifier of the supplier + + + + + + + SupplierProductDesignation + 0173-1#02-AAM551#002 + + + + + + + + Supplier product designation + Lieferantenproduktbezeichnung + + SupplierTypName + + + STRING_TRANSLATABLE + + Kurze Beschreibung des Produktes (Kurztext) + Short description of the product (short text) + + + + + + + SupplierProductDescription + 0173-1#02-AAU730#001 + + + + + + + + Supplier product description + Lieferantenproduktbeschreibung + + Supplier product description + + + + + Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) + Description of the product, it's technical features and implementation if needed (long text) + + + + + + + ClassificationSystem + 0173-1#02-AAO715#002 + + + + + + + + classification system + Klassifizierungssystem + + ClassificationSystem + + + + + Klassifizierungssystem + Classification System + + + + + + + SecondaryKeyTyp + https://www.hsu-hh.de/aut/aas/secondarykeytyp + + + + + + + + SecondaryKeyTyp + Typnummer des IT Systems + + SecondaryKeyTyp + + + + + Führende technische ID im IT System des Typs + SecondaryKeyTyp + + + + + + + TypThumbnail + www.company.com/ids/cd/4401_1272_7091_3437 + + + + + + + + TypThumbnail + Vorschaubild + + TypThumbnail + + + + + Darstellung des Produkttyps in kleinem Format + Small picture of the product type + + + + + + + AssetId + https://www.hsu-hh.de/aut/aas/assetid + + + + + + + + AssetId + Asset ID + + AssetId + + + + + Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. + Global unique ID of an asset, which can be read by both human and machine. + + + + + + + SecondaryKeyInstance + https://www.hsu-hh.de/aut/aas/secondarykeyinstance + + + + + + + + SecondaryKeyInstance + Instanznummer des IT Systems + + SecondaryKeyInstance + + + + + Führende technische ID im IT System der Instanz + SecondaryKeyInstance + + + + + + + DateOfManufacture + 0173-1#02-AAR972#002 + + + + + + + + Date of manufacture + Herstellungsdatum + + Date of manufacture + + + DATE + + Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist + Date from which the production and / or development process is completed or from which a service is provided completely + + + + + + + DeviceRevision + https://www.hsu-hh.de/aut/aas/devicerevision + + + + + + + + DeviceRevision + DeviceRevision + + DeviceRevision + + + + + DeviceRevision + DeviceRevision + + + + + + + SoftwareRevision + https://www.hsu-hh.de/aut/aas/softwarerevision + + + + + + + + SoftwareRevision + SoftwareRevision + + SoftwareRevision + + + + + SoftwareRevision + SoftwareRevision + + + + + + + HardwareRevision + https://www.hsu-hh.de/aut/aas/hardwarerevision + + + + + + + + HardwareRevision + HardwareRevision + + HardwareRevision + + + + + HardwareRevision + HardwareRevision + + + + + + + QrCode + https://www.hsu-hh.de/aut/aas/qrcode + + + + + + + + QrCode + QrCode + + QrCode + + + + + In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. + QrCode + + + + + + + CompanyLogo + https://www.hsu-hh.de/aut/aas/companylogo + + + + + + + + Firmenlogo + CompanyLogo + + CompanyLogo + + + + + Firmenlogo + CompanyLogo + + + + + + + \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/17_ABB.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/17_ABB.aasx.xml new file mode 100644 index 000000000..cba1293c8 --- /dev/null +++ b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/17_ABB.aasx.xml @@ -0,0 +1,4777 @@ + + + + + ABB_TTF_300 + www.abb.com/8055_9070_1191_2593 + + + www.abb.com/8055_9070_1191_2593 + + + + + https://productid.abb.com/9AAC129110?sn=3K650000548505 + + + + + + www.abb.com/ids/4834_5472_7091_3242 + + + + + www.company.com/ids/sm/2543_5072_7091_2660 + + + + + www.company.com/ids/sm/6053_5072_7091_5102 + + + + + www.company.com/ids/sm/6563_5072_7091_4267 + + + + + www.abb.com/ids/6113_5160_1191_8063 + + + + + www.abb.com/ids/0212_0171_1391_2237 + + + + + www.abb.com/ids/3213_0170_1192_3931 + + + + + + + + + instanceAsset + https://productid.abb.com/9AAC129110?sn=3K650000548505 + Instance + + + www.abb.com/sm/1433_0170_1191_4089 + + + + + + + Nameplate + www.abb.com/ids/4834_5472_7091_3242 + + + https://www.hsu-hh.de/aut/aas/nameplate + + + Instance + + + + + ManufacturerName + PARAMETER + + + 0173-1#02-AAO677#002 + + + Instance + + string + ABB Automation Products GmbH + + + + + ManufacturerProductDesignation + PARAMETER + + + 0173-1#02-AAW338#001 + + + Instance + + string + TTF 300 + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Stierstadterstrasse 5 + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 60488 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Frankfurt + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Hessen + + + + false + false + + + + + ManufacturerProductFamily + PARAMETER + + + 0173-1#02-AAU731#001 + + + Instance + + + Temperature transmitter + + + + + SerialNumber + PARAMETER + + + 0173-1#02-AAM556#002 + + + Instance + + string + 3K650000548505 + + + + + BatchNumber + PARAMETER + + + 0173-1#02-AAQ196#001 + + + Instance + + + + + + + + ProductCountryOfOrigin + PARAMETER + + + 0173-1#02-AAO841#001 + + + Instance + + string + DE + + + + + YearOfConstruction + PARAMETER + + + 0173-1#02-AAP906#001 + + + Instance + + integer + 2019 + + + + + Marking_CE + PARAMETER + + + https://www.hsu-hh.de/aut/aas/productmarking + + + Instance + + + + + CEQualificationPresent + PARAMETER + + + 0173-1#02-BAF053#008 + + + Instance + + boolean + 1 + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + image/png + /aasx/Nameplate/marking_ce.png + + + + false + false + + + + + + Document + www.company.com/ids/sm/2543_5072_7091_2660 + + + https://www.hsu-hh.de/aut/aas/document + + + Instance + + + + + DeclarationCEMarking + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + CE_TTX300_TTX200_ATEX_2016X + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + ABB + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + ABB Automation Products GmbH + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 02-04 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Zeugnisse, Zertifikate, Bescheinigungen + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + de + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + EU-Konformitätserklärung + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + CE_TTX300_TTX200_ATEX_2016X-DE.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/CE_TTX300_TTX200_ATEX_2016X-DE.pdf + + + + false + false + + + + + ManualDE + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + OI/TTF300 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + ABB + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + ABB Automation Products GmbH + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-02 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Operation (EN) Bedienung (DE) + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + G + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + de + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Betriebsanleitung + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + OI_TTF300_DE_G01.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/OI_TTF300_DE_G01.pdf + + + + false + false + + + + + ManualEN + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + OI/TTF300 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + ABB + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + ABB Automation Products GmbH + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-02 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Operation (EN) Bedienung (DE) + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + G + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Manual + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + OI_TTF300_EN_G01.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/OI_TTF300_EN_G01.pdf + + + + false + false + + + + + + Service + www.company.com/ids/sm/6053_5072_7091_5102 + + + https://www.hsu-hh.de/aut/aas/service + + + Instance + + + + + ContactInfo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/contactinfo + + + Instance + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + ABB AG + + + + + ContactInfo_Role + PARAMETER + + + https://www.hsu-hh.de/aut/aas/role + + + Instance + + string + Manufacturer + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Schillerstr. 72 + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 32423 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Minden + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Nordrhein-Westfalen + + + + false + false + + + + + Email + PARAMETER + + + https://www.hsu-hh.de/aut/aas/email + + + Instance + + string + contact.center@de.abb.com + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + string + https://new.abb.com/service + + + + + PhoneNumber + PARAMETER + + + 0173-1#02-AAO136#002 + + + Instance + + string + +496213813333 + + + + + Fax + PARAMETER + + + https://www.hsu-hh.de/aut/aas/fax + + + Instance + + string + + + + + false + false + + + + + + Identification + www.company.com/ids/sm/6563_5072_7091_4267 + + + https://www.hsu-hh.de/aut/aas/identification + + + Instance + + + + + ManufacturerName + PARAMETER + + + 0173-1#02-AAO677#002 + + + Instance + + string + ABB Automation Products GmbH + + + + + GLNOfManufacturer + PARAMETER + + + 0173-1#02-AAY812#001 + + + Instance + + string + + + + + + SupplierOfTheIdentifier + + + 0173-1#02-AAP796#004 + + + Instance + + + + + + + + MAN_PROD_NUM + + + 0173-1#02-AAO676#003 + + + Instance + + + + + + + + ManufacturerProductDesignation + PARAMETER + + + 0173-1#02-AAW338#001 + + + Instance + + string + Field mounted temperature transmitters + + + + + ManufacturerProductDescription + PARAMETER + + + 0173-1#02-AAU734#001 + + + Instance + + langString + For enhanced (e.g. redundancy) field mounting application with 4 to 20 mA HART, PROFIBUS and FOUNDATION Fieldbus communication. With and without LCD display including device configurability. Also available with Ex-approvals and SIL declaration of conformity. + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + ABB Automation Products GmbH + + + + + GLNOfSupplier + PARAMETER + + + 0173-1#02-AAY813#001 + + + Instance + + string + + + + + + SupplierIdProvider + PARAMETER + + + https://www.hsu-hh.de/aut/aas/supplieridprovider + + + Instance + + + + + + + + SUP_PROD_NUM + PARAMETER + + + 0173-1#02-AAO736#004 + + + Instance + + + TTF300.Y0C4F + + + + + SupplierProductDesignation + + + 0173-1#02-AAM551#002 + + + Instance + + string + Field mounted temperature transmitters + + + + + SupplierProductDescription + PARAMETER + + + 0173-1#02-AAU730#001 + + + Instance + + langString + For enhanced (e.g. redundancy) field mounting application with 4 to 20 mA HART, PROFIBUS and FOUNDATION Fieldbus communication. With and without LCD display including device configurability. Also available with Ex-approvals and SIL declaration of conformity. + + + + + ManufacturerProductFamily + PARAMETER + + + 0173-1#02-AAU731#001 + + + Instance + + string + Temperature transmitter + + + + + ClassificationSystem + PARAMETER + + + 0173-1#02-AAO715#002 + + + Instance + + string + eclass + + + + + SecondaryKeyTyp + + + https://www.hsu-hh.de/aut/aas/secondarykeytyp + + + Instance + + + + + + + + TypThumbnail + PARAMETER + + + https://www.hsu-hh.de/aut/aas/thumbnail + + + Instance + + image/jpeg + /thumbnail.jpg + + + + + AssetId + PARAMETER + + + https://www.hsu-hh.de/aut/aas/assetid + + + Instance + + anyURI + www.company.com/ids/asset/8220_6010_8091_3593 + + + + + SerialNumber + PARAMETER + + + 0173-1#02-AAM556#002 + + + Instance + + string + 3K650000548505 + + + + + BatchNumber + PARAMETER + + + 0173-1#02-AAQ196#001 + + + Instance + + + + + + + + SecondaryKeyInstance + PARAMETER + + + https://www.hsu-hh.de/aut/aas/secondarykeyinstance + + + Instance + + + + + + + + DateOfManufacture + PARAMETER + + + 0173-1#02-AAR972#002 + + + Instance + + date + 2018-12-20 + + + + + DeviceRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/devicerevision + + + Instance + + + + + + + + SoftwareRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/softwarerevision + + + Instance + + + 01.01.05 + + + + + HardwareRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/hardwarerevision + + + Instance + + + 01.00.02 + + + + + QrCode + PARAMETER + + + https://www.hsu-hh.de/aut/aas/qrcode + + + Instance + + image/jpeg + /aasx/QR_9AAC129110_3K650000548505.png + + + + + ContactInfo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/contactinfo + + + Instance + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + ABB Automation Products GmbH + + + + + ContactInfo_Role + PARAMETER + + + https://www.hsu-hh.de/aut/aas/role + + + Instance + + string + Manufacturer + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + langString + Wallstadter Straße 59 + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 68526 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Ladenburg + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Baden-Württemberg + + + + false + false + + + + + Email + PARAMETER + + + https://www.hsu-hh.de/aut/aas/email + + + Instance + + string + contact.center@de.abb.com + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://www.abb.com + + + + + PhoneNumber + PARAMETER + + + 0173-1#02-AAO136#002 + + + Instance + + string + +49 621 381 3333 + + + + + Fax + PARAMETER + + + https://www.hsu-hh.de/aut/aas/fax + + + Instance + + string + + + + + false + false + + + + + CompanyLogo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/companylogo + + + Instance + + image/png + /aasx/ABB_Logo_320.png + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://productid.abb.com/9AAC129110?sn=3K650000548505 + + + + + + AssetIdentification + www.abb.com/ids/6113_5160_1191_8063 + + + https://www.hsu-hh.de/aut/aas/assetidentification + + + Instance + + + + + ManufacturerName + PARAMETER + + + 0173-1#02-AAO677#002 + + + Instance + + string + ABB Automation Products GmbH + + + + + Brand + CONSTANT + + + 0173-1#02-AAO742#002 + + + Instance + + string + TTF300 + + + + + SUP_PROD_NUM + PARAMETER + + + 0173-1#02-AAO736#004 + + + Instance + + + TTF300.Y0C4F + + + + + EclassClassification + CONSTANT + + + + https://www.eclasscontent.com/index.php?action=det&id=27200208 + + + Instance + + + 27-20-02-08 + + + + + SerialNumber + PARAMETER + + + 0173-1#02-AAM556#002 + + + Instance + + string + 3K650000548505 + + + + + InstallationID + + + + https://www.abb.com/servIS/installationID + + + Instance + + + 9AAK619994K8957 + + + + + DeliveryDate + + + + https://www.abb.com/servIS/deliveryDate + + + Instance + + + 2018-12-20 + + + + + + CertificatesAndDeclarations + + www.abb.com/ids/0212_0171_1391_2237 + + + https://www.hsu-hh.de/aut/aas/certificatesanddeclarations + + + Instance + + + + + AdditionalLinkAddress + + + 0173-1#02-AAE670#003 + + + Instance + + anyURI + https://share.library.abb.com/api/v4?cid=9AAC129110&dk=Certificate + + + + + + TechnicalData + + www.abb.com/ids/3213_0170_1192_3931 + + + https://www.hsu-hh.de/aut/aas/technicaldata + + + Instance + + + + + Weight + + + + 0173-1#02-AAB713#005 + + + Instance + + + 1.2 + + + + + + + + ManufacturerName + 0173-1#02-AAO677#002 + + + + + + + + Herstellername + Manufacturer Name + + Manufacturer Name + + + + + Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist + 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 + + + + + + + ManufacturerProductDesignation + 0173-1#02-AAW338#001 + + + + + + + + Manufacturer product designation + Herstellerproduktbezeichnung + + ManufacturerTypName + + + STRING_TRANSLATABLE + + Kurze Beschreibung des Produktes (Kurztext) + Short description of the product (short text) + + + + + + + PhysicalAddress + https://www.hsu-hh.de/aut/aas/physicaladdress + + + + + + + + PhysicalAddress + Physische Adresse + + PhysicalAddress + + + + + Sammlung für reale physische Adresse + Collection for real physical address + + + + + + + CountryCode + 0173-1#02-AAO730#001 + + + + + + + + + + + + Landeskennung + Country code + + Country code + + + + + Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes + agreed upon symbol for unambiguous identification of a country + + + + + + + Street + 0173-1#02-AAO128#001 + + + + + + + + Strasse + Street + + Street + + + + + Name der Strasse und Hausnummer + Street name and house number + + + + + + + Zip + 0173-1#02-AAO129#002 + + + + + + + + Zip + Postleitzahl der Anschrift + + PostalCode + + + + + ZIP code of address + Postleitzahl der Anschrift + + + + + + + CityTown + 0173-1#02-AAO132#001 + + + + + + + + Ort + City/town + + City/town + + + + + Town or city of the company + Ortsangabe + + + + + + + StateCounty + 0173-1#02-AAO133#002 + + + + + + + + state/county + Bundesland + + StateCounty + + + + + Bundesland + state/county + + + + + + + ManufacturerProductFamily + 0173-1#02-AAU731#001 + + + + + + + + Manufacturer product family + Herstellerproduktfamilie + + TypClass + + + + + 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie + 2nd level of a 3 level manufacturer specific product hierarchy + + + + + + + SerialNumber + 0173-1#02-AAM556#002 + + + + + + + + Serial number + Seriennummer + + InstanceId + + + + + eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist + unique combination of numbers and letters used to identify the device once it has been manufactured + + + + + + + BatchNumber + 0173-1#02-AAQ196#001 + + + + + + + + Batch number + Chargen-Nummer + + ChargeId + + + + + Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge + Number assigned by the manufacturer of a material to identify the manufacturer's batch + + + + + + + ProductCountryOfOrigin + 0173-1#02-AAO841#001 + + + + + + + + Produkt Ursprungsland + Product country of origin + + CountryOfOrigin + + + + + Land in dem das Produkt hergestellt wurde (Hersteller Land) + Country in which the product is manufactured (manufacturer country) + + + + + + + YearOfConstruction + 0173-1#02-AAP906#001 + + + + + + + + Year of construction + Baujahr + + YearOfConstruction + + + + + Jahreszahl als Datumsangabe für die Fertigstellung des Objektes + Year as completion date of object + + + + + + + ProductMarking + https://www.hsu-hh.de/aut/aas/productmarking + + + + + + + + Produktkennzeichnung + Product Marking + + ProductMarking + + + + + Sammlungsdatei für Produktkennzeichnung + Collection file for product marking + + + + + + + CEQualificationPresent + 0173-1#02-BAF053#008 + + + + + + + + CE-Kennzeichnung vorhanden + CE- qualification present + + CEMarkingPresent + + + BOOLEAN + + whether CE- qualification is present + Angabe, ob CE-Kennzeichnung vorhanden ist + + + + + + + File + 0173-1#02-AAD005#008 + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Enthaltene Doku. Datei + Embedded Doc. file + + File + + + + + Verweis/ BLOB auf enthaltene Dokumentations-Datei. + Reference/ BLOB to embedded documentation file. + + + + + + + DocumentationItem + 0173-1#02-AAD001#001 + + + + + + + + Dokumentationsgruppe + Documentation item + + DocumentationItem + + + + + Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. + Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. + + + + + + + DocumentType + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + + + + + + Dokumententyp + Document Type + + DocumentType + + + + + Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) + TBD + + + + + + + VDI2770_DomainId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + + + + + + Domain-Nummer + DomainId + + DomainId + + + + + Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. + TBD + + + + + + + VDI2770_IdType + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + + + + + + Nummerntyp + IdType + + IdType + + + + + Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. + TBD + + + + + + + DocumentId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + + + + + + DocumentId + Dokumenten-Nummer + + DocumentId + + + + + Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. + TBD + + + + + + + DocumentDomainId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + + + + + + DocumentDomainId + DocumentDomainId + + DocumentDomainId + + + + + Kennung oder Kennzeichen einer Domäne + TBD + + + + + + + VDI2770_Role + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + + + + + + Rolle + Role + + Role + + + + + Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) + TBD + + + + + + + VDI2770_OrganisationId + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + + + + + + Organisation ID + Organisation ID + + OrganisationId + + + + + eindeutige ID für die Organisation + TBD + + + + + + + VDI2770_OrganisationName + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + + + + + + OrganisationName + OrganisationName + + OrganisationName + + + + + gebräuchliche Bezeichnung für die Organisation + TBD + + + + + + + VDI2770_OrganisationOfficialName + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + + + + + + Offizieller Name der Organisation + Organisation Official Name + + OrganisationOfficialName + + + + + offizieller Name der Organisation + TBD + + + + + + + VDI2770_Description + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + + + + + + Beschreibung + Description + + Description + + + + + Beschreibung für die nächste übergeordnete Collection + TBD + + + + + + + DocumentPartId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + + + + + + Dokumenten-Teilnummer + DocumentPartId + + DocumentPartId + + + + + Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. + TBD + + + + + + + DocumentClassification_ClassId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + + + + Dokumentkategorie + Document category + + DocCategory + + + + + Dokumentkategorie nach VDI 2770:2018/10 + Document category after VDI 2770:2018/10 + + + + + + + VDI2770_ClassName + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + + + + + + Klassenname + Class Name + + ClassName + + + + + Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. + TBD + + + + + + + VDI2770_ClassificationSystem + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + + + + + + Klassifizierungssystem + classification system + + ClassificationSystem + + + + + Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. + TBD + + + + + + + DocumentVersionId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + + + + + + Dokumenten-Versionsnummer + DocumentVersionId + + DocumentVersionId + + + + + Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. + TBD + + + + + + + DocumentVersion_LanguageCode + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + + + + + + Sprachenschlüssel + LanguageCode + + LanguageCode + + + + + Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 + TBD + + + + + + + VDI2770_Title + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + + + + + + Titel + Title + + VDI2770_Title + + + + + sprachabhängiger Titel des Dokuments + TBD + + + + + + + VDI2770_Summary + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + + + + + + Zusammenfassung + Summary + + Summary + + + + + sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts + TBD + + + + + + + VDI2770_Keywords + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + + + + + + Schlagwörter + Keywords + + Keywords + + + + + sprachabhängige, durch Komma getrennte Liste von Schlagwörtern + TBD + + + + + + + VDI2770_StatusValue + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + + + + + + Statuswert + StatusValue + + StatusValue + + + + + Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) + TBD + + + + + + + VDI2770_SetDate + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + + + + + + Erstellungsdatum + Set Date + + SetDate + + + + + Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). + TBD + + + + + + + VDI2770_Purpose + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + + + + + + Zweck + Purpose + + Purpose + + + + + Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. + TBD + + + + + + + VDI2770_BasedOnProcedure + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + + + + + + Prozedur + Procedure + + BasedOnProcedure + + + + + textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt + TBD + + + + + + + VDI2770_Comments + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + + + + + + Kommentar + Comments + + Comments + + + + + textuelle Bemerkungen und Anmerkungen zum Status + TBD + + + + + + + VDI2770_ReferencedObject_Type + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + + + + + + Typ + Type + + Type + + + + + Für Type des Objekts muss immer Product angegeben werden. + TBD + + + + + + + VDI2770_ReferencedObject_RefType + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + + + + + + RefType + RefType + + RefType + + + + + Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) + TBD + + + + + + + VDI2770_ReferencedObject_ObjectId + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + + + + + + ObjectId + ObjectId + + ObjectId + + + + + Angabe der Identifikationsnummer zum Objekt + TBD + + + + + + + VDI2770_FileId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + + + + + + ID der Datei + File ID + + FileId + + + + + eindeutige ID für die Datei + TBD + + + + + + + VDI2770_FileName + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + + + + + + Dateiname + File name + + FileName + + + + + Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. + TBD + + + + + + + VDI2770_FileFormat + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + + + + + + Datei Format + File format + + FileFormat + + + + + Angabe eines Media Typs gemäß der Liste der IANA + TBD + + + + + + + OrganisationContactInfo + https://www.hsu-hh.de/aut/aas/contactinfo + + + + + + + + Contact Info + Kontakt Info + + OrganisationContactInfo + + + + + Sammlung für die allgemeinen Kontaktdaten + Collection for general contact data + + + + + + + NameOfSupplier + 0173-1#02-AAO735#003 + + + + + + + + + + + + name of supplier + Lieferantenname + + name of supplier + + + + + Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt + name of supplier which provides the customer with a product or a service + + + + + + + ContactInfo_Role + https://www.hsu-hh.de/aut/aas/role + + + + + + + + Rolle + Role + + Role + + + + + Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt + Information to specify the role which the organisation of ContactInfo plays + + + + + + + Email + https://www.hsu-hh.de/aut/aas/email + + + + + + + + Emailadresse + Email address + + Email + + + + + Emailadresse + Email address + + + + + + + URL + 0173-1#02-AAO694#001 + + + + + + + + Internetadresse + Internet address + + URL + + + + + stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html + Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html + + + + + + + PhoneNumber + 0173-1#02-AAO136#002 + + + + + + + + Telefonnummer + telephone number + + Phone + + + + + vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist + complete telephone number to be called to reach a business partner + + + + + + + Fax + https://www.hsu-hh.de/aut/aas/fax + + + + + + + + Fax + Fax + + Fax + + + + + Faxnummer + Fax number + + + + + + + 0173-1#02-AAO136#002 + + + + + GLNOfManufacturer + 0173-1#02-AAY812#001 + + + + + + + + GLN of manufacturer + GLN des Herstellers + + GLN of manufacturer + + + + + international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort + internationally unique identification number for the manufacturer of the device or the product and for the physical location + + + + + + + SupplierOfTheIdentifier + 0173-1#02-AAP796#004 + + + + + + + + Supplier of the identifier + Anbieter der Identifikationsnummer für Hersteller + + Supplier of the identifier + + + STRING_TRANSLATABLE + + DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification + DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer + + + + + + + MAN_PROD_NUM + + product article number of manufacturer + + 0173-1#02-AAO676#003 + + + + + + + + product article number of manufacturer + Herstellerartikelnummer + + MAN_PROD_NUM + + + STRING_TRANSLATABLE + + eindeutiger Bestellschlüssel des Herstellers + unique product identifier of the manufacturer + + + + + + + ManufacturerProductDescription + 0173-1#02-AAU734#001 + + + + + + + + Manufacturer product description + Herstellerproduktbeschreibung + + Manufacturer product description + + + + + Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) + Description of the product, it's technical features and implementation if needed (long text) + + + + + + + GLNOfSupplier + 0173-1#02-AAY813#001 + + + + + + + + GLN of supplier + GLN des Lieferanten + + GLN of supplier + + + + + international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort + internationally unique identification number for the supplier of the device or the product and for the physical location + + + + + + + SupplierIdProvider + https://www.hsu-hh.de/aut/aas/supplieridprovider + + + + + + + + SupplierIdProvider + Anbieter der Identifikationsnummer + + SupplierIdProvider + + + STRING_TRANSLATABLE + + DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer + DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification + + + + + + + SUP_PROD_NUM + 0173-1#02-AAO736#004 + + + + + + + + product article number of supplier + Lieferantenartikelnummer + + product article number of supplier + + + + + eindeutiger Bestellschlüssel des Lieferanten + unique product order identifier of the supplier + + + + + + + SupplierProductDesignation + 0173-1#02-AAM551#002 + + + + + + + + Supplier product designation + Lieferantenproduktbezeichnung + + SupplierTypName + + + STRING_TRANSLATABLE + + Kurze Beschreibung des Produktes (Kurztext) + Short description of the product (short text) + + + + + + + SupplierProductDescription + 0173-1#02-AAU730#001 + + + + + + + + Supplier product description + Lieferantenproduktbeschreibung + + Supplier product description + + + + + Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) + Description of the product, it's technical features and implementation if needed (long text) + + + + + + + ClassificationSystem + 0173-1#02-AAO715#002 + + + + + + + + classification system + Klassifizierungssystem + + ClassificationSystem + + + + + Klassifizierungssystem + Classification System + + + + + + + SecondaryKeyTyp + https://www.hsu-hh.de/aut/aas/secondarykeytyp + + + + + + + + SecondaryKeyTyp + Typnummer des IT Systems + + SecondaryKeyTyp + + + + + Führende technische ID im IT System des Typs + SecondaryKeyTyp + + + + + + + TypThumbnail + https://www.hsu-hh.de/aut/aas/thumbnail + + + + + + + + TypThumbnail + Vorschaubild + + TypThumbnail + + + + + Darstellung des Produkttyps in kleinem Format + Small picture of the product type + + + + + + + AssetId + https://www.hsu-hh.de/aut/aas/assetid + + + + + + + + AssetId + Asset ID + + AssetId + + + + + Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. + Global unique ID of an asset, which can be read by both human and machine. + + + + + + + SecondaryKeyInstance + https://www.hsu-hh.de/aut/aas/secondarykeyinstance + + + + + + + + SecondaryKeyInstance + Instanznummer des IT Systems + + SecondaryKeyInstance + + + + + Führende technische ID im IT System der Instanz + SecondaryKeyInstance + + + + + + + DateOfManufacture + 0173-1#02-AAR972#002 + + + + + + + + Date of manufacture + Herstellungsdatum + + Date of manufacture + + + DATE + + Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist + Date from which the production and / or development process is completed or from which a service is provided completely + + + + + + + DeviceRevision + https://www.hsu-hh.de/aut/aas/devicerevision + + + + + + + + DeviceRevision + DeviceRevision + + DeviceRevision + + + + + DeviceRevision + DeviceRevision + + + + + + + SoftwareRevision + https://www.hsu-hh.de/aut/aas/softwarerevision + + + + + + + + SoftwareRevision + SoftwareRevision + + SoftwareRevision + + + + + SoftwareRevision + SoftwareRevision + + + + + + + HardwareRevision + https://www.hsu-hh.de/aut/aas/hardwarerevision + + + + + + + + HardwareRevision + HardwareRevision + + HardwareRevision + + + + + HardwareRevision + HardwareRevision + + + + + + + CompanyLogo + https://www.hsu-hh.de/aut/aas/companylogo + + + + + + + + Firmenlogo + CompanyLogo + + CompanyLogo + + + + + Firmenlogo + CompanyLogo + + + + + + + QrCode + https://www.hsu-hh.de/aut/aas/qrcode + + + + + + + + QrCode + QrCode + + QrCode + + + + + In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. + QrCode + + + + + + + Brand + 0173-1#02-AAO742#002 + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Brand + Makre + + BRAND + + + + + + + + + + EclassClasification + CONSTANT + https://www.eclasscontent.com/index.php?action=det&id=27200208 + + + + + + + + + + + + + Temperaturmessung elektrisch komplett + Temperature measuring electr. complete + + + + + + + AdditionalLinkAddress + 0173-1#02-AAE670#003 + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + zusätzlicher Online-Verweis + additional link address + + + + + STRING_TRANSLATABLE + + site address where you can view information about the product or to communicate + Angabe einer Web-Adresse, die zusätzliche Informationen zum Produkt oder Kontaktdaten enthält + + + + + + + Weight + 0173-1#02-AAB713#005 + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Weight + Gewicht + + Weight + kg + + REAL_MEASURE + + Masse des Wägegutes ohne Verpackung und ohne Transportgerät + Mass of weight without packaging and transport unit + + + + + + + \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/18_Hitachi_HX_DigTyp40.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/18_Hitachi_HX_DigTyp40.aasx.xml new file mode 100644 index 000000000..39324b5b9 --- /dev/null +++ b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/18_Hitachi_HX_DigTyp40.aasx.xml @@ -0,0 +1,6872 @@ + + + + + 000000001 + https://admin-shell.hitachi-industrial.eu/aas/1/1/000000001 + + + https://admin-shell.hitachi-industrial.eu/asset/000000001 + + + + + + www.company.com/ids/sm/4343_5072_7091_3242 + + + + + www.company.com/ids/sm/2543_5072_7091_2660 + + + + + www.company.com/ids/sm/6053_5072_7091_5102 + + + + + www.company.com/ids/sm/6563_5072_7091_4267 + + + + + https://automation.hitachi-industrial.eu/_Resources/Static/Packages/Moon.HitachiEurope/Downloads/automation/[2]%20Software/[5]%20Configuration%20Files/[1]%20Device%20Descriptions/Device%20files.zip + + + + + + + + + Hitachi_000000001 + + Hitachi HX PLC + Hitachi HX SPS + + https://admin-shell.hitachi-industrial.eu/asset/000000001 + Instance + + + + + Nameplate + www.company.com/ids/sm/4343_5072_7091_3242 + + + https://www.hsu-hh.de/aut/aas/nameplate + + + Instance + + + + + ManufacturerName + PARAMETER + + + 0173-1#02-AAO677#002 + + + Instance + + string + Hitachi Industrial Equipment Systems Co.,Ltd. + + + + + ManufacturerProductDesignation + PARAMETER + + + 0173-1#02-AAW338#001 + + + Instance + + string + HX-CP1H16 + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + JP + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + AKS Bldg, 3 Kanda Neribei-cho + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 101-0022 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Chiyoda-ku, Tokyo + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + Tokyo + + + + false + false + + + + + ManufacturerProductFamily + PARAMETER + + + 0173-1#02-AAU731#001 + + + Instance + + + PAC IoT Controller HX Series + + + + + SerialNumber + PARAMETER + + + 0173-1#02-AAM556#002 + + + Instance + + string + HX-CP1H16 + + + + + BatchNumber + PARAMETER + + + 0173-1#02-AAQ196#001 + + + Instance + + string + N/A + + + + + ProductCountryOfOrigin + PARAMETER + + + 0173-1#02-AAO841#001 + + + Instance + + string + JP + + + + + YearOfConstruction + PARAMETER + + + 0173-1#02-AAP906#001 + + + Instance + + integer + 2018 + + + + + Marking_CE + PARAMETER + + + https://www.hsu-hh.de/aut/aas/productmarking + + + Instance + + + + + CEQualificationPresent + PARAMETER + + + 0173-1#02-BAF053#008 + + + Instance + + boolean + 1 + + + 0173-1#07-CAA016#001 + + + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + image/png + /aasx/Nameplate/marking_ce.png + + + + false + false + + + + + Marking_CRUUS + PARAMETER + + + https://www.hsu-hh.de/aut/aas/productmarking + + + Instance + + + + + CRUUSLabelingPresent + PARAMETER + + + 0173-1#02-AAR528#005 + + + Instance + + boolean + 1 + + + 0173-1#07-CAA016#001 + + + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + image/png + /aasx/Nameplate/marking_cruus.jpg + + + + false + false + + + + + + Document + www.company.com/ids/sm/2543_5072_7091_2660 + + + https://www.hsu-hh.de/aut/aas/document + + + Instance + + + + + DeclarationCEMarking + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Hitachi + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Hitachi Industrial Equipment Systems Co.,Ltd. + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 02-04 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Zeugnisse, Zertifikate, Bescheinigungen + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + HX CE declaration + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + CE_DLR_EH-150_REV17.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/CE_DLR_EH-150_REV17.pdf + + + + false + false + + + + + DeclarationRoHS + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Hitachi + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Hitachi Industrial Equipment Systems Co.,Ltd. + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 02-04 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Zeugnisse, Zertifikate, Bescheinigungen + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + RoHS 2011/65/EU Declaration of conformity + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + CE_DLR_EH-150_REV17.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/CE_DLR_EH-150_REV17.pdf + + + + false + false + + + + + EN_Manual_Hitachi_HX_Hardware + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + NJI-637(X) + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Hitachi + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Hitachi Industrial Equipment Systems Co.,Ltd. + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-02 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Bedienung + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + 2016.11 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + HX Series Application Manual (Hardware) + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + This application manual informs about the hardware of HX series which is a high-performance PAC system suitable for IoT. The contents relevant to programming has been separated as an application manual (software) and a command reference manual. + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + NJI-637A(X)_HX-CPU_Hardware_Rev_01.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/NJI-637A(X)_HX-CPU_Hardware_Rev_01.pdf + + + + false + false + + + + + EN_Manual_Hitachi_HX_Software + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + NJI-638(X) + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Hitachi + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Hitachi Industrial Equipment Systems Co.,Ltd. + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-02 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Bedienung + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + 2016.12 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + HX Series Application Manual (Software) + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + This application manual informs about the software of HX series which is a high-performance PAC system suitable for IoT. The contents relevant to installation has been separated as an hardware manual. + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + NJI-638X_HX-CPU_Software.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/NJI-638X_HX-CPU_Software.pdf + + + + false + false + + + + + DE_CODESYS_V3_Installation_und_Erste_Schritte + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + 0000000 + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + 3S-Smart Software Solutions GmbH + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + 3S-Smart Software Solutions GmbH + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-02 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Bedienung + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + 20XX + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + de + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + CODESYS V3, Installation und Erste Schritte - Anwenderdokumentation + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + CODESYS_Installation_und_Erste_Schritte_20V11.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/CODESYS_Installation_und_Erste_Schritte_V11.pdf + + + + false + false + + + + + EN_Datasheet_IoT_PAC_Controller_HX_Series + PARAMETER + + + 0173-1#02-AAD001#001 + + + Instance + + + + + DocumentType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + Instance + + string + Single + + + + + VDI2770_DomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + Instance + + + + + + + + VDI2770_IdType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + Instance + + string + Primary + + + + + DocumentId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + Instance + + + + + + + + DocumentDomainId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + Instance + + + + + + + + VDI2770_Role + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + Instance + + string + Responsible + + + + + VDI2770_OrganisationId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + Instance + + + + + + + + VDI2770_OrganisationName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + Instance + + string + Hitachi + + + + + VDI2770_OrganisationOfficialName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + Instance + + string + Hitachi Europe GmbH + + + + + VDI2770_Description + PARAMETER + + Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. + + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + Instance + + + The new Hitachi HX series PAC Controller combines powerful features and efficiency to meet the demands of a global supply chain in manufacturing industries. In addition, HX series is already prepared for the next generation requirements in automation thanks to its IoT capabilities. Manufacturing & service innovations can be achieved with integrated functions and seamless connectivity from field machine level to cloud services. + + + + + DocumentPartId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + Instance + + + + + + + + DocumentClassification_ClassId + PARAMETER + + eindeutige ID der Klasse in einer Klassifikation + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + Instance + + string + 03-02 + + + + + VDI2770_ClassName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + Instance + + string + Bedienung + + + + + ClassificationSystem + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + Instance + + string + VDI2770:2018 + + + + + DocumentVersionId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + Instance + + + 1.10 + + + + + DocumentVersion_LanguageCode + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + Instance + + string + en + + + + + VDI2770_Title + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + Instance + + string + Datasheet: IoT PAC Controller HX Series - Next generation industrial controller. + + + + + VDI2770_Summary + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + Instance + + + + + + + + VDI2770_Keywords + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + Instance + + + + + + + + VDI2770_StatusValue + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + Instance + + string + Released + + + + + VDI2770_SetDate + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + Instance + + + 2017.03 + + + + + VDI2770_Purpose + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + Instance + + + + + + + + VDI2770_BasedOnProcedure + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + Instance + + + + + + + + VDI2770_Comments + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + Instance + + + + + + + + VDI2770_ReferencedObject_Type + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + Instance + + string + Product + + + + + VDI2770_ReferencedObject_RefType + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + Instance + + + + + + + + VDI2770_ReferencedObject_ObjectId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + Instance + + + + + + + + VDI2770_FileId + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + Instance + + + + + + + + VDI2770_FileName + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + Instance + + string + HX%20Datasheet.pdf + + + + + VDI2770_FileFormat + PARAMETER + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + Instance + + string + application/pdf + + + + + File + PARAMETER + + + 0173-1#02-AAD005#008 + + + Instance + + application/pdf + /aasx/Document/HX_Datasheet.pdf + + + + false + false + + + + + + Service + www.company.com/ids/sm/6053_5072_7091_5102 + + + https://www.hsu-hh.de/aut/aas/service + + + Instance + + + + + ContactInfo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/contactinfo + + + Instance + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + Hitachi Europe GmbH + + + + + ContactInfo_Role + PARAMETER + + + https://www.hsu-hh.de/aut/aas/role + + + Instance + + string + Sales organization + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + string + Niederkasseler Lohweg 191 + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 40547 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Düsseldorf + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + North Rhine-Westphalia + + + + false + false + + + + + Email + PARAMETER + + + https://www.hsu-hh.de/aut/aas/email + + + Instance + + string + automation.industrial@hitachi-eu.com + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + string + https://automation.hitachi-industrial.eu/ + + + + + PhoneNumber + PARAMETER + + + 0173-1#02-AAO136#002 + + + Instance + + string + +49-211-5283-0 + + + + + Fax + PARAMETER + + + https://www.hsu-hh.de/aut/aas/fax + + + Instance + + string + +49-211-2049-049 + + + + false + false + + + + + + Identification + www.company.com/ids/sm/6563_5072_7091_4267 + + + https://www.hsu-hh.de/aut/aas/identification + + + Instance + + + + + ManufacturerName + PARAMETER + + + 0173-1#02-AAO677#002 + + + Instance + + string + Hitachi Industrial Equipment Systems Co.,Ltd. + + + + + GLNOfManufacturer + PARAMETER + + + 0173-1#02-AAY812#001 + + + Instance + + string + N/A + + + + + SupplierOfTheIdentifier + + + 0173-1#02-AAP796#004 + + + Instance + + + N/A + + + + + MAN_PROD_NUM + + + 0173-1#02-AAO676#003 + + + Type + + + 1696-0702 + + + + + ManufacturerProductDesignation + PARAMETER + + + 0173-1#02-AAW338#001 + + + Instance + + string + HX-CP1H16 + + + + + ManufacturerProductDescription + PARAMETER + + + 0173-1#02-AAU734#001 + + + Instance + + langString + PLC Based PAC System for IoT Applications + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + Hitachi Europe GmbH + + + + + GLNOfSupplier + PARAMETER + + + 0173-1#02-AAY813#001 + + + Instance + + string + N/A + + + + + SupplierIdProvider + PARAMETER + + + https://www.hsu-hh.de/aut/aas/supplieridprovider + + + Instance + + + 316033943 + + + + + SUP_PROD_NUM + PARAMETER + + + 0173-1#02-AAO736#004 + + + Type + + + 1696-0702 + + + + + SupplierProductDesignation + + + 0173-1#02-AAM551#002 + + + Instance + + string + HX-CP1H16 + + + + + SupplierProductDescription + PARAMETER + + + 0173-1#02-AAU730#001 + + + Instance + + langString + Programmable automation controller (PAC) System for IoT Applications + + + + + ManufacturerProductFamily + PARAMETER + + + 0173-1#02-AAU731#001 + + + Instance + + string + PAC IoT Controller HX Series + + + + + ClassificationSystem + PARAMETER + + + 0173-1#02-AAO715#002 + + + Instance + + string + eclass + + + + + SecondaryKeyTyp + + + https://www.hsu-hh.de/aut/aas/secondarykeytyp + + + Instance + + + + + + + + TypThumbnail + PARAMETER + + + https://www.hsu-hh.de/aut/aas/thumbnail + + + Instance + + image/png + /HX_200432.png + + + + + AssetId + PARAMETER + + + https://www.hsu-hh.de/aut/aas/assetid + + + Instance + + anyURI + https://automation.hitachi-industrial.eu/demo/asset/0000_0000_0000_0000_0000 + + + + + SerialNumber + PARAMETER + + + 0173-1#02-AAM556#002 + + + Instance + + string + 1696-0702 + + + + + BatchNumber + PARAMETER + + + 0173-1#02-AAQ196#001 + + + Instance + + + N/A + + + + + SecondaryKeyInstance + PARAMETER + + + https://www.hsu-hh.de/aut/aas/secondarykeyinstance + + + Instance + + + + + + + + DateOfManufacture + PARAMETER + + + 0173-1#02-AAR972#002 + + + Instance + + date + N/A + + + + + DeviceRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/devicerevision + + + Instance + + + N/A + + + + + SoftwareRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/softwarerevision + + + Instance + + + 3.5.13.40 + + + + + HardwareRevision + PARAMETER + + + https://www.hsu-hh.de/aut/aas/hardwarerevision + + + Instance + + + N/A + + + + + ContactInfo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/contactinfo + + + Instance + + + + + NameOfSupplier + PARAMETER + + + 0173-1#02-AAO735#003 + + + Instance + + string + Hitachi Europe GmbH + + + + + ContactInfo_Role + PARAMETER + + + https://www.hsu-hh.de/aut/aas/role + + + Instance + + string + Manufacturer + + + + + PhysicalAddress + PARAMETER + + + https://www.hsu-hh.de/aut/aas/physicaladdress + + + Instance + + + + + CountryCode + PARAMETER + + + 0173-1#02-AAO730#001 + + + Instance + + string + DE + + + + + Street + PARAMETER + + + 0173-1#02-AAO128#001 + + + Instance + + langString + Niederkasseler Lohweg 191 + + + + + Zip + PARAMETER + + + 0173-1#02-AAO129#002 + + + Instance + + string + 40547 + + + + + CityTown + PARAMETER + + + 0173-1#02-AAO132#001 + + + Instance + + string + Düsseldorf + + + + + StateCounty + PARAMETER + + + 0173-1#02-AAO133#002 + + + Instance + + string + North Rhine-Westphalia + + + + false + false + + + + + Email + PARAMETER + + + https://www.hsu-hh.de/aut/aas/email + + + Instance + + string + automation.industrial@hitachi-eu.com + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://automation.hitachi-industrial.eu/ + + + + + PhoneNumber + PARAMETER + + + 0173-1#02-AAO136#002 + + + Instance + + string + +49-211-5283-0 + + + + + Fax + PARAMETER + + + https://www.hsu-hh.de/aut/aas/fax + + + Instance + + string + +49-211-2049-049 + + + + false + false + + + + + CompanyLogo + PARAMETER + + + https://www.hsu-hh.de/aut/aas/companylogo + + + Instance + + image/png + /aasx/assetIdentification/Hitachi_logo.png + + + + + URL + PARAMETER + + + 0173-1#02-AAO694#001 + + + Instance + + anyURI + https://automation.hitachi-industrial.eu/demo/0000_0000_0000_0000_0000 + + + + + + DeviceDescriptionFiles + https://automation.hitachi-industrial.eu/_Resources/Static/Packages/Moon.HitachiEurope/Downloads/automation/[2]%20Software/[5]%20Configuration%20Files/[1]%20Device%20Descriptions/Device%20files.zip + + + https://automation.hitachi-industrial.eu/en/products/software/configuration-files/device-descriptions + + + Instance + + + + + CodeSysDD + + + http://admin-shell.io/sample/conceptdescriptions/437857438753457473 + + + Instance + + application/general + /aasx/Document/Device_files.zip + + + + + + + + ManufacturerName + 0173-1#02-AAO677#002 + + + + + + + + Herstellername + Manufacturer Name + + Manufacturer Name + + + + + Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist + 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 + + + + + + + GLNOfManufacturer + 0173-1#02-AAY812#001 + + + + + + + + GLN of manufacturer + GLN des Herstellers + + GLN of manufacturer + + + + + international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort + internationally unique identification number for the manufacturer of the device or the product and for the physical location + + + + + + + SupplierOfTheIdentifier + 0173-1#02-AAP796#004 + + + + + + + + Supplier of the identifier + Anbieter der Identifikationsnummer für Hersteller + + Supplier of the identifier + + + STRING_TRANSLATABLE + + DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification + DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer + + + + + + + MAN_PROD_NUM + + product article number of manufacturer + + 0173-1#02-AAO676#003 + + + + + + + + product article number of manufacturer + Herstellerartikelnummer + + MAN_PROD_NUM + + + STRING_TRANSLATABLE + + eindeutiger Bestellschlüssel des Herstellers + unique product identifier of the manufacturer + + + + + + + ManufacturerProductDesignation + 0173-1#02-AAW338#001 + + + + + + + + Manufacturer product designation + Herstellerproduktbezeichnung + + ManufacturerTypName + + + STRING_TRANSLATABLE + + Kurze Beschreibung des Produktes (Kurztext) + Short description of the product (short text) + + + + + + + ManufacturerProductDescription + 0173-1#02-AAU734#001 + + + + + + + + Manufacturer product description + Herstellerproduktbeschreibung + + Manufacturer product description + + + + + Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) + Description of the product, it's technical features and implementation if needed (long text) + + + + + + + NameOfSupplier + 0173-1#02-AAO735#003 + + + + + + + + + + + + name of supplier + Lieferantenname + + name of supplier + + + + + Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt + name of supplier which provides the customer with a product or a service + + + + + + + GLNOfSupplier + 0173-1#02-AAY813#001 + + + + + + + + GLN of supplier + GLN des Lieferanten + + GLN of supplier + + + + + international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort + internationally unique identification number for the supplier of the device or the product and for the physical location + + + + + + + SupplierIdProvider + https://www.hsu-hh.de/aut/aas/supplieridprovider + + + + + + + + SupplierIdProvider + Anbieter der Identifikationsnummer + + SupplierIdProvider + + + STRING_TRANSLATABLE + + DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer + DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification + + + + + + + SUP_PROD_NUM + 0173-1#02-AAO736#004 + + + + + + + + product article number of supplier + Lieferantenartikelnummer + + product article number of supplier + + + + + eindeutiger Bestellschlüssel des Lieferanten + unique product order identifier of the supplier + + + + + + + SupplierProductDesignation + 0173-1#02-AAM551#002 + + + + + + + + Supplier product designation + Lieferantenproduktbezeichnung + + SupplierTypName + + + STRING_TRANSLATABLE + + Kurze Beschreibung des Produktes (Kurztext) + Short description of the product (short text) + + + + + + + SupplierProductDescription + 0173-1#02-AAU730#001 + + + + + + + + Supplier product description + Lieferantenproduktbeschreibung + + Supplier product description + + + + + Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) + Description of the product, it's technical features and implementation if needed (long text) + + + + + + + ManufacturerProductFamily + 0173-1#02-AAU731#001 + + + + + + + + Manufacturer product family + Herstellerproduktfamilie + + TypClass + + + + + 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie + 2nd level of a 3 level manufacturer specific product hierarchy + + + + + + + ClassificationSystem + 0173-1#02-AAO715#002 + + + + + + + + classification system + Klassifizierungssystem + + ClassificationSystem + + + + + Klassifizierungssystem + Classification System + + + + + + + SecondaryKeyTyp + https://www.hsu-hh.de/aut/aas/secondarykeytyp + + + + + + + + SecondaryKeyTyp + Typnummer des IT Systems + + SecondaryKeyTyp + + + + + Führende technische ID im IT System des Typs + SecondaryKeyTyp + + + + + + + TypThumbnail + https://www.hsu-hh.de/aut/aas/thumbnail + + + + + + + + TypThumbnail + Vorschaubild + + TypThumbnail + + + + + Darstellung des Produkttyps in kleinem Format + Small picture of the product type + + + + + + + AssetId + https://www.hsu-hh.de/aut/aas/assetid + + + + + + + + AssetId + Asset ID + + AssetId + + + + + Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. + Global unique ID of an asset, which can be read by both human and machine. + + + + + + + SerialNumber + 0173-1#02-AAM556#002 + + + + + + + + Serial number + Seriennummer + + InstanceId + + + + + eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist + unique combination of numbers and letters used to identify the device once it has been manufactured + + + + + + + BatchNumber + 0173-1#02-AAQ196#001 + + + + + + + + Batch number + Chargen-Nummer + + ChargeId + + + + + Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge + Number assigned by the manufacturer of a material to identify the manufacturer's batch + + + + + + + SecondaryKeyInstance + https://www.hsu-hh.de/aut/aas/secondarykeyinstance + + + + + + + + SecondaryKeyInstance + Instanznummer des IT Systems + + SecondaryKeyInstance + + + + + Führende technische ID im IT System der Instanz + SecondaryKeyInstance + + + + + + + DateOfManufacture + 0173-1#02-AAR972#002 + + + + + + + + Date of manufacture + Herstellungsdatum + + Date of manufacture + + + DATE + + Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist + Date from which the production and / or development process is completed or from which a service is provided completely + + + + + + + DeviceRevision + https://www.hsu-hh.de/aut/aas/devicerevision + + + + + + + + DeviceRevision + DeviceRevision + + DeviceRevision + + + + + DeviceRevision + DeviceRevision + + + + + + + SoftwareRevision + https://www.hsu-hh.de/aut/aas/softwarerevision + + + + + + + + SoftwareRevision + SoftwareRevision + + SoftwareRevision + + + + + SoftwareRevision + SoftwareRevision + + + + + + + HardwareRevision + https://www.hsu-hh.de/aut/aas/hardwarerevision + + + + + + + + HardwareRevision + HardwareRevision + + HardwareRevision + + + + + HardwareRevision + HardwareRevision + + + + + + + QrCode + https://www.hsu-hh.de/aut/aas/qrcode + + + + + + + + QrCode + QrCode + + QrCode + + + + + In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. + QrCode + + + + + + + OrganisationContactInfo + https://www.hsu-hh.de/aut/aas/contactinfo + + + + + + + + Contact Info + Kontakt Info + + OrganisationContactInfo + + + + + Sammlung für die allgemeinen Kontaktdaten + Collection for general contact data + + + + + + + PhysicalAddress + https://www.hsu-hh.de/aut/aas/physicaladdress + + + + + + + + PhysicalAddress + Physische Adresse + + PhysicalAddress + + + + + Sammlung für reale physische Adresse + Collection for real physical address + + + + + + + CountryCode + 0173-1#02-AAO730#001 + + + + + + + + + + + + Landeskennung + Country code + + Country code + + + + + Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes + agreed upon symbol for unambiguous identification of a country + + + + + + + Street + 0173-1#02-AAO128#001 + + + + + + + + Strasse + Street + + Street + + + + + Name der Strasse und Hausnummer + Street name and house number + + + + + + + Zip + 0173-1#02-AAO129#002 + + + + + + + + Zip + Postleitzahl + + PostalCode + + + + + ZIP code of address + Postleitzahl der Anschrift + + + + + + + CityTown + 0173-1#02-AAO132#001 + + + + + + + + Ort + City/town + + City/town + + + + + Town or city of the company + Ortsangabe + + + + + + + StateCounty + 0173-1#02-AAO133#002 + + + + + + + + state/county + Bundesland + + StateCounty + + + + + Bundesland + state/county + + + + + + + Email + https://www.hsu-hh.de/aut/aas/email + + + + + + + + Emailadresse + Email address + + Email + + + + + Emailadresse + Email address + + + + + + + TelephoneContact + https://www.hsu-hh.de/aut/aas/ContactInfo/TelephoneContact + + + + + + + + Telephone Contact + Telefonkontakt + + TelephoneContact + + + + + Sammlung für Kontaktdaten über Telefon + Collection for contact data via telephone + + + + + + + PhoneNumber + 0173-1#02-AAO136#002 + + + + + + + + Telefonnummer + telephone number + + Phone + + + + + vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist + complete telephone number to be called to reach a business partner + + + + + + + CompanyLogo + https://www.hsu-hh.de/aut/aas/companylogo + + + + + + + + Firmenlogo + CompanyLogo + + CompanyLogo + + + + + Firmenlogo + CompanyLogo + + + + + + + URL + 0173-1#02-AAO694#001 + + + + + + + + Internetadresse + Internet address + + URL + + + + + stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html + Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html + + + + + + + ProductCountryOfOrigin + 0173-1#02-AAO841#001 + + + + + + + + Produkt Ursprungsland + Product country of origin + + CountryOfOrigin + + + + + Land in dem das Produkt hergestellt wurde (Hersteller Land) + Country in which the product is manufactured (manufacturer country) + + + + + + + YearOfConstruction + 0173-1#02-AAP906#001 + + + + + + + + Year of construction + Baujahr + + YearOfConstruction + + + + + Jahreszahl als Datumsangabe für die Fertigstellung des Objektes + Year as completion date of object + + + + + + + File + 0173-1#02-AAD005#008 + + + + www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 + + + + + + Enthaltene Doku. Datei + Embedded Doc. file + + File + + + + + Verweis/ BLOB auf enthaltene Dokumentations-Datei. + Reference/ BLOB to embedded documentation file. + + + + + + + ProductMarking + https://www.hsu-hh.de/aut/aas/productmarking + + + + + + + + Produktkennzeichnung + Product Marking + + ProductMarking + + + + + Sammlungsdatei für Produktkennzeichnung + Collection file for product marking + + + + + + + CEQualificationPresent + 0173-1#02-BAF053#008 + + + + + + + + CE-Kennzeichnung vorhanden + CE- qualification present + + CEMarkingPresent + + + BOOLEAN + + whether CE- qualification is present + Angabe, ob CE-Kennzeichnung vorhanden ist + + + + + + + CRUUSLabelingPresent + 0173-1#02-AAR528#005 + + + + + + + + Kennzeichnung (RCM) vorhanden + RCM labeling present + + CRUUSLabelingPresent + + + BOOLEAN + + indication whether the product is equipped with a specified RCM labeling + Angabe, ob das Produkt mit einer spezifizierten RCM-Kennzeichnung ausgestattet ist + + + + + + + DocumentClassification_ClassId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + + + + Dokumentkategorie + Document category + + DocCategory + + + + + Dokumentkategorie nach VDI 2770:2018/10 + Document category after VDI 2770:2018/10 + + + + + + + DocumentId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId + + + + + + + + DocumentId + Dokumenten-Nummer + + DocumentId + + + + + Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. + TBD + + + + + + + VDI2770_DomainId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId + + + + + + + + Domain-Nummer + DomainId + + DomainId + + + + + Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. + TBD + + + + + + + VDI2770_IdType + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType + + + + + + + + Nummerntyp + IdType + + IdType + + + + + Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. + TBD + + + + + + + ValString + www.company.com/ids/cd/4490_8182_7091_6124 + + + + + + + + Wert + Value String + + ValString + + + + + Ausdruck für den Wert der übergeordneten Collection. + Value string for the collection value on the next superordinate level + + + + + + + DocumentationItem + 0173-1#02-AAD001#001 + + + + + + + + Dokumentationsgruppe + Documentation item + + DocumentationItem + + + + + Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. + Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. + + + + + + + DocumentIdDomain + www.company.com/ids/cd/6003_8182_7091_9350 + + + + + + + + DocumentIdDomain + DocumentIdDomain + + DocumentIdDomain + + + + + Angabe einer Liste von Domänen, in de-nen die DocumentIds des Dokuments eindeutig sind + TBD + + + + + + + DocumentDomainId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId + + + + + + + + DocumentDomainId + DocumentDomainId + + DocumentDomainId + + + + + Kennung oder Kennzeichen einer Domäne + TBD + + + + + + + VDI2770_Party + www.company.com/ids/cd/3153_8182_7091_4327 + + + + + + + + Party + Party + + Party + + + + + Verweis auf eine Party (siehe VDI 2770 Anhang C1.17), die für diese Domäne verantwortlich ist + TBD + + + + + + + VDI2770_Role + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role + + + + + + + + Rolle + Role + + Role + + + + + Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) + TBD + + + + + + + VDI2770_Organisation + www.company.com/ids/cd/9214_8182_7091_6391 + + + + + + + + Organisation + Organisation + + Organisation + + + + + Angabe einer Organisation + TBD + + + + + + + VDI2770_OrganisationId + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId + + + + + + + + Organisation ID + Organisation ID + + OrganisationId + + + + + eindeutige ID für die Organisation + TBD + + + + + + + VDI2770_OrganisationName + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName + + + + + + + + OrganisationName + OrganisationName + + OrganisationName + + + + + gebräuchliche Bezeichnung für die Organisation + TBD + + + + + + + VDI2770_OrganisationOfficialName + http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName + + + + + + + + Offizieller Name der Organisation + Organisation Official Name + + OrganisationOfficialName + + + + + offizieller Name der Organisation + TBD + + + + + + + DocumentPartId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId + + + + + + + + Dokumenten-Teilnummer + DocumentPartId + + DocumentPartId + + + + + Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. + TBD + + + + + + + VDI2770_Description + http://www.vdi.de/2770/AssetDocumentation/Document/Description + + + + + + + + Beschreibung + Description + + Description + + + + + Beschreibung für die nächste übergeordnete Collection + TBD + + + + + + + VDI2770_ClassName + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName + + + + + + + + Klassenname + Class Name + + ClassName + + + + + Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. + TBD + + + + + + + DocumentVersion_LanguageCode + http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode + + + + + + + + Sprachenschlüssel + LanguageCode + + LanguageCode + + + + + Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 + TBD + + + + + + + VDI2770_ClassificationSystem + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem + + + + + + + + Klassifizierungssystem + classification system + + ClassificationSystem + + + + + Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. + TBD + + + + + + + DocumentVersion + www.company.com/ids/cd/2580_0282_7091_6213 + + + + + + + + Dokumenten-Version + DocumentVersion + + DocumentVersion + + + + + Zu jedem Dokument muss eine Menge von mindestens einer Dokumentenversion existieren. Es können auch mehrere Dokumentenversionen ausgeliefert werden. + TBD + + + + + + + DocumentVersionId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId + + + + + + + + Dokumenten-Versionsnummer + DocumentVersionId + + DocumentVersionId + + + + + Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. + TBD + + + + + + + VDI2770_Language + www.company.com/ids/cd/0231_0282_7091_5062 + + + + + + + + Sprache + Language + + Language + + + + + Liste der im Dokument verwendeten Sprachen + TBD + + + + + + + DocumentVersion_Description + www.company.com/ids/cd/9151_0282_7091_8032 + + + + + + + + Beschreibung zur DocumentVersion + DocumentVersion Description + + DocumentVersion_Description + + + + + Zusammenfassende Beschreibungen zur Dokumentenversion in ggf. unterschiedlichen Sprachen. + TBD + + + + + + + VDI2770_Title + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title + + + + + + + + Titel + Title + + VDI2770_Title + + + + + sprachabhängiger Titel des Dokuments + TBD + + + + + + + VDI2770_Summary + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary + + + + + + + + Zusammenfassung + Summary + + Summary + + + + + sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts + TBD + + + + + + + VDI2770_Keywords + http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords + + + + + + + + Schlagwörter + Keywords + + Keywords + + + + + sprachabhängige, durch Komma getrennte Liste von Schlagwörtern + TBD + + + + + + + VDI2770_LifeCycleStatus + www.company.com/ids/cd/0282_0282_7091_7878 + + + + + + + + Lebenszyklus Status + LifeCycleStatus + + LifeCycleStatus + + + + + Liste von Statusdefinitionen mit Bezug zum Dokumentenlebenszyklus inklusive der Angabe der Beteiligten und einem zugehörigen Zeitstempel + TBD + + + + + + + VDI2770_StatusValue + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue + + + + + + + + Statuswert + StatusValue + + StatusValue + + + + + Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) + TBD + + + + + + + VDI2770_SetDate + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate + + + + + + + + Erstellungsdatum + Set Date + + SetDate + + + + + Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). + TBD + + + + + + + VDI2770_Purpose + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose + + + + + + + + Zweck + Purpose + + Purpose + + + + + Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. + TBD + + + + + + + VDI2770_BasedOnProcedure + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure + + + + + + + + Prozedur + Procedure + + BasedOnProcedure + + + + + textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt + TBD + + + + + + + VDI2770_Comments + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments + + + + + + + + Kommentar + Comments + + Comments + + + + + textuelle Bemerkungen und Anmerkungen zum Status + TBD + + + + + + + DocumentRelationship + www.company.com/ids/cd/1204_0282_7091_7896 + + + + + + + + Dokumenten-Beziehung + Document Relationship + + DocumentRelationship + + + + + Liste von Beziehungen zu anderen Dokumenten. Es ist möglich, auf einen Dokument, ein Dokument in einer spezifischen Dokumentenversion oder auch ein Teildokument zu verweisen. + TBD + + + + + + + DocumentRelationship_Type + www.company.com/ids/cd/5044_0282_7091_6924 + + + + + + + + Typ der Dokumenten-Beziehung + DocumentRelationship_Type + + DocumentRelationship_Type + + + + + Typisierung der Beziehung zwischen den beiden DocumentVersions. Folgende Beziehungsarten können verwendet werden: Affecting (hat Auswirkungen auf), ReferesTo (bezieht sich auf), BasedOn (basiert auf) + TBD + + + + + + + StoredDocumentRepresentation + www.company.com/ids/cd/3094_0282_7091_2090 + + + + + + + + StoredDocumentRepresentation + StoredDocumentRepresentation + + StoredDocumentRepresentation + + + + + Liste von digitalen Repräsentationen zur DocumentVersion + TBD + + + + + + + VDI2770_DigitalFile + www.company.com/ids/cd/2305_0282_7091_2077 + + + + + + + + Digitaler-File + DigitalFile + + DigitalFile + + + + + Datei, die die DocumentVersion (siehe VDI 2770:2018 Anhang C1.5) repräsentiert Neben der obligatorischen PDF/A-Datei können weitere Dateien angegeben werden. + TBD + + + + + + + VDI2770_FileId + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId + + + + + + + + ID der Datei + File ID + + FileId + + + + + eindeutige ID für die Datei + TBD + + + + + + + VDI2770_FileName + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName + + + + + + + + Dateiname + File name + + FileName + + + + + Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. + TBD + + + + + + + VDI2770_FileFormat + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat + + + + + + + + Datei Format + File format + + FileFormat + + + + + Angabe eines Media Typs gemäß der Liste der IANA + TBD + + + + + + + DocumentType + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType + + + + + + + + Dokumententyp + Document Type + + DocumentType + + + + + Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) + TBD + + + + + + + VDI2770_ReferencedObject + www.company.com/ids/cd/2570_2282_7091_0055 + + + + + + + + ReferencedObject + ReferencedObject + + ReferencedObject + + + + + Liste von IDs für ein Objekt, auf das sich das Dokument bezieht + TBD + + + + + + + VDI2770_ReferencedObject_Type + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType + + + + + + + + Typ + Type + + Type + + + + + Für Type des Objekts muss immer Product angegeben werden. + TBD + + + + + + + VDI2770_ReferencedObject_RefType + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType + + + + + + + + RefType + RefType + + RefType + + + + + Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) + TBD + + + + + + + VDI2770_ReferencedObject_ObjectId + http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId + + + + + + + + ObjectId + ObjectId + + ObjectId + + + + + Angabe der Identifikationsnummer zum Objekt + TBD + + + + + + + ContactInfo_Role + https://www.hsu-hh.de/aut/aas/role + + + + + + + + Rolle + Role + + Role + + + + + Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt + Information to specify the role which the organisation of ContactInfo plays + + + + + + + Fax + https://www.hsu-hh.de/aut/aas/fax + + + + + + + + Fax + Fax + + Fax + + + + + Faxnummer + Fax number + + + + + + + 0173-1#02-AAO136#002 + + + + + DocGroup_01 + www.company.com/ids/cd/1420_0113_7091_0891 + + + + + + + + 01 Identifikation + 01 Identification + + DocGroup_01 + + + + + Der Gruppe „Identifikation“ werden alle Dokumente zugeordnet, die der Identifikation des Objekts dienen, zu dem die Herstellerdokumentation gehört. Sie enthält insbesondere Informationen, die die elektronische Datenverarbeitung unterstützen und die es dem Hersteller und dem Nutzer erlauben, das Objekt in ihren jeweiligen elektronischen Datenverarbeitungssystemen zu identifizieren. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocGroup_02 + www.company.com/ids/cd/4323_0113_7091_2591 + + + + + + + + 02 Technische Beschaffenheit + 02 Technical characteristics + + DocGroup_02 + + + + + Die Gruppe „Technische Beschaffenheit“ beinhaltet alle Dokumente, die die technischen Anforderungen, deren Erfüllung und die Bescheinigung der Eigenschaften eines Objekts betreffen. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocGroup_03 + www.company.com/ids/cd/5053_0113_7091_5741 + + + + + + + + 03 Tätigkeitsbezogene Dokumente + 03 Work-related documents + + DocGroup_03 + + + + + Die Gruppe „Tätigkeitsbezogene Dokumente“ beinhaltet alle Dokumente, die Anforderungen, Hinweise und Hilfestellungen für Tätigkeiten an und mit dem Objekt nach der Übergabe an den Nutzer betreffen. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocGroup_04 + www.company.com/ids/cd/5473_0113_7091_1588 + + + + + + + + 04 Vertragsunterlagen + 04 Contract documents + + DocGroup_04 + + + + + Der Gruppe „Vertragsunterlagen“ werden alle Dokumente zugeordnet, die im Zusammenhang mit der kaufmännischen Abwicklung eines Vertrages stehen, aber nicht selbst Gegenstand des Vertrags sind und lediglich zur Erfüllung des Vertrags dienen. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocCategory_01-01 + www.company.com/ids/cd/9593_0113_7091_2401 + + + + + + + + 01-01 Identifikation + 01-01 Identification + + DocCategory_01-01 + + + + + Der Kategorie „Identifikation“ werden alle Dokumente zugeordnet, die der Identifikation des Objekts dienen, zu dem die Herstellerdokumentation gehört. Sie enthält insbesondere Informationen, die die elektronische Datenverarbeitung unterstützen und die es dem Hersteller und dem Nutzer erlauben, das Objekt in ihren jeweiligen elektronischen Datenverarbeitungssystemen zu identifizieren. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocCategory_02-01 + www.company.com/ids/cd/5314_0113_7091_8640 + + + + + + + + 02-01 Techn. Spezifikation + 02-01 Technical specification + + DocCategory_02-01 + + + + + Der Kategorie „Technische Spezifikation“ werden alle Dokumente zugeordnet, die die Anforderungen an ein Objekt sowie dessen Eigenschaften beschreiben. Dazu gehören die Auslegungsdaten, Berechnungen (Verfahrenstechnik, Festigkeit usw.) sowie alle relevanten Eigenschaften des übergebenen Objekts. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocCategory_02-02 + www.company.com/ids/cd/5515_0113_7091_8581 + + + + + + + + 02-02 Zeichnungen, Pläne + 02-02 Drawings and diagrams + + DocCategory_02-02 + + + + + Der Kategorie „Zeichnungen, Pläne“ werden alle Dokumente zugeordnet, die Zeichnungscharakter haben, das heißt eine grafische Darstellung zur Übermittlung von Information nutzen. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocCategory_02-03 + www.company.com/ids/cd/0335_0113_7091_0312 + + + + + + + + 02-03 Bauteile + 02-03 Components + + DocCategory_02-03 + + + + + Der Kategorie „Bauteile“ werden alle Dokumente zugeordnet, die eine strukturierte Auflistung der Teile eines Objekts beinhalten. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocCategory_02-04 + www.company.com/ids/cd/2155_0113_7091_3955 + + + + + + + + 02-04 Zeugnisse, Zertifikate, Bescheinigungen + 02-04 Reports, Certificates, declarations + + DocCategory_02-04 + + + + + Der Kategorie „Zeugnisse, Zertifikate, Bescheinigungen“ werden alle Dokumente zugeordnet, die Urkundencharakter haben. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocCategory_03-01 + www.company.com/ids/cd/3565_0113_7091_2704 + + + + + + + + 03-01 Montage, Inbetriebnahme, Demontage + 03-01 Assembly, commissioning, disassembly + + DocCategory_03-01 + + + + + Der Kategorie „Montage, Demontage“ werden alle Dokumente zugeordnet, die Tätigkeiten und Maßnahmen beschreiben, die erforderlich sind, um ein Objekt: zu transportieren oder zu lagern, als Ganzes in ein übergeordnetes Objekt einzubauen, auszubauen oder an dieses anzuschließen, so weit vorzubereiten, dass es zur Inbetriebnahme bereitsteht, nach Abschluss der Nutzungsphase zu demontieren und zu entsorgen + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocCategory_03-02 + www.company.com/ids/cd/4290_1113_7091_7266 + + + + + + + + 03-02 Bedienung + 03-02 Operation + + DocCategory_03-02 + + + + + Der Kategorie „Bedienung“ werden Dokumente zur bestimmungsgemäßen Verwendung und sicheren Bedienung eines Objekts zugeordnet. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocCategory_03-03 + www.company.com/ids/cd/2211_1113_7091_3911 + + + + + + + + 03-03 Allgemeine Sicherheit + 03-03 Safety in general + + DocCategory_03-03 + + + + + Der Kategorie „Allgemeine Sicherheit“ werden Dokumente zugeordnet, die Sicherheitshinweise auf mögliche Gefährdungen bei der Verwendung des Objekts geben. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocCategory_03-04 + www.company.com/ids/cd/7521_1113_7091_4471 + + + + + + + + 03-04 Inspektion, Wartung, Prüfung + 03-04 Inspection, maintenance, test + + DocCategory_03-04 + + + + + Der Kategorie „Inspektion, Wartung, Prüfung“ werden alle Dokumente zugeordnet, die vom Hersteller vorgeschlagene wiederkehrende Maßnahmen zur Feststellung oder zum Erhalt des funktionsfähigen Zustands beschreiben. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocCategory_03-05 + www.company.com/ids/cd/5161_1113_7091_0458 + + + + + + + + 03-05 Instandsetzung + 03-05 Repair + + DocCategory_03-05 + + + + + Der Kategorie „Instandsetzung“ werden alle Dokumente zugeordnet, die Maßnahmen zur Wiederherstellung der Funktion eines Objekts betreffen. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocCategory_03-06 + www.company.com/ids/cd/2181_1113_7091_5948 + + + + + + + + 03-06 Ersatzteile + 03-06 Spare parts + + DocCategory_03-06 + + + + + Der Kategorie „Ersatzteile“ werden Dokumente zugeordnet, die Informationen zu Ersatzteilen und Hilfs- und Betriebsstoffen enthalten. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + DocCategory_04-01 + www.company.com/ids/cd/5391_1113_7091_8996 + + + + + + + + 04-01 Vertragsunterlagen + 04-01 Contract documents + + DocCategory_04-01 + + + + + Der Kategorie „Vertragsunterlagen“ werden alle Dokumente zugeordnet, die im Zusammenhang mit der kaufmännischen Abwicklung eines Vertrages stehen, aber nicht selbst Gegenstand des Vertrags sind und lediglich zur Erfüllung des Vertrags dienen. + TBD + + + + + + + http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId + + + + + \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestValidateXml.cs b/src/AasxCsharpLibrary.Tests/TestValidateXml.cs new file mode 100644 index 000000000..dc4b2f64f --- /dev/null +++ b/src/AasxCsharpLibrary.Tests/TestValidateXml.cs @@ -0,0 +1,56 @@ +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Environment = System.Environment; +using InvalidOperationException = System.InvalidOperationException; +using Path = System.IO.Path; + +namespace AdminShellNS.Tests +{ + public class TestOnFiles + { + [Test] + public void TestSuccess() + { + string successDir = Path.Combine( + TestContext.CurrentContext.TestDirectory, + "TestResources\\AasxCsharpLibrary.Tests\\XmlValidation\\expectedOk"); + + if (!System.IO.Directory.Exists(successDir)) + { + throw new InvalidOperationException( + $"The directory containing the valid AAS XML files does not exist or is not a directory: " + + successDir); + } + + var paths = System.IO.Directory.GetFiles(successDir) + .Where(p => System.IO.Path.GetExtension(p) == ".xml") + .ToList(); + + if (paths.Count == 0) + { + throw new InvalidOperationException( + $"No *.xml files were found in the directory expected to contain the valid XML files: " + + successDir); + } + + var validator = AasSchemaValidation.NewXmlValidator(); + + foreach (string path in paths) + { + using var fileStream = System.IO.File.OpenRead(path); + var records = new AasValidationRecordList(); + validator.Validate(records, fileStream); + if (records.Count != 0) + { + var parts = new List + { + $"Failed to validate XML file {path}:" + }; + parts.AddRange(records.Select((r) => r.Message)); + throw new AssertionException(string.Join(Environment.NewLine, parts)); + } + } + } + } +} diff --git a/src/AasxCsharpLibrary/AasxCompatibilityModels/V10/AdminShellV10.cs b/src/AasxCsharpLibrary/AasxCompatibilityModels/V10/AdminShellV10.cs new file mode 100644 index 000000000..91c73d650 --- /dev/null +++ b/src/AasxCsharpLibrary/AasxCompatibilityModels/V10/AdminShellV10.cs @@ -0,0 +1,4649 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ + +using System; +using System.Collections.Generic; +using System.IO; +using System.IO.Packaging; +using System.Text.RegularExpressions; +using System.Xml; +using System.Xml.Serialization; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +// ReSharper disable All .. as this is legacy code! + +#if !DoNotUseAasxCompatibilityModels + +namespace AasxCompatibilityModels +{ + #region Utils + // + // Utils + // + + public class AdminShellUtilV10 + { + public static string EvalToNonNullString(string fmt, object o, string elseString = "") + { + if (o == null) + return elseString; + return string.Format(fmt, o); + } + + public static string EvalToNonEmptyString(string fmt, string o, string elseString = "") + { + if (o == "") + return elseString; + return string.Format(fmt, o); + } + + public static string FilterFriendlyName(string src) + { + if (src == null) + return null; + return Regex.Replace(src, @"[^a-zA-Z0-9\-_]", "_"); + } + + public static bool HasWhitespace(string src) + { + if (src == null) + throw new ArgumentNullException(nameof(src)); + for (var i = 0; i < src.Length; i++) + foreach (var c in src) + if (char.IsWhiteSpace(c)) + return true; + return false; + } + + public static bool ComplyIdShort(string src) + { + if (src == null) + throw new ArgumentNullException(nameof(src)); + var res = true; + foreach (var c in src) + if (!Char.IsLetterOrDigit(c) && c != '_') + res = false; + if (src.Length > 0 && !Char.IsLetter(src[0])) + res = false; + return res; + } + + public static string ShortLocation(Exception ex) + { + if (ex == null || ex.StackTrace == null) + return ""; + string[] lines = ex.StackTrace.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None); + if (lines.Length < 1) + return ""; + // search for " in " + // as the most actual stacktrace might be a built-in function, this might not work and therefore + // go down in the stack + int currLine = 0; + while (true) + { + // nothing found at all + if (currLine >= lines.Length) + return ""; + // access current line + var p = lines[currLine].IndexOf(" in ", StringComparison.Ordinal); + if (p < 0) + { + // advance to next oldest line + currLine++; + continue; + } + // search last "\" or "/", to get only filename portion and position + p = lines[currLine].LastIndexOfAny(new[] { '\\', '/' }); + if (p < 0) + { + // advance to next oldest line + currLine++; + continue; + } + // return this + return lines[currLine].Substring(p); + } + } + + } + + #endregion + + + #region AdminShell_V1_0 + + /// + /// Version of Details of Administration Shell Part 1 V1.0 published Nov/Dec/Jan 2018/19 + /// + public class AdminShellV10 + { + + public class Identification + { + + // members + + [XmlAttribute] + public string idType = ""; + [XmlText] + public string id = ""; + + // constructors + + public Identification() { } + + public Identification(string idType, string id) + { + this.idType = idType; + this.id = id; + } + + public Identification(Identification src) + { + this.idType = src.idType; + this.id = src.id; + } + + // Creator with validation + + public static Identification CreateNew(string idType, string id) + { + if (idType == null || id == null) + return null; + var found = false; + foreach (var x in Key.IdentifierTypeNames) + found = found || idType.ToLower().Trim() == x.ToLower().Trim(); + if (!found) + return null; + return new Identification(idType, id); + } + + // further + + public bool IsEqual(Identification other) + { + return (this.idType.Trim().ToLower() == other.idType.Trim().ToLower() + && this.id.Trim().ToLower() == other.id.Trim().ToLower()); + } + + public override string ToString() + { + return $"[{this.idType}] {this.id}"; + } + } + + public class Administration + { + + // members + + public string version = ""; + public string revision = ""; + + // constructors + + public Administration() { } + + public Administration(Administration src) + { + this.version = src.version; + this.revision = src.revision; + } + + public Administration(string version, string revision) + { + this.version = version; + this.revision = revision; + } + + public override string ToString() + { + return $"R={this.version}, V={this.revision}"; + } + } + + public class Key + { + [XmlAttribute] + public string type = ""; + [XmlAttribute] + public bool local = false; + + [XmlAttribute] + [JsonIgnore] + public string idType = ""; + [XmlIgnore] + [JsonProperty(PropertyName = "idType")] + public string JsonIdType + { + get { return (idType == "idShort") ? "IdShort" : idType; } + set { if (value == "IdShort") idType = "idShort"; else idType = value; } + } + + [XmlText] + public string value = ""; + + [XmlIgnore] + [JsonProperty(PropertyName = "index")] + public int index = 0; + + public Key() + { + } + + public Key(Key src) + { + this.type = src.type; + this.local = src.local; + this.idType = src.idType; + this.value = src.value; + } + + public Key(string type, bool local, string idType, string value) + { + this.type = type; + this.local = local; + this.idType = idType; + this.value = value; + } + + public static Key CreateNew(string type, bool local, string idType, string value) + { + var k = new Key(); + k.type = type; + k.local = local; + k.idType = idType; + k.value = value; + return (k); + } + + public static Key GetFromRef(Reference r) + { + if (r == null || r.Count != 1) + return null; + return r[0]; + } + + public override string ToString() + { + var local = (this.local) ? "Local" : "not Local"; + return $"[{this.type}, {local}, {this.idType}, {this.value}]"; + } + + public static string KeyListToString(List keys) + { + if (keys == null || keys.Count < 1) + return ""; + // normally, exactly one key + if (keys.Count == 1) + return keys[0].ToString(); + // multiple! + var s = "[ "; + foreach (var k in keys) + { + if (s.Length > 0) + s += ", "; + s += k.ToString(); + } + return s + " ]"; + } + + public static string[] KeyElements = new string[] { + "GlobalReference", + "AccessPermissionRule", + "Asset", + "AssetAdministrationShell", + "ConceptDescription", + "Submodel", + "SubmodelRef", // not completely right, but used by Package Explorer + "Blob", + "ConceptDictionary", + "DataElement", + "File", + "Event", + "Operation", + "OperationVariable", + "Property", + "ReferenceElement", + "RelationshipElement", + "SubmodelElement", + "SubmodelElementCollection", + "View" }; + + public static string[] ReferableElements = new string[] { + "AccessPermissionRule", + "Asset", + "AssetAdministrationShell", + "ConceptDescription", + "Submodel", + "Blob", + "ConceptDictionary", + "DataElement", + "File", + "Event", + "Operation", + "OperationVariable", + "Property", + "ReferenceElement", + "RelationshipElement", + "SubmodelElement", + "SubmodelElementCollection", + "View" + }; + + public static string[] SubmodelElements = new string[] { + "DataElement", + "File", + "Event", + "Operation", + "Property", + "ReferenceElement", + "RelationshipElement", + "SubmodelElementCollection"}; + + public static string[] IdentifiableElements = new string[] { + "Asset", + "AssetAdministrationShell", + "ConceptDescription", + "Submodel" }; + + // use this in list to designate all of the above elements + public static string AllElements = "All"; + + // use this in list to designate the GlobalReference + public static string GlobalReference = "GlobalReference"; + public static string ConceptDescription = "ConceptDescription"; + public static string SubmodelRef = "SubmodelRef"; + public static string Submodel = "Submodel"; + public static string Asset = "Asset"; + public static string AAS = "AssetAdministrationShell"; + + public static string[] IdentifierTypeNames = new string[] { "IdShort", "Custom", "IRDI", "URI" }; + + public enum IdentifierType { IdShort = 0, Custom, IRDI, URI }; + + public static string GetIdentifierTypeName(IdentifierType t) + { + return IdentifierTypeNames[(int)t]; + } + + // some helpers + + public static bool IsInKeyElements(string ke) + { + var res = false; + foreach (var s in KeyElements) + if (s.Trim().ToLower() == ke.Trim().ToLower()) + res = true; + return res; + } + + } + + // the whole class shall not be serialized by having it private + public class KeyList + { + // members + + [XmlIgnore] // anyway, as it is privat + private List key = new List(); + + // getters / setters + + [XmlIgnore] + public List Keys { get { return key; } } + [XmlIgnore] + public bool IsEmpty { get { return key == null || key.Count < 1; } } + [XmlIgnore] + public int Count { get { if (key == null) return 0; return key.Count; } } + [XmlIgnore] + public Key this[int index] { get { return key[index]; } } + + // constructors / creators + + public void Add(Key k) + { + key.Add(k); + } + + public static KeyList CreateNew(Key k) + { + var kl = new KeyList(); + kl.Add(k); + return kl; + } + + public static KeyList CreateNew(string type, bool local, string idType, string value) + { + var kl = new KeyList(); + kl.Add(Key.CreateNew(type, local, idType, value)); + return kl; + } + + // other + + public void NumberIndices() + { + if (this.Keys == null) + return; + for (int i = 0; i < this.Keys.Count; i++) + this.Keys[i].index = i; + } + } + + [XmlType(TypeName = "reference")] + public class Reference + { + + // members + + [XmlIgnore] // anyway, as it is privat + [JsonIgnore] + private KeyList keys = new KeyList(); + + // getters / setters + + [XmlArray("keys")] + [XmlArrayItem("key")] + [JsonIgnore] + public List Keys { get { return keys?.Keys; } } + [XmlIgnore] + [JsonProperty(PropertyName = "keys")] + public List JsonKeys + { + get + { + keys?.NumberIndices(); + return keys.Keys; + } + } + + [XmlIgnore] + [JsonIgnore] + public bool IsEmpty { get { return keys == null || keys.Count < 1; } } + [XmlIgnore] + [JsonIgnore] + public int Count { get { if (keys == null) return 0; return keys.Count; } } + [XmlIgnore] + [JsonIgnore] + public Key this[int index] { get { return keys[index]; } } + + // constructors / creators + + public Reference() + { + } + + public Reference(Key k) + { + if (k != null) + keys.Keys.Add(k); + } + + public Reference(Reference src) + { + if (src != null) + foreach (var k in src.Keys) + keys.Add(new Key(k)); + } + + public Reference(SemanticId src) + { + if (src != null) + foreach (var k in src.Keys) + keys.Add(new Key(k)); + } + + public static Reference CreateNew(Key k) + { + if (k == null) + return null; + var r = new Reference(); + r.keys.Keys.Add(k); + return r; + } + + public static Reference CreateNew(List k) + { + if (k == null) + return null; + var r = new Reference(); + r.keys.Keys.AddRange(k); + return r; + } + + public static Reference CreateNew(string type, bool local, string idType, string value) + { + if (type == null || idType == null || value == null) + return null; + var r = new Reference(); + r.keys.Keys.Add(Key.CreateNew(type, local, idType, value)); + return r; + } + + public static Reference CreateIrdiReference(string irdi) + { + if (irdi == null) + return null; + var r = new Reference(); + r.keys.Keys.Add(new Key(Key.GlobalReference, false, "IRDI", irdi)); + return r; + } + + // further + + public bool IsExactlyOneKey(string type, bool local, string idType, string id) + { + if (keys == null || keys.Keys == null || keys.Count != 1) + return false; + var k = keys.Keys[0]; + return k.type == type && k.local == local && k.idType == idType && k.value == id; + } + + public bool MatchesTo(Identification other) + { + return (this.keys != null && this.keys.Count == 1 + && this.keys[0].idType.Trim().ToLower() == other.idType.Trim().ToLower() + && this.keys[0].value.Trim().ToLower() == other.id.Trim().ToLower()); + } + + public bool MatchesTo(Reference other) + { + if (this.keys == null || other == null || other.keys == null || other.Count != this.Count) + return false; + + var same = true; + for (int i = 0; i < this.Count; i++) + same = same + && this.keys[i].type.Trim().ToLower() == other.keys[i].type.Trim().ToLower() + && this.keys[i].local == other.keys[i].local + && this.keys[i].idType.Trim().ToLower() == other.keys[i].idType.Trim().ToLower() + && this.keys[i].value.Trim().ToLower() == other.keys[i].value.Trim().ToLower(); + + return same; + } + + public override string ToString() + { + var res = ""; + if (keys != null && keys.Keys != null) + foreach (var k in keys.Keys) + res += k.ToString() + ","; + return res.TrimEnd(','); + } + + public string ListOfValues(string delim) + { + string res = ""; + if (this.Keys != null) + foreach (var x in this.Keys) + { + if (x == null) + continue; + if (res != "") res += delim; + res += x.value; + } + return res; + } + + public virtual string GetElementName() + { + return "Reference"; + } + } + + [XmlType(TypeName = "derivedFrom")] + public class AssetAdministrationShellRef : Reference + { + // constructors + + public AssetAdministrationShellRef() : base() { } + + public AssetAdministrationShellRef(Key k) : base(k) { } + + public AssetAdministrationShellRef(Reference src) : base(src) { } + + // further methods + + public override string GetElementName() + { + return "AssetAdministrationShellRef"; + } + } + + [XmlType(TypeName = "assetRef")] + public class AssetRef : Reference + { + // constructors + + public AssetRef() : base() { } + + public AssetRef(AssetRef src) : base(src) { } + + // translation + + public static AssetRef CreateNew(Reference r) + { + return (AssetRef)new Reference(r); + } + + // further methods + + public override string GetElementName() + { + return "AssetRef"; + } + } + + [XmlType(TypeName = "submodelRef")] + public class SubmodelRef : Reference + { + // constructors + + public SubmodelRef() : base() { } + + public SubmodelRef(SubmodelRef src) : base(src) { } + + public static new SubmodelRef CreateNew(string type, bool local, string idType, string value) + { + var r = new SubmodelRef(); + r.Keys.Add(Key.CreateNew(type, local, idType, value)); + return r; + } + + public static SubmodelRef CreateNew(Reference src) + { + if (src == null || src.Keys == null) + return null; + var r = new SubmodelRef(); + r.Keys.AddRange(src.Keys); + return r; + } + + // further methods + + public override string GetElementName() + { + return "SubmodelRef"; + } + } + + [XmlType(TypeName = "conceptDescriptionRef")] + public class ConceptDescriptionRef : Reference + { + // constructors + + public ConceptDescriptionRef() : base() { } + + public ConceptDescriptionRef(ConceptDescriptionRef src) : base(src) { } + + // further methods + + public new static ConceptDescriptionRef CreateNew(string type, bool local, string idType, string value) + { + var r = new ConceptDescriptionRef(); + r.Keys.Add(Key.CreateNew(type, local, idType, value)); + return r; + } + + public override string GetElementName() + { + return "ConceptDescriptionRef"; + } + } + + [XmlType(TypeName = "dataSpecificationRef")] + public class DataSpecificationRef : Reference + { + // constructors + + public DataSpecificationRef() : base() { } + + public DataSpecificationRef(DataSpecificationRef src) : base(src) { } + + // further methods + + public static DataSpecificationRef CreateNew(Reference src) + { + if (src == null || src.Keys == null) + return null; + var res = new DataSpecificationRef(); + foreach (var k in src.Keys) + res.Keys.Add(new Key(k)); + return res; + } + + public override string GetElementName() + { + return "DataSpecificationRef"; + } + } + + [XmlType(TypeName = "conceptDescriptions")] + public class ConceptDescriptionRefs + { + [XmlElement(ElementName = "conceptDescriptionRef")] + public List conceptDescriptions = new List(); + + // constructors + + public ConceptDescriptionRefs() { } + + public ConceptDescriptionRefs(ConceptDescriptionRefs src) + { + if (src.conceptDescriptions != null) + foreach (var cdr in src.conceptDescriptions) + this.conceptDescriptions.Add(new ConceptDescriptionRef(cdr)); + } + } + + [XmlType(TypeName = "containedElementRef")] + public class ContainedElementRef : Reference + { + // constructors + + public ContainedElementRef() { } + public ContainedElementRef(ContainedElementRef src) : base(src) { } + + public static ContainedElementRef CreateNew(Reference src) + { + if (src == null || src.Keys == null) + return null; + var r = new ContainedElementRef(); + r.Keys.AddRange(src.Keys); + return r; + } + + // further methods + + public override string GetElementName() + { + return "ContainedElementRef"; + } + } + + [XmlType(TypeName = "hasDataSpecification")] + public class HasDataSpecification + { + [XmlElement(ElementName = "reference")] // make "reference" go away by magic?! + public List reference = new List(); + + public HasDataSpecification() { } + + public HasDataSpecification(HasDataSpecification src) + { + foreach (var r in src.reference) + reference.Add(new Reference(r)); + } + } + + [XmlType(TypeName = "ContainedElements")] + public class ContainedElements + { + + // members + + [XmlElement(ElementName = "containedElementRef")] // make "reference" go away by magic?! + public List reference = new List(); + + // getter / setter + + public bool IsEmpty { get { return reference == null || reference.Count < 1; } } + public int Count { get { if (reference == null) return 0; return reference.Count; } } + public ContainedElementRef this[int index] { get { return reference[index]; } } + + // Creators + + public ContainedElements() { } + + public ContainedElements(ContainedElements src) + { + if (src.reference != null) + foreach (var r in src.reference) + this.reference.Add(new ContainedElementRef(r)); + } + + public static ContainedElements CreateOrSetInner(ContainedElements outer, ContainedElementRef[] inner) + { + var res = outer; + if (res == null) + res = new ContainedElements(); + if (inner == null) + { + res.reference = null; + return res; + } + res.reference = new List(inner); + return res; + } + + } + + [XmlType(TypeName = "langString", Namespace = "http://www.admin-shell.io/1/0")] + public class LangStr + { + + // members + + [XmlAttribute(Namespace = "http://www.admin-shell.io/1/0")] + [JsonProperty(PropertyName = "language")] + public string lang = ""; + [XmlText] + [JsonProperty(PropertyName = "text")] + public string str = ""; + + // constructors + + public LangStr() { } + + public LangStr(LangStr src) + { + this.lang = src.lang; + this.str = src.str; + } + + public static LangStr CreateNew(string lang, string str) + { + var l = new LangStr(); + l.lang = lang; + l.str = str; + return (l); + } + + public static List CreateManyFromStringArray(string[] s) + { + var r = new List(); + var i = 0; + while ((i + 1) < s.Length) + { + r.Add(LangStr.CreateNew(s[i], s[i + 1])); + i += 2; + } + return r; + } + } + + public class Description + { + + // members + + [XmlElement(ElementName = "langString")] + public List langString = new List(); + + // constructors + + public Description() { } + + public Description(Description src) + { + if (src != null) + foreach (var ls in src.langString) + langString.Add(new LangStr(ls)); + } + } + + public class Kind + { + [XmlText] + public string kind = "Instance"; + + // getters / setters + + [XmlIgnore] + [JsonIgnore] + public bool IsInstance { get { return kind == null || kind.Trim().ToLower() == "instance"; } } + + [XmlIgnore] + [JsonIgnore] + public bool IsType { get { return kind != null && kind.Trim().ToLower() == "type"; } } + + // constructors / creators + + public Kind() { } + + public Kind(Kind src) + { + kind = src.kind; + } + + public Kind(string kind) + { + this.kind = kind; + } + + public static Kind CreateFrom(Kind k) + { + var res = new Kind(); + res.kind = k.kind; + return res; + } + + public static Kind CreateAsType() + { + var res = new Kind(); + res.kind = "Type"; + return res; + } + + public static Kind CreateAsInstance() + { + var res = new Kind(); + res.kind = "Instance"; + return res; + } + } + + public class SemanticId + { + + // members + + [XmlIgnore] + [JsonIgnore] + private KeyList keys = new KeyList(); + + // getters / setters + + [XmlArray("keys")] + [XmlArrayItem("key")] + [JsonIgnore] + public List Keys { get { return keys?.Keys; } } + [XmlIgnore] + [JsonProperty(PropertyName = "keys")] + public List JsonKeys + { + get + { + keys?.NumberIndices(); + return keys.Keys; + } + } + + [XmlIgnore] + [JsonIgnore] + public bool IsEmpty { get { return keys == null || keys.IsEmpty; } } + [XmlIgnore] + [JsonIgnore] + public int Count { get { if (keys == null) return 0; return keys.Count; } } + [XmlIgnore] + [JsonIgnore] + public Key this[int index] { get { return keys[index]; } } + + public override string ToString() + { + return Key.KeyListToString(keys.Keys); + } + + // constructors / creators + + public SemanticId() + { + } + + public SemanticId(SemanticId src) + { + if (src != null) + foreach (var k in src.Keys) + keys.Add(k); + } + + public static SemanticId CreateFromKey(Key key) + { + if (key == null) + return null; + var res = new SemanticId(); + res.Keys.Add(key); + return res; + } + + public static SemanticId CreateFromKeys(List keys) + { + if (keys == null) + return null; + var res = new SemanticId(); + res.Keys.AddRange(keys); + return res; + } + + // matching + + public bool Matches(string type, bool local, string idType, string value) + { + if (this.Count == 1 + && this.keys[0].type.ToLower().Trim() == type.ToLower().Trim() + && this.keys[0].local == local + && this.keys[0].idType.ToLower().Trim() == idType.ToLower().Trim() + && this.keys[0].value.ToLower().Trim() == value.ToLower().Trim()) + return true; + return false; + } + } + + public class Referable + { + + // members + + public string idShort = null; + public string category = null; + + [XmlElement(ElementName = "description")] + [JsonIgnore] + public Description description = null; + [XmlIgnore] + [JsonProperty(PropertyName = "descriptions")] + public List JsonDescription + { + get + { + if (description == null) + return null; + return description.langString; + } + set + { + if (description == null) + description = new Description(); + description.langString = value; + } + } + + [XmlIgnore] + [JsonIgnore] + public Referable parent = null; + + public static string[] ReferableCategoryNames = new string[] { "CONSTANT", "PARAMETER", "VARIABLE" }; + + // constructors + + public Referable() { } + + public Referable(Referable src) + { + this.idShort = src.idShort; + this.category = src.category; + if (src.description != null) + this.description = new Description(src.description); + } + + public void AddDescription(string lang, string str) + { + if (description == null) + description = new Description(); + description.langString.Add(LangStr.CreateNew(lang, str)); + } + + public virtual string GetElementName() + { + return "GlobalReference"; // not correct, but this method wasn't overridden correctly + } + + public string GetFriendlyName() + { + return AdminShellUtilV10.FilterFriendlyName(this.idShort); + } + + public void CollectReferencesByParent(List refs) + { + // check, if this is identifiable + if (this is Identifiable) + { + var idf = this as Identifiable; + var k = Key.CreateNew( + idf.GetElementName(), true, idf.identification.idType, idf.identification.id); + refs.Insert(0, k); + } + else + { + var k = Key.CreateNew(this.GetElementName(), true, "idShort", this.idShort); + refs.Insert(0, k); + // recurse upwards! + if (parent != null && parent is Referable) + (this.parent).CollectReferencesByParent(refs); + } + } + + public string CollectIdShortByParent() + { + // recurse first + var head = ""; + if (!(this is Identifiable) && this.parent != null && this.parent is Referable) + // can go up + head = this.parent.CollectIdShortByParent() + "/"; + // add own + var myid = ""; + if (this.idShort != null && this.idShort.Trim() != "") + myid = this.idShort.Trim(); + // together + return head + myid; + } + } + + public class Identifiable : Referable + { + + // members + + public Identification identification = new Identification(); + public Administration administration = null; + + // constructors + + public Identifiable() : base() { } + + public Identifiable(Identifiable src) + : base(src) + { + if (src.identification != null) + this.identification = new Identification(src.identification); + if (src.administration != null) + this.administration = new Administration(src.administration); + } + + public void SetIdentification(string idType, string id, string idShort = null) + { + identification.idType = idType; + identification.id = id; + if (idShort != null) + this.idShort = idShort; + } + + public void SetAdminstration(string version, string revision) + { + if (administration == null) + administration = new Administration(); + administration.version = version; + administration.revision = revision; + } + + public new string GetFriendlyName() + { + if (identification != null && identification.id != "") + return AdminShellUtilV10.FilterFriendlyName(this.identification.id); + return AdminShellUtilV10.FilterFriendlyName(this.idShort); + } + + } + + public class JsonModelTypeWrapper + { + public string name = ""; + + public JsonModelTypeWrapper(string name = "") { this.name = name; } + } + + public class AdministrationShell : Identifiable + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } + + // from hasDataSpecification: + [XmlElement(ElementName = "hasDataSpecification")] + public HasDataSpecification hasDataSpecification = null; + + // from this very class + public AssetAdministrationShellRef derivedFrom = null; + + [JsonProperty(PropertyName = "asset")] + public AssetRef assetRef = new AssetRef(); + + [JsonProperty(PropertyName = "submodels")] + public List submodelRefs = new List(); + + [JsonIgnore] + public Views views = null; + [XmlIgnore] + [JsonProperty(PropertyName = "views")] + public View[] JsonViews + { + get { return views?.views.ToArray(); } + set { views = Views.CreateOrSetInnerViews(views, value); } + } + + [JsonProperty(PropertyName = "conceptDictionaries")] + public List conceptDictionaries = null; + + // constructurs + + public AdministrationShell() { } + + public AdministrationShell(AdministrationShell src) + : base(src) + { + if (src.hasDataSpecification != null) + this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); + + if (src.derivedFrom != null) + this.derivedFrom = new AssetAdministrationShellRef(src.derivedFrom); + + if (src.assetRef != null) + this.assetRef = new AssetRef(src.assetRef); + + if (src.submodelRefs != null) + foreach (var smr in src.submodelRefs) + this.submodelRefs.Add(new SubmodelRef(smr)); + + if (src.views != null) + this.views = new Views(src.views); + + if (src.conceptDictionaries != null) + { + this.conceptDictionaries = new List(); + foreach (var cdd in src.conceptDictionaries) + this.conceptDictionaries.Add(new ConceptDictionary(cdd)); + } + } + + public static AdministrationShell CreateNew( + string idType, string id, string version = null, string revision = null) + { + var s = new AdministrationShell(); + s.identification.idType = idType; + s.identification.id = id; + if (version != null) + s.SetAdminstration(version, revision); + return (s); + } + + // add + + public void AddView(View v) + { + if (views == null) + views = new Views(); + views.views.Add(v); + } + + public void AddConceptDictionary(ConceptDictionary d) + { + if (conceptDictionaries == null) + conceptDictionaries = new List(); + conceptDictionaries.Add(d); + } + + public void AddDataSpecification(Key k) + { + if (hasDataSpecification == null) + hasDataSpecification = new HasDataSpecification(); + var r = new Reference(); + r.Keys.Add(k); + hasDataSpecification.reference.Add(r); + } + + public override string GetElementName() + { + return "AssetAdministrationShell"; + } + + public Tuple ToCaptionInfo() + { + var caption = AdminShellUtilV10.EvalToNonNullString("\"{0}\" ", idShort, "\"AAS\""); + if (administration != null) + caption += "V" + administration.version + "." + administration.revision; + + var info = ""; + if (identification != null) + info = $"[{identification.idType}, {identification.id}]"; + return Tuple.Create(caption, info); + } + + public override string ToString() + { + var ci = ToCaptionInfo(); + return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); + } + + public SubmodelRef FindSubmodelRef(Identification refid) + { + if (this.submodelRefs == null) + return null; + foreach (var r in this.submodelRefs) + if (r.MatchesTo(refid)) + return r; + return null; + } + + public bool HasSubmodelRef(SubmodelRef newref) + { + // check, if existing + if (this.submodelRefs == null) + return false; + var found = false; + foreach (var r in this.submodelRefs) + if (r.MatchesTo(newref)) + found = true; + + return found; + } + + public void AddSubmodelRef(SubmodelRef newref) + { + if (this.submodelRefs == null) + this.submodelRefs = new List(); + this.submodelRefs.Add(newref); + } + } + + public class Asset : Identifiable + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } + + // from hasDataSpecification: + [XmlElement(ElementName = "hasDataSpecification")] + public HasDataSpecification hasDataSpecification = null; + // from HasKind + [XmlElement(ElementName = "kind")] + [JsonIgnore] + public Kind kind = new Kind(); + [XmlIgnore] + [JsonProperty(PropertyName = "kind")] + public string JsonKind + { + get + { + if (kind == null) + return null; + return kind.kind; + } + set + { + if (kind == null) + kind = new Kind(); + kind.kind = value; + } + } + // from this very class + [XmlElement(ElementName = "assetIdentificationModelRef")] + public SubmodelRef assetIdentificationModelRef = null; + + // constructors + + public Asset() { } + + public Asset(Asset src) + : base(src) + { + if (src.hasDataSpecification != null) + this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); + if (src.kind != null) + this.kind = new Kind(src.kind); + if (src.assetIdentificationModelRef != null) + this.assetIdentificationModelRef = new SubmodelRef(src.assetIdentificationModelRef); + } + + // Getter & setters + + public AssetRef GetReference() + { + var r = new AssetRef(); + r.Keys.Add( + Key.CreateNew(this.GetElementName(), true, this.identification.idType, this.identification.id)); + return r; + } + + public override string GetElementName() + { + return "Asset"; + } + + public Tuple ToCaptionInfo() + { + var caption = AdminShellUtilV10.EvalToNonNullString("\"{0}\" ", idShort, ""); + if (administration != null) + caption += "V" + administration.version + "." + administration.revision; + + var info = ""; + if (identification != null) + info = $"[{identification.idType}, {identification.id}]"; + return Tuple.Create(caption, info); + } + + public override string ToString() + { + var ci = ToCaptionInfo(); + return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); + } + + } + + public class View : Referable + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } + + // members + + // from hasSemanticId: + [XmlElement(ElementName = "semanticId")] + public SemanticId semanticId = null; + // from hasDataSpecification + [XmlElement(ElementName = "hasDataSpecification")] + public HasDataSpecification hasDataSpecification = null; + + // from this very class + [JsonIgnore] + public ContainedElements containedElements = null; + [XmlIgnore] + [JsonProperty(PropertyName = "containedElements")] + public ContainedElementRef[] JsonContainedElements + { + get { return containedElements?.reference.ToArray(); } + set { containedElements = ContainedElements.CreateOrSetInner(containedElements, value); } + } + + // getter / setter + + [XmlIgnore] + [JsonIgnore] + public bool IsEmpty { get { return containedElements == null || containedElements.Count < 1; } } + [XmlIgnore] + [JsonIgnore] + public int Count { get { if (containedElements == null) return 0; return containedElements.Count; } } + + public ContainedElementRef this[int index] + { + get + { + if ( +containedElements == null) return null; return containedElements[index]; + } + } + + // constructors / creators + + public View() { } + + public View(View src) + : base(src) + { + if (src.semanticId != null) + this.semanticId = new SemanticId(src.semanticId); + if (src.hasDataSpecification != null) + this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); + if (src.containedElements != null) + this.containedElements = new ContainedElements(src.containedElements); + } + + public static View CreateNew(string idShort) + { + var v = new View(); + v.idShort = idShort; + return (v); + } + + public void AddDataSpecification(Key k) + { + if (hasDataSpecification == null) + hasDataSpecification = new HasDataSpecification(); + var r = new Reference(); + r.Keys.Add(k); + hasDataSpecification.reference.Add(r); + } + + public void AddContainedElement(Key k) + { + if (containedElements == null) + containedElements = new ContainedElements(); + var r = new ContainedElementRef(); + r.Keys.Add(k); + containedElements.reference.Add(r); + } + + public void AddContainedElement(List keys) + { + if (containedElements == null) + containedElements = new ContainedElements(); + var r = new ContainedElementRef(); + foreach (var k in keys) + r.Keys.Add(k); + containedElements.reference.Add(r); + } + + public void AddContainedElement(Reference r) + { + if (containedElements == null) + containedElements = new ContainedElements(); + containedElements.reference.Add(ContainedElementRef.CreateNew(r)); + } + + public void AddContainedElement(List rlist) + { + if (containedElements == null) + containedElements = new ContainedElements(); + foreach (var r in rlist) + containedElements.reference.Add(ContainedElementRef.CreateNew(r)); + } + + public override string GetElementName() + { + return "View"; + } + + public Tuple ToCaptionInfo() + { + var caption = AdminShellUtilV10.EvalToNonNullString("\"{0}\" ", idShort, ""); + var info = ""; + if (this.semanticId != null) + info = Key.KeyListToString(this.semanticId.Keys); + if (this.containedElements != null && this.containedElements.reference != null) + info = + (info + " ").Trim() + String.Format("({0} elements)", this.containedElements.reference.Count); + return Tuple.Create(caption, info); + } + + public override string ToString() + { + var ci = ToCaptionInfo(); + return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); + } + } + + public class Views + { + [XmlElement(ElementName = "view")] + [JsonIgnore] + public List views = new List(); + + // constructors + + public Views() { } + + public Views(Views src) + { + if (src != null && src.views != null) + foreach (var v in src.views) + this.views.Add(new View(v)); + } + + public static Views CreateOrSetInnerViews(Views outer, View[] inner) + { + var res = outer; + if (res == null) + res = new Views(); + if (inner == null) + { + res.views = null; + return res; + } + res.views = new List(inner); + return res; + } + } + + public class LangStringIEC61360 + { + + // members + + [XmlElement(ElementName = "langString", Namespace = "http://www.admin-shell.io/aas/1/0")] + public List langString = new List(); + + // getters / setters + + [XmlIgnore] + [JsonIgnore] + public bool IsEmpty { get { return langString == null || langString.Count < 1; } } + [XmlIgnore] + [JsonIgnore] + public int Count { get { if (langString == null) return 0; return langString.Count; } } + [XmlIgnore] + [JsonIgnore] + public LangStr this[int index] { get { return langString[index]; } } + + // constructors + + public LangStringIEC61360() { } + + public LangStringIEC61360(LangStringIEC61360 src) + { + if (src.langString != null) + foreach (var ls in src.langString) + this.langString.Add(new LangStr(ls)); + } + + // converter + + public static LangStringIEC61360 CreateFrom(List src) + { + var res = new LangStringIEC61360(); + if (src != null) + foreach (var ls in src) + res.langString.Add(new LangStr(ls)); + return res; + } + + } + + public class UnitId + { + + // members + + [XmlIgnore] + [JsonIgnore] + public KeyList keys = new KeyList(); + + // getter / setters + + [XmlArray("keys")] + [XmlArrayItem("key")] + [JsonIgnore] + public List Keys { get { return keys?.Keys; } } + [XmlIgnore] + [JsonProperty(PropertyName = "keys")] + public List JsonKeys + { + get + { + keys?.NumberIndices(); + return keys.Keys; + } + } + + [XmlIgnore] + [JsonIgnore] + public bool IsEmpty { get { return keys == null || keys.IsEmpty; } } + [XmlIgnore] + [JsonIgnore] + public int Count { get { if (keys == null) return 0; return keys.Count; } } + [XmlIgnore] + [JsonIgnore] + public Key this[int index] { get { return keys.Keys[index]; } } + + // constructors / creators + + public UnitId() { } + + public UnitId(UnitId src) + { + if (src.keys != null) + foreach (var k in src.Keys) + this.keys.Add(new Key(k)); + } + + public static UnitId CreateNew(string type, bool local, string idType, string value) + { + var u = new UnitId(); + u.keys.Keys.Add(Key.CreateNew(type, local, idType, value)); + return u; + } + + public static UnitId CreateNew(Reference src) + { + var res = new UnitId(); + if (src != null && src.Keys != null) + foreach (var k in src.Keys) + res.keys.Add(k); + return res; + } + } + + [XmlRoot(Namespace = "http://www.admin-shell.io/IEC61360/1/0")] + public class DataSpecificationIEC61360 + { + // static member + [XmlIgnore] + [JsonIgnore] + public static string[] DataTypeNames = { + "STRING", + "STRING_TRANSLATABLE", + "REAL_MEASURE", + "REAL_COUNT", + "REAL_CURRENCY", + "INTEGER_MEASURE", + "INTEGER_COUNT", + "INTEGER_CURRENCY", + "BOOLEAN", + "URL", + "RATIONAL", + "RATIONAL_MEASURE", + "TIME", + "TIMESTAMP", + "DATE" }; + + // members + public LangStringIEC61360 preferredName = new LangStringIEC61360(); + public string shortName = ""; + public string unit = ""; + public UnitId unitId = null; + public string valueFormat = null; + public List sourceOfDefinition = new List(); + public string symbol = null; + public string dataType = ""; + public LangStringIEC61360 definition = new LangStringIEC61360(); + + // getter / setters + + // constructors + + public DataSpecificationIEC61360() { } + + public DataSpecificationIEC61360(DataSpecificationIEC61360 src) + { + if (src.preferredName != null) + this.preferredName = new LangStringIEC61360(src.preferredName); + this.shortName = src.shortName; + this.unit = src.unit; + if (src.unitId != null) + this.unitId = new UnitId(src.unitId); + this.valueFormat = src.valueFormat; + if (src.sourceOfDefinition != null) + foreach (var sod in src.sourceOfDefinition) + this.sourceOfDefinition.Add(sod); + this.symbol = src.symbol; + this.dataType = src.dataType; + if (src.definition != null) + this.definition = new LangStringIEC61360(src.definition); + } + + public static DataSpecificationIEC61360 CreateNew( + string[] preferredName = null, + string shortName = "", + string unit = "", + UnitId unitId = null, + string valueFormat = null, + string[] sourceOfDefinition = null, + string symbol = null, + string dataType = "", + string[] definition = null + ) + { + var d = new DataSpecificationIEC61360(); + if (preferredName != null) + d.preferredName.langString = LangStr.CreateManyFromStringArray(preferredName); + d.shortName = shortName; + d.unit = unit; + d.unitId = unitId; + d.valueFormat = valueFormat; + if (sourceOfDefinition != null) + d.sourceOfDefinition = LangStr.CreateManyFromStringArray(sourceOfDefinition); + d.symbol = symbol; + d.dataType = dataType; + if (definition != null) + d.definition.langString = LangStr.CreateManyFromStringArray(definition); + return (d); + } + } + + public class DataSpecificationISO99999 + { + } + + public class DataSpecificationContent + { + + // members + + public DataSpecificationIEC61360 dataSpecificationIEC61360 = new DataSpecificationIEC61360(); + public DataSpecificationISO99999 dataSpecificationISO99999 = null; + + // constructors + + public DataSpecificationContent() { } + + public DataSpecificationContent(DataSpecificationContent src) + { + if (src.dataSpecificationIEC61360 != null) + this.dataSpecificationIEC61360 = new DataSpecificationIEC61360(src.dataSpecificationIEC61360); + } + } + + public class EmbeddedDataSpecification + { + // members + + public DataSpecificationRef hasDataSpecification = new DataSpecificationRef(); + public DataSpecificationContent dataSpecificationContent = new DataSpecificationContent(); + + // constructors + + public EmbeddedDataSpecification() { } + + public EmbeddedDataSpecification(EmbeddedDataSpecification src) + { + if (src.hasDataSpecification != null) + this.hasDataSpecification = new DataSpecificationRef(src.hasDataSpecification); + if (src.dataSpecificationContent != null) + this.dataSpecificationContent = new DataSpecificationContent(src.dataSpecificationContent); + } + } + + public class ConceptDescription : Identifiable, System.IDisposable + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } + + // members + + // do this in order to be IDisposable, that is: suitable for (using) + void System.IDisposable.Dispose() { } + public void GetData() { } + // from HasDataSpecification + // TODO (Michael Hoffmeister, 1970-01-01): in V1.0, shall be a list of embeddedDataSpecification + [XmlElement(ElementName = "embeddedDataSpecification")] + [JsonIgnore] + public EmbeddedDataSpecification embeddedDataSpecification = new EmbeddedDataSpecification(); + [XmlIgnore] + [JsonProperty(PropertyName = "embeddedDataSpecifications")] + public EmbeddedDataSpecification[] JsonEmbeddedDataSpecifications + { + get + { + if (embeddedDataSpecification == null) + return null; + return new EmbeddedDataSpecification[] { embeddedDataSpecification }; + } + set + { + if (value == null) + embeddedDataSpecification = null; + else + embeddedDataSpecification = value[0]; + } + } + + // this class + [XmlIgnore] + private List isCaseOf = null; + + // getter / setter + + [XmlElement(ElementName = "isCaseOf")] + [JsonProperty(PropertyName = "isCaseOf")] + public List IsCaseOf + { + get { return isCaseOf; } + set { isCaseOf = value; } + } + + // constructors / creators + + public ConceptDescription() : base() { } + + public ConceptDescription(ConceptDescription src) + : base(src) + { + if (src.embeddedDataSpecification != null) + this.embeddedDataSpecification = new EmbeddedDataSpecification(src.embeddedDataSpecification); + if (src.isCaseOf != null) + foreach (var ico in src.isCaseOf) + { + if (this.isCaseOf == null) + this.isCaseOf = new List(); + this.isCaseOf.Add(new Reference(ico)); + } + } + + public static ConceptDescription CreateNew( + string idType, string id, string version = null, string revision = null) + { + var cd = new ConceptDescription(); + cd.identification.idType = idType; + cd.identification.id = id; + if (version != null) + { + if (cd.administration == null) + cd.administration = new Administration(); + cd.administration.version = version; + cd.administration.revision = revision; + } + return (cd); + } + + public ConceptDescriptionRef GetReference() + { + var r = new ConceptDescriptionRef(); + r.Keys.Add( + Key.CreateNew(this.GetElementName(), true, this.identification.idType, this.identification.id)); + return r; + } + + public Key GetGlobalDataSpecRef() + { + if (embeddedDataSpecification.hasDataSpecification.Count != 1) + return null; + return (embeddedDataSpecification.hasDataSpecification[0]); + } + + public void SetIEC61360Spec( + string[] preferredNames = null, + string shortName = "", + string unit = "", + UnitId unitId = null, + string valueFormat = null, + string[] sourceOfDefinition = null, + string symbol = null, + string dataType = "", + string[] definition = null + ) + { + this.embeddedDataSpecification = new EmbeddedDataSpecification(); + this.embeddedDataSpecification.hasDataSpecification.Keys.Add( + Key.CreateNew("GlobalReference", false, "URI", + "www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360")); + this.embeddedDataSpecification.dataSpecificationContent.dataSpecificationIEC61360 = + AdminShellV10.DataSpecificationIEC61360.CreateNew( + preferredNames, shortName, unit, unitId, valueFormat, sourceOfDefinition, symbol, dataType, + definition); + this.AddIsCaseOf( + Reference.CreateNew(new Key( + "ConceptDescription", false, this.identification.idType, this.identification.id))); + } + + public DataSpecificationIEC61360 GetIEC61360() + { + if (embeddedDataSpecification != null && + embeddedDataSpecification.dataSpecificationContent != null && + embeddedDataSpecification.dataSpecificationContent.dataSpecificationIEC61360 != null) + return embeddedDataSpecification.dataSpecificationContent.dataSpecificationIEC61360; + return null; + } + + public string GetShortName() + { + if (embeddedDataSpecification != null && + embeddedDataSpecification.dataSpecificationContent != null && + embeddedDataSpecification.dataSpecificationContent.dataSpecificationIEC61360 != null) + return embeddedDataSpecification.dataSpecificationContent.dataSpecificationIEC61360.shortName; + return ""; + } + + public override string GetElementName() + { + return "ConceptDescription"; + } + + public Tuple ToCaptionInfo() + { + var caption = ""; + if (this.idShort != null && this.idShort.Trim() != "") + caption = $"\"{this.idShort.Trim()}\""; + if (this.identification != null) + caption = (caption + " " + this.identification).Trim(); + + var info = ""; + if (embeddedDataSpecification != null && + embeddedDataSpecification.dataSpecificationContent != null && + embeddedDataSpecification.dataSpecificationContent.dataSpecificationIEC61360 != null) + info += embeddedDataSpecification.dataSpecificationContent.dataSpecificationIEC61360.shortName; + + return Tuple.Create(caption, info); + } + + public override string ToString() + { + var ci = ToCaptionInfo(); + return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); + } + + public void AddIsCaseOf(Reference ico) + { + if (isCaseOf == null) + isCaseOf = new List(); + isCaseOf.Add(ico); + } + + public static IDisposable CreateNew() + { + throw new NotImplementedException(); + } + } + + public class ConceptDictionary : Referable + { + [XmlElement(ElementName = "conceptDescriptions")] + public ConceptDescriptionRefs conceptDescriptionsRefs = null; + + // constructors + + public ConceptDictionary() { } + + public ConceptDictionary(ConceptDictionary src) + { + if (src.conceptDescriptionsRefs != null) + this.conceptDescriptionsRefs = new ConceptDescriptionRefs(src.conceptDescriptionsRefs); + } + + public static ConceptDictionary CreateNew(string idShort = null) + { + var d = new ConceptDictionary(); + if (idShort != null) + d.idShort = idShort; + return (d); + } + + // add + + public void AddReference(Reference r) + { + var cdr = (ConceptDescriptionRef)(ConceptDescriptionRef.CreateNew(r.Keys)); + if (conceptDescriptionsRefs == null) + conceptDescriptionsRefs = new ConceptDescriptionRefs(); + conceptDescriptionsRefs.conceptDescriptions.Add(cdr); + } + + public override string GetElementName() + { + return "ConceptDictionary"; + } + } + + [XmlRoot(ElementName = "aasenv", Namespace = "http://www.admin-shell.io/aas/1/0")] + public class AdministrationShellEnv + { + [XmlAttribute(Namespace = System.Xml.Schema.XmlSchema.InstanceNamespace)] + public string schemaLocation = + "http://www.admin-shell.io/aas/1/0 AAS.xsd http://www.admin-shell.io/IEC61360/1/0 IEC61360.xsd"; + + /// [XmlElement(ElementName="assetAdministrationShells")] + [XmlIgnore] // will be ignored, anyway + private List administrationShells = new List(); + [XmlIgnore] // will be ignored, anyway + private List assets = new List(); + [XmlIgnore] // will be ignored, anyway + private List submodels = new List(); + [XmlIgnore] // will be ignored, anyway + private List conceptDescriptions = new List(); + + // getter / setters + + [XmlArray("assetAdministrationShells")] + [XmlArrayItem("assetAdministrationShell")] + [JsonProperty(PropertyName = "assetAdministrationShells")] + public List AdministrationShells + { + get { return administrationShells; } + set { administrationShells = value; } + } + + [XmlArray("assets")] + [XmlArrayItem("asset")] + [JsonProperty(PropertyName = "assets")] + public List Assets + { + get { return assets; } + set { assets = value; } + } + + [XmlArray("submodels")] + [XmlArrayItem("submodel")] + [JsonProperty(PropertyName = "submodels")] + public List Submodels + { + get { return submodels; } + set { submodels = value; } + } + + [XmlArray("conceptDescriptions")] + [XmlArrayItem("conceptDescription")] + [JsonProperty(PropertyName = "conceptDescriptions")] + public List ConceptDescriptions + { + get { return conceptDescriptions; } + set { conceptDescriptions = value; } + } + + // finders + + public AdministrationShell FindAAS(Identification id) + { + if (id == null) + return null; + foreach (var aas in this.AdministrationShells) + if (aas.identification != null && aas.identification.IsEqual(id)) + return aas; + return null; + } + + public AdministrationShell FindAAS(string idShort) + { + if (idShort == null) + return null; + foreach (var aas in this.AdministrationShells) + if (aas.idShort != null && aas.idShort.Trim().ToLower() == idShort.Trim().ToLower()) + return aas; + return null; + } + + public AdministrationShell FindAASwithSubmodel(Identification smid) + { + if (smid == null) + return null; + foreach (var aas in this.AdministrationShells) + if (aas.submodelRefs != null) + foreach (var smref in aas.submodelRefs) + if (smref.MatchesTo(smid)) + return aas; + return null; + } + + public Asset FindAsset(Identification id) + { + if (id == null) + return null; + foreach (var asset in this.Assets) + if (asset.identification != null && asset.identification.IsEqual(id)) + return asset; + return null; + } + + public Asset FindAsset(AssetRef aref) + { + // trivial + if (aref == null) + return null; + // can only refs with 1 key + if (aref.Count != 1) + return null; + // and we're picky + var key = aref[0]; + if (!key.local || key.type.ToLower().Trim() != "asset") + return null; + // brute force + foreach (var a in assets) + if (a.identification.idType.ToLower().Trim() == key.idType.ToLower().Trim() + && a.identification.id.ToLower().Trim() == key.value.ToLower().Trim()) + return a; + // uups + return null; + } + + public Submodel FindSubmodel(Identification id) + { + if (id == null) + return null; + foreach (var sm in this.Submodels) + if (sm.identification != null && sm.identification.IsEqual(id)) + return sm; + return null; + } + + public Submodel FindSubmodel(SubmodelRef smref) + { + // trivial + if (smref == null) + return null; + // can only refs with 1 key + if (smref.Count != 1) + return null; + // and we're picky + var key = smref.Keys[0]; + if (!key.local || key.type.ToLower().Trim() != "submodel") + return null; + // brute force + foreach (var sm in this.Submodels) + if (sm.identification.idType.ToLower().Trim() == key.idType.ToLower().Trim() + && sm.identification.id.ToLower().Trim() == key.value.ToLower().Trim()) + return sm; + // uups + return null; + } + + public Referable FindReferableByReference(Reference rf, int keyIndex = 0) + { + // first index needs to exist .. + if (rf == null || keyIndex >= rf.Count) + return null; + + // which type? + var firstType = rf[keyIndex].type.Trim().ToLower(); + var firstIdentification = new Identification(rf[keyIndex].idType, rf[keyIndex].value); + + if (firstType == Key.AAS.Trim().ToLower()) + return this.FindAAS(firstIdentification); + + if (firstType == Key.Asset.Trim().ToLower()) + return this.FindAsset(firstIdentification); + + if (firstType == Key.ConceptDescription.Trim().ToLower()) + return this.FindConceptDescription(firstIdentification); + + if (firstType == Key.Submodel.Trim().ToLower()) + { + // ok, search Submodel + var sm = this.FindSubmodel(new Identification(rf[keyIndex].idType, rf[keyIndex].value)); + if (sm == null) + return null; + + // at our end? + if (keyIndex >= rf.Count - 1) + return sm; + + // go inside + return SubmodelElementWrapper.FindReferableByReference(sm.submodelElements, rf, keyIndex + 1); + } + + // nothing in this Environment + return null; + } + + + public ConceptDescription FindConceptDescription(ConceptDescriptionRef cdr) + { + if (cdr == null) + return null; + return FindConceptDescription(cdr.Keys); + } + + public ConceptDescription FindConceptDescription(Identification id) + { + var cdr = ConceptDescriptionRef.CreateNew("Conceptdescription", true, id.idType, id.id); + return FindConceptDescription(cdr); + } + + public ConceptDescription FindConceptDescription(List keys) + { + // trivial + if (keys == null) + return null; + // can only refs with 1 key + if (keys.Count != 1) + return null; + // and we're picky + var key = keys[0]; + if (!key.local || key.type.ToLower().Trim() != "conceptdescription") + return null; + // brute force + foreach (var cd in conceptDescriptions) + if (cd.identification.idType.ToLower().Trim() == key.idType.ToLower().Trim() + && cd.identification.id.ToLower().Trim() == key.value.ToLower().Trim()) + return cd; + // uups + return null; + } + + public ConceptDescription FindConceptDescription(Key key) + { + if (key == null) + return null; + var l = new List(); + l.Add(key); + return (FindConceptDescription(l)); + } + + // creators + + private void CopyConceptDescriptionsFrom( + AdministrationShellEnv srcEnv, SubmodelElement src, bool shallowCopy = false) + { + // access + if (srcEnv == null || src == null || src.semanticId == null) + return; + // check for this SubmodelElement in Source + var cdSrc = srcEnv.FindConceptDescription(src.semanticId.Keys); + if (cdSrc == null) + return; + // check for this SubmodelElement in Destnation (this!) + var cdDest = this.FindConceptDescription(src.semanticId.Keys); + if (cdDest != null) + return; + // copy new + this.ConceptDescriptions.Add(new ConceptDescription(cdSrc)); + // recurse? + if (!shallowCopy && src is SubmodelElementCollection) + foreach (var m in (src as SubmodelElementCollection).value) + CopyConceptDescriptionsFrom(srcEnv, m.submodelElement, shallowCopy); + + } + + public SubmodelElementWrapper CopySubmodelElementAndCD( + AdministrationShellEnv srcEnv, SubmodelElement srcElem, bool copyCD = false, bool shallowCopy = false) + { + // access + if (srcEnv == null || srcElem == null) + return null; + + // 1st result pretty easy (calling function will add this to the appropriate Submodel) + var res = new SubmodelElementWrapper(srcElem); + + // copy the CDs.. + if (copyCD) + CopyConceptDescriptionsFrom(srcEnv, srcElem, shallowCopy); + + // give back + return res; + } + + public SubmodelRef CopySubmodelRefAndCD( + AdministrationShellEnv srcEnv, SubmodelRef srcSubRef, bool copySubmodel = false, bool copyCD = false, + bool shallowCopy = false) + { + // access + if (srcEnv == null || srcSubRef == null) + return null; + + // need to have the source Submodel + var srcSub = srcEnv.FindSubmodel(srcSubRef); + if (srcSub == null) + return null; + + // 1st result pretty easy (calling function will add this to the appropriate AAS) + var dstSubRef = new SubmodelRef(srcSubRef); + + // get the destination and shall src != dst + var dstSub = this.FindSubmodel(dstSubRef); + if (srcSub == dstSub) + return null; + + // maybe we need the Submodel in our environment, as well + if (dstSub == null && copySubmodel) + { + dstSub = new Submodel(srcSub, shallowCopy); + this.Submodels.Add(dstSub); + } + else + { + // there is already an submodel, just add members + if (!shallowCopy && srcSub.submodelElements != null) + { + if (dstSub.submodelElements == null) + dstSub.submodelElements = new List(); + foreach (var smw in srcSub.submodelElements) + dstSub.submodelElements.Add(new SubmodelElementWrapper(smw.submodelElement, shallowCopy)); + } + } + + // copy the CDs.. + if (copyCD && srcSub.submodelElements != null) + foreach (var smw in srcSub.submodelElements) + CopyConceptDescriptionsFrom(srcEnv, smw.submodelElement, shallowCopy); + + // give back + return dstSubRef; + } + + // serializations + + public void SerializeXmlToStream(StreamWriter s) + { + var serializer = new XmlSerializer(typeof(AdminShellV10.AdministrationShellEnv)); + var nss = new XmlSerializerNamespaces(); + nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace); + nss.Add("aas", "http://www.admin-shell.io/aas/1/0"); + nss.Add("IEC61360", "http://www.admin-shell.io/IEC61360/1/0"); + serializer.Serialize(s, this, nss); + } + + public JsonWriter SerialiazeJsonToStream(StreamWriter sw, bool leaveJsonWriterOpen = false) + { + sw.AutoFlush = true; + + JsonSerializer serializer = new JsonSerializer(); + serializer.NullValueHandling = NullValueHandling.Ignore; + serializer.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; + serializer.Formatting = Newtonsoft.Json.Formatting.Indented; + + JsonWriter writer = new JsonTextWriter(sw); + serializer.Serialize(writer, this); + if (leaveJsonWriterOpen) + return writer; + writer.Close(); + return null; + } + + public AdministrationShellEnv DeserializeFromXmlStream(TextReader reader) + { + XmlSerializer serializer = new XmlSerializer( + typeof(AdminShellV10.AdministrationShellEnv), "http://www.admin-shell.io/aas/1/0"); + var res = serializer.Deserialize(reader) as AdminShellV10.AdministrationShellEnv; + return res; + } + + public AdministrationShellEnv DeserializeFromJsonStream(TextReader reader) + { + JsonSerializer serializer = new JsonSerializer(); + serializer.Converters.Add(new AdminShellV10.JsonAasxConverter("modelType", "name")); + var res = (AdministrationShellEnv)serializer.Deserialize(reader, typeof(AdministrationShellEnv)); + return res; + } + + // special functions + + private static void CreateFromExistingEnvRecurseForCDs( + AdministrationShellEnv src, List wrappers, + ref List filterForCD) + { + if (wrappers == null || filterForCD == null) + return; + + foreach (var w in wrappers) + { + // include in filter .. + if (w.submodelElement.semanticId != null) + { + var cd = src.FindConceptDescription(w.submodelElement.semanticId.Keys); + if (cd != null) + filterForCD.Add(cd); + } + + // recurse? + if (w.submodelElement is SubmodelElementCollection) + CreateFromExistingEnvRecurseForCDs( + src, (w.submodelElement as SubmodelElementCollection).value, ref filterForCD); + + if (w.submodelElement is Operation) + for (int i = 0; i < 2; i++) + { + var w2s = Operation.GetWrappers((w.submodelElement as Operation)[i]); + CreateFromExistingEnvRecurseForCDs(src, w2s, ref filterForCD); + } + + } + } + + public static AdministrationShellEnv CreateFromExistingEnv(AdministrationShellEnv src, + List filterForAas = null, + List filterForAsset = null, + List filterForSubmodel = null, + List filterForCD = null) + { + // prepare defaults + if (filterForAas == null) + filterForAas = new List(); + if (filterForAsset == null) + filterForAsset = new List(); + if (filterForSubmodel == null) + filterForSubmodel = new List(); + if (filterForCD == null) + filterForCD = new List(); + + // make new + var res = new AdministrationShellEnv(); + + // take over AAS + foreach (var aas in src.administrationShells) + if (filterForAas.Contains(aas)) + { + // take over + res.administrationShells.Add(new AdministrationShell(aas)); + + // consequences + if (aas.assetRef != null) + { + var asset = src.FindAsset(aas.assetRef); + if (asset != null) + filterForAsset.Add(asset); + } + + if (aas.submodelRefs != null) + foreach (var smr in aas.submodelRefs) + { + var sm = src.FindSubmodel(smr); + if (sm != null) + filterForSubmodel.Add(sm); + } + + if (aas.conceptDictionaries != null) + foreach (var cdd in aas.conceptDictionaries) + if (cdd.conceptDescriptionsRefs != null && + cdd.conceptDescriptionsRefs.conceptDescriptions != null) + foreach (var cdr in cdd.conceptDescriptionsRefs.conceptDescriptions) + { + var cd = src.FindConceptDescription(cdr); + if (cd != null) + filterForCD.Add(cd); + } + } + + // take over Assets + foreach (var asset in src.assets) + if (filterForAsset.Contains(asset)) + { + // take over + res.assets.Add(new Asset(asset)); + } + + // take over Submodels + foreach (var sm in src.Submodels) + if (filterForSubmodel.Contains(sm)) + { + // take over + res.submodels.Add(new Submodel(sm)); + + // recursion in order to find used CDs + CreateFromExistingEnvRecurseForCDs(src, sm.submodelElements, ref filterForCD); + } + + // ConceptDescriptions + foreach (var cd in src.ConceptDescriptions) + if (filterForCD.Contains(cd)) + { + // take over + res.conceptDescriptions.Add(new ConceptDescription(cd)); + } + + // ok + return res; + } + } + + // + // Submodel + Submodel elements + // + + public interface IGetReference + { + Reference GetReference(); + } + + public class Qualifier + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } + + // member + + // from hasSemantics: + [XmlElement(ElementName = "semanticId")] + // TODO (Michael Hoffmeister, 1970-01-01): Qualifiers not working! + // 190410: test-wise enable them again, everyhing works fine .. + public SemanticId semanticId = null; + + // this class + public string qualifierType = null; + public string qualifierValue = null; + public Reference qualifierValueId = null; + + // constructors + + public Qualifier() { } + + public Qualifier(Qualifier src) + { + if (src.semanticId != null) + this.semanticId = new SemanticId(src.semanticId); + this.qualifierType = src.qualifierType; + this.qualifierValue = src.qualifierValue; + if (src.qualifierValueId != null) + this.qualifierValueId = new Reference(src.qualifierValueId); + } + + public string GetElementName() + { + return "Qualifier"; + } + } + + public class SubmodelElement : Referable, System.IDisposable, IGetReference + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } + + // members + + // do this in order to be IDisposable, that is: suitable for (using) + void System.IDisposable.Dispose() { } + public void GetData() { } + // from hasDataSpecification: + [XmlElement(ElementName = "hasDataSpecification")] + public HasDataSpecification hasDataSpecification = null; + // from hasSemantics: + [XmlElement(ElementName = "semanticId")] + public SemanticId semanticId = null; + // from hasKind: + [XmlElement(ElementName = "kind")] + [JsonIgnore] + public Kind kind = null; + [XmlIgnore] + [JsonProperty(PropertyName = "kind")] + public string JsonKind + { + get + { + if (kind == null) + return null; + return kind.kind; + } + set + { + if (kind == null) + kind = new Kind(); + kind.kind = value; + } + } + // from Qualifiable: + [XmlArray("qualifier")] + [XmlArrayItem("qualifier")] + [JsonProperty(PropertyName = "constraints")] + public List qualifiers = null; + + // getter / setter + + // constructors / creators + + public SubmodelElement() + : base() { } + + public SubmodelElement(SubmodelElement src) + : base(src) + { + if (src.hasDataSpecification != null) + hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); + if (src.semanticId != null) + semanticId = new SemanticId(src.semanticId); + if (src.kind != null) + kind = new Kind(src.kind); + if (src.qualifiers != null) + { + if (qualifiers == null) + qualifiers = new List(); + foreach (var q in src.qualifiers) + qualifiers.Add(new Qualifier(q)); + } + } + + public void CreateNewLogic(string idShort = null, string category = null, Key semanticIdKey = null) + { + if (idShort != null) + this.idShort = idShort; + if (category != null) + this.category = category; + if (semanticIdKey != null) + { + if (this.semanticId == null) + this.semanticId = new SemanticId(); + this.semanticId.Keys.Add(semanticIdKey); + } + } + + public void AddQualifier( + string qualifierType = null, string qualifierValue = null, KeyList semanticKeys = null, + Reference qualifierValueId = null) + { + if (this.qualifiers == null) + this.qualifiers = new List(); + var q = new Qualifier(); + q.qualifierType = qualifierType; + q.qualifierValue = qualifierValue; + q.qualifierValueId = qualifierValueId; + if (semanticKeys != null) + q.semanticId = SemanticId.CreateFromKeys(semanticKeys.Keys); + this.qualifiers.Add(q); + } + + public Qualifier HasQualifierOfType(string qualifierType) + { + if (this.qualifiers == null || qualifierType == null) + return null; + foreach (var q in this.qualifiers) + if (q.qualifierType.Trim().ToLower() == qualifierType.Trim().ToLower()) + return q; + return null; + } + + public override string GetElementName() + { + return "SubmodelElement"; + } + + public Reference GetReference() + { + Reference r = new Reference(); + // this is the tail of our referencing chain .. + r.Keys.Add(Key.CreateNew(GetElementName(), true, "idShort", this.idShort)); + // try to climb up .. + var current = this.parent; + while (current != null) + { + if (current is Identifiable) + { + // add big information set + r.Keys.Insert(0, Key.CreateNew( + current.GetElementName(), + true, + (current as Identifiable).identification.idType, + (current as Identifiable).identification.id)); + } + else + { + // reference via idShort + r.Keys.Insert(0, Key.CreateNew( + current.GetElementName(), + true, + "idShort", this.idShort)); + } + current = current.parent; + } + return r; + } + + public Tuple ToCaptionInfo() + { + var caption = AdminShellUtilV10.EvalToNonNullString("\"{0}\" ", idShort, ""); + var info = ""; + if (semanticId != null) + info = AdminShellUtilV10.EvalToNonEmptyString("\u21e8 {0}", semanticId.ToString(), ""); + return Tuple.Create(caption, info); + } + + public override string ToString() + { + var ci = ToCaptionInfo(); + return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); + } + + + } + + [XmlType(TypeName = "submodelElement")] + public class SubmodelElementWrapper + { + + // members + + [XmlElement(ElementName = "property", Type = typeof(Property))] + [XmlElement(ElementName = "file", Type = typeof(File))] + [XmlElement(ElementName = "blob", Type = typeof(Blob))] + [XmlElement(ElementName = "referenceElement", Type = typeof(ReferenceElement))] + [XmlElement(ElementName = "relationshipElement", Type = typeof(RelationshipElement))] + [XmlElement(ElementName = "submodelElementCollection", Type = typeof(SubmodelElementCollection))] + [XmlElement(ElementName = "operation", Type = typeof(Operation))] + public SubmodelElement submodelElement; + + // element names + public static string[] AdequateElementNames = { + "SubmodelElementCollection", "Property", "File", "Blob", "ReferenceElement", + "RelationshipElement", "Operation", "OperationVariable" }; + + // constructors + + public SubmodelElementWrapper() { } + + // for cloning + public SubmodelElementWrapper(SubmodelElement src, bool shallowCopy = false) + { + if (src is Property) + this.submodelElement = new Property(src as Property); + if (src is File) + this.submodelElement = new File(src as File); + if (src is Blob) + this.submodelElement = new Blob(src as Blob); + if (src is ReferenceElement) + this.submodelElement = new ReferenceElement(src as ReferenceElement); + if (src is RelationshipElement) + this.submodelElement = new RelationshipElement(src as RelationshipElement); + if (src is SubmodelElementCollection) + this.submodelElement = new SubmodelElementCollection( + src as SubmodelElementCollection, shallowCopy: shallowCopy); + if (src is Operation) + this.submodelElement = new Operation(src as Operation); + } + + /// + /// Introduced for JSON serialization, can create SubModelElements based on a string name + /// + /// string name (standard PascalCased) + /// SubmodelElement + public static SubmodelElement CreateAdequateType(string elementName) + { + if (elementName == "Property") + return new Property(); + if (elementName == "File") + return new File(); + if (elementName == "Blob") + return new Blob(); + if (elementName == "ReferenceElement") + return new ReferenceElement(); + if (elementName == "RelationshipElement") + return new RelationshipElement(); + if (elementName == "SubmodelElementCollection") + return new SubmodelElementCollection(); + if (elementName == "Operation") + return new Operation(); + if (elementName == "OperationVariable") + return new OperationVariable(); + return null; + } + + /// + /// Can create SubmodelElements based on a numerical index + /// + /// Index 0..7 (6+7 are Operation..!) + /// SubmodelElement + public static SubmodelElement CreateAdequateType(int index) + { + AdminShellV10.SubmodelElement sme = null; + switch (index) + { + case 0: + sme = new AdminShellV10.Property(); + break; + case 1: + sme = new AdminShellV10.File(); + break; + case 2: + sme = new AdminShellV10.Blob(); + break; + case 3: + sme = new AdminShellV10.ReferenceElement(); + break; + case 4: + sme = new AdminShellV10.SubmodelElementCollection(); + break; + case 5: + sme = new AdminShellV10.RelationshipElement(); + break; + case 6: + sme = new AdminShellV10.Operation(); + break; + case 7: + sme = new AdminShellV10.OperationVariable(); + break; + } + return sme; + } + + public string GetFourDigitCode() + { + if (submodelElement == null) + return ("Null"); + if (submodelElement is AdminShellV10.Property) return ("Prop"); + if (submodelElement is AdminShellV10.File) return ("File"); + if (submodelElement is AdminShellV10.Blob) return ("Blob"); + if (submodelElement is AdminShellV10.ReferenceElement) return ("Ref"); + if (submodelElement is AdminShellV10.RelationshipElement) return ("Rel"); + if (submodelElement is AdminShellV10.SubmodelElementCollection) return ("Coll"); + if (submodelElement is AdminShellV10.Operation) return ("Opr"); + return ("Elem"); + } + + public static List ListOfWrappersToListOfElems(List wrappers) + { + var res = new List(); + if (wrappers == null) + return res; + foreach (var w in wrappers) + if (w.submodelElement != null) + res.Add(w.submodelElement); + return res; + } + + public static SubmodelElementWrapper CreateFor(SubmodelElement sme) + { + var res = new SubmodelElementWrapper(); + res.submodelElement = sme; + return res; + } + + public static Referable FindReferableByReference( + List wrappers, Reference rf, int keyIndex) + { + // first index needs to exist .. + if (wrappers == null || rf == null || keyIndex >= rf.Count) + return null; + + // as SubmodelElements are not Identifiables, the actual key shall be IdSHort + if (rf[keyIndex].idType.Trim().ToLower() != + Key.GetIdentifierTypeName(Key.IdentifierType.IdShort).Trim().ToLower()) + return null; + + // over all wrappers + if (wrappers != null) + foreach (var smw in wrappers) + if (smw.submodelElement != null && + smw.submodelElement.idShort.Trim().ToLower() == rf[keyIndex].value.Trim().ToLower()) + { + // match on this level. Did we find a leaf element? + if ((keyIndex + 1) >= rf.Count) + return smw.submodelElement; + + // ok, not a leaf, must be a recursion + // int SMEC + if (smw.submodelElement is SubmodelElementCollection) + return FindReferableByReference( + (smw.submodelElement as SubmodelElementCollection).value, rf, keyIndex + 1); + + // TODO (Michael Hoffmeister, 1970-01-01): Operation + + // else: + return null; + } + + // no? + return null; + } + } + + public class Submodel : Identifiable, System.IDisposable, IGetReference + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } + + // members + + // do this in order to be IDisposable, that is: suitable for (using) + void System.IDisposable.Dispose() { } + public void GetData() { } + // from hasDataSpecification: + [XmlElement(ElementName = "hasDataSpecification")] + public HasDataSpecification hasDataSpecification = null; + // from hasSemanticId: + [XmlElement(ElementName = "semanticId")] + public SemanticId semanticId = new SemanticId(); + // from Kindable + [XmlElement(ElementName = "kind")] + [JsonIgnore] + public Kind kind = new Kind(); + [XmlIgnore] + [JsonProperty(PropertyName = "kind")] + public string JsonKind + { + get + { + if (kind == null) + return null; + return kind.kind; + } + set + { + if (kind == null) + kind = new Kind(); + kind.kind = value; + } + } + // from Qualifiable: + [XmlArray("qualifier")] + [XmlArrayItem("qualifier")] + public List qualifiers = null; + + // from this very class + [JsonIgnore] + public List submodelElements = null; + [XmlIgnore] + [JsonProperty(PropertyName = "submodelElements")] + public SubmodelElement[] JsonSubmodelElements + { + get + { + var res = new List(); + if (submodelElements != null) + foreach (var smew in submodelElements) + res.Add(smew.submodelElement); + return res.ToArray(); + } + set + { + if (value != null) + { + this.submodelElements = new List(); + foreach (var x in value) + { + var smew = new SubmodelElementWrapper(); + smew.submodelElement = x; + this.submodelElements.Add(smew); + } + } + } + } + + // getter / setter + + // constructors / creators + + public Submodel() : base() { } + + public Submodel(Submodel src, bool shallowCopy = false) + : base(src) + { + if (src.hasDataSpecification != null) + this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); + if (src.semanticId != null) + this.semanticId = new SemanticId(src.semanticId); + if (src.kind != null) + this.kind = new Kind(src.kind); + if (!shallowCopy && src.submodelElements != null) + { + if (this.submodelElements == null) + this.submodelElements = new List(); + foreach (var smw in src.submodelElements) + this.submodelElements.Add(new SubmodelElementWrapper(smw.submodelElement, shallowCopy)); + } + } + + public static Submodel CreateNew(string idType, string id, string version = null, string revision = null) + { + var s = new Submodel(); + s.identification.idType = idType; + s.identification.id = id; + if (version != null) + { + if (s.administration == null) + s.administration = new Administration(); + s.administration.version = version; + s.administration.revision = revision; + } + return (s); + } + + public override string GetElementName() + { + return "Submodel"; + } + + public Reference GetReference() + { + SubmodelRef l = new SubmodelRef(); + l.Keys.Add( + Key.CreateNew(this.GetElementName(), true, this.identification.idType, this.identification.id)); + return l; + } + + public void Add(SubmodelElement se) + { + if (submodelElements == null) + submodelElements = new List(); + var sew = new SubmodelElementWrapper(); + se.parent = this; // track parent here! + sew.submodelElement = se; + submodelElements.Add(sew); + } + + public void AddDataSpecification(Key k) + { + if (hasDataSpecification == null) + hasDataSpecification = new HasDataSpecification(); + var r = new Reference(); + r.Keys.Add(k); + hasDataSpecification.reference.Add(r); + } + + public SubmodelElementWrapper FindSubmodelElementWrapper(string idShort) + { + if (this.submodelElements == null) + return null; + foreach (var smw in this.submodelElements) + if (smw.submodelElement != null) + if (smw.submodelElement.idShort.Trim().ToLower() == idShort.Trim().ToLower()) + return smw; + return null; + } + + public Tuple ToCaptionInfo() + { + var caption = AdminShellUtilV10.EvalToNonNullString("\"{0}\" ", idShort, ""); + if (administration != null) + caption += "V" + administration.version + "." + administration.revision; + var info = ""; + if (identification != null) + info = $"[{identification.idType}, {identification.id}]"; + return Tuple.Create(caption, info); + } + + public override string ToString() + { + var ci = ToCaptionInfo(); + return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); + } + + // Recursing + + private void RecurseOnSubmodelElementsRecurse( + List wrappers, object state, List parents, + Action, SubmodelElement> lambda) + { + // trivial + if (wrappers == null || parents == null || lambda == null) + return; + + // over all elements + foreach (var smw in wrappers) + { + var current = smw.submodelElement; + if (current == null) + continue; + + // call lambda for this element + lambda(state, parents, current); + + // add to parents + parents.Add(current); + + // dive into? + if (current is SubmodelElementCollection) + { + var smc = current as SubmodelElementCollection; + RecurseOnSubmodelElementsRecurse(smc.value, state, parents, lambda); + } + + if (current is Operation) + { + var op = current as Operation; + for (int i = 0; i < 2; i++) + RecurseOnSubmodelElementsRecurse(Operation.GetWrappers(op[i]), state, parents, lambda); + } + + // remove from parents + parents.RemoveAt(parents.Count - 1); + } + } + + public void RecurseOnSubmodelElements( + object state, Action, SubmodelElement> lambda) + { + RecurseOnSubmodelElementsRecurse(this.submodelElements, state, new List(), lambda); + } + + // Parents stuff + + private static void SetParentsForSME(Referable parent, SubmodelElement se) + { + se.parent = parent; + var smc = se as SubmodelElementCollection; + if (smc != null) + foreach (var sme in smc.value) + SetParentsForSME(se, sme.submodelElement); + } + + public void SetAllParents() + { + if (this.submodelElements != null) + foreach (var sme in this.submodelElements) + SetParentsForSME(this, sme.submodelElement); + } + + } + + // + // Derived from SubmodelElements + // + + public class DataElement : SubmodelElement + { + + public DataElement() { } + + public DataElement(DataElement src) + : base(src) + { } + + public override string GetElementName() + { + return "DataElement"; + } + } + + public class JsonValueTypeCast + { + + public class JsonDataObjectType + { + [JsonProperty(PropertyName = "name")] + public string name = ""; + } + + [JsonProperty(PropertyName = "dataObjectType")] + public JsonDataObjectType dataObjectType = new JsonDataObjectType(); + + public JsonValueTypeCast(string name) + { + this.dataObjectType.name = name; + } + } + + public class Property : DataElement + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public new JsonModelTypeWrapper JsonModelType + { + get { return new JsonModelTypeWrapper(GetElementName()); } + } + + // members + + [JsonIgnore] + public string valueType = ""; + [XmlIgnore] + [JsonProperty(PropertyName = "valueType")] + public JsonValueTypeCast JsonValueType + { + get { return new JsonValueTypeCast(this.valueType); } + set { this.valueType = value?.dataObjectType?.name; } + } + + + public string value = ""; + public Reference valueId = null; + + // constructors + + public Property() { } + + public Property(Property src) + : base(src) + { + this.valueType = src.valueType; + this.value = src.value; + if (src.valueId != null) + src.valueId = new Reference(src.valueId); + } + + public static Property CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) + { + var x = new Property(); + x.CreateNewLogic(idShort, category, semanticIdKey); + return (x); + } + + public void Set(string valueType = "", string value = "") + { + this.valueType = valueType; + this.value = value; + } + + public void Set(string type, bool local, string idType, string value) + { + this.valueId = Reference.CreateNew(Key.CreateNew(type, local, idType, value)); + } + + public override string GetElementName() + { + return "Property"; + } + } + + public class Blob : DataElement + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public new JsonModelTypeWrapper JsonModelType + { + get { return new JsonModelTypeWrapper(GetElementName()); } + } + + // members + + public string mimeType = ""; + public string value = ""; + + // constructors + + public Blob() { } + + public Blob(Blob src) + : base(src) + { + this.mimeType = src.mimeType; + this.value = src.value; + } + + public static Blob CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) + { + var x = new Blob(); + x.CreateNewLogic(idShort, category, semanticIdKey); + return (x); + } + + public void Set(string mimeType = "", string value = "") + { + this.mimeType = mimeType; + this.value = value; + } + + public override string GetElementName() + { + return "Blob"; + } + + } + + public class File : DataElement + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public new JsonModelTypeWrapper JsonModelType + { + get { return new JsonModelTypeWrapper(GetElementName()); } + } + + // members + + public string mimeType = ""; + public string value = ""; + + // constructors + + public File() { } + + public File(File src) + : base(src) + { + this.mimeType = src.mimeType; + this.value = src.value; + } + + public static File CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) + { + var x = new File(); + x.CreateNewLogic(idShort, category, semanticIdKey); + return (x); + } + + public void Set(string mimeType = "", string value = "") + { + this.mimeType = mimeType; + this.value = value; + } + + public override string GetElementName() + { + return "File"; + } + + public static string[] GetPopularMimeTypes() + { + return + new string[] { + System.Net.Mime.MediaTypeNames.Text.Plain, + System.Net.Mime.MediaTypeNames.Text.Xml, + System.Net.Mime.MediaTypeNames.Text.Html, + "application/json", + "application/rdf+xml", + System.Net.Mime.MediaTypeNames.Application.Pdf, + System.Net.Mime.MediaTypeNames.Image.Jpeg, + "image/png", + System.Net.Mime.MediaTypeNames.Image.Gif, + "application/iges", + "application/step" + }; + } + } + + public class ReferenceElement : DataElement + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public new JsonModelTypeWrapper JsonModelType + { + get { return new JsonModelTypeWrapper(GetElementName()); } + } + + // members + + public Reference value = new Reference(); + + // constructors + + public ReferenceElement() { } + + public ReferenceElement(ReferenceElement src) + : base(src) + { + if (src.value != null) + this.value = new Reference(src.value); + } + + public static ReferenceElement CreateNew( + string idShort = null, string category = null, Key semanticIdKey = null) + { + var x = new ReferenceElement(); + x.CreateNewLogic(idShort, category, semanticIdKey); + return (x); + } + + public void Set(Reference value = null) + { + this.value = value; + } + + public override string GetElementName() + { + return "ReferenceElement"; + } + + } + + public class RelationshipElement : DataElement + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public new JsonModelTypeWrapper JsonModelType + { + get { return new JsonModelTypeWrapper(GetElementName()); } + } + + // members + + public Reference first = new Reference(); + public Reference second = new Reference(); + + // constructors + + public RelationshipElement() { } + + public RelationshipElement(RelationshipElement src) + : base(src) + { + if (src.first != null) + this.first = new Reference(src.first); + if (src.second != null) + this.second = new Reference(src.second); + } + + public static RelationshipElement CreateNew( + string idShort = null, string category = null, Key semanticIdKey = null) + { + var x = new RelationshipElement(); + x.CreateNewLogic(idShort, category, semanticIdKey); + return (x); + } + + public void Set(Reference first = null, Reference second = null) + { + this.first = first; + this.second = second; + } + + public override string GetElementName() + { + return "RelationshipElement"; + } + } + + public class SubmodelElementCollection : SubmodelElement + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public new JsonModelTypeWrapper JsonModelType + { + get { return new JsonModelTypeWrapper(GetElementName()); } + } + + // members + [JsonIgnore] + public List value = new List(); + + [XmlIgnore] + [JsonProperty(PropertyName = "value")] + public SubmodelElement[] JsonValue + { + get + { + var res = new List(); + if (value != null) + foreach (var smew in value) + res.Add(smew.submodelElement); + return res.ToArray(); + } + set + { + if (value != null) + { + this.value = new List(); + foreach (var x in value) + { + var smew = new SubmodelElementWrapper(); + smew.submodelElement = x; + this.value.Add(smew); + } + } + } + } + + // further members + public bool ordered = false; + public bool allowDuplicates = false; + + // constructors + + public SubmodelElementCollection() { } + + public SubmodelElementCollection(SubmodelElementCollection src, bool shallowCopy = false) + : base(src) + { + this.ordered = src.ordered; + this.allowDuplicates = src.allowDuplicates; + if (!shallowCopy) + foreach (var smw in src.value) + value.Add(new SubmodelElementWrapper(smw.submodelElement)); + } + + public static SubmodelElementCollection CreateNew( + string idShort = null, string category = null, Key semanticIdKey = null) + { + var x = new SubmodelElementCollection(); + x.CreateNewLogic(idShort, category, semanticIdKey); + return (x); + } + + public void Set(bool allowDuplicates = false, bool ordered = false) + { + this.allowDuplicates = allowDuplicates; + this.ordered = ordered; + } + + public void Add(SubmodelElement se) + { + if (value == null) + value = new List(); + var sew = new SubmodelElementWrapper(); + se.parent = this; // track parent here! + sew.submodelElement = se; + value.Add(sew); + } + + public SubmodelElementWrapper FindSubmodelElementWrapper(string idShort) + { + if (this.value == null) + return null; + foreach (var smw in this.value) + if (smw.submodelElement != null) + if (smw.submodelElement.idShort.Trim().ToLower() == idShort.Trim().ToLower()) + return smw; + return null; + } + + public override string GetElementName() + { + return "SubmodelElementCollection"; + } + } + + public class OperationVariable : SubmodelElement + { + public enum Direction { In, Out }; + + // Note: for OperationVariable, the values of the SubmodelElement itself ARE NOT TO BE USED! + // only the SME attributes of "value" are counting + + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public new JsonModelTypeWrapper JsonModelType + { + get { return new JsonModelTypeWrapper(GetElementName()); } + } + + // members + public SubmodelElementWrapper value = null; + + // constructors + + public OperationVariable() + { + this.kind = new Kind("Type"); + } + + public OperationVariable(OperationVariable src, bool shallowCopy = false) + : base(src) + { + this.value = new SubmodelElementWrapper(src.value.submodelElement, shallowCopy); + } + + public OperationVariable(SubmodelElement elem) + : base() + { + this.value = new SubmodelElementWrapper(elem); + } + + public override string GetElementName() + { + return "OperationVariable"; + } + } + + public class Operation : SubmodelElement + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public new JsonModelTypeWrapper JsonModelType + { + get { return new JsonModelTypeWrapper(GetElementName()); } + } + + // members + [JsonIgnore] + [XmlElement(ElementName = "in")] + public List valueIn = new List(); + + [JsonIgnore] + [XmlElement(ElementName = "out")] + public List valueOut = new List(); + + [XmlIgnore] + // MICHA 190504: enabled JSON operation variables! + [JsonProperty(PropertyName = "in")] + public OperationVariable[] JsonValueIn + { + get { return valueIn?.ToArray(); } + set { valueIn = (value != null) ? new List(value) : null; } + } + + [XmlIgnore] + [JsonProperty(PropertyName = "out")] + // MICHA 190504: enabled JSON operation variables! + public OperationVariable[] JsonValueOut + { + get { return valueOut?.ToArray(); } + set { valueOut = (value != null) ? new List(value) : null; } + } + + public List this[OperationVariable.Direction dir] + { + get + { + return (dir == OperationVariable.Direction.In) ? valueIn : valueOut; + } + set + { + if (dir == OperationVariable.Direction.In) + valueIn = value; + else + valueOut = value; + } + } + + public List this[int dir] + { + get + { + return (dir == 0) ? valueIn : valueOut; + } + set + { + if (dir == 0) + valueIn = value; + else + valueOut = value; + } + } + + public static List GetWrappers(List ovl) + { + var res = new List(); + foreach (var ov in ovl) + if (ov.value != null) + res.Add(ov.value); + return res; + } + + // constructors + + public Operation() { } + + public Operation(Operation src) + : base(src) + { + for (int i = 0; i < 2; i++) + if (src[i] != null) + { + if (this[i] == null) + this[i] = new List(); + foreach (var ov in src[i]) + this[i].Add(ov); + } + } + + + public override string GetElementName() + { + return "Operation"; + } + } + + // + // Handling of packages + // + + /// + /// This converter is used for reading JSON files; it claims to be responsible for + /// "SubmodelElements" (the base class) + /// and decides, which sub-class of the base class shall be populated. + /// The decision, shich special sub-class to create is done in a factory + /// AdminShell.SubmodelElementWrapper.CreateAdequateType(), + /// in order to have all sub-class specific decisions in one place (SubmodelElementWrapper) + /// Remark: There is a NuGet package JsonSubTypes, which could have done the job, except the fact of having + /// "modelType" being a class property with a contained property "name". + /// + public class JsonAasxConverter : JsonConverter + { + private string UpperClassProperty = "modelType"; + private string LowerClassProperty = "name"; + + public JsonAasxConverter() : base() + { + } + + public JsonAasxConverter(string UpperClassProperty, string LowerClassProperty) : base() + { + this.UpperClassProperty = UpperClassProperty; + this.LowerClassProperty = LowerClassProperty; + } + + public override bool CanConvert(Type objectType) + { + if (typeof(AdminShellV10.SubmodelElement).IsAssignableFrom(objectType)) + return true; + return false; + } + + public override bool CanWrite + { + get { return false; } + } + + public override object ReadJson(JsonReader reader, + Type objectType, + object existingValue, + JsonSerializer serializer) + { + // Load JObject from stream + JObject jObject = JObject.Load(reader); + + // Create target object based on JObject + object target = new AdminShellV10.SubmodelElement(); + + if (jObject.ContainsKey(UpperClassProperty)) + { + var j2 = jObject[UpperClassProperty]; + foreach (var c in j2.Children()) + { + var cprop = c as Newtonsoft.Json.Linq.JProperty; + if (cprop == null) + continue; + if (cprop.Name == LowerClassProperty && + cprop.Value != null && + cprop.Value.Type.ToString() == "String") + { + var cpval = cprop.Value.ToObject(); + if (cpval == null) + continue; + var o = AdminShellV10.SubmodelElementWrapper.CreateAdequateType(cpval); + if (o != null) + target = o; + } + } + } + + // Populate the object properties + serializer.Populate(jObject.CreateReader(), target); + + return target; + } + + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + throw new NotImplementedException(); + } + } + + /// + /// This class lets an outer functionality keep track on the supplementary files, which are in or + /// are pending to be added or deleted to an Package. + /// + public class PackageSupplementaryFile : Referable + { + public enum LocationType { InPackage, AddPending, DeletePending } + + public enum SpecialHandlingType { None, EmbedAsThumbnail } + + public Uri uri = null; + public string sourcePath = null; + public LocationType location = LocationType.InPackage; + public SpecialHandlingType specialHandling = SpecialHandlingType.None; + + public PackageSupplementaryFile( + Uri uri, string sourcePath = null, LocationType location = LocationType.InPackage, + SpecialHandlingType specialHandling = SpecialHandlingType.None) + { + this.uri = uri; + this.sourcePath = sourcePath; + this.location = location; + this.specialHandling = specialHandling; + } + + // class derives from Referable in order to provide GetElementName + public override string GetElementName() + { + return "File"; + } + + } + + /// + /// This class encapsulates an AdminShellEnvironment and supplementary files into an AASX Package. + /// Specifically has the capability to load, update and store .XML, .JSON and .AASX packages. + /// + public class PackageEnv + { + private string fn = "New Package"; + private AdministrationShellEnv aasenv = new AdministrationShellEnv(); + private Package openPackage = null; + private List pendingFilesToAdd = new List(); + private List pendingFilesToDelete = new List(); + + public PackageEnv() + { + } + + public PackageEnv(AdministrationShellEnv env) + { + if (env != null) + this.aasenv = env; + } + + public PackageEnv(string fn) + { + Load(fn); + } + + public bool IsOpen + { + get + { + return openPackage != null; + } + } + + public string Filename + { + get + { + return fn; + } + } + + public AdminShellV10.AdministrationShellEnv AasEnv + { + get + { + return aasenv; + } + } + + public bool Load(string fn) + { + this.fn = fn; + if (this.openPackage != null) + this.openPackage.Close(); + this.openPackage = null; + + if (fn.ToLower().EndsWith(".xml")) + { + // load only XML + try + { + // TODO (Michael Hoffmeister, 1970-01-01): use aasenv serialzers here! + XmlSerializer serializer = new XmlSerializer( + typeof(AdminShellV10.AdministrationShellEnv), "http://www.admin-shell.io/aas/1/0"); + TextReader reader = new StreamReader(fn); + this.aasenv = serializer.Deserialize(reader) as AdminShellV10.AdministrationShellEnv; + if (this.aasenv == null) + throw (new Exception("Type error for XML file!")); + reader.Close(); + } + catch (Exception ex) + { + throw (new Exception( + string.Format("While reading AAS {0} at {1} gave: {2}", fn, + AdminShellUtilV10.ShortLocation(ex), ex.Message))); + } + return true; + } + + if (fn.ToLower().EndsWith(".json")) + { + // load only JSON + try + { + using (StreamReader file = System.IO.File.OpenText(fn)) + { + // TODO (Michael Hoffmeister, 1970-01-01): use aasenv serialzers here! + JsonSerializer serializer = new JsonSerializer(); + serializer.Converters.Add(new AdminShellV10.JsonAasxConverter("modelType", "name")); + this.aasenv = (AdministrationShellEnv)serializer.Deserialize( + file, typeof(AdministrationShellEnv)); + } + } + catch (Exception ex) + { + throw (new Exception( + string.Format("While reading AAS {0} at {1} gave: {2}", + fn, AdminShellUtilV10.ShortLocation(ex), ex.Message))); + } + return true; + } + + if (fn.ToLower().EndsWith(".aasx")) + { + // load package AASX + try + { + var package = Package.Open(fn, FileMode.Open); + + // get the origin from the package + PackagePart originPart = null; + var xs = package.GetRelationshipsByType( + "http://www.admin-shell.io/aasx/relationships/aasx-origin"); + foreach (var x in xs) + if (x.SourceUri.ToString() == "/") + { + originPart = package.GetPart(x.TargetUri); + break; + } + if (originPart == null) + throw (new Exception(string.Format("Unable to find AASX origin. Aborting!"))); + + // get the specs from the package + PackagePart specPart = null; + xs = originPart.GetRelationshipsByType( + "http://www.admin-shell.io/aasx/relationships/aas-spec"); + foreach (var x in xs) + { + specPart = package.GetPart(x.TargetUri); + break; + } + if (specPart == null) + throw (new Exception(string.Format("Unable to find AASX spec(s). Aborting!"))); + + // open spec part to read + try + { + if (specPart.Uri.ToString().ToLower().Trim().EndsWith("json")) + { + using (var s = specPart.GetStream(FileMode.Open)) + { + using (StreamReader file = new StreamReader(s)) + { + JsonSerializer serializer = new JsonSerializer(); + serializer.Converters.Add( + new AdminShellV10.JsonAasxConverter("modelType", "name")); + this.aasenv = (AdministrationShellEnv)serializer.Deserialize( + file, typeof(AdministrationShellEnv)); + } + } + } + else + { + using (var s = specPart.GetStream(FileMode.Open)) + { + // own catch loop to be more specific + XmlSerializer serializer = new XmlSerializer( + typeof(AdminShellV10.AdministrationShellEnv), + "http://www.admin-shell.io/aas/1/0"); + this.aasenv = serializer.Deserialize(s) as AdminShellV10.AdministrationShellEnv; + this.openPackage = package; + if (this.aasenv == null) + throw (new Exception("Type error for XML file!")); + s.Close(); + } + } + } + catch (Exception ex) + { + throw (new Exception( + string.Format("While reading AAS {0} spec at {1} gave: {2}", + fn, AdminShellUtilV10.ShortLocation(ex), ex.Message))); + } + } + catch (Exception ex) + { + throw (new Exception( + string.Format("While reading AASX {0} at {1} gave: {2}", fn, + AdminShellUtilV10.ShortLocation(ex), ex.Message))); + } + return true; + } + + // Don't know to handle + throw (new Exception(string.Format($"Not able to handle {fn}."))); + } + + public bool LoadFromAasEnvString(string content) + { + try + { + using (var file = new StringReader(content)) + { + // TODO (Michael Hoffmeister, 1970-01-01): use aasenv serialzers here! + JsonSerializer serializer = new JsonSerializer(); + serializer.Converters.Add(new AdminShellV10.JsonAasxConverter("modelType", "name")); + this.aasenv = (AdministrationShellEnv)serializer.Deserialize( + file, typeof(AdministrationShellEnv)); + } + } + catch (Exception ex) + { + throw (new Exception( + string.Format("While reading AASENV string {0} gave: {1}", + AdminShellUtilV10.ShortLocation(ex), ex.Message))); + } + return true; + } + + public enum PreferredFormat { None, Xml, Json }; + + public bool SaveAs(string fn, bool writeFreshly = false, PreferredFormat prefFmt = PreferredFormat.None) + { + + if (fn.ToLower().EndsWith(".xml")) + { + // save only XML + this.fn = fn; + try + { + using (var s = new StreamWriter(this.fn)) + { + // TODO (Michael Hoffmeister, 1970-01-01): use aasenv serialzers here! + var serializer = new XmlSerializer(typeof(AdminShellV10.AdministrationShellEnv)); + var nss = new XmlSerializerNamespaces(); + nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace); + nss.Add("aas", "http://www.admin-shell.io/aas/1/0"); + nss.Add("IEC61360", "http://www.admin-shell.io/IEC61360/1/0"); + serializer.Serialize(s, this.aasenv, nss); + } + } + catch (Exception ex) + { + throw (new Exception( + string.Format("While writing AAS {0} at {1} gave: {2}", + fn, AdminShellUtilV10.ShortLocation(ex), ex.Message))); + } + return true; + } + + if (fn.ToLower().EndsWith(".json")) + { + // save only JSON + // this funcitonality is a initial test + this.fn = fn; + try + { + using (var sw = new StreamWriter(fn)) + { + // TODO (Michael Hoffmeister, 1970-01-01): use aasenv serialzers here! + + sw.AutoFlush = true; + + JsonSerializer serializer = new JsonSerializer(); + serializer.NullValueHandling = NullValueHandling.Ignore; + serializer.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; + serializer.Formatting = Newtonsoft.Json.Formatting.Indented; + using (JsonWriter writer = new JsonTextWriter(sw)) + { + serializer.Serialize(writer, this.aasenv); + } + } + } + catch (Exception ex) + { + throw (new Exception( + string.Format("While writing AAS {0} at {1} gave: {2}", + fn, AdminShellUtilV10.ShortLocation(ex), ex.Message))); + } + return true; + } + + if (fn.ToLower().EndsWith(".aasx")) + { + // save package AASX + try + { + // we want existing contents to be preserved, but no possiblity to change file name + // therefore: copy file to new name, re-open! + // fn could be changed, therefore close "old" package first + if (this.openPackage != null) + { + try + { + this.openPackage.Close(); + if (!writeFreshly) + System.IO.File.Copy(this.fn, fn); + } + catch { } + this.openPackage = null; + } + + // approach is to utilize the existing package, if possible. If not, create from scratch + var package = Package.Open(fn, (writeFreshly) ? FileMode.Create : FileMode.OpenOrCreate); + this.fn = fn; + + // get the origin from the package + PackagePart originPart = null; + var xs = package.GetRelationshipsByType( + "http://www.admin-shell.io/aasx/relationships/aasx-origin"); + foreach (var x in xs) + if (x.SourceUri.ToString() == "/") + { + originPart = package.GetPart(x.TargetUri); + break; + } + if (originPart == null) + { + // create, as not existing + originPart = package.CreatePart( + new Uri( + "/aasx/aasx-origin", UriKind.RelativeOrAbsolute), + System.Net.Mime.MediaTypeNames.Text.Plain, CompressionOption.Maximum); + using (var s = originPart.GetStream(FileMode.Create)) + { + var bytes = System.Text.Encoding.ASCII.GetBytes("Intentionally empty."); + s.Write(bytes, 0, bytes.Length); + } + package.CreateRelationship( + originPart.Uri, TargetMode.Internal, + "http://www.admin-shell.io/aasx/relationships/aasx-origin"); + } + + // get the specs from the package + PackagePart specPart = null; + PackageRelationship specRel = null; + xs = originPart.GetRelationshipsByType( + "http://www.admin-shell.io/aasx/relationships/aas-spec"); + foreach (var x in xs) + { + specRel = x; + specPart = package.GetPart(x.TargetUri); + break; + } + + // check, if we have to change the spec part + if (specPart != null && specRel != null) + { + var name = System.IO.Path.GetFileNameWithoutExtension( + specPart.Uri.ToString()).ToLower().Trim(); + var ext = System.IO.Path.GetExtension(specPart.Uri.ToString()).ToLower().Trim(); + if ((ext == ".json" && prefFmt == PreferredFormat.Xml) + || (ext == ".xml" && prefFmt == PreferredFormat.Json) + || (name.StartsWith("aasenv-with-no-id"))) + { + // try kill specpart + try + { + originPart.DeleteRelationship(specRel.Id); + package.DeletePart(specPart.Uri); + } + catch { } + finally { specPart = null; specRel = null; } + } + } + + if (specPart == null) + { + // create, as not existing + var frn = "aasenv-with-no-id"; + if (this.aasenv.AdministrationShells.Count > 0) + frn = this.aasenv.AdministrationShells[0].GetFriendlyName() ?? frn; + var aas_spec_fn = "/aasx/#/#.aas"; + if (prefFmt == PreferredFormat.Json) + aas_spec_fn += ".json"; + else + aas_spec_fn += ".xml"; + aas_spec_fn = aas_spec_fn.Replace("#", "" + frn); + specPart = package.CreatePart( + new Uri( + aas_spec_fn, UriKind.RelativeOrAbsolute), System.Net.Mime.MediaTypeNames.Text.Xml, + CompressionOption.Maximum); + originPart.CreateRelationship( + specPart.Uri, TargetMode.Internal, + "http://www.admin-shell.io/aasx/relationships/aas-spec"); + } + + // now, specPart shall be != null! + if (specPart.Uri.ToString().ToLower().Trim().EndsWith("json")) + { + using (var s = specPart.GetStream(FileMode.Create)) + { + JsonSerializer serializer = new JsonSerializer(); + serializer.NullValueHandling = NullValueHandling.Ignore; + serializer.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; + serializer.Formatting = Newtonsoft.Json.Formatting.Indented; + using (var sw = new StreamWriter(s)) + { + using (JsonWriter writer = new JsonTextWriter(sw)) + { + serializer.Serialize(writer, this.aasenv); + } + } + } + } + else + { + using (var s = specPart.GetStream(FileMode.Create)) + { + var serializer = new XmlSerializer(typeof(AdminShellV10.AdministrationShellEnv)); + var nss = new XmlSerializerNamespaces(); + nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace); + nss.Add("aas", "http://www.admin-shell.io/aas/1/0"); + nss.Add("IEC61360", "http://www.admin-shell.io/IEC61360/1/0"); + serializer.Serialize(s, this.aasenv, nss); + } + } + + // there might be pending files to be deleted (first delete, then add, in case of identical + // files in both categories) + foreach (var psfDel in pendingFilesToDelete) + { + // try find an existing part for that file .. + var found = false; + + // normal files + xs = specPart.GetRelationshipsByType( + "http://www.admin-shell.io/aasx/relationships/aas-suppl"); + foreach (var x in xs) + if (x.TargetUri == psfDel.uri) + { + // try to delete + specPart.DeleteRelationship(x.Id); + package.DeletePart(psfDel.uri); + found = true; + break; + } + + // thumbnails + xs = package.GetRelationshipsByType( + "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); + foreach (var x in xs) + if (x.TargetUri == psfDel.uri) + { + // try to delete + package.DeleteRelationship(x.Id); + package.DeletePart(psfDel.uri); + found = true; + break; + } + + if (!found) + throw (new Exception( + $"Not able to delete pending file {psfDel.uri} in saving package {fn}")); + } + + // after this, there are no more pending for delete files + pendingFilesToDelete.Clear(); + + // write pending supplementary files + foreach (var psfAdd in pendingFilesToAdd) + { + // make sure .. + if (psfAdd.sourcePath == null || + psfAdd.location != PackageSupplementaryFile.LocationType.AddPending) + continue; + + // normal file? + if (psfAdd.specialHandling == PackageSupplementaryFile.SpecialHandlingType.None) + { + + // try find an existing part for that file .. + PackagePart filePart = null; + xs = specPart.GetRelationshipsByType( + "http://www.admin-shell.io/aasx/relationships/aas-suppl"); + foreach (var x in xs) + if (x.TargetUri == psfAdd.uri) + { + filePart = package.GetPart(x.TargetUri); + break; + } + + if (filePart == null) + { + // create new part and link + filePart = package.CreatePart( + psfAdd.uri, AdminShellV10.PackageEnv.GuessMimeType(psfAdd.sourcePath), + CompressionOption.Maximum); + specPart.CreateRelationship( + filePart.Uri, TargetMode.Internal, + "http://www.admin-shell.io/aasx/relationships/aas-suppl"); + } + + // now should be able to write + using (var s = filePart.GetStream(FileMode.Create)) + { + var bytes = System.IO.File.ReadAllBytes(psfAdd.sourcePath); + s.Write(bytes, 0, bytes.Length); + } + } + + // thumbnail file? + if (psfAdd.specialHandling == + PackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail) + { + // try find an existing part for that file .. + PackagePart filePart = null; + xs = package.GetRelationshipsByType( + "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); + foreach (var x in xs) + if (x.SourceUri.ToString() == "/" && x.TargetUri == psfAdd.uri) + { + filePart = package.GetPart(x.TargetUri); + break; + } + + if (filePart == null) + { + // create new part and link + filePart = package.CreatePart( + psfAdd.uri, AdminShellV10.PackageEnv.GuessMimeType(psfAdd.sourcePath), + CompressionOption.Maximum); + package.CreateRelationship( + filePart.Uri, TargetMode.Internal, + "http://schemas.openxmlformats.org/package/2006/" + + "relationships/metadata/thumbnail"); + } + + // now should be able to write + using (var s = filePart.GetStream(FileMode.Create)) + { + var bytes = System.IO.File.ReadAllBytes(psfAdd.sourcePath); + s.Write(bytes, 0, bytes.Length); + } + } + } + + // after this, there are no more pending for add files + pendingFilesToAdd.Clear(); + + // flush, but leave open + package.Flush(); + this.openPackage = package; + } + catch (Exception ex) + { + throw (new Exception( + string.Format("While write AASX {0} at {1} gave: {2}", + fn, AdminShellUtilV10.ShortLocation(ex), ex.Message))); + } + return true; + } + + // Don't know to handle + throw (new Exception(string.Format($"Not able to handle {fn}."))); + } + + private int BackupIndex = 0; + + public void BackupInDir(string backupDir, int maxFiles) + { + // access + if (backupDir == null || maxFiles < 1) + return; + + // we do it not caring on any errors + try + { + // get index in form + if (BackupIndex == 0) + { + // do not always start at 0!! + var rnd = new Random(); + BackupIndex = rnd.Next(maxFiles); + } + var ndx = BackupIndex % maxFiles; + BackupIndex += 1; + + // build a filename + var fn = Path.Combine(backupDir, $"backup{ndx:000}.xml"); + + // raw save + using (var s = new StreamWriter(fn)) + { + var serializer = new XmlSerializer(typeof(AdminShellV10.AdministrationShellEnv)); + var nss = new XmlSerializerNamespaces(); + nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace); + nss.Add("aas", "http://www.admin-shell.io/aas/1/0"); + nss.Add("IEC61360", "http://www.admin-shell.io/IEC61360/1/0"); + serializer.Serialize(s, this.aasenv, nss); + } + } + catch { } + } + + public Stream GetLocalStreamFromPackage(string uriString) + { + // access + if (this.openPackage == null) + throw (new Exception(string.Format($"AASX Package {this.fn} not opened. Aborting!"))); + var part = this.openPackage.GetPart(new Uri(uriString, UriKind.RelativeOrAbsolute)); + if (part == null) + throw (new Exception( + string.Format( + $"Cannot access URI {uriString} in {this.fn} not opened. Aborting!"))); + return part.GetStream(FileMode.Open); + } + + public long GetStreamSizeFromPackage(string uriString) + { + long res = 0; + try + { + if (this.openPackage == null) + return 0; + var part = this.openPackage.GetPart(new Uri(uriString, UriKind.RelativeOrAbsolute)); + if (part == null) + return 0; + using (var s = part.GetStream(FileMode.Open)) + { + res = s.Length; + } + } + catch { return 0; } + return res; + } + + public Stream GetLocalThumbnailStream(ref Uri thumbUri) + { + // access + if (this.openPackage == null) + throw (new Exception(string.Format($"AASX Package {this.fn} not opened. Aborting!"))); + // get the thumbnail over the relationship + PackagePart thumbPart = null; + var xs = this.openPackage.GetRelationshipsByType( + "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); + foreach (var x in xs) + if (x.SourceUri.ToString() == "/") + { + thumbPart = this.openPackage.GetPart(x.TargetUri); + thumbUri = x.TargetUri; + break; + } + if (thumbPart == null) + throw (new Exception(string.Format("Unable to find AASX thumbnail. Aborting!"))); + return thumbPart.GetStream(FileMode.Open); + } + + public Stream GetLocalThumbnailStream() + { + Uri dummy = null; + return GetLocalThumbnailStream(ref dummy); + } + + public List GetListOfSupplementaryFiles() + { + // new result + var result = new List(); + + // access + if (this.openPackage != null) + { + + // get the thumbnail(s) from the package + var xs = this.openPackage.GetRelationshipsByType( + "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); + foreach (var x in xs) + if (x.SourceUri.ToString() == "/") + { + result.Add(new PackageSupplementaryFile( + x.TargetUri, + location: PackageSupplementaryFile.LocationType.InPackage, + specialHandling: PackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail)); + } + + // get the origin from the package + PackagePart originPart = null; + xs = this.openPackage.GetRelationshipsByType( + "http://www.admin-shell.io/aasx/relationships/aasx-origin"); + foreach (var x in xs) + if (x.SourceUri.ToString() == "/") + { + originPart = this.openPackage.GetPart(x.TargetUri); + break; + } + + if (originPart != null) + { + // get the specs from the origin + PackagePart specPart = null; + xs = originPart.GetRelationshipsByType( + "http://www.admin-shell.io/aasx/relationships/aas-spec"); + foreach (var x in xs) + { + specPart = this.openPackage.GetPart(x.TargetUri); + break; + } + + if (specPart != null) + { + // get the supplementaries from the package, derived from spec + xs = specPart.GetRelationshipsByType( + "http://www.admin-shell.io/aasx/relationships/aas-suppl"); + foreach (var x in xs) + { + result.Add( + new PackageSupplementaryFile( + x.TargetUri, location: PackageSupplementaryFile.LocationType.InPackage)); + } + } + } + } + + // add or modify the files to delete + foreach (var psfDel in pendingFilesToDelete) + { + // already in + var found = result.Find(x => { return x.uri == psfDel.uri; }); + if (found != null) + found.location = PackageSupplementaryFile.LocationType.DeletePending; + else + { + psfDel.location = PackageSupplementaryFile.LocationType.DeletePending; + result.Add(psfDel); + } + } + + // add the files to store as well + foreach (var psfAdd in pendingFilesToAdd) + { + // already in (should not happen ?!) + var found = result.Find(x => { return x.uri == psfAdd.uri; }); + if (found != null) + found.location = PackageSupplementaryFile.LocationType.AddPending; + else + { + psfAdd.location = PackageSupplementaryFile.LocationType.AddPending; + result.Add(psfAdd); + } + } + + // done + return result; + } + + public static string GuessMimeType(string fn) + { + var file_ext = System.IO.Path.GetExtension(fn).ToLower().Trim(); + var content_type = System.Net.Mime.MediaTypeNames.Text.Plain; + if (file_ext == ".pdf") content_type = System.Net.Mime.MediaTypeNames.Application.Pdf; + if (file_ext == ".xml") content_type = System.Net.Mime.MediaTypeNames.Text.Xml; + if (file_ext == ".txt") content_type = System.Net.Mime.MediaTypeNames.Text.Plain; + if (file_ext == ".igs") content_type = "application/iges"; + if (file_ext == ".iges") content_type = "application/iges"; + if (file_ext == ".stp") content_type = "application/step"; + if (file_ext == ".step") content_type = "application/step"; + if (file_ext == ".jpg") content_type = System.Net.Mime.MediaTypeNames.Image.Jpeg; + if (file_ext == ".jpeg") content_type = System.Net.Mime.MediaTypeNames.Image.Jpeg; + if (file_ext == ".png") content_type = "image/png"; + if (file_ext == ".gif") content_type = System.Net.Mime.MediaTypeNames.Image.Gif; + return content_type; + } + + public void AddSupplementaryFileToStore( + string sourcePath, string targetDir, string targetFn, bool embedAsThumb) + { + // beautify parameters + sourcePath = sourcePath.Trim(); + targetDir = targetDir.Trim(); + if (!targetDir.EndsWith("/")) + targetDir += "/"; + targetDir = targetDir.Replace(@"\", "/"); + targetFn = targetFn.Trim(); + if (sourcePath == "" || targetDir == "" || targetFn == "") + throw (new Exception(string.Format("Trying add supplementary file with empty name or path!"))); + + var file_fn = "" + targetDir.Trim() + targetFn.Trim(); + + // add record + pendingFilesToAdd.Add( + new PackageSupplementaryFile( + new Uri(file_fn, UriKind.RelativeOrAbsolute), + sourcePath, + location: PackageSupplementaryFile.LocationType.AddPending, + specialHandling: ( + embedAsThumb + ? PackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail + : PackageSupplementaryFile.SpecialHandlingType.None) + )); + } + + public void DeleteSupplementaryFile(PackageSupplementaryFile psf) + { + if (psf == null) + throw (new Exception(string.Format("No supplementary file given!"))); + + if (psf.location == PackageSupplementaryFile.LocationType.AddPending) + { + // is still pending in add list -> remove + pendingFilesToAdd.RemoveAll((x) => { return x.uri == psf.uri; }); + } + + if (psf.location == PackageSupplementaryFile.LocationType.InPackage) + { + // add to pending delete list + pendingFilesToDelete.Add(psf); + } + } + + public void Close() + { + if (this.openPackage != null) + this.openPackage.Close(); + this.openPackage = null; + this.fn = ""; + this.aasenv = null; + } + } + + } + + #endregion +} + +#endif diff --git a/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShell.cs b/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShell.cs new file mode 100644 index 000000000..045199144 --- /dev/null +++ b/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShell.cs @@ -0,0 +1,8895 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Text.RegularExpressions; +using System.Xml; +using System.Xml.Serialization; +using AdminShell_V20; +using Newtonsoft.Json; + +//namespace AdminShellNS +//namespace AdminShell_V20 +namespace AasxCompatibilityModels +{ + /// + /// This empty class derives always from the current version of the Administration Shell class hierarchy. + /// + public class AdminShell : AdminShellV20 { } + + #region AdminShell_V2_0 + + /// + /// Version of Details of Administration Shell Part 1 V1.0 published Nov/Dec/Jan 2018/19 + /// + public class AdminShellV20 + { + public class Identification + { + + // members + + [XmlAttribute] + [CountForHash] + public string idType = ""; + + [XmlText] + [CountForHash] + public string id = ""; + + // some constants + + public static string IRDI = "IRDI"; + public static string IRI = "IRI"; + public static string IdShort = "IdShort"; + + // constructors + + public Identification() { } + + public Identification(Identification src) + { + this.idType = src.idType; + this.id = src.id; + } + +#if !DoNotUseAasxCompatibilityModels + public Identification(AasxCompatibilityModels.AdminShellV10.Identification src) + { + this.idType = src.idType; + if (this.idType.Trim().ToLower() == "uri") + this.idType = Identification.IRI; + this.id = src.id; + } +#endif + + public Identification(string idType, string id) + { + this.idType = idType; + this.id = id; + } + + public Identification(Key key) + { + this.idType = key.idType; + this.id = key.value; + } + + // Creator with validation + + public static Identification CreateNew(string idType, string id) + { + if (idType == null || id == null) + return null; + var found = false; + foreach (var x in Key.IdentifierTypeNames) + found = found || idType.ToLower().Trim() == x.ToLower().Trim(); + if (!found) + return null; + return new Identification(idType, id); + } + + // further + + public bool IsEqual(Identification other) + { + return (this.idType.Trim().ToLower() == other.idType.Trim().ToLower() + && this.id.Trim().ToLower() == other.id.Trim().ToLower()); + } + + public bool IsIRI() + { + return idType?.Trim().ToUpper() == "URI" + || idType?.Trim().ToUpper() == IRI; + } + + public bool IsIRDI() + { + return idType?.Trim().ToUpper() == IRDI; + } + + public override string ToString() + { + return $"[{this.idType}] {this.id}"; + } + } + + public class Administration + { + + // members + + [MetaModelName("Administration.version")] + [TextSearchable] + [CountForHash] + public string version = ""; + + [MetaModelName("Administration.revision")] + [TextSearchable] + [CountForHash] + public string revision = ""; + + // constructors + + public Administration() { } + + public Administration(Administration src) + { + this.version = src.version; + this.revision = src.revision; + } + +#if !DoNotUseAasxCompatibilityModels + public Administration(AasxCompatibilityModels.AdminShellV10.Administration src) + { + this.version = src.version; + this.revision = src.revision; + } +#endif + + public Administration(string version, string revision) + { + this.version = version; + this.revision = revision; + } + + public override string ToString() + { + return $"R={this.version}, V={this.revision}"; + } + } + + public class Key + { + // Constants + + public enum MatchMode { Strict, Relaxed, Identification }; + + // Members + + [MetaModelName("Key.type")] + [TextSearchable] + [XmlAttribute] + [CountForHash] + public string type = ""; + + [XmlAttribute] + [CountForHash] + public bool local = false; + + [MetaModelName("Key.idType")] + [TextSearchable] + [XmlAttribute] + [JsonIgnore] + [CountForHash] + public string idType = ""; + + [XmlIgnore] + [JsonProperty(PropertyName = "idType")] + public string JsonIdType + { + // adapt idShort <-> IdShort + get => (idType == "idShort") ? "IdShort" : idType; + set => idType = (value == "idShort") ? "IdShort" : value; + } + + [MetaModelName("Key.value")] + [TextSearchable] + [XmlText] + [CountForHash] + public string value = ""; + + [XmlIgnore] + [JsonProperty(PropertyName = "index")] + [CountForHash] + public int index = 0; + + public Key() + { + } + + public Key(Key src) + { + this.type = src.type; + this.local = src.local; + this.idType = src.idType; + this.value = src.value; + } + +#if !DoNotUseAasxCompatibilityModels + public Key(AasxCompatibilityModels.AdminShellV10.Key src) + { + this.type = src.type; + this.local = src.local; + this.idType = src.idType; + if (this.idType.Trim().ToLower() == "uri") + this.idType = Identification.IRI; + if (this.idType.Trim().ToLower() == "idshort") + this.idType = Identification.IdShort; + this.value = src.value; + } +#endif + + public Key(string type, bool local, string idType, string value) + { + this.type = type; + this.local = local; + this.idType = idType; + this.value = value; + } + + public static Key CreateNew(string type, bool local, string idType, string value) + { + var k = new Key() + { + type = type, + local = local, + idType = idType, + value = value + }; + return (k); + } + + public static Key GetFromRef(Reference r) + { + if (r == null || r.Count != 1) + return null; + return r[0]; + } + + public Identification ToId() + { + return new Identification(this); + } + + public string ToString(int format = 0) + { + if (format == 1) + { + return String.Format( + "({0})({1})[{2}]{3}", this.type, this.local ? "local" : "no-local", this.idType, this.value); + } + if (format == 2) + { + return String.Format("[{0}]{1}", this.idType, this.value); + } + + // (old) default + var tlc = (this.local) ? "Local" : "not Local"; + return $"[{this.type}, {tlc}, {this.idType}, {this.value}]"; + } + + public static Key Parse(string cell, string typeIfNotSet = null, + bool allowFmtAll = false, bool allowFmt0 = false, + bool allowFmt1 = false, bool allowFmt2 = false) + { + // access and defaults? + if (cell == null || cell.Trim().Length < 1) + return null; + if (typeIfNotSet == null) + typeIfNotSet = Key.GlobalReference; + + // format == 1 + if (allowFmtAll || allowFmt1) + { + var m = Regex.Match(cell, @"\((\w+)\)\((\S+)\)\[(\w+)\]( ?)(.*)$"); + if (m.Success) + { + return new AdminShell.Key( + m.Groups[1].ToString(), m.Groups[2].ToString() == "local", + m.Groups[3].ToString(), m.Groups[5].ToString()); + } + } + + // format == 2 + if (allowFmtAll || allowFmt2) + { + var m = Regex.Match(cell, @"\[(\w+)\]( ?)(.*)$"); + if (m.Success) + { + return new AdminShell.Key( + typeIfNotSet, true, + m.Groups[1].ToString(), m.Groups[3].ToString()); + } + } + + // format == 0 + if (allowFmtAll || allowFmt0) + { + var m = Regex.Match(cell, @"\[(\w+),( ?)([^,]+),( ?)\[(\w+)\],( ?)(.*)\]"); + if (m.Success) + { + return new AdminShell.Key( + m.Groups[1].ToString(), !m.Groups[3].ToString().Contains("not"), + m.Groups[5].ToString(), m.Groups[7].ToString()); + } + } + + // no + return null; + } + + public static string KeyListToString(List keys) + { + if (keys == null || keys.Count < 1) + return ""; + // normally, exactly one key + if (keys.Count == 1) + return keys[0].ToString(); + // multiple! + var s = "[ "; + foreach (var k in keys) + { + if (s.Length > 0) + s += ", "; + s += k.ToString(); + } + return s + " ]"; + } + + public static string[] KeyElements = new string[] { + "GlobalReference", + "FragmentReference", + "AccessPermissionRule", + "Asset", + "AssetAdministrationShell", + "ConceptDescription", + "Submodel", + "SubmodelRef", // not completely right, but used by Package Explorer + "Blob", + "ConceptDictionary", + "DataElement", + "File", + "Operation", + "OperationVariable", + "BasicEvent", + "Entity", + "Property", + "MultiLanguageProperty", + "Range", + "ReferenceElement", + "RelationshipElement", + "AnnotatedRelationshipElement", + "Capability", + "SubmodelElement", + "SubmodelElementCollection", + "View" }; + + public static string[] ReferableElements = new string[] { + "AccessPermissionRule", + "Asset", + "AssetAdministrationShell", + "ConceptDescription", + "Submodel", + "Blob", + "ConceptDictionary", + "DataElement", + "File", + "Operation", + "OperationVariable", + "Entity", + "BasicEvent", + "Property", + "MultiLanguageProperty", + "Range", + "ReferenceElement", + "RelationshipElement", + "AnnotatedRelationshipElement", + "Capability", + "SubmodelElement", + "SubmodelElementCollection", + "View" }; + + public static string[] SubmodelElements = new string[] { + "DataElement", + "File", + "Event", + "Operation", + "Property", + "MultiLanguageProperty", + "Range", + "ReferenceElement", + "RelationshipElement", + "AnnotatedRelationshipElement", + "Capability", + "BasicEvent", + "Entity", + "SubmodelElementCollection"}; + + public static string[] IdentifiableElements = new string[] { + "Asset", + "AssetAdministrationShell", + "ConceptDescription", + "Submodel" }; + + // use this in list to designate all of the above elements + public static string AllElements = "All"; + + // use this in list to designate the GlobalReference + // Resharper disable MemberHidesStaticFromOuterClass + public static string GlobalReference = "GlobalReference"; + public static string FragmentReference = "FragmentReference"; + public static string ConceptDescription = "ConceptDescription"; + public static string SubmodelRef = "SubmodelRef"; + public static string Submodel = "Submodel"; + public static string SubmodelElement = "SubmodelElement"; + public static string Asset = "Asset"; + public static string AAS = "AssetAdministrationShell"; + public static string Entity = "Entity"; + public static string View = "View"; + // Resharper enable MemberHidesStaticFromOuterClass + + public static string[] IdentifierTypeNames = new string[] { + Identification.IdShort, "FragmentId", "Custom", Identification.IRDI, Identification.IRI }; + + public enum IdentifierType { IdShort = 0, FragmentId, Custom, IRDI, IRI }; + + public static string GetIdentifierTypeName(IdentifierType t) + { + return IdentifierTypeNames[(int)t]; + } + + public static string IdShort = "IdShort"; + public static string FragmentId = "FragmentId"; + public static string Custom = "Custom"; + + // some helpers + + public static bool IsInKeyElements(string ke) + { + var res = false; + foreach (var s in KeyElements) + if (s.Trim().ToLower() == ke.Trim().ToLower()) + res = true; + return res; + } + + public bool IsIdType(string[] value) + { + if (value == null || idType == null || idType.Trim() == "") + return false; + return value.Contains(idType.Trim()); + } + + public bool IsIdType(string value) + { + if (value == null || idType == null || idType.Trim() == "") + return false; + return value.Trim().Equals(idType.Trim()); + } + + public bool IsType(string value) + { + if (value == null || type == null || type.Trim() == "") + return false; + return value.Trim().ToLower().Equals(type.Trim().ToLower()); + } + + public bool IsAbsolute() + { + return IsType(Key.GlobalReference) + || IsType(Key.AAS) + || IsType(Key.Asset) + || IsType(Key.Submodel); + } + + public bool Matches( + string type, bool local, string idType, string id, MatchMode matchMode = MatchMode.Strict) + { + if (matchMode == MatchMode.Strict) + return this.type == type && this.local == local && this.idType == idType && this.value == id; + + if (matchMode == MatchMode.Relaxed) + return (this.type == type || this.type == Key.GlobalReference || type == Key.GlobalReference) + && this.idType == idType && this.value == id; + + if (matchMode == MatchMode.Identification) + return this.idType == idType && this.value == id; + + return false; + } + + public bool Matches(Identification id) + { + if (id == null) + return false; + return this.Matches(Key.GlobalReference, false, id.idType, id.id, MatchMode.Identification); + } + + public bool Matches(Key key, MatchMode matchMode = MatchMode.Strict) + { + if (key == null) + return false; + return this.Matches(key.type, key.local, key.idType, key.value, matchMode); + } + + // validation + + public static AasValidationAction Validate(AasValidationRecordList results, Key k, Referable container) + { + // access + if (results == null || container == null) + return AasValidationAction.No; + + var res = AasValidationAction.No; + + // check + if (k == null) + { + // violation case + results.Add(new AasValidationRecord( + AasValidationSeverity.SpecViolation, container, + "Key: is null", + () => + { + res = AasValidationAction.ToBeDeleted; + })); + } + else + { + // check IdType + var idf = AdminShellUtilV20.CheckIfInConstantStringArray(IdentifierTypeNames, k.idType); + if (idf == AdminShellUtilV20.ConstantFoundEnum.No) + // violation case + results.Add(new AasValidationRecord( + AasValidationSeverity.SchemaViolation, container, + "Key: idType is not in allowed enumeration values", + () => + { + k.idType = Custom; + })); + if (idf == AdminShellUtilV20.ConstantFoundEnum.AnyCase) + // violation case + results.Add(new AasValidationRecord( + AasValidationSeverity.SchemaViolation, container, + "Key: idType in wrong casing", + () => + { + k.idType = AdminShellUtilV20.CorrectCasingForConstantStringArray( + IdentifierTypeNames, k.idType); + })); + + // check type + var tf = AdminShellUtilV20.CheckIfInConstantStringArray(KeyElements, k.type); + if (tf == AdminShellUtilV20.ConstantFoundEnum.No) + // violation case + results.Add(new AasValidationRecord( + AasValidationSeverity.SchemaViolation, container, + "Key: type is not in allowed enumeration values", + () => + { + k.type = GlobalReference; + })); + if (tf == AdminShellUtilV20.ConstantFoundEnum.AnyCase) + // violation case + results.Add(new AasValidationRecord( + AasValidationSeverity.SchemaViolation, container, + "Key: type in wrong casing", + () => + { + k.idType = AdminShellUtilV20.CorrectCasingForConstantStringArray( + KeyElements, k.type); + })); + } + + // may give result "to be deleted" + return res; + } + } + + public class KeyList : List + { + // getters / setters + + [XmlIgnore] + public bool IsEmpty { get { return this.Count < 1; } } + + // constructors / creators + + public KeyList() { } + + public KeyList(KeyList src) + { + if (src != null) + foreach (var k in src) + this.Add(new Key(k)); + } + + public static KeyList CreateNew(Key k) + { + var kl = new KeyList { k }; + return kl; + } + + public static KeyList CreateNew(string type, bool local, string idType, string value) + { + var kl = new KeyList() { + Key.CreateNew(type, local, idType, value) + }; + return kl; + } + + public static KeyList CreateNew(string type, bool local, string idType, string[] valueItems) + { + // access + if (valueItems == null) + return null; + + // prepare + var kl = new AdminShell.KeyList(); + foreach (var x in valueItems) + kl.Add(new AdminShell.Key(type, local, idType, "" + x)); + return kl; + } + + // matches + + public bool Matches(KeyList other, Key.MatchMode matchMode = Key.MatchMode.Strict) + { + if (other == null || other.Count != this.Count) + return false; + + var same = true; + for (int i = 0; i < this.Count; i++) + same = same && this[i].Matches(other[i], matchMode); + + return same; + } + + // other + + public void NumberIndices() + { + for (int i = 0; i < this.Count; i++) + this[i].index = i; + } + + public string ToString(int format = 0, string delimiter = ",") + { + var res = string.Join(delimiter, this.Select((k) => k.ToString(format))); + return res; + } + + public static KeyList Parse(string input) + { + // access + if (input == null) + return null; + + // split + var parts = input.Split(',', ';'); + var kl = new KeyList(); + + foreach (var p in parts) + { + var k = Key.Parse(p); + if (k != null) + kl.Add(k); + } + + return kl; + } + + public string MostSignificantInfo() + { + if (this.Count < 1) + return "-"; + var i = this.Count - 1; + var res = this[i].value; + if (this[i].IsIdType(new[] { Key.FragmentId }) && i > 0) + res += this[i - 1].value; + return res; + } + + // validation + + public static void Validate(AasValidationRecordList results, KeyList kl, + Referable container) + { + // access + if (results == null || kl == null || container == null) + return; + + // iterate thru + var idx = 0; + while (idx < kl.Count) + { + var act = Key.Validate(results, kl[idx], container); + if (act == AasValidationAction.ToBeDeleted) + { + kl.RemoveAt(idx); + continue; + } + idx++; + } + } + + public bool StartsWith(KeyList head, bool emptyIsTrue = false, + Key.MatchMode matchMode = Key.MatchMode.Strict) + { + // access + if (head == null) + return false; + if (head.Count == 0) + return emptyIsTrue; + + // simply test element-wise + for (int i = 0; i < head.Count; i++) + { + // does head have more elements than this list? + if (i >= this.Count) + return false; + + if (!head[i].Matches(this[i], matchMode)) + return false; + } + + // ok! + return true; + } + + // arithmetics + + public static KeyList operator +(KeyList a, Key b) + { + var res = new KeyList(a); + if (b != null) + res.Add(b); + return res; + } + + public static KeyList operator +(KeyList a, KeyList b) + { + var res = new KeyList(a); + if (b != null) + res.AddRange(b); + return res; + } + + public KeyList SubList(int startPos, int count = int.MaxValue) + { + var res = new KeyList(); + if (startPos >= this.Count) + return res; + int nr = 0; + for (int i = startPos; i < this.Count && nr < count; i++) + { + nr++; + res.Add(this[i]); + } + return res; + } + + public KeyList ReplaceLastKey(KeyList newKeys) + { + var res = new KeyList(this); + if (res.Count < 1 || newKeys == null || newKeys.Count < 1) + return res; + + res.Remove(res.Last()); + res = res + newKeys; + + return res; + } + + // other + + /// + /// Take only idShort, ignore all other key-types and create a '/'-separated list + /// + /// Empty string or list of idShorts + public string BuildIdShortPath(int startPos = 0, int count = int.MaxValue) + { + if (startPos >= this.Count) + return ""; + int nr = 0; + var res = ""; + for (int i = startPos; i < this.Count && nr < count; i++) + { + nr++; + if (this[i].idType.Trim().ToLower() == Key.IdShort.Trim().ToLower()) + { + if (res != "") + res += "/"; + res += this[i].value; + } + } + return res; + } + } + + public class AasElementSelfDescription + { + public string ElementName = ""; + public string ElementAbbreviation = ""; + public SubmodelElementWrapper.AdequateElementEnum ElementEnum = + SubmodelElementWrapper.AdequateElementEnum.Unknown; + + public AasElementSelfDescription() { } + + public AasElementSelfDescription( + string ElementName, string ElementAbbreviation, + SubmodelElementWrapper.AdequateElementEnum elementEnum + = SubmodelElementWrapper.AdequateElementEnum.Unknown) + { + this.ElementName = ElementName; + this.ElementAbbreviation = ElementAbbreviation; + this.ElementEnum = elementEnum; + } + } + + /// + /// Extends understanding of Referable to further elements, which can be related to + /// + public interface IAasElement + { + AasElementSelfDescription GetSelfDescription(); + string GetElementName(); + } + + [XmlType(TypeName = "reference")] + public class Reference : IAasElement + { + + // members + + [XmlIgnore] // anyway, as it is private + [JsonIgnore] + private KeyList keys = new KeyList(); + + // getters / setters + + [XmlArray("keys")] + [XmlArrayItem("key")] + [JsonIgnore] + public KeyList Keys { get { return keys; } } + [XmlIgnore] + [JsonProperty(PropertyName = "keys")] + public KeyList JsonKeys + { + get + { + keys?.NumberIndices(); + return keys; + } + } + + [XmlIgnore] + [JsonIgnore] + public bool IsEmpty { get { return keys == null || keys.Count < 1; } } + [XmlIgnore] + [JsonIgnore] + public int Count { get { if (keys == null) return 0; return keys.Count; } } + [XmlIgnore] + [JsonIgnore] + public Key this[int index] { get { return keys[index]; } } + + [XmlIgnore] + [JsonIgnore] + public Key First { get { return this.Count < 1 ? null : this.keys[0]; } } + + [XmlIgnore] + [JsonIgnore] + public Key Last { get { return this.Count < 1 ? null : this.keys[this.keys.Count - 1]; } } + + // constructors / creators + + public Reference() + { + } + + public Reference(Key k) + { + if (k != null) + keys.Add(k); + } + + public Reference(Reference src) + { + if (src != null) + foreach (var k in src.Keys) + keys.Add(new Key(k)); + } + +#if !DoNotUseAasxCompatibilityModels + public Reference(AasxCompatibilityModels.AdminShellV10.Reference src) + { + if (src != null) + foreach (var k in src.Keys) + keys.Add(new Key(k)); + } +#endif + + public Reference(SemanticId src) + { + if (src != null) + foreach (var k in src.Keys) + keys.Add(new Key(k)); + } + +#if !DoNotUseAasxCompatibilityModels + public Reference(AasxCompatibilityModels.AdminShellV10.SemanticId src) + { + if (src != null) + foreach (var k in src.Keys) + keys.Add(new Key(k)); + } +#endif + public static Reference CreateNew(Key k) + { + if (k == null) + return null; + var r = new Reference(); + r.keys.Add(k); + return r; + } + + public static Reference CreateNew(List k) + { + if (k == null) + return null; + var r = new Reference(); + r.keys.AddRange(k); + return r; + } + + public static Reference CreateNew(string type, bool local, string idType, string value) + { + if (type == null || idType == null || value == null) + return null; + var r = new Reference(); + r.keys.Add(Key.CreateNew(type, local, idType, value)); + return r; + } + + public static Reference CreateIrdiReference(string irdi) + { + if (irdi == null) + return null; + var r = new Reference(); + r.keys.Add(new Key(Key.GlobalReference, false, Identification.IRDI, irdi)); + return r; + } + + // additions + + public static Reference operator +(Reference a, Key b) + { + var res = new Reference(a); + res.Keys?.Add(b); + return res; + } + + public static Reference operator +(Reference a, Reference b) + { + var res = new Reference(a); + res.Keys?.AddRange(b?.Keys); + return res; + } + + // further + + public Key GetAsExactlyOneKey() + { + if (keys == null || keys.Count != 1) + return null; + var k = keys[0]; + return new Key(k.type, k.local, k.idType, k.value); + } + + public bool MatchesExactlyOneKey( + string type, bool local, string idType, string id, Key.MatchMode matchMode = Key.MatchMode.Strict) + { + if (keys == null || keys.Count != 1) + return false; + var k = keys[0]; + return k.Matches(type, local, idType, id, matchMode); + } + + public bool MatchesExactlyOneKey(Key key, Key.MatchMode matchMode = Key.MatchMode.Strict) + { + if (key == null) + return false; + return this.MatchesExactlyOneKey(key.type, key.local, key.idType, key.value, matchMode); + } + + public bool Matches( + string type, bool local, string idType, string id, Key.MatchMode matchMode = Key.MatchMode.Strict) + { + if (this.Count == 1) + { + var k = keys[0]; + return k.Matches(type, local, idType, id, matchMode); + } + return false; + } + + public bool Matches(Key key, Key.MatchMode matchMode = Key.MatchMode.Strict) + { + if (this.Count == 1) + { + var k = keys[0]; + return k.Matches(key, matchMode); + } + return false; + } + + public bool Matches(Identification other) + { + if (other == null) + return false; + if (this.Count == 1) + { + var k = keys[0]; + return k.Matches(Key.GlobalReference, false, other.idType, other.id, Key.MatchMode.Identification); + } + return false; + } + + public bool Matches(Reference other, Key.MatchMode matchMode = Key.MatchMode.Strict) + { + if (this.keys == null || other == null || other.keys == null || other.Count != this.Count) + return false; + + var same = true; + for (int i = 0; i < this.Count; i++) + same = same && this.keys[i].Matches(other.keys[i], matchMode); + + return same; + } + + public bool Matches(SemanticId other, Key.MatchMode matchMode = Key.MatchMode.Strict) + { + return Matches(new Reference(other), matchMode); + } + + public bool Matches(ConceptDescription cd, Key.MatchMode matchMode = Key.MatchMode.Strict) + { + return Matches(cd?.GetReference(), matchMode); + } + + public string ToString(int format = 0, string delimiter = ",") + { + return keys?.ToString(format, delimiter); + } + + public static Reference Parse(string input) + { + return CreateNew(KeyList.Parse(input)); + } + + public string ListOfValues(string delim) + { + string res = ""; + if (this.Keys != null) + foreach (var x in this.Keys) + { + if (x == null) + continue; + if (res != "") res += delim; + res += x.value; + } + return res; + } + + // self description + + public virtual AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("Reference", "Rfc"); + } + + public virtual string GetElementName() + { + return this.GetSelfDescription()?.ElementName; + } + } + + [XmlType(TypeName = "derivedFrom")] + public class AssetAdministrationShellRef : Reference + { + // constructors + + public AssetAdministrationShellRef() : base() { } + + public AssetAdministrationShellRef(Key k) : base(k) { } + + public AssetAdministrationShellRef(Reference src) : base(src) { } + +#if !DoNotUseAasxCompatibilityModels + public AssetAdministrationShellRef(AasxCompatibilityModels.AdminShellV10.Reference src) : base(src) { } +#endif + + // further methods + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("AssetAdministrationShellRef", "AasRef"); + } + } + + [XmlType(TypeName = "assetRef")] + public class AssetRef : Reference + { + // constructors + + public AssetRef() : base() { } + + public AssetRef(AssetRef src) : base(src) { } + +#if !DoNotUseAasxCompatibilityModels + public AssetRef(AasxCompatibilityModels.AdminShellV10.AssetRef src) : base(src) { } +#endif + + public AssetRef(Reference r) + : base(r) + { + } + + // further methods + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("AssetRef", "AssetRef"); + } + } + + [XmlType(TypeName = "submodelRef")] + public class SubmodelRef : Reference + { + // constructors + + public SubmodelRef() : base() { } + + public SubmodelRef(SubmodelRef src) : base(src) { } + + public SubmodelRef(Reference src) : base(src) { } + +#if !DoNotUseAasxCompatibilityModels + public SubmodelRef(AasxCompatibilityModels.AdminShellV10.SubmodelRef src) : base(src) { } +#endif + + public new static SubmodelRef CreateNew(string type, bool local, string idType, string value) + { + var r = new SubmodelRef(); + r.Keys.Add(Key.CreateNew(type, local, idType, value)); + return r; + } + + public static SubmodelRef CreateNew(Reference src) + { + if (src == null || src.Keys == null) + return null; + var r = new SubmodelRef(); + r.Keys.AddRange(src.Keys); + return r; + } + + // further methods + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("SubmodelRef", "SMRef"); + } + } + + [XmlType(TypeName = "conceptDescriptionRef")] + public class ConceptDescriptionRef : Reference + { + // constructors + + public ConceptDescriptionRef() : base() { } + + public ConceptDescriptionRef(ConceptDescriptionRef src) : base(src) { } + +#if !DoNotUseAasxCompatibilityModels + public ConceptDescriptionRef( + AasxCompatibilityModels.AdminShellV10.ConceptDescriptionRef src) : base(src) { } +#endif + + // further methods + + public new static ConceptDescriptionRef CreateNew(string type, bool local, string idType, string value) + { + var r = new ConceptDescriptionRef(); + r.Keys.Add(Key.CreateNew(type, local, idType, value)); + return r; + } + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("ConceptDescriptionRef", "CDRef"); + } + + } + + [XmlType(TypeName = "dataSpecificationRef")] + public class DataSpecificationRef : Reference + { + // constructors + + public DataSpecificationRef() : base() { } + + public DataSpecificationRef(DataSpecificationRef src) : base(src) { } + + public DataSpecificationRef(Reference src) : base(src) { } + +#if !DoNotUseAasxCompatibilityModels + public DataSpecificationRef(AasxCompatibilityModels.AdminShellV10.DataSpecificationRef src) : base(src) { } + + public DataSpecificationRef(AasxCompatibilityModels.AdminShellV10.Reference src) : base(src) { } +#endif + + // further methods + + public static DataSpecificationRef CreateNew(Reference src) + { + if (src == null || src.Keys == null) + return null; + var res = new DataSpecificationRef(); + foreach (var k in src.Keys) + res.Keys.Add(new Key(k)); + return res; + } + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("DataSpecificationRef", "DSRef"); + } + + } + + [XmlType(TypeName = "conceptDescriptions")] + public class ConceptDescriptionRefs + { + [XmlElement(ElementName = "conceptDescriptionRef")] + public List conceptDescriptions = new List(); + + // constructors + + public ConceptDescriptionRefs() { } + + public ConceptDescriptionRefs(ConceptDescriptionRefs src) + { + if (src.conceptDescriptions != null) + foreach (var cdr in src.conceptDescriptions) + this.conceptDescriptions.Add(new ConceptDescriptionRef(cdr)); + } + +#if !DoNotUseAasxCompatibilityModels + public ConceptDescriptionRefs(AasxCompatibilityModels.AdminShellV10.ConceptDescriptionRefs src) + { + if (src.conceptDescriptions != null) + foreach (var cdr in src.conceptDescriptions) + this.conceptDescriptions.Add(new ConceptDescriptionRef(cdr)); + } +#endif + } + + [XmlType(TypeName = "containedElementRef")] + public class ContainedElementRef : Reference + { + // constructors + + public ContainedElementRef() { } + + public ContainedElementRef(ContainedElementRef src) : base(src) { } + +#if !DoNotUseAasxCompatibilityModels + public ContainedElementRef(AasxCompatibilityModels.AdminShellV10.ContainedElementRef src) : base(src) { } +#endif + + public static ContainedElementRef CreateNew(Reference src) + { + if (src == null || src.Keys == null) + return null; + var r = new ContainedElementRef(); + r.Keys.AddRange(src.Keys); + return r; + } + + // further methods + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("ContainedElementRef", "CERef"); + } + + } + +#if __not_valid_anymore + [XmlType(TypeName = "hasDataSpecification")] + public class HasDataSpecification + { + [XmlElement(ElementName = "reference")] // make "reference" go away by magic?! + public List reference = new List(); + + public HasDataSpecification() { } + + public HasDataSpecification(HasDataSpecification src) + { + foreach (var r in src.reference) + reference.Add(new Reference(r)); + } + +#if !DoNotUseAasxCompatibilityModels + public HasDataSpecification(AasxCompatibilityModels.AdminShellV10.HasDataSpecification src) + { + foreach (var r in src.reference) + reference.Add(new Reference(r)); + } +#endif + } +#else + // Note: In versions prior to V2.0.1, the SDK has "HasDataSpecification" containing only a Reference. + // Iv 2.0.1, theoretically each entity with HasDataSpecification could also conatin a + // EmbeddedDataSpecification. + + [XmlType(TypeName = "hasDataSpecification")] + public class HasDataSpecification : List + { + public HasDataSpecification() { } + + public HasDataSpecification(HasDataSpecification src) + { + foreach (var r in src) + this.Add(new EmbeddedDataSpecification(r)); + } + + public HasDataSpecification(IEnumerable src) + { + foreach (var r in src) + this.Add(new EmbeddedDataSpecification(r)); + } + +#if !DoNotUseAasxCompatibilityModels + public HasDataSpecification(AasxCompatibilityModels.AdminShellV10.HasDataSpecification src) + { + foreach (var r in src.reference) + this.Add(new EmbeddedDataSpecification(r)); + } +#endif + + // make some explicit and easy to use getter, setters + + [XmlIgnore] + [JsonIgnore] + public EmbeddedDataSpecification IEC61360 + { + get + { + foreach (var eds in this) + if (eds?.dataSpecificationContent?.dataSpecificationIEC61360 != null + || eds?.dataSpecification?.MatchesExactlyOneKey( + DataSpecificationIEC61360.GetKey(), Key.MatchMode.Identification) == true) + return eds; + return null; + } + set + { + // search existing first? + var eds = this.IEC61360; + if (eds != null) + { + // replace this + /* TODO (MIHO, 2020-08-30): this does not prevent the corner case, that we could have + * multiple dataSpecificationIEC61360 in this list, which would be an error */ + this.Remove(eds); + this.Add(value); + return; + } + + // no? .. add! + this.Add(value); + } + } + + [XmlIgnore] + [JsonIgnore] + public DataSpecificationIEC61360 IEC61360Content + { + get + { + return this.IEC61360?.dataSpecificationContent?.dataSpecificationIEC61360; + } + set + { + // search existing first? + var eds = this.IEC61360; + if (eds != null) + { + // replace this + eds.dataSpecificationContent.dataSpecificationIEC61360 = value; + return; + } + // no? .. add! + var edsnew = new EmbeddedDataSpecification(); + edsnew.dataSpecificationContent.dataSpecificationIEC61360 = value; + this.Add(edsnew); + } + } + + } +#endif + + [XmlType(TypeName = "ContainedElements")] + public class ContainedElements + { + + // members + + [XmlElement(ElementName = "containedElementRef")] // make "reference" go away by magic?! + public List reference = new List(); + + // getter / setter + + public bool IsEmpty { get { return reference == null || reference.Count < 1; } } + public int Count { get { if (reference == null) return 0; return reference.Count; } } + public ContainedElementRef this[int index] { get { return reference[index]; } } + + // Creators + + public ContainedElements() { } + + public ContainedElements(ContainedElements src) + { + if (src.reference != null) + foreach (var r in src.reference) + this.reference.Add(new ContainedElementRef(r)); + } + +#if !DoNotUseAasxCompatibilityModels + public ContainedElements(AasxCompatibilityModels.AdminShellV10.ContainedElements src) + { + if (src.reference != null) + foreach (var r in src.reference) + this.reference.Add(new ContainedElementRef(r)); + } +#endif + + public static ContainedElements CreateOrSetInner(ContainedElements outer, ContainedElementRef[] inner) + { + var res = outer; + if (res == null) + res = new ContainedElements(); + if (inner == null) + { + res.reference = null; + return res; + } + res.reference = new List(inner); + return res; + } + + } + + [XmlType(TypeName = "langString", Namespace = "http://www.admin-shell.io/2/0")] + public class LangStr + { + // constants + public static string LANG_DEFAULT = "en"; + + // members + + [MetaModelName("LangStr.lang")] + [TextSearchable] + [XmlAttribute(Namespace = "http://www.admin-shell.io/2/0")] + [JsonProperty(PropertyName = "language")] + [CountForHash] + public string lang = ""; + + [MetaModelName("LangStr.str")] + [TextSearchable] + [XmlText] + [JsonProperty(PropertyName = "text")] + [CountForHash] + public string str = ""; + + // constructors + + public LangStr() { } + + public LangStr(LangStr src) + { + this.lang = src.lang; + this.str = src.str; + } + +#if !DoNotUseAasxCompatibilityModels + public LangStr(AasxCompatibilityModels.AdminShellV10.LangStr src) + { + this.lang = src.lang; + this.str = src.str; + } +#endif + + public LangStr(string lang, string str) + { + this.lang = lang; + this.str = str; + } + + public static ListOfLangStr CreateManyFromStringArray(string[] s) + { + var r = new ListOfLangStr(); + var i = 0; + while ((i + 1) < s.Length) + { + r.Add(new LangStr(s[i], s[i + 1])); + i += 2; + } + return r; + } + + public override string ToString() + { + return $"{str}@{lang}"; + } + } + + public class ListOfLangStr : List + { + public ListOfLangStr() { } + + public ListOfLangStr(LangStr ls) + { + if (ls != null) + this.Add(ls); + } + + public ListOfLangStr(ListOfLangStr src) + { + if (src != null) + foreach (var ls in src) + this.Add(ls); + } + + public string this[string lang] + { + get + { + return GetDefaultStr(lang); + } + set + { + foreach (var ls in this) + if (ls.lang.Trim().ToLower() == lang?.Trim().ToLower()) + { + ls.str = value; + return; + } + this.Add(new LangStr(lang, value)); + } + } + + public string GetDefaultStr(string defaultLang = null) + { + // start + if (defaultLang == null) + defaultLang = LangStr.LANG_DEFAULT; + defaultLang = defaultLang.Trim().ToLower(); + string res = null; + + // search + foreach (var ls in this) + if (ls.lang.Trim().ToLower() == defaultLang) + res = ls.str; + if (res == null && this.Count > 0) + res = this[0].str; + + // found? + return res; + } + + public string GetExactStrForLang(string lang) + { + // start + if (lang == null) + return null; + string res = null; + + // exact search + foreach (var ls in this) + if (ls.lang.Trim().ToLower() == lang) + res = ls.str; + + // found? + return res; + } + + public bool ContainsLang(string lang) + { + return GetExactStrForLang(lang) != null; + } + + public bool AllLangSameString() + { + if (this.Count < 2) + return true; + + for (int i = 1; i < this.Count; i++) + if (this[0]?.str != null && this[0]?.str?.Trim() != this[i]?.str?.Trim()) + return false; + + return true; + } + + public override string ToString() + { + return string.Join(", ", this.Select((ls) => ls.ToString())); + } + + public static ListOfLangStr Parse(string cell) + { + // access + if (cell == null) + return null; + + // iterative approach + var res = new ListOfLangStr(); + while (true) + { + // trivial case and finite end + if (!cell.Contains("@")) + { + if (cell.Trim() != "") + res.Add(new LangStr(LangStr.LANG_DEFAULT, cell)); + break; + } + + // OK, pick the next couple + var m = Regex.Match(cell, @"(.*?)@(\w+)", RegexOptions.Singleline); + if (!m.Success) + { + // take emergency exit? + res.Add(new LangStr("??", cell)); + break; + } + + // use the match and shorten cell .. + res.Add(new LangStr(m.Groups[2].ToString(), m.Groups[1].ToString().Trim())); + cell = cell.Substring(m.Index + m.Length); + } + + return res; + } + } + + public class Description + { + + // members + + [XmlElement(ElementName = "langString")] + public ListOfLangStr langString = new ListOfLangStr(); + + // constructors + + public Description() { } + + public Description(Description src) + { + if (src != null && src.langString != null) + foreach (var ls in src.langString) + langString.Add(new LangStr(ls)); + } + + public Description(LangStringSet src) + { + if (src != null && src.langString != null) + foreach (var ls in src.langString) + langString.Add(new LangStr(ls)); + } + +#if !DoNotUseAasxCompatibilityModels + public Description(AasxCompatibilityModels.AdminShellV10.Description src) + { + if (src != null) + foreach (var ls in src.langString) + langString.Add(new LangStr(ls)); + } +#endif + + // single string representation + public string GetDefaultStr(string defaultLang = null) + { + return this.langString?.GetDefaultStr(defaultLang); + } + + } + + public class AssetKind + { + // constants + public static string Type = "Type"; + public static string Instance = "Instance"; + + [MetaModelName("AssetKind.kind")] + [TextSearchable] + [XmlText] + [CountForHash] + public string kind = "Instance"; + + // getters / setters + + [XmlIgnore] + [JsonIgnore] + public bool IsInstance { get { return kind == null || kind.Trim().ToLower() == "instance"; } } + + [XmlIgnore] + [JsonIgnore] + public bool IsType { get { return kind != null && kind.Trim().ToLower() == "type"; } } + + // constructors / creators + + public AssetKind() { } + + public AssetKind(AssetKind src) + { + kind = src.kind; + } + +#if !DoNotUseAasxCompatibilityModels + public AssetKind(AasxCompatibilityModels.AdminShellV10.Kind src) + { + kind = src.kind; + } +#endif + + public AssetKind(string kind) + { + this.kind = kind; + } + + public static AssetKind CreateAsType() + { + var res = new AssetKind() { kind = AssetKind.Type }; + return res; + } + + public static AssetKind CreateAsInstance() + { + var res = new AssetKind() { kind = AssetKind.Instance }; + return res; + } + } + + public class ModelingKind + { + // constants + public static string Template = "Template"; + public static string Instance = "Instance"; + + [MetaModelName("ModelingKind.kind")] + [TextSearchable] + [XmlText] + [CountForHash] + public string kind = Instance; + + // getters / setters + + [XmlIgnore] + [JsonIgnore] + public bool IsInstance { get { return kind == null || kind.Trim().ToLower() == Instance.ToLower(); } } + + [XmlIgnore] + [JsonIgnore] + public bool IsTemplate { get { return kind != null && kind.Trim().ToLower() == Template.ToLower(); } } + + // constructors / creators + + public ModelingKind() { } + + public ModelingKind(ModelingKind src) + { + kind = src.kind; + } + +#if !DoNotUseAasxCompatibilityModels + public ModelingKind(AasxCompatibilityModels.AdminShellV10.Kind src) + { + kind = src.kind; + } +#endif + + public ModelingKind(string kind) + { + this.kind = kind; + } + + public static ModelingKind CreateAsTemplate() + { + var res = new ModelingKind() { kind = Template }; + return res; + } + + public static ModelingKind CreateAsInstance() + { + var res = new ModelingKind() { kind = Instance }; + return res; + } + + // validation + + public static void Validate(AasValidationRecordList results, ModelingKind mk, Referable container) + { + // access + if (results == null || container == null) + return; + + // check + if (mk == null || mk.kind == null) + { + // warning + results.Add(new AasValidationRecord( + AasValidationSeverity.Warning, container, + "ModelingKind: is null", + () => + { + })); + } + else + { + var k = mk.kind.Trim(); + var kl = k.ToLower(); + if (kl != Template.ToLower() && kl != Instance.ToLower()) + { + // violation case + results.Add(new AasValidationRecord( + AasValidationSeverity.SchemaViolation, container, + $"ModelingKind: enumeration value neither {Template} nor {Instance}", + () => + { + mk.kind = Instance; + })); + } + else if (k != Template && k != Instance) + { + // warning + results.Add(new AasValidationRecord( + AasValidationSeverity.Warning, container, + "ModelingKind: enumeration value in wrong casing", + () => + { + if (kl == Template.ToLower()) + mk.kind = Template; + else + mk.kind = Instance; + })); + } + } + } + } + + public class SemanticId : Reference + { + + // constructors / creators + + public SemanticId() + : base() + { + } + + public SemanticId(SemanticId src) + : base(src) + { + } + + public SemanticId(Reference src) : base(src) { } + +#if !DoNotUseAasxCompatibilityModels + public SemanticId(AasxCompatibilityModels.AdminShellV10.SemanticId src) + : base(src) + { + } +#endif + public SemanticId(Key key) : base(key) { } + + public static SemanticId CreateFromKey(Key key) + { + if (key == null) + return null; + var res = new SemanticId(); + res.Keys.Add(key); + return res; + } + + public static SemanticId CreateFromKeys(List keys) + { + if (keys == null) + return null; + var res = new SemanticId(); + res.Keys.AddRange(keys); + return res; + } + + public new static SemanticId Parse(string input) + { + return (SemanticId)CreateNew(KeyList.Parse(input)); + } + } + + /// + /// This class allows to describe further data (in derived classes) when enumerating Children. + /// + public class EnumerationPlacmentBase + { + } + + public interface IEnumerateChildren + { + IEnumerable EnumerateChildren(); + EnumerationPlacmentBase GetChildrenPlacement(SubmodelElement child); + object AddChild(SubmodelElementWrapper smw, EnumerationPlacmentBase placement = null); + } + + public interface IValidateEntity + { + void Validate(AasValidationRecordList results); + } + + /// + /// This attribute indicates, that it should e.g. serialized in JSON. + /// + [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = true)] + public class CountForHash : System.Attribute + { + } + + /// + /// This attribute indicates, that evaluation shall not count following field or not dive into references. + /// + [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = true)] + public class SkipForHash : System.Attribute + { + } + + /// + /// This attribute indicates, that the field / property is searchable + /// + [System.AttributeUsage(System.AttributeTargets.Field | System.AttributeTargets.Property, AllowMultiple = true)] + public class MetaModelName : System.Attribute + { + public string name; + public MetaModelName(string name) + { + this.name = name; + } + } + + /// + /// This attribute indicates, that the field / property shall be skipped for reflection + /// in order to avoid cycles + /// + [System.AttributeUsage(System.AttributeTargets.Field | System.AttributeTargets.Property, AllowMultiple = true)] + public class SkipForReflection : System.Attribute + { + } + + /// + /// This attribute indicates, that the field / property shall be skipped for searching, because it is not + /// directly displayed in Package Explorer + /// + [System.AttributeUsage(System.AttributeTargets.Field | System.AttributeTargets.Property, AllowMultiple = true)] + public class SkipForSearch : System.Attribute + { + } + + /// + /// This attribute indicates, that the field / property is searchable + /// + [System.AttributeUsage(System.AttributeTargets.Field | System.AttributeTargets.Property, AllowMultiple = true)] + public class TextSearchable : System.Attribute + { + } + + /// + /// Result of FindReferable in Environment + /// + public class ReferableRootInfo + { + public AdministrationShell AAS = null; + public Asset Asset = null; + public Submodel Submodel = null; + + public int NrOfRootKeys = 0; + + public bool IsValid + { + get + { + return NrOfRootKeys > 0 && (AAS != null || Submodel != null || Asset != null); + } + } + } + + /// + /// Marks an object, preferaby a payload item, which might be featured by the diary collection + /// + public interface IAasDiaryEntry + { + } + + public class DiaryDataDef + { + public enum TimeStampKind { Create, Update } + + [XmlIgnore] + [JsonIgnore] + private DateTime[] _timeStamp = new DateTime[2]; + + [XmlIgnore] + [JsonIgnore] + public DateTime[] TimeStamp { get { return _timeStamp; } } + + /// + /// List of entries, timewise one after each other (entries are timestamped). + /// Note: Default is Entries = null, as handling of many many AAS elements does not + /// create additional overhead of creating empty lists. An empty list shall be avoided. + /// + public List Entries = null; + + public static void AddAndSetTimestamps(Referable element, IAasDiaryEntry de, bool isCreate = false) + { + // trivial + if (element == null || de == null || element.DiaryData == null) + return; + + // add entry + if (element.DiaryData.Entries == null) + element.DiaryData.Entries = new List(); + element.DiaryData.Entries.Add(de); + + // figure out which timestamp + var tsk = TimeStampKind.Update; + if (isCreate) + { + tsk = TimeStampKind.Create; + } + + // set this timestamp (and for the parents, as well) + IDiaryData el = element; + while (el?.DiaryData != null) + { + // itself + el.DiaryData.TimeStamp[(int)tsk] = DateTime.UtcNow; + + // go up + el = (el as Referable)?.parent as IDiaryData; + } + } + } + + public interface IDiaryData + { + DiaryDataDef DiaryData { get; } + } + + public class ListOfReferable : List + { + // conversion to other list + + public KeyList ToKeyList() + { + var res = new KeyList(); + foreach (var rf in this) + res.Add(rf.ToKey()); + return res; + } + + public Reference GetReference() + { + return Reference.CreateNew(ToKeyList()); + } + } + + public interface IRecurseOnReferables + { + void RecurseOnReferables( + object state, Func lambda, + bool includeThis = false); + } + + public class Referable : IValidateEntity, IAasElement, IDiaryData, IGetReference, IRecurseOnReferables + { + // diary + + [XmlIgnore] + [JsonIgnore] + [SkipForHash] + [SkipForReflection] + private DiaryDataDef _diaryData = new DiaryDataDef(); + + [XmlIgnore] + [JsonIgnore] + [SkipForReflection] + public DiaryDataDef DiaryData { get { return _diaryData; } } + + // members + + [MetaModelName("Referable.IdShort")] + [TextSearchable] + [CountForHash] + public string idShort = ""; + + [MetaModelName("Referable.category")] + [TextSearchable] + [CountForHash] + public string category = null; + + [XmlElement(ElementName = "description")] + [JsonIgnore] + [CountForHash] + public Description description = null; + + [XmlIgnore] + [JsonProperty(PropertyName = "descriptions")] + public ListOfLangStr JsonDescription + { + get + { + return description?.langString; + } + set + { + if (value == null) + { + description = null; + return; + } + + if (description == null) + description = new Description(); + description.langString = value; + } + } + + [XmlIgnore] + [JsonIgnore] + [SkipForHash] // important to skip, as recursion elsewise will go in cycles! + [SkipForReflection] // important to skip, as recursion elsewise will go in cycles! + public IAasElement parent = null; + + public static string CONSTANT = "CONSTANT"; + public static string Category_PARAMETER = "PARAMETER"; + public static string VARIABLE = "VARIABLE"; + + public static string[] ReferableCategoryNames = new string[] { CONSTANT, Category_PARAMETER, VARIABLE }; + + // constructors + + public Referable() { } + + public Referable(string idShort) + { + this.idShort = idShort; + } + + public Referable(Referable src) + { + if (src == null) + return; + this.idShort = src.idShort; + this.category = src.category; + if (src.description != null) + this.description = new Description(src.description); + } + +#if !DoNotUseAasxCompatibilityModels + public Referable(AasxCompatibilityModels.AdminShellV10.Referable src) + { + if (src == null) + return; + this.idShort = src.idShort; + if (this.idShort == null) + // change in V2.0 -> mandatory + this.idShort = ""; + this.category = src.category; + if (src.description != null) + this.description = new Description(src.description); + } +#endif + + /// + /// Introduced for JSON serialization, can create Referables based on a string name + /// + /// string name (standard PascalCased) + public static Referable CreateAdequateType(string elementName) + { + if (elementName == Key.AAS) + return new AdministrationShell(); + if (elementName == Key.Asset) + return new Asset(); + if (elementName == Key.ConceptDescription) + return new ConceptDescription(); + if (elementName == Key.Submodel) + return new Submodel(); + if (elementName == Key.View) + return new View(); + return SubmodelElementWrapper.CreateAdequateType(elementName); + } + + public void AddDescription(string lang, string str) + { + if (description == null) + description = new Description(); + description.langString.Add(new LangStr(lang, str)); + } + + public virtual AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("Referable", "Ref"); + } + + public virtual string GetElementName() + { + return this.GetSelfDescription()?.ElementName; + } + + public string GetFriendlyName() + { + return AdminShellUtilV20.FilterFriendlyName(this.idShort); + } + + public virtual Reference GetReference(bool includeParents = true) + { + return new Reference( + new AdminShell.Key( + this.GetElementName(), false, Key.IdShort, "" + this.idShort)); + } + + public void CollectReferencesByParent(List refs) + { + // access + if (refs == null) + return; + + // check, if this is identifiable + if (this is Identifiable) + { + var idf = this as Identifiable; + if (idf != null) + { + var k = Key.CreateNew( + idf.GetElementName(), true, idf.identification?.idType, idf.identification?.id); + refs.Insert(0, k); + } + } + else + { + var k = Key.CreateNew(this.GetElementName(), true, "IdShort", this.idShort); + refs.Insert(0, k); + // recurse upwards! + if (this.parent is Referable prf) + prf.CollectReferencesByParent(refs); + } + } + + public string CollectIdShortByParent() + { + // recurse first + var head = ""; + if (!(this is Identifiable) && this.parent is Referable prf) + // can go up + head = prf.CollectIdShortByParent() + "/"; + // add own + var myid = ""; + if (this.idShort != null && this.idShort.Trim() != "") + myid = this.idShort.Trim(); + // together + return head + myid; + } + + // string functions + + public string ToIdShortString() + { + if (this.idShort == null || this.idShort.Trim().Length < 1) + return (""); + return this.idShort.Trim(); + } + + public override string ToString() + { + return "" + this.idShort; + } + + public virtual Key ToKey() + { + return new Key(GetElementName(), true, Key.IdShort, idShort); + } + + // hash functionality + + public class ObjectFieldInfo + { + public object o; + public FieldInfo fi; + public ObjectFieldInfo() { } + public ObjectFieldInfo(object o, FieldInfo fi) + { + this.o = o; + this.fi = fi; + } + } + + public List RecursivelyFindFields(object o, Type countAttribute, Type skipAttribute) + { + // access + var res = new List(); + if (o == null || countAttribute == null) + return res; + + // find fields for this object + var t = o.GetType(); + var l = t.GetFields(BindingFlags.Instance | BindingFlags.Public); + foreach (var f in l) + { + // Skip this field?? + if (skipAttribute != null && f.GetCustomAttribute(skipAttribute) != null) + continue; + + // add directly? + if (f.GetCustomAttribute(countAttribute) != null) + res.Add(new ObjectFieldInfo(o, f)); + + // object + if (f.FieldType.IsClass) + { + var oo = f.GetValue(o); + var r = RecursivelyFindFields(oo, countAttribute, skipAttribute); + res.AddRange(r); + } + + // try cast in IList to check further + var elems = f.GetValue(o) as IList; + if (elems != null) + foreach (var e in elems) + { + var r = RecursivelyFindFields(e, countAttribute, skipAttribute); + res.AddRange(r); + } + + } + // OK + return res; + } + + public byte[] ComputeByteArray() + { + // use memory stream for effcient behaviour + var mems = new MemoryStream(); + + // TEST + var xxx = RecursivelyFindFields(this, typeof(CountForHash), typeof(SkipForHash)); + + foreach (var ofi in xxx) + { + var a = ofi.fi.GetCustomAttribute(); + if (a != null) + { + // found an accountable field, get bytes + var o = ofi.fi.GetValue(ofi.o); + byte[] bs = null; + + // optimize for probabilities + + if (o is string) + bs = System.Text.Encoding.UTF8.GetBytes((string)o); + else if (o is char[]) + bs = System.Text.Encoding.UTF8.GetBytes((char[])o); + else if (o is double) + bs = BitConverter.GetBytes((double)o); + else if (o is float) + bs = BitConverter.GetBytes((float)o); + else if (o is char) + bs = BitConverter.GetBytes((char)o); + else if (o is byte) + bs = BitConverter.GetBytes((byte)o); + else if (o is int) + bs = BitConverter.GetBytes((int)o); + else if (o is long) + bs = BitConverter.GetBytes((long)o); + else if (o is short) + bs = BitConverter.GetBytes((short)o); + else if (o is uint) + bs = BitConverter.GetBytes((uint)o); + else if (o is ulong) + bs = BitConverter.GetBytes((ulong)o); + else if (o is ushort) + bs = BitConverter.GetBytes((ushort)o); + + if (bs != null) + mems.Write(bs, 0, bs.Length); + } + } + + return mems.ToArray(); + } + + private static System.Security.Cryptography.SHA256 HashProvider = + System.Security.Cryptography.SHA256.Create(); + + public string ComputeHashcode() + { + var dataBytes = this.ComputeByteArray(); + var hashBytes = Referable.HashProvider.ComputeHash(dataBytes); + + StringBuilder sb = new StringBuilder(); + foreach (var hb in hashBytes) + sb.Append(hb.ToString("X2")); + return sb.ToString(); + } + + // sorting + + public class ComparerIdShort : IComparer + { + public int Compare(Referable a, Referable b) + { + return String.Compare(a?.idShort, b?.idShort, + CultureInfo.InvariantCulture, CompareOptions.IgnoreCase); + } + } + + public class ComparerIndexed : IComparer + { + public int NullIndex = int.MaxValue; + public Dictionary Index = new Dictionary(); + + public int Compare(Referable a, Referable b) + { + var ca = Index.ContainsKey(a); + var cb = Index.ContainsKey(b); + + if (!ca && !cb) + return 0; + // make CDs without usage to appear at end of list + if (!ca) + return +1; + if (!cb) + return -1; + + var ia = Index[a]; + var ib = Index[b]; + + if (ia == ib) + return 0; + if (ia < ib) + return -1; + return +1; + } + } + + // validation + + public virtual void Validate(AasValidationRecordList results) + { + // access + if (results == null) + return; + + // check + if (this.idShort == null || this.idShort.Trim() == "") + results.Add(new AasValidationRecord( + AasValidationSeverity.SpecViolation, this, + "Referable: missing idShort", + () => + { + this.idShort = "TO_FIX"; + })); + + if (this.description != null && (this.description.langString == null + || this.description.langString.Count < 1)) + results.Add(new AasValidationRecord( + AasValidationSeverity.SchemaViolation, this, + "Referable: existing description with missing langString", + () => + { + this.description = null; + })); + } + + // hierarchy & recursion (by derived elements) + + public virtual void RecurseOnReferables( + object state, Func lambda, + bool includeThis = false) + { + if (includeThis) + lambda(state, null, this); + } + + public Identifiable FindParentFirstIdentifiable() + { + Referable curr = this; + while (curr != null) + { + if (curr is Identifiable curri) + return curri; + curr = curr.parent as Referable; + } + return null; + } + } + + public class Identifiable : Referable, IGetReference + { + + // members + + public Identification identification = new Identification(); + public Administration administration = null; + + // constructors + + public Identifiable() : base() { } + + public Identifiable(string idShort) : base(idShort) { } + + public Identifiable(Identifiable src) + : base(src) + { + if (src == null) + return; + if (src.identification != null) + this.identification = new Identification(src.identification); + if (src.administration != null) + this.administration = new Administration(src.administration); + } + +#if !DoNotUseAasxCompatibilityModels + public Identifiable(AasxCompatibilityModels.AdminShellV10.Identifiable src) + : base(src) + { + if (src.identification != null) + this.identification = new Identification(src.identification); + if (src.administration != null) + this.administration = new Administration(src.administration); + } +#endif + + public void SetIdentification(string idType, string id, string idShort = null) + { + identification.idType = idType; + identification.id = id; + if (idShort != null) + this.idShort = idShort; + } + + public void SetAdminstration(string version, string revision) + { + if (administration == null) + administration = new Administration(); + administration.version = version; + administration.revision = revision; + } + + public new string GetFriendlyName() + { + if (identification != null && identification.id != "") + return AdminShellUtilV20.FilterFriendlyName(this.identification.id); + return AdminShellUtilV20.FilterFriendlyName(this.idShort); + } + + public override string ToString() + { + return ("" + identification?.ToString() + " " + administration?.ToString()).Trim(); + } + + public override Key ToKey() + { + return new Key(GetElementName(), true, "" + identification?.idType, "" + identification?.id); + } + + // self description + + public override Reference GetReference(bool includeParents = true) + { + var r = new Reference(); + r.Keys.Add( + Key.CreateNew( + this.GetElementName(), true, this.identification.idType, this.identification.id)); + return r; + } + + // sorting + + public class ComparerIdentification : IComparer + { + public int Compare(Identifiable a, Identifiable b) + { + if (a?.identification == null && b?.identification == null) + return 0; + if (a?.identification == null) + return +1; + if (b?.identification == null) + return -1; + + var vc = String.Compare(a.identification.idType, b.identification.idType, + CultureInfo.InvariantCulture, CompareOptions.IgnoreCase); + if (vc != 0) + return vc; + + return String.Compare(a.identification.id, b.identification.id, + CultureInfo.InvariantCulture, CompareOptions.IgnoreCase | CompareOptions.IgnoreNonSpace); + } + } + + } + + public class JsonModelTypeWrapper + { + public string name = ""; + + public JsonModelTypeWrapper(string name = "") { this.name = name; } + } + + public interface IFindAllReferences + { + IEnumerable FindAllReferences(); + } + + public interface IGetSemanticId + { + SemanticId GetSemanticId(); + } + + public class AdministrationShell : Identifiable, IFindAllReferences + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } + + // from hasDataSpecification: + [XmlElement(ElementName = "hasDataSpecification")] + public HasDataSpecification hasDataSpecification = null; + + // from this very class + public AssetAdministrationShellRef derivedFrom = null; + + [JsonProperty(PropertyName = "asset")] + public AssetRef assetRef = new AssetRef(); + + [JsonProperty(PropertyName = "submodels")] + [SkipForSearch] + public List submodelRefs = new List(); + + [JsonIgnore] + public Views views = null; + [XmlIgnore] + [JsonProperty(PropertyName = "views")] + public View[] JsonViews + { + get { return views?.views.ToArray(); } + set { views = Views.CreateOrSetInnerViews(views, value); } + } + + [JsonProperty(PropertyName = "conceptDictionaries")] + public List conceptDictionaries = null; + + // constructors + + public AdministrationShell() { } + + public AdministrationShell(string idShort) : base(idShort) { } + + public AdministrationShell(AdministrationShell src) + : base(src) + { + if (src != null) + { + if (src.hasDataSpecification != null) + this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); + + if (src.derivedFrom != null) + this.derivedFrom = new AssetAdministrationShellRef(src.derivedFrom); + + if (src.assetRef != null) + this.assetRef = new AssetRef(src.assetRef); + + if (src.submodelRefs != null) + foreach (var smr in src.submodelRefs) + this.submodelRefs.Add(new SubmodelRef(smr)); + + if (src.views != null) + this.views = new Views(src.views); + + if (src.conceptDictionaries != null) + { + this.conceptDictionaries = new List(); + foreach (var cdd in src.conceptDictionaries) + this.conceptDictionaries.Add(new ConceptDictionary(cdd)); + } + } + } + +#if !DoNotUseAasxCompatibilityModels + public AdministrationShell(AasxCompatibilityModels.AdminShellV10.AdministrationShell src) + : base(src) + { + if (src.hasDataSpecification != null) + this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); + + if (src.derivedFrom != null) + this.derivedFrom = new AssetAdministrationShellRef(src.derivedFrom); + + if (src.assetRef != null) + this.assetRef = new AssetRef(src.assetRef); + + if (src.submodelRefs != null) + foreach (var smr in src.submodelRefs) + this.submodelRefs.Add(new SubmodelRef(smr)); + + if (src.views != null) + this.views = new Views(src.views); + + if (src.conceptDictionaries != null) + { + this.conceptDictionaries = new List(); + foreach (var cdd in src.conceptDictionaries) + this.conceptDictionaries.Add(new ConceptDictionary(cdd)); + } + } +#endif + + public static AdministrationShell CreateNew( + string idShort, string idType, string id, string version = null, string revision = null) + { + var s = new AdministrationShell(); + s.idShort = idShort; + if (version != null) + s.SetAdminstration(version, revision); + s.identification.idType = idType; + s.identification.id = id; + return (s); + } + + // add + + public void AddView(View v) + { + if (views == null) + views = new Views(); + views.views.Add(v); + } + + public void AddConceptDictionary(ConceptDictionary d) + { + if (conceptDictionaries == null) + conceptDictionaries = new List(); + conceptDictionaries.Add(d); + } + + public void AddDataSpecification(Key k) + { + if (hasDataSpecification == null) + hasDataSpecification = new HasDataSpecification(); + var r = new Reference(); + r.Keys.Add(k); + hasDataSpecification.Add(new EmbeddedDataSpecification(r)); + } + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("AssetAdministrationShell", "AAS"); + } + + public Tuple ToCaptionInfo() + { + var caption = AdminShellUtilV20.EvalToNonNullString("\"{0}\" ", idShort, "\"AAS\""); + if (administration != null) + caption += "V" + administration.version + "." + administration.revision; + + var info = ""; + if (identification != null) + info = $"[{identification.idType}, {identification.id}]"; + return Tuple.Create(caption, info); + } + + public override string ToString() + { + var ci = ToCaptionInfo(); + return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); + } + + public SubmodelRef FindSubmodelRef(Identification refid) + { + if (this.submodelRefs == null) + return null; + foreach (var r in this.submodelRefs) + if (r.Matches(refid)) + return r; + return null; + } + + public bool HasSubmodelRef(SubmodelRef newref) + { + // check, if existing + if (this.submodelRefs == null) + return false; + var found = false; + foreach (var r in this.submodelRefs) + if (r.Matches(newref)) + found = true; + + return found; + } + + public void AddSubmodelRef(SubmodelRef newref) + { + if (this.submodelRefs == null) + this.submodelRefs = new List(); + this.submodelRefs.Add(newref); + } + + public IEnumerable FindAllReferences() + { + // Asset + if (this.assetRef != null) + yield return new LocatedReference(this, this.assetRef); + + // Submodel references + if (this.submodelRefs != null) + foreach (var r in this.submodelRefs) + yield return new LocatedReference(this, r); + + // Views + if (this.views?.views != null) + foreach (var vw in this.views.views) + if (vw?.containedElements?.reference != null) + foreach (var r in vw.containedElements.reference) + yield return new LocatedReference(this, r); + } + } + + public class ListOfAdministrationShells : List, IAasElement + { + // self decscription + + public AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("AssetAdministrationShells", "AASs"); + } + + public string GetElementName() + { + return this.GetSelfDescription()?.ElementName; + } + } + + public class Asset : Identifiable + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } + + // from hasDataSpecification: + [XmlElement(ElementName = "hasDataSpecification")] + public HasDataSpecification hasDataSpecification = null; + + // from this very class + [XmlElement(ElementName = "assetIdentificationModelRef")] + public SubmodelRef assetIdentificationModelRef = null; + + [XmlElement(ElementName = "billOfMaterialRef")] + public SubmodelRef billOfMaterialRef = null; + + // from HasKind + [XmlElement(ElementName = "kind")] + [JsonIgnore] + public AssetKind kind = new AssetKind(); + [XmlIgnore] + [JsonProperty(PropertyName = "kind")] + public string JsonKind + { + get + { + if (kind == null) + return null; + return kind.kind; + } + set + { + if (kind == null) + kind = new AssetKind(); + kind.kind = value; + } + } + + // constructors + + public Asset() { } + + public Asset(string idShort) : base(idShort) { } + + public Asset(Asset src) + : base(src) + { + if (src != null) + { + if (src.hasDataSpecification != null) + this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); + if (src.kind != null) + this.kind = new AssetKind(src.kind); + if (src.assetIdentificationModelRef != null) + this.assetIdentificationModelRef = new SubmodelRef(src.assetIdentificationModelRef); + } + } + +#if !DoNotUseAasxCompatibilityModels + public Asset(AasxCompatibilityModels.AdminShellV10.Asset src) + : base(src) + { + if (src != null) + { + if (src.hasDataSpecification != null) + this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); + if (src.kind != null) + this.kind = new AssetKind(src.kind); + if (src.assetIdentificationModelRef != null) + this.assetIdentificationModelRef = new SubmodelRef(src.assetIdentificationModelRef); + } + } +#endif + + // Getter & setters + + public AssetRef GetAssetReference() + { + var r = new AssetRef(); + r.Keys.Add( + Key.CreateNew( + this.GetElementName(), true, this.identification.idType, this.identification.id)); + return r; + } + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("Asset", "Asset"); + } + + public Tuple ToCaptionInfo() + { + var caption = AdminShellUtilV20.EvalToNonNullString("\"{0}\" ", idShort, ""); + if (administration != null) + caption += "V" + administration.version + "." + administration.revision; + + var info = ""; + if (identification != null) + info = $"[{identification.idType}, {identification.id}]"; + return Tuple.Create(caption, info); + } + + public override string ToString() + { + var ci = ToCaptionInfo(); + return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); + } + + public IEnumerable FindAllReferences() + { + if (this.assetIdentificationModelRef != null) + yield return this.assetIdentificationModelRef; + if (this.billOfMaterialRef != null) + yield return this.billOfMaterialRef; + } + } + + public class ListOfAssets : List, IAasElement + { + // self decscription + + public AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("Assets", "Assets"); + } + + public string GetElementName() + { + return this.GetSelfDescription()?.ElementName; + } + + } + + public class View : Referable + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } + + // members + + // from hasSemanticId: + [XmlElement(ElementName = "semanticId")] + public SemanticId semanticId = null; + + // from hasDataSpecification + [XmlElement(ElementName = "hasDataSpecification")] + public HasDataSpecification hasDataSpecification = null; + + // from this very class + [JsonIgnore] + [SkipForSearch] + public ContainedElements containedElements = null; + [XmlIgnore] + [SkipForSearch] + [JsonProperty(PropertyName = "containedElements")] + public ContainedElementRef[] JsonContainedElements + { + get { return containedElements?.reference.ToArray(); } + set { containedElements = ContainedElements.CreateOrSetInner(containedElements, value); } + } + + // getter / setter + + [XmlIgnore] + [JsonIgnore] + public bool IsEmpty { get { return containedElements == null || containedElements.Count < 1; } } + [XmlIgnore] + [JsonIgnore] + public int Count { get { if (containedElements == null) return 0; return containedElements.Count; } } + + public ContainedElementRef this[int index] + { + get { if (containedElements == null) return null; return containedElements[index]; } + } + + // constructors / creators + + public View() { } + + public View(View src) + : base(src) + { + if (src.semanticId != null) + this.semanticId = new SemanticId(src.semanticId); + if (src.hasDataSpecification != null) + this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); + if (src.containedElements != null) + this.containedElements = new ContainedElements(src.containedElements); + } + +#if !DoNotUseAasxCompatibilityModels + public View(AasxCompatibilityModels.AdminShellV10.View src) + : base(src) + { + if (src.semanticId != null) + this.semanticId = new SemanticId(src.semanticId); + if (src.hasDataSpecification != null) + this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); + if (src.containedElements != null) + this.containedElements = new ContainedElements(src.containedElements); + } +#endif + + public static View CreateNew(string idShort) + { + var v = new View() { idShort = idShort }; + return (v); + } + + public void AddDataSpecification(Key k) + { + if (hasDataSpecification == null) + hasDataSpecification = new HasDataSpecification(); + var r = new Reference(); + r.Keys.Add(k); + hasDataSpecification.Add(new EmbeddedDataSpecification(r)); + } + + public void AddContainedElement(Key k) + { + if (containedElements == null) + containedElements = new ContainedElements(); + var r = new ContainedElementRef(); + r.Keys.Add(k); + containedElements.reference.Add(r); + } + + public void AddContainedElement(List keys) + { + if (containedElements == null) + containedElements = new ContainedElements(); + var r = new ContainedElementRef(); + foreach (var k in keys) + r.Keys.Add(k); + containedElements.reference.Add(r); + } + + public void AddContainedElement(Reference r) + { + if (containedElements == null) + containedElements = new ContainedElements(); + containedElements.reference.Add(ContainedElementRef.CreateNew(r)); + } + + public void AddContainedElement(List rlist) + { + if (containedElements == null) + containedElements = new ContainedElements(); + foreach (var r in rlist) + containedElements.reference.Add(ContainedElementRef.CreateNew(r)); + } + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("View", "View"); + } + + public Tuple ToCaptionInfo() + { + var caption = AdminShellUtilV20.EvalToNonNullString("\"{0}\" ", idShort, ""); + var info = ""; + if (this.semanticId != null) + info = Key.KeyListToString(this.semanticId.Keys); + if (this.containedElements != null && this.containedElements.reference != null) + info = (info + " ").Trim() + + String.Format("({0} elements)", this.containedElements.reference.Count); + return Tuple.Create(caption, info); + } + + public override string ToString() + { + var ci = ToCaptionInfo(); + return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); + } + + // validation + + public override void Validate(AasValidationRecordList results) + { + // access + if (results == null) + return; + + // check + base.Validate(results); + KeyList.Validate(results, semanticId?.Keys, this); + } + } + + public class Views + { + [XmlElement(ElementName = "view")] + [JsonIgnore] + public List views = new List(); + + // constructors + + public Views() { } + + public Views(Views src) + { + if (src != null && src.views != null) + foreach (var v in src.views) + this.views.Add(new View(v)); + } + +#if !DoNotUseAasxCompatibilityModels + public Views(AasxCompatibilityModels.AdminShellV10.Views src) + { + if (src != null && src.views != null) + foreach (var v in src.views) + this.views.Add(new View(v)); + } +#endif + + public static Views CreateOrSetInnerViews(Views outer, View[] inner) + { + var res = outer; + if (res == null) + res = new Views(); + if (inner == null) + { + res.views = null; + return res; + } + res.views = new List(inner); + return res; + } + } + + /// + /// Multiple lang string for the AAS namespace + /// + public class LangStringSet + { + + // members + + [XmlElement(ElementName = "langString", Namespace = "http://www.admin-shell.io/aas/2/0")] + public ListOfLangStr langString = new ListOfLangStr(); + + // getters / setters + + [XmlIgnore] + [JsonIgnore] + public bool IsEmpty { get { return langString == null || langString.Count < 1; } } + [XmlIgnore] + [JsonIgnore] + public int Count { get { if (langString == null) return 0; return langString.Count; } } + [XmlIgnore] + [JsonIgnore] + public LangStr this[int index] { get { return langString[index]; } } + + // constructors + + public LangStringSet() { } + + public LangStringSet(LangStringSet src) + { + if (src.langString != null) + foreach (var ls in src.langString) + this.langString.Add(new LangStr(ls)); + } + + public LangStringSet(ListOfLangStr src) + { + if (src != null) + foreach (var ls in src) + this.langString.Add(new LangStr(ls)); + } + +#if !DoNotUseAasxCompatibilityModels + // not available in V1.0 +#endif + public LangStringSet(string lang, string str) + { + if (str == null || str.Trim() == "") + return; + this.langString.Add(new LangStr(lang, str)); + } + + // converter + + public static LangStringSet CreateFrom(List src) + { + var res = new LangStringSet(); + if (src != null) + foreach (var ls in src) + res.langString.Add(new LangStr(ls)); + return res; + } + + // add + + public LangStr Add(LangStr ls) + { + this.langString.Add(ls); + return ls; + } + + public LangStr Add(string lang, string str) + { + var ls = new LangStr(lang, str); + this.langString.Add(ls); + return ls; + } + + // single string representation + public string GetDefaultStr(string defaultLang = null) + { + return this.langString?.GetDefaultStr(defaultLang); + } + } + + /// + /// Multiple lang string for the IEC61360 namespace + /// + public class LangStringSetIEC61360 : ListOfLangStr + { + + // getters / setters + + [XmlIgnore] + [JsonIgnore] + public bool IsEmpty { get { return this.Count < 1; } } + + // constructors + + public LangStringSetIEC61360() { } + + public LangStringSetIEC61360(ListOfLangStr lol) : base(lol) { } + + public LangStringSetIEC61360(LangStringSetIEC61360 src) + { + foreach (var ls in src) + this.Add(new LangStr(ls)); + } + +#if !DoNotUseAasxCompatibilityModels + public LangStringSetIEC61360(AasxCompatibilityModels.AdminShellV10.LangStringIEC61360 src) + { + if (src.langString != null) + foreach (var ls in src.langString) + this.Add(new LangStr(ls)); + } +#endif + public LangStringSetIEC61360(string lang, string str) + { + if (str == null || str.Trim() == "") + return; + this.Add(new LangStr(lang, str)); + } + + // converter + + public static LangStringSetIEC61360 CreateFrom(List src) + { + var res = new LangStringSetIEC61360(); + if (src != null) + foreach (var ls in src) + res.Add(new LangStr(ls)); + return res; + } + + } + + public class UnitId + { + + // members + + [XmlIgnore] + [JsonIgnore] + public KeyList keys = new KeyList(); + + // getter / setters + + [XmlArray("keys")] + [XmlArrayItem("key")] + [JsonIgnore] + public KeyList Keys { get { return keys; } } + [XmlIgnore] + [JsonProperty(PropertyName = "keys")] + public KeyList JsonKeys + { + get + { + keys?.NumberIndices(); + return keys; + } + } + + [XmlIgnore] + [JsonIgnore] + public bool IsEmpty { get { return keys == null || keys.IsEmpty; } } + [XmlIgnore] + [JsonIgnore] + public int Count { get { if (keys == null) return 0; return keys.Count; } } + [XmlIgnore] + [JsonIgnore] + public Key this[int index] { get { return keys[index]; } } + + // constructors / creators + + public UnitId() { } + + public UnitId(UnitId src) + { + if (src.keys != null) + foreach (var k in src.Keys) + this.keys.Add(new Key(k)); + } + +#if !DoNotUseAasxCompatibilityModels + public UnitId(AasxCompatibilityModels.AdminShellV10.UnitId src) + { + if (src.keys != null) + foreach (var k in src.Keys) + this.keys.Add(new Key(k)); + } +#endif + + public static UnitId CreateNew(string type, bool local, string idType, string value) + { + var u = new UnitId(); + u.keys.Add(Key.CreateNew(type, local, idType, value)); + return u; + } + + public static UnitId CreateNew(Reference src) + { + if (src == null) + return null; + var res = new UnitId(); + if (src.Keys != null) + foreach (var k in src.Keys) + res.keys.Add(k); + return res; + } + } + + [XmlRoot(Namespace = "http://www.admin-shell.io/IEC61360/2/0")] + public class DataSpecificationIEC61360 + { + // static member + [XmlIgnore] + [JsonIgnore] + public static string[] DataTypeNames = { + "STRING", + "STRING_TRANSLATABLE", + "REAL_MEASURE", + "REAL_COUNT", + "REAL_CURRENCY", + "INTEGER_MEASURE", + "INTEGER_COUNT", + "INTEGER_CURRENCY", + "BOOLEAN", + "URL", + "RATIONAL", + "RATIONAL_MEASURE", + "TIME", + "TIMESTAMP", + "DATE" }; + + // members + // TODO (MIHO, 2020-08-27): According to spec, cardinality is [1..1][1..n] + // these cardinalities are NOT MAINTAINED in ANY WAY by the system + public LangStringSetIEC61360 preferredName = new LangStringSetIEC61360(); + + // TODO (MIHO, 2020-08-27): According to spec, cardinality is [0..1][1..n] + // these cardinalities are NOT MAINTAINED in ANY WAY by the system + public LangStringSetIEC61360 shortName = null; + + [MetaModelName("DataSpecificationIEC61360.unit")] + [TextSearchable] + [CountForHash] + public string unit = ""; + + public UnitId unitId = null; + + [MetaModelName("DataSpecificationIEC61360.valueFormat")] + [TextSearchable] + [CountForHash] + public string valueFormat = null; + + [MetaModelName("DataSpecificationIEC61360.sourceOfDefinition")] + [TextSearchable] + [CountForHash] + public string sourceOfDefinition = null; + + [MetaModelName("DataSpecificationIEC61360.symbol")] + [TextSearchable] + [CountForHash] + public string symbol = null; + + [MetaModelName("DataSpecificationIEC61360.dataType")] + [TextSearchable] + [CountForHash] + public string dataType = ""; + + // TODO (MIHO, 2020-08-27): According to spec, cardinality is [0..1][1..n] + // these cardinalities are NOT MAINTAINED in ANY WAY by the system + public LangStringSetIEC61360 definition = null; + + // getter / setters + + // constructors + + public DataSpecificationIEC61360() { } + + public DataSpecificationIEC61360(DataSpecificationIEC61360 src) + { + if (src.preferredName != null) + this.preferredName = new LangStringSetIEC61360(src.preferredName); + this.shortName = src.shortName; + this.unit = src.unit; + if (src.unitId != null) + this.unitId = new UnitId(src.unitId); + this.valueFormat = src.valueFormat; + this.sourceOfDefinition = src.sourceOfDefinition; + this.symbol = src.symbol; + this.dataType = src.dataType; + if (src.definition != null) + this.definition = new LangStringSetIEC61360(src.definition); + } + +#if !DoNotUseAasxCompatibilityModels + public DataSpecificationIEC61360(AasxCompatibilityModels.AdminShellV10.DataSpecificationIEC61360 src) + { + if (src.preferredName != null) + this.preferredName = new LangStringSetIEC61360(src.preferredName); + this.shortName = new LangStringSetIEC61360("EN?", src.shortName); + this.unit = src.unit; + if (src.unitId != null) + this.unitId = new UnitId(src.unitId); + this.valueFormat = src.valueFormat; + if (src.sourceOfDefinition != null && src.sourceOfDefinition.Count > 0) + this.sourceOfDefinition = src.sourceOfDefinition[0].str; + this.symbol = src.symbol; + this.dataType = src.dataType; + if (src.definition != null) + this.definition = new LangStringSetIEC61360(src.definition); + } +#endif + + public static DataSpecificationIEC61360 CreateNew( + string[] preferredName = null, + string shortName = "", + string unit = "", + UnitId unitId = null, + string valueFormat = null, + string sourceOfDefinition = null, + string symbol = null, + string dataType = "", + string[] definition = null + ) + { + var d = new DataSpecificationIEC61360(); + if (preferredName != null) + { + d.preferredName = new LangStringSetIEC61360(LangStr.CreateManyFromStringArray(preferredName)); + } + d.shortName = new LangStringSetIEC61360("EN?", shortName); + d.unit = unit; + d.unitId = unitId; + d.valueFormat = valueFormat; + d.sourceOfDefinition = sourceOfDefinition; + d.symbol = symbol; + d.dataType = dataType; + if (definition != null) + { + if (d.definition == null) + d.definition = new LangStringSetIEC61360(); + d.definition = new LangStringSetIEC61360(LangStr.CreateManyFromStringArray(definition)); + } + return (d); + } + + // "constants" + + public static Key GetKey() + { + return Key.CreateNew( + "GlobalReference", false, "IRI", + "http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/2/0"); + } + + // validation + + public void Validate(AasValidationRecordList results, ConceptDescription cd) + { + // access + if (results == null || cd == null) + return; + + // check IEC61360 spec + if (this.preferredName == null || this.preferredName.Count < 1) + results.Add(new AasValidationRecord( + AasValidationSeverity.SchemaViolation, cd, + "ConceptDescription: missing preferredName", + () => + { + this.preferredName = new AdminShell.LangStringSetIEC61360("EN?", + AdminShellUtilV20.EvalToNonEmptyString("{0}", cd.idShort, "UNKNOWN")); + })); + + if (this.shortName != null && this.shortName.Count < 1) + results.Add(new AasValidationRecord( + AasValidationSeverity.SchemaViolation, cd, + "ConceptDescription: existing shortName with missing langString", + () => + { + this.shortName = null; + })); + + if (this.definition != null && this.definition.Count < 1) + results.Add(new AasValidationRecord( + AasValidationSeverity.SchemaViolation, cd, + "ConceptDescription: existing definition with missing langString", + () => + { + this.definition = null; + })); + + // check data type + string foundDataType = null; + if (this.dataType != null) + foreach (var dtn in DataTypeNames) + if (this.dataType.Trim() == dtn.Trim()) + foundDataType = this.dataType; + if (foundDataType == null) + results.Add(new AasValidationRecord( + AasValidationSeverity.SchemaViolation, cd, + "ConceptDescription: dataType does not match allowed enumeration values", + () => + { + this.dataType = "STRING"; + })); + } + } + + // ReSharper disable ClassNeverInstantiated.Global .. class is important to show potential for ISO! + + public class DataSpecificationISO99999 + { + } + + // ReSharper enable ClassNeverInstantiated.Global + + public class DataSpecificationContent + { + + // members + + public DataSpecificationIEC61360 dataSpecificationIEC61360 = null; + public DataSpecificationISO99999 dataSpecificationISO99999 = null; + + // constructors + + public DataSpecificationContent() { } + + public DataSpecificationContent(DataSpecificationContent src) + { + if (src.dataSpecificationIEC61360 != null) + this.dataSpecificationIEC61360 = new DataSpecificationIEC61360(src.dataSpecificationIEC61360); + } + +#if !DoNotUseAasxCompatibilityModels + public DataSpecificationContent(AasxCompatibilityModels.AdminShellV10.DataSpecificationContent src) + { + if (src.dataSpecificationIEC61360 != null) + this.dataSpecificationIEC61360 = new DataSpecificationIEC61360(src.dataSpecificationIEC61360); + } +#endif + } + + public class EmbeddedDataSpecification + { + // members + + [JsonIgnore] + public DataSpecificationContent dataSpecificationContent = null; + + [XmlIgnore] + [JsonProperty("dataSpecificationContent")] + public DataSpecificationIEC61360 JsonWrongDataSpec61360 + { + get { return dataSpecificationContent?.dataSpecificationIEC61360; } + set + { + if (dataSpecificationContent == null) + dataSpecificationContent = new DataSpecificationContent(); + dataSpecificationContent.dataSpecificationIEC61360 = value; + } + } + + public DataSpecificationRef dataSpecification = null; + + // constructors + + public EmbeddedDataSpecification() { } + + public EmbeddedDataSpecification( + DataSpecificationRef dataSpecification, + DataSpecificationContent dataSpecificationContent) + { + this.dataSpecification = dataSpecification; + this.dataSpecificationContent = dataSpecificationContent; + } + + public EmbeddedDataSpecification(EmbeddedDataSpecification src) + { + if (src.dataSpecification != null) + this.dataSpecification = new DataSpecificationRef(src.dataSpecification); + if (src.dataSpecificationContent != null) + this.dataSpecificationContent = new DataSpecificationContent(src.dataSpecificationContent); + } + + public EmbeddedDataSpecification(Reference src) + { + if (src != null) + this.dataSpecification = new DataSpecificationRef(src); + } + +#if !DoNotUseAasxCompatibilityModels + public EmbeddedDataSpecification(AasxCompatibilityModels.AdminShellV10.EmbeddedDataSpecification src) + { + if (src.hasDataSpecification != null) + this.dataSpecification = new DataSpecificationRef(src.hasDataSpecification); + if (src.dataSpecificationContent != null) + this.dataSpecificationContent = new DataSpecificationContent(src.dataSpecificationContent); + } + + public EmbeddedDataSpecification(AasxCompatibilityModels.AdminShellV10.Reference src) + { + if (src != null) + this.dataSpecification = new DataSpecificationRef(src); + } +#endif + + public static EmbeddedDataSpecification CreateIEC61360WithContent() + { + var eds = new EmbeddedDataSpecification(new DataSpecificationRef(), new DataSpecificationContent()); + + eds.dataSpecification.Keys.Add(DataSpecificationIEC61360.GetKey()); + + eds.dataSpecificationContent.dataSpecificationIEC61360 = + AdminShell.DataSpecificationIEC61360.CreateNew(); + + return eds; + } + + public DataSpecificationIEC61360 GetIEC61360() + { + return this.dataSpecificationContent?.dataSpecificationIEC61360; + } + } + + public class ConceptDescription : Identifiable, System.IDisposable + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } + + // members + + // do this in order to be IDisposable, that is: suitable for (using) + void System.IDisposable.Dispose() { } + public void GetData() { } + // from HasDataSpecification + +#if __not_anymore + + [XmlElement(ElementName = "embeddedDataSpecification")] + [JsonIgnore] + public EmbeddedDataSpecification embeddedDataSpecification = new EmbeddedDataSpecification(); +#else + // According to Spec V2.0.1, a ConceptDescription might feature alos multiple data specifications + /* TODO (MIHO, 2020-08-30): align wording of the member ("embeddedDataSpecification") with the + * wording of the other entities ("hasDataSpecification") */ + [XmlElement(ElementName = "embeddedDataSpecification")] + [JsonIgnore] + public HasDataSpecification embeddedDataSpecification = null; +#endif + + [XmlIgnore] + [JsonProperty(PropertyName = "embeddedDataSpecifications")] + public EmbeddedDataSpecification[] JsonEmbeddedDataSpecifications + { + get + { + return this.embeddedDataSpecification?.ToArray(); + } + set + { + embeddedDataSpecification = new HasDataSpecification(value); + } + } + + // old + + // this class + [XmlIgnore] + private List isCaseOf = null; + + // getter / setter + + [XmlElement(ElementName = "isCaseOf")] + [JsonProperty(PropertyName = "isCaseOf")] + public List IsCaseOf + { + get { return isCaseOf; } + set { isCaseOf = value; } + } + + // constructors / creators + + public ConceptDescription() : base() { } + + public ConceptDescription(ConceptDescription src) + : base(src) + { + if (src.embeddedDataSpecification != null) + this.embeddedDataSpecification = new HasDataSpecification(src.embeddedDataSpecification); + if (src.isCaseOf != null) + foreach (var ico in src.isCaseOf) + { + if (this.isCaseOf == null) + this.isCaseOf = new List(); + this.isCaseOf.Add(new Reference(ico)); + } + } + +#if !DoNotUseAasxCompatibilityModels + public ConceptDescription(AasxCompatibilityModels.AdminShellV10.ConceptDescription src) + : base(src) + { + if (src.embeddedDataSpecification != null) + { + this.embeddedDataSpecification = new HasDataSpecification(); + this.embeddedDataSpecification.Add(new EmbeddedDataSpecification(src.embeddedDataSpecification)); + } + if (src.IsCaseOf != null) + foreach (var ico in src.IsCaseOf) + { + if (this.isCaseOf == null) + this.isCaseOf = new List(); + this.isCaseOf.Add(new Reference(ico)); + } + } +#endif + + public static ConceptDescription CreateNew( + string idShort, string idType, string id, string version = null, string revision = null) + { + var cd = new ConceptDescription(); + cd.idShort = idShort; + cd.identification.idType = idType; + cd.identification.id = id; + if (version != null) + { + if (cd.administration == null) + cd.administration = new Administration(); + cd.administration.version = version; + cd.administration.revision = revision; + } + return (cd); + } + + public Key GetSingleKey() + { + return Key.CreateNew(this.GetElementName(), true, this.identification.idType, this.identification.id); + } + + public ConceptDescriptionRef GetCdReference() + { + var r = new ConceptDescriptionRef(); + r.Keys.Add( + Key.CreateNew( + this.GetElementName(), true, this.identification.idType, this.identification.id)); + return r; + } + + public void SetIEC61360Spec( + string[] preferredNames = null, + string shortName = "", + string unit = "", + UnitId unitId = null, + string valueFormat = null, + string sourceOfDefinition = null, + string symbol = null, + string dataType = "", + string[] definition = null + ) + { + var eds = new EmbeddedDataSpecification(new DataSpecificationRef(), new DataSpecificationContent()); + eds.dataSpecification.Keys.Add( + DataSpecificationIEC61360.GetKey()); + eds.dataSpecificationContent.dataSpecificationIEC61360 = + AdminShell.DataSpecificationIEC61360.CreateNew( + preferredNames, shortName, unit, unitId, valueFormat, sourceOfDefinition, symbol, + dataType, definition); + + this.embeddedDataSpecification = new HasDataSpecification(); + this.embeddedDataSpecification.Add(eds); + + this.AddIsCaseOf( + Reference.CreateNew( + new Key("ConceptDescription", false, this.identification.idType, this.identification.id))); + } + + public DataSpecificationIEC61360 GetIEC61360() + { + return this.embeddedDataSpecification?.IEC61360Content; + } + + // as experimental approach, forward the IEC getter/sett of hasDataSpec directly + + [XmlIgnore] + [JsonIgnore] + public EmbeddedDataSpecification IEC61360DataSpec + { + get + { + return this.embeddedDataSpecification?.IEC61360; + } + set + { + // add embeddedDataSpecification first? + if (this.embeddedDataSpecification == null) + this.embeddedDataSpecification = new HasDataSpecification(); + this.embeddedDataSpecification.IEC61360 = value; + } + } + + [XmlIgnore] + [JsonIgnore] + public DataSpecificationIEC61360 IEC61360Content + { + get + { + return this.embeddedDataSpecification?.IEC61360Content; + } + set + { + // add embeddedDataSpecification first? + if (this.embeddedDataSpecification == null) + this.embeddedDataSpecification = new HasDataSpecification(); + + // check, if e IEC61360 can be found + var eds = this.embeddedDataSpecification.IEC61360; + + // if already there, update + if (eds != null) + { + eds.dataSpecificationContent = new DataSpecificationContent(); + eds.dataSpecificationContent.dataSpecificationIEC61360 = value; + return; + } + + // no: add a full record + eds = EmbeddedDataSpecification.CreateIEC61360WithContent(); + eds.dataSpecificationContent.dataSpecificationIEC61360 = value; + this.embeddedDataSpecification.Add(eds); + } + } + + public DataSpecificationIEC61360 CreateDataSpecWithContentIec61360() + { + var eds = AdminShell.EmbeddedDataSpecification.CreateIEC61360WithContent(); + if (this.embeddedDataSpecification == null) + this.embeddedDataSpecification = new HasDataSpecification(); + this.embeddedDataSpecification.Add(eds); + return eds.dataSpecificationContent?.dataSpecificationIEC61360; + } + + public string GetDefaultPreferredName(string defaultLang = null) + { + return "" + + GetIEC61360()? + .preferredName?.GetDefaultStr(defaultLang); + } + + public string GetDefaultShortName(string defaultLang = null) + { + return "" + + GetIEC61360()? + .shortName?.GetDefaultStr(defaultLang); + } + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("ConceptDescription", "CD"); + } + + public Tuple ToCaptionInfo() + { + var caption = ""; + if (this.idShort != null && this.idShort.Trim() != "") + caption = $"\"{this.idShort.Trim()}\""; + if (this.identification != null) + caption = (caption + " " + this.identification).Trim(); + + var info = "" + GetDefaultShortName(); + + return Tuple.Create(caption, info); + } + + public override string ToString() + { + var ci = ToCaptionInfo(); + return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); + } + + public void AddIsCaseOf(Reference ico) + { + if (isCaseOf == null) + isCaseOf = new List(); + isCaseOf.Add(ico); + } + + public static IDisposable CreateNew() + { + throw new NotImplementedException(); + } + + // validation + + public override void Validate(AasValidationRecordList results) + { + // access + if (results == null) + return; + + // check CD itself + base.Validate(results); + + // check IEC61360 spec + var eds61360 = this.IEC61360DataSpec; + if (eds61360 != null) + { + // check data spec + if (eds61360.dataSpecification == null || + !(eds61360.dataSpecification.MatchesExactlyOneKey(DataSpecificationIEC61360.GetKey()))) + results.Add(new AasValidationRecord( + AasValidationSeverity.SpecViolation, this, + "HasDataSpecification: data specification content set to IEC61360, but no " + + "data specification reference set!", + () => + { + eds61360.dataSpecification = new DataSpecificationRef( + new Reference( + DataSpecificationIEC61360.GetKey())); + })); + + // validate content + if (eds61360.dataSpecificationContent?.dataSpecificationIEC61360 == null) + { + results.Add(new AasValidationRecord( + AasValidationSeverity.SpecViolation, this, + "HasDataSpecification: data specification reference set to IEC61360, but no " + + "data specification content set!", + () => + { + eds61360.dataSpecificationContent = new DataSpecificationContent(); + eds61360.dataSpecificationContent.dataSpecificationIEC61360 = + new DataSpecificationIEC61360(); + })); + } + else + { + // validate + eds61360.dataSpecificationContent.dataSpecificationIEC61360.Validate(results, this); + } + } + } + + // more find + + public IEnumerable FindAllReferences() + { + yield break; + } + } + + public class ListOfConceptDescriptions : List, IAasElement + { + // finding + + public ConceptDescription Find(ConceptDescriptionRef cdr) + { + if (cdr == null) + return null; + return Find(cdr.Keys); + } + + public ConceptDescription Find(Identification id) + { + var cdr = ConceptDescriptionRef.CreateNew("Conceptdescription", true, id.idType, id.id); + return Find(cdr); + } + + public ConceptDescription Find(List keys) + { + // trivial + if (keys == null) + return null; + // can only refs with 1 key + if (keys.Count != 1) + return null; + // and we're picky + var key = keys[0]; + if (!key.local || key.type.ToLower().Trim() != "conceptdescription") + return null; + // brute force + foreach (var cd in this) + if (cd.identification.idType.ToLower().Trim() == key.idType.ToLower().Trim() + && cd.identification.id.ToLower().Trim() == key.value.ToLower().Trim()) + return cd; + // uups + return null; + } + + // item management + + public ConceptDescription AddIfNew(ConceptDescription cd) + { + if (cd == null) + return null; + + var exist = this.Find(cd.identification); + if (exist != null) + return exist; + + this.Add(cd); + return cd; + } + + // self decscription + + public AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("ConceptDescriptions", "CDS"); + } + + public string GetElementName() + { + return this.GetSelfDescription()?.ElementName; + } + + // sorting + + + } + + public class ConceptDictionary : Referable + { + [XmlElement(ElementName = "conceptDescriptions")] + public ConceptDescriptionRefs conceptDescriptionsRefs = null; + + // constructors + + public ConceptDictionary() { } + + public ConceptDictionary(ConceptDictionary src) + { + if (src.conceptDescriptionsRefs != null) + this.conceptDescriptionsRefs = new ConceptDescriptionRefs(src.conceptDescriptionsRefs); + } + +#if !DoNotUseAasxCompatibilityModels + public ConceptDictionary(AasxCompatibilityModels.AdminShellV10.ConceptDictionary src) + { + if (src.conceptDescriptionsRefs != null) + this.conceptDescriptionsRefs = new ConceptDescriptionRefs(src.conceptDescriptionsRefs); + } +#endif + + public static ConceptDictionary CreateNew(string idShort = null) + { + var d = new ConceptDictionary(); + if (idShort != null) + d.idShort = idShort; + return (d); + } + + // add + + public void AddReference(Reference r) + { + var cdr = (ConceptDescriptionRef)(ConceptDescriptionRef.CreateNew(r.Keys)); + if (conceptDescriptionsRefs == null) + conceptDescriptionsRefs = new ConceptDescriptionRefs(); + conceptDescriptionsRefs.conceptDescriptions.Add(cdr); + } + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("ConceptDictionary", "CDic"); + } + } + + /// + /// Use by FindAllReference to provide a enumeration of referenced with location + /// info, where they are contained + /// + public class LocatedReference + { + public Identifiable Identifiable; + public Reference Reference; + + public LocatedReference() { } + public LocatedReference(Identifiable identifiable, Reference reference) + { + Identifiable = identifiable; + Reference = reference; + } + } + + [XmlRoot(ElementName = "aasenv", Namespace = "http://www.admin-shell.io/aas/2/0")] + public class AdministrationShellEnv : IFindAllReferences, IAasElement, IDiaryData, IRecurseOnReferables + { + + // diary (as e.g. deleted AASes need to be listed somewhere) + + [XmlIgnore] + [JsonIgnore] + [SkipForHash] + [SkipForReflection] + private DiaryDataDef _diaryData = new DiaryDataDef(); + + [XmlIgnore] + [JsonIgnore] + [SkipForReflection] + public DiaryDataDef DiaryData { get { return _diaryData; } } + + // members + + [XmlAttribute(Namespace = System.Xml.Schema.XmlSchema.InstanceNamespace)] + [JsonIgnore] + public string schemaLocation = + "http://www.admin-shell.io/aas/2/0 AAS.xsd http://www.admin-shell.io/IEC61360/2/0 IEC61360.xsd"; + + [XmlIgnore] // will be ignored, anyway + private ListOfAdministrationShells administrationShells = new ListOfAdministrationShells(); + [XmlIgnore] // will be ignored, anyway + private ListOfAssets assets = new ListOfAssets(); + [XmlIgnore] // will be ignored, anyway + private ListOfSubmodels submodels = new ListOfSubmodels(); + [XmlIgnore] // will be ignored, anyway + private ListOfConceptDescriptions conceptDescriptions = new ListOfConceptDescriptions(); + + // getter / setters + + [XmlArray("assetAdministrationShells")] + [XmlArrayItem("assetAdministrationShell")] + [JsonProperty(PropertyName = "assetAdministrationShells")] + public ListOfAdministrationShells AdministrationShells + { + get { return administrationShells; } + set { administrationShells = value; } + } + + [XmlArray("assets")] + [XmlArrayItem("asset")] + [JsonProperty(PropertyName = "assets")] + public ListOfAssets Assets + { + get { return assets; } + set { assets = value; } + } + + [XmlArray("submodels")] + [XmlArrayItem("submodel")] + [JsonProperty(PropertyName = "submodels")] + public ListOfSubmodels Submodels + { + get { return submodels; } + set { submodels = value; } + } + + [XmlArray("conceptDescriptions")] + [XmlArrayItem("conceptDescription")] + [JsonProperty(PropertyName = "conceptDescriptions")] + public ListOfConceptDescriptions ConceptDescriptions + { + get { return conceptDescriptions; } + set { conceptDescriptions = value; } + } + + // constructors + + public AdministrationShellEnv() { } + +#if !DoNotUseAasxCompatibilityModels + public AdministrationShellEnv(AasxCompatibilityModels.AdminShellV10.AdministrationShellEnv src) + { + if (src.AdministrationShells != null) + foreach (var aas in src.AdministrationShells) + this.administrationShells.Add(new AdministrationShell(aas)); + + if (src.Assets != null) + foreach (var asset in src.Assets) + this.assets.Add(new Asset(asset)); + + if (src.Submodels != null) + foreach (var sm in src.Submodels) + this.submodels.Add(new Submodel(sm)); + + if (src.ConceptDescriptions != null) + foreach (var cd in src.ConceptDescriptions) + this.conceptDescriptions.Add(new ConceptDescription(cd)); + } +#endif + + // to String + + public override string ToString() + { + var res = "AAS-ENV"; + if (AdministrationShells != null) + res += $" {AdministrationShells.Count} AAS"; + if (Assets != null) + res += $" {Assets.Count} Assets"; + if (Submodels != null) + res += $" {Submodels.Count} Submodels"; + if (ConceptDescriptions != null) + res += $" {ConceptDescriptions.Count} CDs"; + return res; + } + + // self decscription + + public AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("AdministrationShellEnv", "Env"); + } + + public string GetElementName() + { + return this.GetSelfDescription()?.ElementName; + } + + // finders + + public AdministrationShell FindAAS(Identification id) + { + if (id == null) + return null; + foreach (var aas in this.AdministrationShells) + if (aas.identification != null && aas.identification.IsEqual(id)) + return aas; + return null; + } + + public AdministrationShell FindAAS(string idShort) + { + if (idShort == null) + return null; + foreach (var aas in this.AdministrationShells) + if (aas.idShort != null && aas.idShort.Trim().ToLower() == idShort.Trim().ToLower()) + return aas; + return null; + } + + public AdministrationShell FindAASwithSubmodel(Identification smid) + { + if (smid == null) + return null; + foreach (var aas in this.AdministrationShells) + if (aas.submodelRefs != null) + foreach (var smref in aas.submodelRefs) + if (smref.Matches(smid)) + return aas; + return null; + } + + public IEnumerable FindAllAAS( + Predicate p = null) + { + if (this.administrationShells == null) + yield break; + foreach (var x in this.administrationShells) + if (p == null || p(x)) + yield return x; + } + + public IEnumerable FindAllSubmodelGroupedByAAS( + Func p = null) + { + if (this.administrationShells == null || this.submodels == null) + yield break; + foreach (var aas in this.administrationShells) + { + if (aas?.submodelRefs == null) + continue; + foreach (var smref in aas.submodelRefs) + { + var sm = this.FindSubmodel(smref); + if (sm != null && (p == null || p(aas, sm))) + yield return sm; + } + } + } + + public Asset FindAsset(Identification id) + { + if (id == null) + return null; + foreach (var asset in this.Assets) + if (asset.identification != null && asset.identification.IsEqual(id)) + return asset; + return null; + } + + public Asset FindAsset(AssetRef aref) + { + // trivial + if (aref == null) + return null; + // can only refs with 1 key + if (aref.Count != 1) + return null; + // and we're picky + var key = aref[0]; + if (!key.local || key.type.ToLower().Trim() != "asset") + return null; + // brute force + foreach (var a in assets) + if (a.identification.idType.ToLower().Trim() == key.idType.ToLower().Trim() + && a.identification.id.ToLower().Trim() == key.value.ToLower().Trim()) + return a; + // uups + return null; + } + + public Submodel FindSubmodel(Identification id) + { + if (id == null) + return null; + foreach (var sm in this.Submodels) + if (sm.identification != null && sm.identification.IsEqual(id)) + return sm; + return null; + } + + public Submodel FindSubmodel(SubmodelRef smref) + { + // trivial + if (smref == null) + return null; + // can only refs with 1 key + if (smref.Count != 1) + return null; + // and we're picky + var key = smref.Keys[0]; + if (!key.local || key.type.ToLower().Trim() != "submodel") + return null; + // brute force + foreach (var sm in this.Submodels) + if (sm.identification.idType.ToLower().Trim() == key.idType.ToLower().Trim() + && sm.identification.id.ToLower().Trim() == key.value.ToLower().Trim()) + return sm; + // uups + return null; + } + + public Submodel FindFirstSubmodelBySemanticId(Key semId) + { + // access + if (semId == null) + return null; + + // brute force + foreach (var sm in this.Submodels) + if (true == sm.semanticId?.MatchesExactlyOneKey(semId)) + return sm; + + return null; + } + + public IEnumerable FindAllSubmodelBySemanticId( + Key semId, Key.MatchMode matchMode = Key.MatchMode.Strict) + { + // access + if (semId == null) + yield break; + + // brute force + foreach (var sm in this.Submodels) + if (true == sm.semanticId?.MatchesExactlyOneKey(semId, matchMode)) + yield return sm; + } + + public IEnumerable FindAllReferable(Predicate p) + { + if (p == null) + yield break; + + foreach (var r in this.FindAllReferable()) + if (r != null && p(r)) + yield return r; + } + + public IEnumerable FindAllReferable(bool onlyIdentifiables = false) + { + if (this.AdministrationShells != null) + foreach (var aas in this.AdministrationShells) + if (aas != null) + { + // AAS itself + yield return aas; + + if (!onlyIdentifiables) + { + // Views + if (aas.views?.views != null) + foreach (var view in aas.views.views) + yield return view; + } + } + + if (this.Assets != null) + foreach (var asset in this.Assets) + if (asset != null) + yield return asset; + + if (this.Submodels != null) + foreach (var sm in this.Submodels) + if (sm != null) + { + yield return sm; + + if (!onlyIdentifiables) + { + // TODO (MIHO, 2020-08-26): not very elegant, yet. Avoid temporary collection + var allsme = new ListOfSubmodelElement(); + sm.RecurseOnSubmodelElements(null, (state, parents, sme) => + { + allsme.Add(sme); return true; + }); + foreach (var sme in allsme) + yield return sme; + } + } + + if (this.ConceptDescriptions != null) + foreach (var cd in this.ConceptDescriptions) + if (cd != null) + yield return cd; + } + + // + // Reference handling + // + + public Referable FindReferableByReference(Reference rf, int keyIndex = 0, bool exactMatch = false) + { + return FindReferableByReference(rf?.Keys); + } + + public Referable FindReferableByReference(KeyList kl, int keyIndex = 0, bool exactMatch = false, + ReferableRootInfo rootInfo = null) + { + // first index needs to exist .. + if (kl == null || keyIndex >= kl.Count) + return null; + + // which type? + var firstType = kl[keyIndex].type.Trim().ToLower(); + var firstIdentification = new Identification(kl[keyIndex].idType, kl[keyIndex].value); + AdministrationShell aasToFollow = null; + + if (firstType == Key.AAS.Trim().ToLower()) + { + // search aas + var aas = this.FindAAS(firstIdentification); + + // not found or already at end with our search? + if (aas == null || keyIndex >= kl.Count - 1) + return aas; + + // side info? + if (rootInfo != null) + { + rootInfo.AAS = aas; + rootInfo.NrOfRootKeys = 1 + keyIndex; + } + + // follow up + aasToFollow = aas; + } + + if (firstType == Key.Asset.Trim().ToLower()) + { + // search asset + var asset = this.FindAsset(firstIdentification); + + // not found or already at end with our search? + if (asset == null || keyIndex >= kl.Count - 1) + return exactMatch ? null : asset; + + // try find aas for it + var aas = this.FindAllAAS((a) => + { + return a?.assetRef?.Matches(asset.identification) == true; + }).FirstOrDefault(); + if (aas == null) + return exactMatch ? null : asset; + + // side info? + if (rootInfo != null) + { + rootInfo.Asset = asset; + rootInfo.NrOfRootKeys = 1 + keyIndex; + } + + // follow up + aasToFollow = aas; + } + + // try + if (aasToFollow != null) + { + // search different entities + if (kl[keyIndex + 1].type.Trim().ToLower() == Key.Submodel.ToLower() + || kl[keyIndex + 1].type.Trim().ToLower() == Key.SubmodelRef.ToLower()) + { + // ok, search SubmodelRef + var smref = aasToFollow.FindSubmodelRef(kl[keyIndex + 1].ToId()); + if (smref == null) + return exactMatch ? null : aasToFollow; + + // validate matching submodel + var sm = this.FindSubmodel(smref); + if (sm == null) + return exactMatch ? null : aasToFollow; + + // side info + // side info? + if (rootInfo != null) + { + rootInfo.Submodel = sm; + rootInfo.NrOfRootKeys = 2 + keyIndex; + } + + // at our end? + if (keyIndex >= kl.Count - 2) + return sm; + + // go inside + return SubmodelElementWrapper.FindReferableByReference(sm.submodelElements, kl, keyIndex + 2); + } + } + + if (firstType == Key.ConceptDescription.Trim().ToLower()) + return this.FindConceptDescription(firstIdentification); + + if (firstType == Key.Submodel.Trim().ToLower()) + { + // ok, search Submodel + var sm = this.FindSubmodel(new Identification(kl[keyIndex].idType, kl[keyIndex].value)); + if (sm == null) + return null; + + // notice in side info + if (rootInfo != null) + { + rootInfo.Submodel = sm; + rootInfo.NrOfRootKeys = 1 + keyIndex; + + // add even more info + if (rootInfo.AAS == null) + { + foreach (var aas2 in this.AdministrationShells) + { + var smref2 = aas2.FindSubmodelRef(sm.identification); + if (smref2 != null) + { + rootInfo.AAS = aas2; + break; + } + } + } + } + + // at our end? + if (keyIndex >= kl.Count - 1) + return sm; + + // go inside + return SubmodelElementWrapper.FindReferableByReference(sm.submodelElements, kl, keyIndex + 1); + } + + // nothing in this Environment + return null; + } + + // + // Handling of CDs + // + + public ConceptDescription FindConceptDescription(ConceptDescriptionRef cdr) + { + if (cdr == null) + return null; + return FindConceptDescription(cdr.Keys); + } + + public ConceptDescription FindConceptDescription(SemanticId semId) + { + if (semId == null) + return null; + return FindConceptDescription(semId.Keys); + } + + public ConceptDescription FindConceptDescription(Reference rf) + { + if (rf == null) + return null; + return FindConceptDescription(rf.Keys); + } + + public ConceptDescription FindConceptDescription(Identification id) + { + var cdr = ConceptDescriptionRef.CreateNew("Conceptdescription", true, id.idType, id.id); + return FindConceptDescription(cdr); + } + + public ConceptDescription FindConceptDescription(List keys) + { + // trivial + if (keys == null) + return null; + // can only refs with 1 key + if (keys.Count != 1) + return null; + // and we're picky + var key = keys[0]; + if (!key.local || key.type.ToLower().Trim() != "conceptdescription") + return null; + // brute force + foreach (var cd in conceptDescriptions) + if (cd.identification.idType.ToLower().Trim() == key.idType.ToLower().Trim() + && cd.identification.id.ToLower().Trim() == key.value.ToLower().Trim()) + return cd; + // uups + return null; + } + + public IEnumerable FindAllSubmodelElements( + Predicate match = null, AdministrationShell onlyForAAS = null) where T : SubmodelElement + { + // more or less two different schemes + if (onlyForAAS != null) + { + if (onlyForAAS.submodelRefs == null) + yield break; + foreach (var smr in onlyForAAS.submodelRefs) + { + var sm = this.FindSubmodel(smr); + if (sm?.submodelElements != null) + foreach (var x in sm.submodelElements.FindDeep(match)) + yield return x; + } + } + else + { + if (this.Submodels != null) + foreach (var sm in this.Submodels) + if (sm?.submodelElements != null) + foreach (var x in sm.submodelElements.FindDeep(match)) + yield return x; + } + } + + public ConceptDescription FindConceptDescription(Key key) + { + if (key == null) + return null; + var l = new List { key }; + return (FindConceptDescription(l)); + } + + public IEnumerable FindAllReferences() + { + if (this.AdministrationShells != null) + foreach (var aas in this.AdministrationShells) + if (aas != null) + foreach (var r in aas.FindAllReferences()) + yield return r; + + if (this.Assets != null) + foreach (var asset in this.Assets) + if (asset != null) + foreach (var r in asset.FindAllReferences()) + yield return new LocatedReference(asset, r); + + if (this.Submodels != null) + foreach (var sm in this.Submodels) + if (sm != null) + foreach (var r in sm.FindAllReferences()) + yield return r; + + if (this.ConceptDescriptions != null) + foreach (var cd in this.ConceptDescriptions) + if (cd != null) + foreach (var r in cd.FindAllReferences()) + yield return new LocatedReference(cd, r); + } + + // creators + + private void CopyConceptDescriptionsFrom( + AdministrationShellEnv srcEnv, SubmodelElement src, bool shallowCopy = false) + { + // access + if (srcEnv == null || src == null || src.semanticId == null) + return; + // check for this SubmodelElement in Source + var cdSrc = srcEnv.FindConceptDescription(src.semanticId.Keys); + if (cdSrc == null) + return; + // check for this SubmodelElement in Destnation (this!) + var cdDest = this.FindConceptDescription(src.semanticId.Keys); + if (cdDest != null) + return; + // copy new + this.ConceptDescriptions.Add(new ConceptDescription(cdSrc)); + // recurse? + if (!shallowCopy && src is SubmodelElementCollection) + foreach (var m in (src as SubmodelElementCollection).value) + CopyConceptDescriptionsFrom(srcEnv, m.submodelElement, shallowCopy: false); + + } + + public SubmodelElementWrapper CopySubmodelElementAndCD( + AdministrationShellEnv srcEnv, SubmodelElement srcElem, bool copyCD = false, bool shallowCopy = false) + { + // access + if (srcEnv == null || srcElem == null) + return null; + + // 1st result pretty easy (calling function will add this to the appropriate Submodel) + var res = new SubmodelElementWrapper(srcElem); + + // copy the CDs.. + if (copyCD) + CopyConceptDescriptionsFrom(srcEnv, srcElem, shallowCopy); + + // give back + return res; + } + + public SubmodelRef CopySubmodelRefAndCD( + AdministrationShellEnv srcEnv, SubmodelRef srcSubRef, bool copySubmodel = false, bool copyCD = false, + bool shallowCopy = false) + { + // access + if (srcEnv == null || srcSubRef == null) + return null; + + // need to have the source Submodel + var srcSub = srcEnv.FindSubmodel(srcSubRef); + if (srcSub == null) + return null; + + // 1st result pretty easy (calling function will add this to the appropriate AAS) + var dstSubRef = new SubmodelRef(srcSubRef); + + // get the destination and shall src != dst + var dstSub = this.FindSubmodel(dstSubRef); + if (srcSub == dstSub) + return null; + + // maybe we need the Submodel in our environment, as well + if (dstSub == null && copySubmodel) + { + dstSub = new Submodel(srcSub, shallowCopy); + this.Submodels.Add(dstSub); + } + else + if (dstSub != null) + { + // there is already an submodel, just add members + if (!shallowCopy && srcSub.submodelElements != null) + { + if (dstSub.submodelElements == null) + dstSub.submodelElements = new SubmodelElementWrapperCollection(); + foreach (var smw in srcSub.submodelElements) + dstSub.submodelElements.Add( + new SubmodelElementWrapper( + smw.submodelElement, shallowCopy: false)); + } + } + + // copy the CDs.. + if (copyCD && srcSub.submodelElements != null) + foreach (var smw in srcSub.submodelElements) + CopyConceptDescriptionsFrom(srcEnv, smw.submodelElement, shallowCopy); + + // give back + return dstSubRef; + } + + /// + /// Tries renaming an Identifiable, specifically: the identification of an Identifiable and + /// all references to it. + /// Currently supported: ConceptDescriptions + /// Returns a list of Referables, which were changed or null in case of error + /// + public List RenameIdentifiable(Identification oldId, Identification newId) + where T : Identifiable + { + // access + if (oldId == null || newId == null || oldId.IsEqual(newId)) + return null; + + var res = new List(); + + if (typeof(T) == typeof(ConceptDescription)) + { + // check, if exist or not exist + var cdOld = FindConceptDescription(oldId); + if (cdOld == null || FindConceptDescription(newId) != null) + return null; + + // rename old cd + cdOld.identification = newId; + res.Add(cdOld); + + // search all SMEs referring to this CD + foreach (var sme in this.FindAllSubmodelElements(match: (s) => + { + return (s != null && s.semanticId != null && s.semanticId.Matches(oldId)); + })) + { + sme.semanticId[0].idType = newId.idType; + sme.semanticId[0].value = newId.id; + res.Add(sme); + } + + // seems fine + return res; + } + + if (typeof(T) == typeof(Submodel)) + { + // check, if exist or not exist + var smOld = FindSubmodel(oldId); + if (smOld == null || FindSubmodel(newId) != null) + return null; + + // recurse all possible Referenes in the aas env + foreach (var lr in this.FindAllReferences()) + { + var r = lr?.Reference; + if (r != null) + for (int i = 0; i < r.Count; i++) + if (r[i].Matches(Key.Submodel, false, oldId.idType, oldId.id, Key.MatchMode.Relaxed)) + { + // directly replace + r[i].idType = newId.idType; + r[i].value = newId.id; + if (res.Contains(lr.Identifiable)) + res.Add(lr.Identifiable); + } + } + + // rename old Submodel + smOld.identification = newId; + + // seems fine + return res; + } + + if (typeof(T) == typeof(Asset)) + { + // check, if exist or not exist + var assetOld = FindAsset(oldId); + if (assetOld == null || FindAsset(newId) != null) + return null; + + // recurse all possible Referenes in the aas env + foreach (var lr in this.FindAllReferences()) + { + var r = lr?.Reference; + if (r != null) + for (int i = 0; i < r.Count; i++) + if (r[i].Matches(Key.Asset, false, oldId.idType, oldId.id, Key.MatchMode.Relaxed)) + { + // directly replace + r[i].idType = newId.idType; + r[i].value = newId.id; + if (res.Contains(lr.Identifiable)) + res.Add(lr.Identifiable); + } + } + + // rename old Submodel + assetOld.identification = newId; + + // seems fine + return res; + } + + // no result is false, as well + return null; + } + + // serializations + + public void SerializeXmlToStream(StreamWriter s) + { + var serializer = new XmlSerializer(typeof(AdminShell.AdministrationShellEnv)); + var nss = new XmlSerializerNamespaces(); + nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace); + nss.Add("aas", "http://www.admin-shell.io/aas/2/0"); + nss.Add("IEC61360", "http://www.admin-shell.io/IEC61360/2/0"); + serializer.Serialize(s, this, nss); + } + + public JsonWriter SerialiazeJsonToStream(StreamWriter sw, bool leaveJsonWriterOpen = false) + { + sw.AutoFlush = true; + + JsonSerializer serializer = new JsonSerializer() + { + NullValueHandling = NullValueHandling.Ignore, + ReferenceLoopHandling = ReferenceLoopHandling.Serialize, + Formatting = Newtonsoft.Json.Formatting.Indented + }; + + JsonWriter writer = new JsonTextWriter(sw); + serializer.Serialize(writer, this); + if (leaveJsonWriterOpen) + return writer; + writer.Close(); + return null; + } + + public AdministrationShellEnv DeserializeFromXmlStream(TextReader reader) + { + XmlSerializer serializer = new XmlSerializer( + typeof(AdminShell.AdministrationShellEnv), "http://www.admin-shell.io/aas/2/0"); + var res = serializer.Deserialize(reader) as AdminShell.AdministrationShellEnv; + return res; + } + + public AdministrationShellEnv DeserializeFromJsonStream(TextReader reader) + { + JsonSerializer serializer = new JsonSerializer(); + serializer.Converters.Add(new AdminShellConverters.JsonAasxConverter("modelType", "name")); + var res = (AdministrationShellEnv)serializer.Deserialize(reader, typeof(AdministrationShellEnv)); + return res; + } + + // special functions + + private static void CreateFromExistingEnvRecurseForCDs( + AdministrationShellEnv src, List wrappers, + ref List filterForCD) + { + if (wrappers == null || filterForCD == null) + return; + + foreach (var w in wrappers) + { + // access + if (w == null) + continue; + + // include in filter .. + if (w.submodelElement.semanticId != null) + { + var cd = src.FindConceptDescription(w.submodelElement.semanticId.Keys); + if (cd != null) + filterForCD.Add(cd); + } + + // recurse? + if (w.submodelElement is SubmodelElementCollection smec) + CreateFromExistingEnvRecurseForCDs(src, smec.value, ref filterForCD); + + if (w.submodelElement is Operation op) + for (int i = 0; i < 2; i++) + { + var w2s = Operation.GetWrappers(op[i]); + CreateFromExistingEnvRecurseForCDs(src, w2s, ref filterForCD); + } + + if (w.submodelElement is Entity smee) + CreateFromExistingEnvRecurseForCDs(src, smee.statements, ref filterForCD); + + if (w.submodelElement is AnnotatedRelationshipElement smea) + CreateFromExistingEnvRecurseForCDs(src, smea.annotations, ref filterForCD); + } + } + + public static AdministrationShellEnv CreateFromExistingEnv(AdministrationShellEnv src, + List filterForAas = null, + List filterForAsset = null, + ListOfSubmodels filterForSubmodel = null, + List filterForCD = null) + { + // prepare defaults + if (filterForAas == null) + filterForAas = new List(); + if (filterForAsset == null) + filterForAsset = new List(); + if (filterForSubmodel == null) + filterForSubmodel = new ListOfSubmodels(); + if (filterForCD == null) + filterForCD = new List(); + + // make new + var res = new AdministrationShellEnv(); + + // take over AAS + foreach (var aas in src.administrationShells) + if (filterForAas.Contains(aas)) + { + // take over + res.administrationShells.Add(new AdministrationShell(aas)); + + // consequences + if (aas.assetRef != null) + { + var asset = src.FindAsset(aas.assetRef); + if (asset != null) + filterForAsset.Add(asset); + } + + if (aas.submodelRefs != null) + foreach (var smr in aas.submodelRefs) + { + var sm = src.FindSubmodel(smr); + if (sm != null) + filterForSubmodel.Add(sm); + } + + if (aas.conceptDictionaries != null) + foreach (var cdd in aas.conceptDictionaries) + if (cdd.conceptDescriptionsRefs != null && + cdd.conceptDescriptionsRefs.conceptDescriptions != null) + foreach (var cdr in cdd.conceptDescriptionsRefs.conceptDescriptions) + { + var cd = src.FindConceptDescription(cdr); + if (cd != null) + filterForCD.Add(cd); + } + } + + // take over Assets + foreach (var asset in src.assets) + if (filterForAsset.Contains(asset)) + { + // take over + res.assets.Add(new Asset(asset)); + } + + // take over Submodels + foreach (var sm in src.Submodels) + if (filterForSubmodel.Contains(sm)) + { + // take over + res.submodels.Add(new Submodel(sm)); + + // recursion in order to find used CDs + CreateFromExistingEnvRecurseForCDs(src, sm.submodelElements, ref filterForCD); + } + + // ConceptDescriptions + foreach (var cd in src.ConceptDescriptions) + if (filterForCD.Contains(cd)) + { + // take over + res.conceptDescriptions.Add(new ConceptDescription(cd)); + } + + // ok + return res; + } + + // Sorting + + public Referable.ComparerIndexed CreateIndexedComparerCdsForSmUsage() + { + var cmp = new Referable.ComparerIndexed(); + int nr = 0; + foreach (var sm in FindAllSubmodelGroupedByAAS()) + foreach (var sme in sm.FindDeep()) + { + if (sme.semanticId == null) + continue; + var cd = this.FindConceptDescription(sme.semanticId); + if (cd == null) + continue; + if (cmp.Index.ContainsKey(cd)) + continue; + cmp.Index[cd] = nr++; + } + return cmp; + } + + // Validation + + public AasValidationRecordList ValidateAll() + { + // collect results + var results = new AasValidationRecordList(); + + // all entities + foreach (var rf in this.FindAllReferable()) + rf.Validate(results); + + // give back + return results; + } + + public int AutoFix(IEnumerable records) + { + // access + if (records == null) + return -1; + + // collect Referables (expensive safety measure) + var allowedReferables = this.FindAllReferable().ToList(); + + // go thru records + int res = 0; + foreach (var rec in records) + { + // access + if (rec == null || rec.Fix == null || rec.Source == null) + continue; + + // minimal safety measure + if (!allowedReferables.Contains(rec.Source)) + continue; + + // apply fix + res++; + try + { + rec.Fix.Invoke(); + } + catch + { + res--; + } + } + + // return number of applied fixes + return res; + } + + public void RecurseOnReferables( + object state, Func lambda, bool includeThis = false) + { + // includeThis does not make sense, as no Referable + // just use the others + foreach (var idf in this.FindAllReferable(onlyIdentifiables: true)) + idf?.RecurseOnReferables(state, lambda, includeThis); + } + } + + // + // Submodel + Submodel elements + // + + public interface IGetReference + { + Reference GetReference(bool includeParents = true); + } + + public interface IGetQualifiers + { + QualifierCollection GetQualifiers(); + } + + public class Qualifier : IAasElement + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } + + // member + // from hasSemantics: + [XmlElement(ElementName = "semanticId")] + public SemanticId semanticId = null; + + // this class + // TODO (Michael Hoffmeister, 2020-08-01): check, if Json has Qualifiers or not + + [MetaModelName("Qualifier.type")] + [TextSearchable] + [CountForHash] + public string type = ""; + + [MetaModelName("Qualifier.valueType")] + [TextSearchable] + [CountForHash] + public string valueType = ""; + + [CountForHash] + public Reference valueId = null; + + [MetaModelName("Qualifier.value")] + [TextSearchable] + [CountForHash] + public string value = null; + + // dead-csharp off + // Remark: due to publication of v2.0.1, the order of elements has changed!!! + // from hasSemantics: + // [XmlElement(ElementName = "semanticId")] + // [JsonIgnore] + // public SemanticId semanticId = null; + // dead-csharp on + + // constructors + + public Qualifier() { } + + public Qualifier(Qualifier src) + { + if (src.semanticId != null) + this.semanticId = new SemanticId(src.semanticId); + this.type = src.type; + this.value = src.value; + if (src.valueId != null) + this.valueId = new Reference(src.valueId); + } + + public Qualifier(string type, string value) + { + this.type = type; + this.value = value; + } + +#if !DoNotUseAasxCompatibilityModels + public Qualifier(AasxCompatibilityModels.AdminShellV10.Qualifier src) + { + if (src.semanticId != null) + this.semanticId = new SemanticId(src.semanticId); + this.type = src.qualifierType; + this.value = src.qualifierValue; + if (src.qualifierValueId != null) + this.valueId = new Reference(src.qualifierValueId); + } +#endif + + public AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("Qualifier", "Qfr"); + } + + public string GetElementName() + { + return this.GetSelfDescription()?.ElementName; + } + + // ReSharper disable MethodOverloadWithOptionalParameter .. this seems to work, anyhow + // ReSharper disable RedundantArgumentDefaultValue + public string ToString(int format = 0, string delimiter = ",") + { + var res = "" + type; + if (res == "") + res += "" + semanticId?.ToString(format, delimiter); + + if (value != null) + res += " = " + value; + else if (valueId != null) + res += " = " + valueId?.ToString(format, delimiter); + + return res; + } + + public override string ToString() + { + return this.ToString(0); + } + // ReSharper enable MethodOverloadWithOptionalParameter + // ReSharper enable RedundantArgumentDefaultValue + + public static Qualifier Parse(string input) + { + var m = Regex.Match(input, @"\s*([^,]*)(,[^=]+){0,1}\s*=\s*([^,]*)(,.+){0,1}\s*"); + if (!m.Success) + return null; + + return new Qualifier() + { + type = m.Groups[1].ToString().Trim(), + semanticId = SemanticId.Parse(m.Groups[1].ToString().Trim()), + value = m.Groups[3].ToString().Trim(), + valueId = Reference.Parse(m.Groups[1].ToString().Trim()) + }; + } + } + + /// + /// This class holds some convenience functions for Qualifiers + /// + public class QualifierCollection : List + { + public QualifierCollection() + { + + } + +#if !DoNotUseAasxCompatibilityModels + public QualifierCollection( + List src, bool shallowCopy = false) + + { + if (src != null && src.Count != 0) + { + foreach (var q in src) + { + this.Add(new Qualifier(q)); + } + } + } +#endif + + /// + /// Add qualifier. If null, do nothing + /// + public new void Add(Qualifier q) + { + if (q == null) + return; + base.Add(q); + } + + public Qualifier FindType(string type) + { + if (type == null) + return null; + foreach (var q in this) + if (q != null && q.type != null && q.type.Trim() == type.Trim()) + return q; + return null; + } + + public Qualifier FindSemanticId(SemanticId semId) + { + if (semId == null) + return null; + foreach (var q in this) + if (q != null && q.semanticId != null && q.semanticId.Matches(semId)) + return q; + return null; + } + + // ReSharper disable MethodOverloadWithOptionalParameter .. this seems to work, anyhow + // ReSharper disable RedundantArgumentDefaultValue + public string ToString(int format = 0, string delimiter = ";", string referencesDelimiter = ",") + { + var res = ""; + foreach (var q in this) + { + if (res != "") + res += delimiter; + res += q.ToString(format, referencesDelimiter); + } + return res; + } + + public override string ToString() + { + return this.ToString(0); + } + // ReSharper enable MethodOverloadWithOptionalParameter + // ReSharper enable RedundantArgumentDefaultValue + + // for convenience methods of Submodel, SubmodelElement + + public static void AddQualifier( + ref QualifierCollection qualifiers, + Qualifier q) + { + if (q == null) + return; + if (qualifiers == null) + qualifiers = new QualifierCollection(); + qualifiers.Add(q); + } + + public static void AddQualifier( + ref QualifierCollection qualifiers, + string qualifierType = null, string qualifierValue = null, KeyList semanticKeys = null, + Reference qualifierValueId = null) + { + if (qualifiers == null) + qualifiers = new QualifierCollection(); + var q = new Qualifier() + { + type = qualifierType, + value = qualifierValue, + valueId = qualifierValueId, + }; + if (semanticKeys != null) + q.semanticId = SemanticId.CreateFromKeys(semanticKeys); + qualifiers.Add(q); + } + + public static Qualifier HasQualifierOfType( + QualifierCollection qualifiers, + string qualifierType) + { + if (qualifiers == null || qualifierType == null) + return null; + foreach (var q in qualifiers) + if (q.type.Trim().ToLower() == qualifierType.Trim().ToLower()) + return q; + return null; + } + + public IEnumerable FindAllQualifierType(string qualifierType) + { + if (qualifierType == null) + yield break; + foreach (var q in this) + if (q.type.Trim().ToLower() == qualifierType.Trim().ToLower()) + yield return q; + } + } + + public class ListOfSubmodelElement : List + { + // conversion to other list + + public KeyList ToKeyList() + { + var res = new KeyList(); + foreach (var sme in this) + res.Add(sme.ToKey()); + return res; + } + + public Reference GetReference() + { + return Reference.CreateNew(ToKeyList()); + } + } + + public class SubmodelElement : Referable, System.IDisposable, IGetReference, IGetSemanticId, IGetQualifiers + { + // constants + public static Type[] PROP_MLP = new Type[] { + typeof(AdminShell.MultiLanguageProperty), typeof(AdminShell.Property) }; + + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } + + // members + + // do this in order to be IDisposable, that is: suitable for (using) + void System.IDisposable.Dispose() { } + public void GetData() { } + + // from HasKind + [XmlElement(ElementName = "kind")] + [JsonIgnore] + public ModelingKind kind = new ModelingKind(); + [XmlIgnore] + [JsonProperty(PropertyName = "kind")] + public string JsonKind + { + get + { + if (kind == null) + return null; + return kind.kind; + } + set + { + if (kind == null) + kind = new ModelingKind(); + kind.kind = value; + } + } + + // from hasSemanticId: + [XmlElement(ElementName = "semanticId")] + public SemanticId semanticId = new SemanticId(); + public SemanticId GetSemanticId() { return semanticId; } + + // from Qualifiable: + [XmlArray("qualifier")] + [XmlArrayItem("qualifier")] + [JsonProperty(PropertyName = "constraints")] + public QualifierCollection qualifiers = null; + public QualifierCollection GetQualifiers() => qualifiers; + + // from hasDataSpecification: + [XmlElement(ElementName = "embeddedDataSpecification")] + public HasDataSpecification hasDataSpecification = null; + + // getter / setter + + // constructors / creators + + public SubmodelElement() + : base() { } + + public SubmodelElement(SubmodelElement src) + : base(src) + { + if (src == null) + return; + if (src.hasDataSpecification != null) + hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); + if (src.semanticId != null) + semanticId = new SemanticId(src.semanticId); + if (src.kind != null) + kind = new ModelingKind(src.kind); + if (src.qualifiers != null) + { + if (qualifiers == null) + qualifiers = new QualifierCollection(); + foreach (var q in src.qualifiers) + qualifiers.Add(new Qualifier(q)); + } + } + +#if !DoNotUseAasxCompatibilityModels + public SubmodelElement(AasxCompatibilityModels.AdminShellV10.SubmodelElement src) + : base(src) + { + if (src.hasDataSpecification != null) + hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); + if (src.semanticId != null) + semanticId = new SemanticId(src.semanticId); + if (src.kind != null) + kind = new ModelingKind(src.kind); + if (src.qualifiers != null) + { + if (qualifiers == null) + qualifiers = new QualifierCollection(src.qualifiers); + foreach (var q in src.qualifiers) + qualifiers.Add(new Qualifier(q)); + } + } +#endif + + public static T CreateNew(string idShort = null, string category = null, Reference semanticId = null) + where T : SubmodelElement, new() + { + var res = new T(); + if (idShort != null) + res.idShort = idShort; + if (category != null) + res.category = category; + if (semanticId != null) + res.semanticId = new SemanticId(semanticId); + return res; + } + + public void CreateNewLogic(string idShort = null, string category = null, Key semanticIdKey = null) + { + if (idShort != null) + this.idShort = idShort; + if (category != null) + this.category = category; + if (semanticIdKey != null) + { + if (this.semanticId == null) + this.semanticId = new SemanticId(); + this.semanticId.Keys.Add(semanticIdKey); + } + } + + public void AddQualifier( + Qualifier q) + { + QualifierCollection.AddQualifier( + ref this.qualifiers, q); + } + + public void AddQualifier( + string qualifierType = null, string qualifierValue = null, KeyList semanticKeys = null, + Reference qualifierValueId = null) + { + QualifierCollection.AddQualifier( + ref this.qualifiers, qualifierType, qualifierValue, semanticKeys, qualifierValueId); + } + + public Qualifier HasQualifierOfType(string qualifierType) + { + return QualifierCollection.HasQualifierOfType(this.qualifiers, qualifierType); + } + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("SubmodelElement", "SME"); + } + + public override Reference GetReference(bool includeParents = true) + { + Reference r = new Reference(); + // this is the tail of our referencing chain .. + r.Keys.Add(Key.CreateNew(GetElementName(), true, "IdShort", this.idShort)); + // try to climb up .. + var current = this.parent; + while (includeParents && current != null) + { + if (current is Identifiable cid) + { + // add big information set + r.Keys.Insert(0, Key.CreateNew( + current.GetElementName(), + true, + cid.identification.idType, + cid.identification.id)); + } + else + if (current is Referable crf) + { + // reference via idShort + r.Keys.Insert(0, Key.CreateNew( + current.GetElementName(), + true, + "IdShort", crf.idShort)); + } + + if (current is Referable crf2) + current = crf2.parent; + else + current = null; + } + return r; + } + + public IEnumerable FindAllParents( + Predicate p, + bool includeThis = false, bool includeSubmodel = false, + bool passOverMiss = false) + { + // call for this? + if (includeThis) + { + if (p == null || p.Invoke(this)) + yield return this; + else + if (!passOverMiss) + yield break; + } + + // daisy chain all parents .. + if (this.parent != null) + { + if (this.parent is SubmodelElement psme) + { + foreach (var q in psme.FindAllParents(p, includeThis: true, + passOverMiss: passOverMiss)) + yield return q; + } + else if (includeSubmodel && this.parent is Submodel psm) + { + if (p == null || p.Invoke(psm)) + yield return this; + } + } + } + + public IEnumerable FindAllParentsWithSemanticId( + SemanticId semId, + bool includeThis = false, bool includeSubmodel = false, bool passOverMiss = false) + { + return (FindAllParents( + (rf) => (true == (rf as IGetSemanticId)?.GetSemanticId()?.Matches(semId, + matchMode: Key.MatchMode.Relaxed)), + includeThis: includeThis, includeSubmodel: includeSubmodel, passOverMiss: passOverMiss)); + } + + public Tuple ToCaptionInfo() + { + var caption = AdminShellUtilV20.EvalToNonNullString("\"{0}\" ", idShort, ""); + var info = ""; + // TODO (MIHO, 2021-07-08): obvious error .. info should receive semanticId .. but would change + // display presentation .. therefore to be checked again + if (semanticId != null) + AdminShellUtilV20.EvalToNonEmptyString("\u21e8 {0}", semanticId.ToString(), ""); + return Tuple.Create(caption, info); + } + + public override string ToString() + { + var ci = ToCaptionInfo(); + return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); + } + + public virtual string ValueAsText(string defaultLang = null) + { + return ""; + } + + public virtual double? ValueAsDouble() + { + return null; + } + + public virtual void ValueFromText(string text, string defaultLang = null) + { + } + + // validation + + public override void Validate(AasValidationRecordList results) + { + // access + if (results == null) + return; + + // check + base.Validate(results); + ModelingKind.Validate(results, kind, this); + KeyList.Validate(results, semanticId?.Keys, this); + } + } + + [XmlType(TypeName = "submodelElement")] + public class SubmodelElementWrapper + { + + // members + + [XmlElement(ElementName = "property", Type = typeof(Property))] + [XmlElement(ElementName = "multiLanguageProperty", Type = typeof(MultiLanguageProperty))] + [XmlElement(ElementName = "range", Type = typeof(Range))] + [XmlElement(ElementName = "file", Type = typeof(File))] + [XmlElement(ElementName = "blob", Type = typeof(Blob))] + [XmlElement(ElementName = "referenceElement", Type = typeof(ReferenceElement))] + [XmlElement(ElementName = "relationshipElement", Type = typeof(RelationshipElement))] + [XmlElement(ElementName = "annotatedRelationshipElement", Type = typeof(AnnotatedRelationshipElement))] + [XmlElement(ElementName = "capability", Type = typeof(Capability))] + [XmlElement(ElementName = "submodelElementCollection", Type = typeof(SubmodelElementCollection))] + [XmlElement(ElementName = "operation", Type = typeof(Operation))] + [XmlElement(ElementName = "basicEvent", Type = typeof(BasicEvent))] + [XmlElement(ElementName = "entity", Type = typeof(Entity))] + public SubmodelElement submodelElement; + + // element names + public enum AdequateElementEnum + { + Unknown = 0, SubmodelElementCollection, Property, MultiLanguageProperty, Range, File, Blob, + ReferenceElement, RelationshipElement, AnnotatedRelationshipElement, Capability, Operation, + BasicEvent, Entity + } + + public static AdequateElementEnum[] AdequateElementsDataElement = + { + AdequateElementEnum.SubmodelElementCollection, AdequateElementEnum.RelationshipElement, + AdequateElementEnum.AnnotatedRelationshipElement, AdequateElementEnum.Capability, + AdequateElementEnum.Operation, AdequateElementEnum.BasicEvent, AdequateElementEnum.Entity + }; + + public static string[] AdequateElementNames = { "Unknown", "SubmodelElementCollection", "Property", + "MultiLanguageProperty", "Range", "File", "Blob", "ReferenceElement", "RelationshipElement", + "AnnotatedRelationshipElement", "Capability", "Operation", "BasicEvent", "Entity" }; + + public static string[] AdequateElementShortName = { null, "SMC", null, + "MLP", null, null, null, "Ref", "Rel", + "ARel", null, null, "Event", "Entity" }; + + // constructors + + public SubmodelElementWrapper() { } + + // cloning + + public SubmodelElementWrapper(SubmodelElement src, bool shallowCopy = false) + { + /* TODO (MIHO, 2021-08-12): consider using: + Activator.CreateInstance(pl.GetType(), new object[] { pl }) */ + + if (src is SubmodelElementCollection) + this.submodelElement = new SubmodelElementCollection( + src as SubmodelElementCollection, shallowCopy: shallowCopy); + if (src is Property) + this.submodelElement = new Property(src as Property); + if (src is MultiLanguageProperty) + this.submodelElement = new MultiLanguageProperty(src as MultiLanguageProperty); + if (src is Range) + this.submodelElement = new Range(src as Range); + if (src is File) + this.submodelElement = new File(src as File); + if (src is Blob) + this.submodelElement = new Blob(src as Blob); + if (src is ReferenceElement) + this.submodelElement = new ReferenceElement(src as ReferenceElement); + if (src is RelationshipElement) + this.submodelElement = new RelationshipElement(src as RelationshipElement); + if (src is AnnotatedRelationshipElement) + this.submodelElement = new AnnotatedRelationshipElement(src as AnnotatedRelationshipElement); + if (src is Capability) + this.submodelElement = new Capability(src as Capability); + if (src is Operation) + this.submodelElement = new Operation(src as Operation); + if (src is BasicEvent) + this.submodelElement = new BasicEvent(src as BasicEvent); + if (src is Entity) + this.submodelElement = new Entity(src as Entity); + } + +#if !DoNotUseAasxCompatibilityModels + public SubmodelElementWrapper( + AasxCompatibilityModels.AdminShellV10.SubmodelElement src, bool shallowCopy = false) + { + if (src is AasxCompatibilityModels.AdminShellV10.SubmodelElementCollection) + this.submodelElement = new SubmodelElementCollection( + src as AasxCompatibilityModels.AdminShellV10.SubmodelElementCollection, + shallowCopy: shallowCopy); + if (src is AasxCompatibilityModels.AdminShellV10.Property) + this.submodelElement = new Property(src as AasxCompatibilityModels.AdminShellV10.Property); + if (src is AasxCompatibilityModels.AdminShellV10.File) + this.submodelElement = new File(src as AasxCompatibilityModels.AdminShellV10.File); + if (src is AasxCompatibilityModels.AdminShellV10.Blob) + this.submodelElement = new Blob(src as AasxCompatibilityModels.AdminShellV10.Blob); + if (src is AasxCompatibilityModels.AdminShellV10.ReferenceElement) + this.submodelElement = new ReferenceElement( + src as AasxCompatibilityModels.AdminShellV10.ReferenceElement); + if (src is AasxCompatibilityModels.AdminShellV10.RelationshipElement) + this.submodelElement = new RelationshipElement( + src as AasxCompatibilityModels.AdminShellV10.RelationshipElement); + if (src is AasxCompatibilityModels.AdminShellV10.Operation) + this.submodelElement = new Operation(src as AasxCompatibilityModels.AdminShellV10.Operation); + } +#endif + + public static string GetAdequateName(AdequateElementEnum ae) + { + return AdequateElementNames[(int)ae]; + } + + /// + /// Deprecated. See below. + /// + public static AdequateElementEnum GetAdequateEnum(string adequateName) + { + if (adequateName == null) + return AdequateElementEnum.Unknown; + + foreach (var en in (AdequateElementEnum[])Enum.GetValues(typeof(AdequateElementEnum))) + if (Enum.GetName(typeof(AdequateElementEnum), en)?.Trim().ToLower() == + adequateName.Trim().ToLower()) + return en; + + return AdequateElementEnum.Unknown; + } + + /// + /// This version uses the element name array and allows using ShortName + /// + public static AdequateElementEnum GetAdequateEnum2(string adequateName, bool useShortName = false) + { + if (adequateName == null) + return AdequateElementEnum.Unknown; + + foreach (var en in (AdequateElementEnum[])Enum.GetValues(typeof(AdequateElementEnum))) + if (((int)en < AdequateElementNames.Length + && AdequateElementNames[(int)en].Trim().ToLower() == adequateName.Trim().ToLower()) + || (useShortName + && (int)en < AdequateElementShortName.Length + && AdequateElementShortName[(int)en] != null + && AdequateElementShortName[(int)en].Trim().ToLower() == adequateName.Trim().ToLower())) + return en; + + return AdequateElementEnum.Unknown; + } + + public static IEnumerable GetAdequateEnums( + AdequateElementEnum[] excludeValues = null, AdequateElementEnum[] includeValues = null) + { + if (includeValues != null) + { + foreach (var en in includeValues) + yield return en; + } + else + { + foreach (var en in (AdequateElementEnum[])Enum.GetValues(typeof(AdequateElementEnum))) + { + if (en == AdequateElementEnum.Unknown) + continue; + if (excludeValues != null && excludeValues.Contains(en)) + continue; + yield return en; + } + } + } + + /// + /// Introduced for JSON serialization, can create SubModelElements based on a string name + /// + public static SubmodelElement CreateAdequateType(AdequateElementEnum ae, SubmodelElement src = null) + { + if (ae == AdequateElementEnum.Property) + return new Property(src); + if (ae == AdequateElementEnum.MultiLanguageProperty) + return new MultiLanguageProperty(src); + if (ae == AdequateElementEnum.Range) + return new Range(src); + if (ae == AdequateElementEnum.File) + return new File(src); + if (ae == AdequateElementEnum.Blob) + return new Blob(src); + if (ae == AdequateElementEnum.ReferenceElement) + return new ReferenceElement(src); + if (ae == AdequateElementEnum.RelationshipElement) + return new RelationshipElement(src); + if (ae == AdequateElementEnum.AnnotatedRelationshipElement) + return new AnnotatedRelationshipElement(src); + if (ae == AdequateElementEnum.Capability) + return new Capability(src); + if (ae == AdequateElementEnum.SubmodelElementCollection) + return new SubmodelElementCollection(src); + if (ae == AdequateElementEnum.Operation) + return new Operation(src); + if (ae == AdequateElementEnum.BasicEvent) + return new BasicEvent(src); + if (ae == AdequateElementEnum.Entity) + return new Entity(src); + return null; + } + + /// + /// Introduced for JSON serialization, can create SubModelElements based on a string name + /// + /// string name (standard PascalCased) + public static SubmodelElement CreateAdequateType(string elementName) + { + return CreateAdequateType(GetAdequateEnum(elementName)); + } + + /// + /// Can create SubmodelElements based on a given type information + /// + /// Type of the SME to be created + /// SubmodelElement or null + public static SubmodelElement CreateAdequateType(Type t) + { + if (t == null || !t.IsSubclassOf(typeof(AdminShell.SubmodelElement))) + return null; + var sme = Activator.CreateInstance(t) as SubmodelElement; + return sme; + } + + public string GetElementAbbreviation() + { + if (submodelElement == null) + return ("Null"); + var dsc = submodelElement.GetSelfDescription(); + if (dsc?.ElementAbbreviation == null) + return ("Null"); + return dsc.ElementAbbreviation; + } + + public static string GetElementNameByAdequateType(SubmodelElement sme) + { + // access + var sd = sme.GetSelfDescription(); + if (sd == null || sd.ElementEnum == AdequateElementEnum.Unknown) + return null; + var en = sd.ElementEnum; + + // get the names + string res = null; + if ((int)en < AdequateElementNames.Length) + res = AdequateElementNames[(int)en].Trim(); + if ((int)en < AdequateElementShortName.Length && AdequateElementShortName[(int)en] != null) + res = AdequateElementShortName[(int)en].Trim(); + return res; + } + + public static ListOfSubmodelElement ListOfWrappersToListOfElems(List wrappers) + { + var res = new ListOfSubmodelElement(); + if (wrappers == null) + return res; + foreach (var w in wrappers) + if (w.submodelElement != null) + res.Add(w.submodelElement); + return res; + } + + public static SubmodelElementWrapper CreateFor(SubmodelElement sme) + { + var res = new SubmodelElementWrapper() { submodelElement = sme }; + return res; + } + + public static Referable FindReferableByReference( + List wrappers, Reference rf, int keyIndex) + { + return FindReferableByReference(wrappers, rf?.Keys, keyIndex); + } + + public static Referable FindReferableByReference( + List wrappers, KeyList rf, int keyIndex) + { + // first index needs to exist .. + if (wrappers == null || rf == null || keyIndex >= rf.Count) + return null; + + // as SubmodelElements are not Identifiables, the actual key shall be IdShort + if (rf[keyIndex].idType.Trim().ToLower() != Key.GetIdentifierTypeName( + Key.IdentifierType.IdShort).Trim().ToLower()) + return null; + + // over all wrappers + foreach (var smw in wrappers) + if (smw.submodelElement != null && + smw.submodelElement.idShort.Trim().ToLower() == rf[keyIndex].value.Trim().ToLower()) + { + // match on this level. Did we find a leaf element? + if ((keyIndex + 1) >= rf.Count) + return smw.submodelElement; + + // dive into SMC? + if (smw.submodelElement is SubmodelElementCollection smc) + { + var found = FindReferableByReference(smc.value, rf, keyIndex + 1); + if (found != null) + return found; + } + + // dive into Entity statements? + if (smw.submodelElement is Entity ent) + { + var found = FindReferableByReference(ent.statements, rf, keyIndex + 1); + if (found != null) + return found; + } + + // else: + return null; + } + + // no? + return null; + } + + // typecasting wrapper into specific type + public T GetAs() where T : SubmodelElement + { + var x = (this.submodelElement) as T; + return x; + } + + } + + public class SubmodelElementWrapperCollection : BaseSubmodelElementWrapperCollection + { + public SubmodelElementWrapperCollection() : base() { } + + public SubmodelElementWrapperCollection(SubmodelElementWrapper smw) : base(smw) { } + + public SubmodelElementWrapperCollection(SubmodelElement sme) : base(sme) { } + + public SubmodelElementWrapperCollection(SubmodelElementWrapperCollection other) : base(other) { } + } + + public class DataElementWrapperCollection : BaseSubmodelElementWrapperCollection + { + public DataElementWrapperCollection() : base() { } + + public DataElementWrapperCollection(SubmodelElementWrapperCollection other) + : base(other) + { + } + + public DataElementWrapperCollection(DataElementWrapperCollection other) + : base() + { + foreach (var wo in other) + this.Add(wo); + } + } + + /// + /// Provides some more functionalities for searching specific elements, e.g. in a SMEC + /// + // OZ + // Resharper disable UnusedTypeParameter + public class BaseSubmodelElementWrapperCollection : List + where ELEMT : SubmodelElement + { + // Resharper enable UnusedTypeParameter + + // member: Parent + // will be held correctly by the containing class + public Referable Parent = null; + + // constructors + + public BaseSubmodelElementWrapperCollection() : base() { } + + public BaseSubmodelElementWrapperCollection(SubmodelElementWrapperCollection other) + : base() + { + if (other == null) + return; + + foreach (var smw in other) + this.Add(new SubmodelElementWrapper(smw.submodelElement)); + } + + public BaseSubmodelElementWrapperCollection(SubmodelElementWrapper smw) + : base() + { + if (smw != null) + this.Add(smw); + } + + public BaseSubmodelElementWrapperCollection(SubmodelElement sme) + : base() + { + if (sme != null) + this.Add(new SubmodelElementWrapper(sme)); + } + + // better find functions + + public IEnumerable FindDeep(Predicate match = null) where T : SubmodelElement + { + foreach (var smw in this) + { + var current = smw.submodelElement; + if (current == null) + continue; + + // call lambda for this element + if (current is T) + if (match == null || match.Invoke(current as T)) + yield return current as T; + + // dive into? + // TODO (MIHO, 2020-07-31): would be nice to use IEnumerateChildren for this .. + if (current is SubmodelElementCollection smc && smc.value != null) + foreach (var x in smc.value.FindDeep(match)) + yield return x; + + if (current is AnnotatedRelationshipElement are && are.annotations != null) + foreach (var x in are.annotations.FindDeep(match)) + yield return x; + + if (current is Entity ent && ent.statements != null) + foreach (var x in ent.statements.FindDeep(match)) + yield return x; + + if (current is Operation op) + for (int i = 0; i < 2; i++) + if (Operation.GetWrappers(op[i]) != null) + foreach (var x in Operation.GetWrappers(op[i]).FindDeep(match)) + yield return x; + } + } + + public IEnumerable FindAllIdShort(string idShort) + { + foreach (var smw in this) + if (smw.submodelElement != null) + if (smw.submodelElement.idShort.Trim().ToLower() == idShort.Trim().ToLower()) + yield return smw; + } + + public IEnumerable FindAllIdShortAs(string idShort) where T : SubmodelElement + { + foreach (var smw in this) + if (smw.submodelElement != null && smw.submodelElement is T) + if (smw.submodelElement.idShort.Trim().ToLower() == idShort.Trim().ToLower()) + yield return smw.submodelElement as T; + } + + public SubmodelElementWrapper FindFirstIdShort(string idShort) + { + return FindAllIdShort(idShort)?.FirstOrDefault(); + } + + public T FindFirstIdShortAs(string idShort) where T : SubmodelElement + { + return FindAllIdShortAs(idShort)?.FirstOrDefault(); + } + + public IEnumerable FindAllSemanticId( + Key semId, Type[] allowedTypes = null, Key.MatchMode matchMode = Key.MatchMode.Strict) + { + foreach (var smw in this) + if (smw.submodelElement != null && smw.submodelElement.semanticId != null) + { + if (smw.submodelElement == null) + continue; + + if (allowedTypes != null) + { + var smwt = smw.submodelElement.GetType(); + if (!allowedTypes.Contains(smwt)) + continue; + } + + if (smw.submodelElement.semanticId.MatchesExactlyOneKey(semId, matchMode)) + yield return smw; + } + } + + public IEnumerable FindAllSemanticIdAs(Key semId, Key.MatchMode matchMode = Key.MatchMode.Strict) + where T : SubmodelElement + { + foreach (var smw in this) + if (smw.submodelElement != null && smw.submodelElement is T + && smw.submodelElement.semanticId != null) + if (smw.submodelElement.semanticId.MatchesExactlyOneKey(semId, matchMode)) + yield return smw.submodelElement as T; + } + + public IEnumerable FindAllSemanticIdAs(Reference semId, + Key.MatchMode matchMode = Key.MatchMode.Strict) + where T : SubmodelElement + { + foreach (var smw in this) + if (smw.submodelElement != null && smw.submodelElement is T + && smw.submodelElement.semanticId != null) + if (smw.submodelElement.semanticId.Matches(semId, matchMode)) + yield return smw.submodelElement as T; + } + + public IEnumerable FindAllSemanticIdAs(ConceptDescription cd, + Key.MatchMode matchMode = Key.MatchMode.Strict) + where T : SubmodelElement + { + foreach (var x in FindAllSemanticIdAs(cd.GetReference(), matchMode)) + yield return x; + } + + public SubmodelElementWrapper FindFirstSemanticId( + Key semId, Type[] allowedTypes = null, Key.MatchMode matchMode = Key.MatchMode.Strict) + { + return FindAllSemanticId(semId, allowedTypes, matchMode)?.FirstOrDefault(); + } + + public SubmodelElementWrapper FindFirstAnySemanticId( + Key[] semId, Type[] allowedTypes = null, Key.MatchMode matchMode = Key.MatchMode.Strict) + { + if (semId == null) + return null; + foreach (var si in semId) + { + var found = FindAllSemanticId(si, allowedTypes, matchMode)? + .FirstOrDefault(); + if (found != null) + return found; + } + return null; + } + + public T FindFirstSemanticIdAs(Key semId, Key.MatchMode matchMode = Key.MatchMode.Strict) + where T : SubmodelElement + { + return FindAllSemanticIdAs(semId, matchMode)?.FirstOrDefault(); + } + + public T FindFirstAnySemanticIdAs(Key[] semId, Key.MatchMode matchMode = Key.MatchMode.Strict) + where T : SubmodelElement + { + if (semId == null) + return null; + foreach (var si in semId) + { + var found = FindAllSemanticIdAs(si, matchMode)?.FirstOrDefault(); + if (found != null) + return found; + } + return null; + } + + public T FindFirstSemanticIdAs(Reference semId, Key.MatchMode matchMode = Key.MatchMode.Strict) + where T : SubmodelElement + { + return FindAllSemanticIdAs(semId, matchMode)?.FirstOrDefault(); + } + + /* TODO (MIHO, 2021-10-18): there are overlaps of this new function with + * this old function: FindFirstAnySemanticId(Key[] semId .. + * clarify/ refactor */ + public IEnumerable FindAllSemanticId( + Key[] allowedSemId, Key.MatchMode matchMode = Key.MatchMode.Strict, + bool invertAllowed = false) + where T : SubmodelElement + { + if (allowedSemId == null || allowedSemId.Length < 1) + yield break; + + foreach (var smw in this) + { + if (smw.submodelElement == null || !(smw.submodelElement is T)) + continue; + + if (smw.submodelElement.semanticId == null || smw.submodelElement.semanticId.Count < 1) + { + if (invertAllowed) + yield return smw.submodelElement as T; + continue; + } + + var found = false; + foreach (var semId in allowedSemId) + if (smw.submodelElement.semanticId.MatchesExactlyOneKey(semId, matchMode)) + { + found = true; + break; + } + + if (invertAllowed) + found = !found; + + if (found) + yield return smw.submodelElement as T; + } + } + + public T FindFirstAnySemanticId( + Key[] allowedSemId, Key.MatchMode matchMode = Key.MatchMode.Strict, + bool invertAllowed = false) + where T : SubmodelElement + { + return FindAllSemanticId(allowedSemId, matchMode, invertAllowed)?.FirstOrDefault(); + } + + // recursion + + /// + /// Recurses on all Submodel elements of a Submodel or SME, which allows children. + /// The state object will be passed to the lambda function in order to provide + /// stateful approaches. Also a list of parents will be provided to + /// the lambda. This list of parents can be initialized or simply set to null + /// in order to be created automatically. + /// + /// State object to be provided to lambda. Could be null. + /// List of already existing parents to be provided to lambda. + /// Could be null. + /// The lambda function as (state, parents, SME) + /// The lambda shall return TRUE in order to deep into recursion. + /// + public void RecurseOnReferables( + object state, ListOfReferable parents, + Func lambda) + { + // trivial + if (lambda == null) + return; + if (parents == null) + parents = new ListOfReferable(); + + // over all elements + foreach (var smw in this) + { + var current = smw.submodelElement; + if (current == null) + continue; + + // call lambda for this element + // AND decide, if to recurse! + var goDeeper = lambda(state, parents, current); + + if (goDeeper) + { + // add to parents + parents.Add(current); + + // dive into? + if (current is SubmodelElementCollection smc) + smc.value?.RecurseOnReferables(state, parents, lambda); + + if (current is Entity ent) + ent.statements?.RecurseOnReferables(state, parents, lambda); + + if (current is Operation op) + for (int i = 0; i < 2; i++) + Operation.GetWrappers(op[i])?.RecurseOnReferables(state, parents, lambda); + + if (current is AnnotatedRelationshipElement arel) + arel.annotations?.RecurseOnReferables(state, parents, lambda); + + // remove from parents + parents.RemoveAt(parents.Count - 1); + } + } + } + + // idShort management + + /// + /// Checks, if given idShort is already existing in the collection of SubmodelElements. + /// Trims the string, but does not ignore upper/ lowercase. An empty idShort returns false. + /// + public bool CheckIdShortIsUnique(string idShort) + { + idShort = idShort?.Trim(); + if (idShort == null || idShort.Length < 1) + return false; + + var res = true; + foreach (var smw in this) + if (smw.submodelElement != null && smw.submodelElement.idShort != null && + smw.submodelElement.idShort == idShort) + { + res = false; + break; + } + + return res; + } + + /// + /// The string idShortTemplate shall contain Format.String partt such as {0}. + /// A int-Parameter is as long incremented, until the resulting idShort proves + /// to be unique in the collection of SubmodelElements or maxNum is reached. + /// Returns null in case of any error. + /// + public string IterateIdShortTemplateToBeUnique(string idShortTemplate, int maxNum) + { + if (idShortTemplate == null || maxNum < 1 || !idShortTemplate.Contains("{0")) + return null; + + int i = 1; + while (i < maxNum) + { + var ids = String.Format(idShortTemplate, i); + if (this.CheckIdShortIsUnique(ids)) + return ids; + i++; + } + + return null; + } + + // give more direct access to SMEs + + /// + /// Add sme by creating a SubmodelElementWrapper for it and adding to this collection. + /// + public void Add(SubmodelElement sme) + { + if (sme == null) + return; + sme.parent = this.Parent; + this.Add(SubmodelElementWrapper.CreateFor(sme)); + } + + /// + /// Add sme by creating a SubmodelElementWrapper for it and adding to this collection. + /// + public void Insert(int index, SubmodelElement sme) + { + if (sme == null || index < 0 || index >= this.Count) + return; + sme.parent = this.Parent; + this.Insert(index, SubmodelElementWrapper.CreateFor(sme)); + } + + /// + /// Finds the first (shall be only 1!) SubmodelElementWrapper with SubmodelElement sme. + /// + public SubmodelElementWrapper FindSubModelElement(SubmodelElement sme) + { + if (sme != null) + foreach (var smw in this) + if (smw?.submodelElement == sme) + return smw; + return null; + } + + /// + /// Removes the first (shall be only 1!) SubmodelElementWrapper with SubmodelElement sme. + /// + public void Remove(SubmodelElement sme) + { + if (sme == null) + return; + var found = FindSubModelElement(sme); + if (found != null) + this.Remove(found); + } + + // a little more business logic + + public T CreateSMEForCD(ConceptDescription cd, string category = null, string idShort = null, + string idxTemplate = null, int maxNum = 999, bool addSme = false, bool isTemplate = false) + where T : SubmodelElement, new() + { + // access + if (cd == null) + return null; + + // try to potentially figure out idShort + var ids = cd.idShort; + if ((ids == null || ids.Trim() == "") && cd.GetIEC61360() != null) + ids = cd.GetIEC61360().shortName? + .GetDefaultStr(); + if (idShort != null) + ids = idShort; + if (ids == null) + return null; + + // unique? + if (idxTemplate != null) + ids = this.IterateIdShortTemplateToBeUnique(idxTemplate, maxNum); + + // make a new instance + var sme = new T() + { + idShort = ids, + semanticId = new SemanticId(cd.GetCdReference()) + }; + if (category != null) + sme.category = category; + if (isTemplate) + sme.kind = ModelingKind.CreateAsTemplate(); + + // if its a SMC, make sure its accessible + if (sme is SubmodelElementCollection smc) + smc.value = new SubmodelElementWrapperCollection(); + + // instantanously add it? + if (addSme) + this.Add(sme); + + // give back + return sme; + } + + public T CreateSMEForIdShort(string idShort, string category = null, + string idxTemplate = null, int maxNum = 999, bool addSme = false) where T : SubmodelElement, new() + { + // access + if (idShort == null) + return null; + + // try to potentially figure out idShort + var ids = idShort; + + // unique? + if (idxTemplate != null) + ids = this.IterateIdShortTemplateToBeUnique(idxTemplate, maxNum); + + // make a new instance + var sme = new T() { idShort = ids }; + if (category != null) + sme.category = category; + + // instantanously add it? + if (addSme) + this.Add(sme); + + // give back + return sme; + } + + // for conversion + + public T AdaptiveConvertTo( + SubmodelElement anySrc, + ConceptDescription createDefault = null, + string idShort = null, bool addSme = false) where T : SubmodelElement, new() + { + if (typeof(T) == typeof(MultiLanguageProperty) + && anySrc is Property srcProp) + { + var res = this.CreateSMEForCD(createDefault, idShort: idShort, addSme: addSme); + if (res is MultiLanguageProperty mlp) + { + mlp.value = new LangStringSet("EN?", srcProp.value); + mlp.valueId = srcProp.valueId; + return res; + } + } + + if (typeof(T) == typeof(Property) + && anySrc is MultiLanguageProperty srcMlp) + { + var res = this.CreateSMEForCD(createDefault, idShort: idShort, addSme: addSme); + if (res is Property prp) + { + prp.value = "" + srcMlp.value?.GetDefaultStr(); + prp.valueId = srcMlp.valueId; + return res; + } + } + + return null; + } + + public T CopyOneSMEbyCopy(Key destSemanticId, + SubmodelElementWrapperCollection sourceSmc, Key[] sourceSemanticId, + ConceptDescription createDefault = null, Action setDefault = null, + Key.MatchMode matchMode = Key.MatchMode.Relaxed, + string idShort = null, bool addSme = false) where T : SubmodelElement, new() + { + // get source + var src = sourceSmc?.FindFirstAnySemanticIdAs(sourceSemanticId, matchMode); + + // may be make an adaptive conversion + if (src == null) + { + var anySrc = sourceSmc?.FindFirstAnySemanticId(sourceSemanticId, matchMode: matchMode); + src = AdaptiveConvertTo(anySrc?.submodelElement, createDefault, + idShort: idShort, addSme: false); + } + + // proceed + var aeSrc = SubmodelElementWrapper.GetAdequateEnum(src?.GetElementName()); + if (src == null || aeSrc == SubmodelElementWrapper.AdequateElementEnum.Unknown) + { + // create a default? + if (createDefault == null) + return null; + + // ok, default + var dflt = this.CreateSMEForCD(createDefault, idShort: idShort, addSme: addSme); + + // set default? + setDefault?.Invoke(dflt); + + // return + return dflt; + } + + // ok, create new one + var dst = SubmodelElementWrapper.CreateAdequateType(aeSrc, src) as T; + if (dst == null) + return null; + + // make same things sure + dst.idShort = src.idShort; + dst.category = src.category; + dst.semanticId = new SemanticId(destSemanticId); + + // instantanously add it? + if (addSme) + this.Add(dst); + + // give back + return dst; + } + + public T CopyOneSMEbyCopy(ConceptDescription destCD, + SubmodelElementWrapperCollection sourceSmc, ConceptDescription sourceCD, + bool createDefault = false, Action setDefault = null, + Key.MatchMode matchMode = Key.MatchMode.Relaxed, + string idShort = null, bool addSme = false) where T : SubmodelElement, new() + { + return this.CopyOneSMEbyCopy(destCD?.GetSingleKey(), sourceSmc, new[] { sourceCD?.GetSingleKey() }, + createDefault ? destCD : null, setDefault, matchMode, idShort, addSme); + } + + public T CopyOneSMEbyCopy(ConceptDescription destCD, + SubmodelElementWrapperCollection sourceSmc, Key[] sourceKeys, + bool createDefault = false, Action setDefault = null, + Key.MatchMode matchMode = Key.MatchMode.Relaxed, + string idShort = null, bool addSme = false) where T : SubmodelElement, new() + { + return this.CopyOneSMEbyCopy(destCD?.GetSingleKey(), sourceSmc, sourceKeys, + createDefault ? destCD : null, setDefault, matchMode, idShort, addSme); + } + + public void CopyManySMEbyCopy(Key destSemanticId, + SubmodelElementWrapperCollection sourceSmc, Key sourceSemanticId, + ConceptDescription createDefault = null, Action setDefault = null, + Key.MatchMode matchMode = Key.MatchMode.Relaxed) where T : SubmodelElement, new() + { + // bool find possible sources + bool foundSrc = false; + if (sourceSmc == null) + return; + foreach (var src in sourceSmc.FindAllSemanticIdAs(sourceSemanticId, matchMode)) + { + // type of found src? + var aeSrc = SubmodelElementWrapper.GetAdequateEnum(src?.GetElementName()); + + // ok? + if (src == null || aeSrc == SubmodelElementWrapper.AdequateElementEnum.Unknown) + continue; + foundSrc = true; + + // ok, create new one + var dst = SubmodelElementWrapper.CreateAdequateType(aeSrc, src) as T; + if (dst != null) + { + // make same things sure + dst.idShort = src.idShort; + dst.category = src.category; + dst.semanticId = new SemanticId(destSemanticId); + + // instantanously add it? + this.Add(dst); + } + } + + // default? + if (createDefault != null && !foundSrc) + { + // ok, default + var dflt = this.CreateSMEForCD(createDefault, addSme: true); + + // set default? + setDefault?.Invoke(dflt); + } + } + + public void CopyManySMEbyCopy(ConceptDescription destCD, + SubmodelElementWrapperCollection sourceSmc, ConceptDescription sourceCD, + bool createDefault = false, Action setDefault = null, + Key.MatchMode matchMode = Key.MatchMode.Relaxed) where T : SubmodelElement, new() + { + CopyManySMEbyCopy(destCD.GetSingleKey(), sourceSmc, sourceCD.GetSingleKey(), + createDefault ? destCD : null, setDefault, matchMode); + } + } + + public interface IManageSubmodelElements + { + void Add(SubmodelElement sme); + void Insert(int index, SubmodelElement sme); + void Remove(SubmodelElement sme); + } + + public class Submodel : Identifiable, IManageSubmodelElements, + System.IDisposable, IEnumerateChildren, IFindAllReferences, + IGetSemanticId, IGetQualifiers + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } + + // members + + // do this in order to be IDisposable, that is: suitable for (using) + void System.IDisposable.Dispose() { } + public void GetData() { } + + // from HasKind + [XmlElement(ElementName = "kind")] + [JsonIgnore] + public ModelingKind kind = new ModelingKind(); + [XmlIgnore] + [JsonProperty(PropertyName = "kind")] + public string JsonKind + { + get + { + if (kind == null) + return null; + return kind.kind; + } + set + { + if (kind == null) + kind = new ModelingKind(); + kind.kind = value; + } + } + + // from hasSemanticId: + [XmlElement(ElementName = "semanticId")] + public SemanticId semanticId = new SemanticId(); + public SemanticId GetSemanticId() { return semanticId; } + + // from Qualifiable: + [XmlArray("qualifier")] + [XmlArrayItem("qualifier")] + public QualifierCollection qualifiers = null; + public QualifierCollection GetQualifiers() => qualifiers; + + // from hasDataSpecification: + [XmlElement(ElementName = "embeddedDataSpecification")] + public HasDataSpecification hasDataSpecification = null; + + // from this very class + [XmlIgnore] + [JsonIgnore] + private SubmodelElementWrapperCollection _submodelElements = null; + + [JsonIgnore] + public SubmodelElementWrapperCollection submodelElements + { + get { return _submodelElements; } + set { _submodelElements = value; _submodelElements.Parent = this; } + } + + [XmlIgnore] + [JsonProperty(PropertyName = "submodelElements")] + public SubmodelElement[] JsonSubmodelElements + { + get + { + var res = new ListOfSubmodelElement(); + if (submodelElements != null) + foreach (var smew in submodelElements) + res.Add(smew.submodelElement); + return res.ToArray(); + } + set + { + if (value != null) + { + this.submodelElements = new SubmodelElementWrapperCollection(); + foreach (var x in value) + { + var smew = new SubmodelElementWrapper() { submodelElement = x }; + this.submodelElements.Add(smew); + } + } + } + } + + // getter / setter + + // constructors / creators + + public Submodel() : base() { } + + public Submodel(Submodel src, bool shallowCopy = false) + : base(src) + { + if (src == null) + return; + if (src.hasDataSpecification != null) + this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); + if (src.semanticId != null) + this.semanticId = new SemanticId(src.semanticId); + if (src.kind != null) + this.kind = new ModelingKind(src.kind); + if (!shallowCopy && src.submodelElements != null) + { + if (this.submodelElements == null) + this.submodelElements = new SubmodelElementWrapperCollection(); + foreach (var smw in src.submodelElements) + this.submodelElements.Add(new SubmodelElementWrapper(smw.submodelElement, shallowCopy: false)); + } + } + +#if !DoNotUseAasxCompatibilityModels + public Submodel(AasxCompatibilityModels.AdminShellV10.Submodel src, bool shallowCopy = false) + : base(src) + { + if (src.hasDataSpecification != null) + this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); + if (src.semanticId != null) + this.semanticId = new SemanticId(src.semanticId); + if (src.kind != null) + this.kind = new ModelingKind(src.kind); + if (src.qualifiers != null) + this.qualifiers = new QualifierCollection(src.qualifiers); + if (!shallowCopy && src.submodelElements != null) + { + if (this.submodelElements == null) + this.submodelElements = new SubmodelElementWrapperCollection(); + foreach (var smw in src.submodelElements) + this.submodelElements.Add(new SubmodelElementWrapper(smw.submodelElement, shallowCopy: false)); + } + } +#endif + + public static Submodel CreateNew(string idType, string id, string version = null, string revision = null) + { + var s = new Submodel() { identification = new Identification(idType, id) }; + if (version != null) + { + if (s.administration == null) + s.administration = new Administration(); + s.administration.version = version; + s.administration.revision = revision; + } + return (s); + } + + [JsonIgnore] + [XmlIgnore] + public SubmodelElementWrapperCollection SmeForWrite + { + get + { + if (this.submodelElements == null) + this.submodelElements = new SubmodelElementWrapperCollection(); + return this.submodelElements; + } + } + + // from IEnumarateChildren + public IEnumerable EnumerateChildren() + { + if (this.submodelElements != null) + foreach (var smw in this.submodelElements) + yield return smw; + } + + public EnumerationPlacmentBase GetChildrenPlacement(SubmodelElement child) + { + return null; + } + + public object AddChild(SubmodelElementWrapper smw, EnumerationPlacmentBase placement = null) + { + if (smw == null) + return null; + if (this.submodelElements == null) + this.submodelElements = new SubmodelElementWrapperCollection(); + if (smw.submodelElement != null) + smw.submodelElement.parent = this; + this.submodelElements.Add(smw); + return smw; + } + + // from IManageSubmodelElements + public void Add(SubmodelElement sme) + { + if (submodelElements == null) + submodelElements = new SubmodelElementWrapperCollection(); + var sew = new SubmodelElementWrapper(); + sme.parent = this; // track parent here! + sew.submodelElement = sme; + submodelElements.Add(sew); + } + + public void Insert(int index, SubmodelElement sme) + { + if (submodelElements == null) + submodelElements = new SubmodelElementWrapperCollection(); + var sew = new SubmodelElementWrapper(); + sme.parent = this; // track parent here! + sew.submodelElement = sme; + if (index < 0 || index >= submodelElements.Count) + return; + submodelElements.Insert(index, sew); + } + + public void Remove(SubmodelElement sme) + { + if (submodelElements != null) + submodelElements.Remove(sme); + } + + // further + + public void AddQualifier( + string qualifierType = null, string qualifierValue = null, KeyList semanticKeys = null, + Reference qualifierValueId = null) + { + QualifierCollection.AddQualifier( + ref this.qualifiers, qualifierType, qualifierValue, semanticKeys, qualifierValueId); + } + + public Qualifier HasQualifierOfType(string qualifierType) + { + return QualifierCollection.HasQualifierOfType(this.qualifiers, qualifierType); + } + + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("Submodel", "SM"); + } + + public SubmodelRef GetSubmodelRef() + { + SubmodelRef l = new SubmodelRef(); + l.Keys.Add( + Key.CreateNew( + this.GetElementName(), true, this.identification.idType, this.identification.id)); + return l; + } + + /// + /// If instance, return semanticId as on key. + /// If template, return identification as key. + /// + /// + public Key GetSemanticKey() + { + if (true == this.kind?.IsTemplate) + return new Key(this.GetElementName(), true, this.identification?.idType, this.identification?.id); + else + return this.semanticId?.GetAsExactlyOneKey(); + } + + public void AddDataSpecification(Key k) + { + if (hasDataSpecification == null) + hasDataSpecification = new HasDataSpecification(); + var r = new Reference(); + r.Keys.Add(k); + hasDataSpecification.Add(new EmbeddedDataSpecification(r)); + } + + public SubmodelElementWrapper FindSubmodelElementWrapper(string idShort) + { + if (this.submodelElements == null) + return null; + foreach (var smw in this.submodelElements) + if (smw.submodelElement != null) + if (smw.submodelElement.idShort.Trim().ToLower() == idShort.Trim().ToLower()) + return smw; + return null; + } + + public IEnumerable FindDeep(Predicate match = null) where T : SubmodelElement + { + if (this.submodelElements == null) + yield break; + foreach (var x in this.submodelElements.FindDeep(match)) + yield return x; + } + + public Tuple ToCaptionInfo() + { + var caption = AdminShellUtilV20.EvalToNonNullString("\"{0}\" ", idShort, ""); + if (administration != null) + caption += "V" + administration.version + "." + administration.revision; + var info = ""; + if (identification != null) + info = $"[{identification.idType}, {identification.id}]"; + return Tuple.Create(caption, info); + } + + public override string ToString() + { + var ci = ToCaptionInfo(); + return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); + } + + // Recursing + + /// + /// Recurses on all Submodel elements of a Submodel or SME, which allows children. + /// The state object will be passed to the lambda function in order to provide + /// stateful approaches. + /// + /// State object to be provided to lambda. Could be null. + /// The lambda function as (state, parents, SME) + /// The lambda shall return TRUE in order to deep into recursion. + /// + public void RecurseOnSubmodelElements( + object state, Func lambda) + { + this.submodelElements?.RecurseOnReferables(state, null, (o, par, rf) => + { + if (rf is SubmodelElement sme) + return lambda(o, par, sme); + else + return true; + }); + } + + /// + /// Recurses on all Submodel elements of a Submodel or SME, which allows children. + /// The state object will be passed to the lambda function in order to provide + /// stateful approaches. Include this element, as well. + /// + /// State object to be provided to lambda. Could be null. + /// The lambda function as (state, parents, SME) + /// The lambda shall return TRUE in order to deep into recursion. + /// Include this element as well. parents will then + /// include this element as well! + public override void RecurseOnReferables( + object state, Func lambda, + bool includeThis = false) + { + var parents = new ListOfReferable(); + if (includeThis) + { + lambda(state, null, this); + parents.Add(this); + } + this.submodelElements?.RecurseOnReferables(state, parents, lambda); + } + + // Parents stuff + + public static void SetParentsForSME(Referable parent, SubmodelElement se) + { + if (se == null) + return; + + se.parent = parent; + + // via interface enumaration + if (se is IEnumerateChildren) + { + var childs = (se as IEnumerateChildren).EnumerateChildren(); + if (childs != null) + foreach (var c in childs) + SetParentsForSME(se, c.submodelElement); + } + } + + public void SetAllParents() + { + if (this.submodelElements != null) + foreach (var sme in this.submodelElements) + SetParentsForSME(this, sme.submodelElement); + } + + public T CreateSMEForCD(ConceptDescription cd, string category = null, string idShort = null, + string idxTemplate = null, int maxNum = 999, bool addSme = false) where T : SubmodelElement, new() + { + if (this.submodelElements == null) + this.submodelElements = new SubmodelElementWrapperCollection(); + return this.submodelElements.CreateSMEForCD(cd, category, idShort, idxTemplate, maxNum, addSme); + } + + public T CreateSMEForIdShort(string idShort, string category = null, + string idxTemplate = null, int maxNum = 999, bool addSme = false) where T : SubmodelElement, new() + { + if (this.submodelElements == null) + this.submodelElements = new SubmodelElementWrapperCollection(); + return this.submodelElements.CreateSMEForIdShort(idShort, category, idxTemplate, maxNum, addSme); + } + + // validation + + public override void Validate(AasValidationRecordList results) + { + // access + if (results == null) + return; + + // check + base.Validate(results); + ModelingKind.Validate(results, kind, this); + KeyList.Validate(results, semanticId?.Keys, this); + } + + // find + + public IEnumerable FindAllReferences() + { + // not nice: use temp list + var temp = new List(); + + // recurse + this.RecurseOnSubmodelElements(null, (state, parents, sme) => + { + if (sme is ReferenceElement re) + if (re.value != null) + temp.Add(re.value); + if (sme is RelationshipElement rl) + { + if (rl.first != null) + temp.Add(rl.first); + if (rl.second != null) + temp.Add(rl.second); + } + // recurse + return true; + }); + + // now, give back + foreach (var r in temp) + yield return new LocatedReference(this, r); + } + } + + public class ListOfSubmodels : List, IAasElement + { + // self decscription + + public AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("Submodels", "SMS"); + } + + public string GetElementName() + { + return this.GetSelfDescription()?.ElementName; + } + } + + // + // Derived from SubmodelElements + // + + public class DataElement : SubmodelElement + { + public static string ValueType_STRING = "string"; + public static string ValueType_DATE = "date"; + public static string ValueType_BOOLEAN = "boolean"; + + public static string[] ValueTypeItems = new string[] { + "anyType", "complexType", "anySimpleType", "anyAtomicType", "anyURI", "base64Binary", + "boolean", "date", "dateTime", + "dateTimeStamp", "decimal", "integer", "long", "int", "short", "byte", "nonNegativeInteger", + "positiveInteger", + "unsignedLong", "unsignedInt", "unsignedShort", "unsignedByte", "nonPositiveInteger", + "negativeInteger", "double", "duration", + "dayTimeDuration", "yearMonthDuration", "float", "hexBinary", "string", "langString", "time" }; + + public static string[] ValueTypes_Number = new[] { + "decimal", "integer", "long", "int", "short", "byte", "nonNegativeInteger", + "positiveInteger", + "unsignedLong", "unsignedInt", "unsignedShort", "unsignedByte", "nonPositiveInteger", + "negativeInteger", "double", "float" }; + + public DataElement() { } + + public DataElement(SubmodelElement src) : base(src) { } + + public DataElement(DataElement src) : base(src) { } + +#if !DoNotUseAasxCompatibilityModels + public DataElement(AasxCompatibilityModels.AdminShellV10.DataElement src) + : base(src) + { } +#endif + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("DataElement", "DE"); + } + } + + public class JsonValueTypeCast + { + + public class JsonDataObjectType + { + [JsonProperty(PropertyName = "name")] + public string name = ""; + } + + [JsonProperty(PropertyName = "dataObjectType")] + public JsonDataObjectType dataObjectType = new JsonDataObjectType(); + + public JsonValueTypeCast(string name) + { + this.dataObjectType.name = name; + } + } + + public class Property : DataElement + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public new JsonModelTypeWrapper JsonModelType + { + get { return new JsonModelTypeWrapper(GetElementName()); } + } + + // members + + [MetaModelName("Property.valueType")] + [TextSearchable] + [JsonIgnore] + public string valueType = ""; + [XmlIgnore] + [JsonProperty(PropertyName = "valueType")] + public JsonValueTypeCast JsonValueType + { + get { return new JsonValueTypeCast(this.valueType); } + set { this.valueType = value?.dataObjectType?.name; } + } + + + [MetaModelName("Property.value")] + [TextSearchable] + public string value = ""; + public Reference valueId = null; + + // constructors + + public Property() { } + + public Property(SubmodelElement src) + : base(src) + { + if (!(src is Property p)) + return; + this.valueType = p.valueType; + this.value = p.value; + if (p.valueId != null) + valueId = new Reference(p.valueId); + } + +#if !DoNotUseAasxCompatibilityModels + public Property(AasxCompatibilityModels.AdminShellV10.Property src) + : base(src) + { + if (src == null) + return; + + this.valueType = src.valueType; + this.value = src.value; + if (src.valueId != null) + this.valueId = new Reference(src.valueId); + } +#endif + + public static Property CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) + { + var x = new Property(); + x.CreateNewLogic(idShort, category, semanticIdKey); + return (x); + } + + public Property Set(string valueType = "", string value = "") + { + this.valueType = valueType; + this.value = value; + return this; + } + + public Property Set(string type, bool local, string idType, string value) + { + this.valueId = Reference.CreateNew(Key.CreateNew(type, local, idType, value)); + return this; + } + + public Property Set(Qualifier q) + { + if (q != null) + this.AddQualifier(q); + return this; + } + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("Property", "Prop", + SubmodelElementWrapper.AdequateElementEnum.Property); + } + + public override string ValueAsText(string defaultLang = null) + { + return "" + value; + } + + public override void ValueFromText(string text, string defaultLang = null) + { + value = "" + text; + } + + public bool IsTrue() + { + if (this.valueType?.Trim().ToLower() == "boolean") + { + var v = "" + this.value?.Trim().ToLower(); + if (v == "true" || v == "1") + return true; + } + return false; + } + + public override double? ValueAsDouble() + { + // pointless + if (this.value == null || this.value.Trim() == "" || this.valueType == null) + return null; + + // type? + var vt = this.valueType.Trim().ToLower(); + if (!DataElement.ValueTypes_Number.Contains(vt)) + return null; + + // try convert + if (double.TryParse(this.value, NumberStyles.Any, CultureInfo.InvariantCulture, out double dbl)) + return dbl; + + // no + return null; + } + + } + + public class MultiLanguageProperty : DataElement + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public new JsonModelTypeWrapper JsonModelType + { + get { return new JsonModelTypeWrapper(GetElementName()); } + } + + // members + + public LangStringSet value = new LangStringSet(); + public Reference valueId = null; + + // constructors + + public MultiLanguageProperty() { } + + public MultiLanguageProperty(SubmodelElement src) + : base(src) + { + if (!(src is MultiLanguageProperty mlp)) + return; + + this.value = new LangStringSet(mlp.value); + if (mlp.valueId != null) + valueId = new Reference(mlp.valueId); + } + +#if !DoNotUseAasxCompatibilityModels + // not available in V1.0 +#endif + + public static MultiLanguageProperty CreateNew( + string idShort = null, string category = null, Key semanticIdKey = null) + { + var x = new MultiLanguageProperty(); + x.CreateNewLogic(idShort, category, semanticIdKey); + return (x); + } + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("MultiLanguageProperty", "MLP", + SubmodelElementWrapper.AdequateElementEnum.MultiLanguageProperty); + } + + public MultiLanguageProperty Set(LangStringSet ls) + { + this.value = ls; + return this; + } + + public MultiLanguageProperty Set(ListOfLangStr ls) + { + this.value = new LangStringSet(ls); + return this; + } + + public MultiLanguageProperty Set(LangStr ls) + { + if (ls == null) + return this; + if (this.value?.langString == null) + this.value = new LangStringSet(); + this.value.langString[ls.lang] = ls.str; + return this; + } + + public MultiLanguageProperty Set(string lang, string str) + { + return this.Set(new LangStr(lang, str)); + } + + public override string ValueAsText(string defaultLang = null) + { + return "" + value?.GetDefaultStr(defaultLang); + } + + public override void ValueFromText(string text, string defaultLang = null) + { + Set(defaultLang, text); + } + + } + + public class Range : DataElement + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public new JsonModelTypeWrapper JsonModelType + { + get { return new JsonModelTypeWrapper(GetElementName()); } + } + + // members + + [MetaModelName("Range.valueType")] + [TextSearchable] + [JsonIgnore] + [CountForHash] + public string valueType = ""; + + [XmlIgnore] + [JsonProperty(PropertyName = "valueType")] + public JsonValueTypeCast JsonValueType + { + get { return new JsonValueTypeCast(this.valueType); } + set { this.valueType = value?.dataObjectType?.name; } + } + + [MetaModelName("Range.min")] + [TextSearchable] + [CountForHash] + public string min = ""; + + [MetaModelName("Range.max")] + [TextSearchable] + [CountForHash] + public string max = ""; + + // constructors + + public Range() { } + + public Range(SubmodelElement src) + : base(src) + { + if (!(src is Range rng)) + return; + + this.valueType = rng.valueType; + this.min = rng.min; + this.max = rng.max; + } + +#if !DoNotUseAasxCompatibilityModels + // not available in V1.0 +#endif + + public static Range CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) + { + var x = new Range(); + x.CreateNewLogic(idShort, category, semanticIdKey); + return (x); + } + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("Range", "Range", + SubmodelElementWrapper.AdequateElementEnum.Range); + } + + public override string ValueAsText(string defaultLang = null) + { + return "" + min + " .. " + max; + } + + } + + public class Blob : DataElement + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public new JsonModelTypeWrapper JsonModelType + { + get { return new JsonModelTypeWrapper(GetElementName()); } + } + + // members + + [MetaModelName("Blob.mimeType")] + [TextSearchable] + [CountForHash] + public string mimeType = ""; + + [MetaModelName("Blob.value")] + [TextSearchable] + [CountForHash] + public string value = ""; + + // constructors + + public Blob() { } + + public Blob(SubmodelElement src) + : base(src) + { + if (!(src is Blob blb)) + return; + + this.mimeType = blb.mimeType; + this.value = blb.value; + } + +#if !DoNotUseAasxCompatibilityModels + public Blob(AasxCompatibilityModels.AdminShellV10.Blob src) + : base(src) + { + if (src == null) + return; + + this.mimeType = src.mimeType; + this.value = src.value; + } +#endif + + public static Blob CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) + { + var x = new Blob(); + x.CreateNewLogic(idShort, category, semanticIdKey); + return (x); + } + + public void Set(string mimeType = "", string value = "") + { + this.mimeType = mimeType; + this.value = value; + } + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("Blob", "Blob", + SubmodelElementWrapper.AdequateElementEnum.Blob); + } + + } + + public class File : DataElement + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public new JsonModelTypeWrapper JsonModelType + { + get { return new JsonModelTypeWrapper(GetElementName()); } + } + + // members + + [MetaModelName("File.mimeType")] + [TextSearchable] + [CountForHash] + public string mimeType = ""; + + [MetaModelName("File.value")] + [TextSearchable] + [CountForHash] + public string value = ""; + + // constructors + + public File() { } + + public File(SubmodelElement src) + : base(src) + { + if (!(src is File fil)) + return; + + this.mimeType = fil.mimeType; + this.value = fil.value; + } + +#if !DoNotUseAasxCompatibilityModels + public File(AasxCompatibilityModels.AdminShellV10.File src) + : base(src) + { + if (src == null) + return; + + this.mimeType = src.mimeType; + this.value = src.value; + } +#endif + + public static File CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) + { + var x = new File(); + x.CreateNewLogic(idShort, category, semanticIdKey); + return (x); + } + + public void Set(string mimeType = "", string value = "") + { + this.mimeType = mimeType; + this.value = value; + } + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("File", "File", + SubmodelElementWrapper.AdequateElementEnum.File); + } + + public static string[] GetPopularMimeTypes() + { + return + new[] { + System.Net.Mime.MediaTypeNames.Text.Plain, + System.Net.Mime.MediaTypeNames.Text.Xml, + System.Net.Mime.MediaTypeNames.Text.Html, + "application/json", + "application/rdf+xml", + System.Net.Mime.MediaTypeNames.Application.Pdf, + System.Net.Mime.MediaTypeNames.Image.Jpeg, + "image/png", + System.Net.Mime.MediaTypeNames.Image.Gif, + "application/iges", + "application/step" + }; + } + + public override string ValueAsText(string defaultLang = null) + { + return "" + value; + } + } + + public class ReferenceElement : DataElement + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public new JsonModelTypeWrapper JsonModelType + { + get { return new JsonModelTypeWrapper(GetElementName()); } + } + + // members + + public Reference value = new Reference(); + + // constructors + + public ReferenceElement() { } + + public ReferenceElement(SubmodelElement src) + : base(src) + { + if (!(src is ReferenceElement re)) + return; + + if (re.value != null) + this.value = new Reference(re.value); + } + +#if !DoNotUseAasxCompatibilityModels + public ReferenceElement(AasxCompatibilityModels.AdminShellV10.ReferenceElement src) + : base(src) + { + if (src == null) + return; + + if (src.value != null) + this.value = new Reference(src.value); + } +#endif + + public static ReferenceElement CreateNew( + string idShort = null, string category = null, Key semanticIdKey = null) + { + var x = new ReferenceElement(); + x.CreateNewLogic(idShort, category, semanticIdKey); + return (x); + } + + public void Set(Reference value = null) + { + this.value = value; + } + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("ReferenceElement", "Ref", + SubmodelElementWrapper.AdequateElementEnum.ReferenceElement); + } + + } + + public class RelationshipElement : DataElement + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public new JsonModelTypeWrapper JsonModelType + { + get { return new JsonModelTypeWrapper(GetElementName()); } + } + + // members + + public Reference first = new Reference(); + public Reference second = new Reference(); + + // constructors + + public RelationshipElement() { } + + public RelationshipElement(SubmodelElement src) + : base(src) + { + if (!(src is RelationshipElement rel)) + return; + + if (rel.first != null) + this.first = new Reference(rel.first); + if (rel.second != null) + this.second = new Reference(rel.second); + } + +#if !DoNotUseAasxCompatibilityModels + public RelationshipElement(AasxCompatibilityModels.AdminShellV10.RelationshipElement src) + : base(src) + { + if (src == null) + return; + + if (src.first != null) + this.first = new Reference(src.first); + if (src.second != null) + this.second = new Reference(src.second); + } +#endif + + public static RelationshipElement CreateNew( + string idShort = null, string category = null, Key semanticIdKey = null, Reference first = null, + Reference second = null) + { + var x = new RelationshipElement(); + x.CreateNewLogic(idShort, category, semanticIdKey); + x.first = first; + x.second = second; + return (x); + } + + public void Set(Reference first = null, Reference second = null) + { + this.first = first; + this.second = second; + } + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("RelationshipElement", "Rel", + SubmodelElementWrapper.AdequateElementEnum.RelationshipElement); + } + } + + public class AnnotatedRelationshipElement : RelationshipElement, IManageSubmodelElements, IEnumerateChildren + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public new JsonModelTypeWrapper JsonModelType + { + get { return new JsonModelTypeWrapper(GetElementName()); } + } + + // members + + // from this very class + + [JsonIgnore] + [SkipForHash] // do NOT count children! + [XmlArray("annotations")] + [XmlArrayItem("dataElement")] + public DataElementWrapperCollection annotations = null; + + [XmlIgnore] + [JsonProperty(PropertyName = "annotations")] + public DataElement[] JsonAnotations + { + get + { + var res = new List(); + if (annotations != null) + foreach (var smew in annotations) + if (smew.submodelElement is DataElement de) + res.Add(de); + return res.ToArray(); + } + set + { + if (value != null) + { + this.annotations = new DataElementWrapperCollection(); + foreach (var x in value) + { + var smew = new SubmodelElementWrapper() { submodelElement = x }; + this.annotations.Add(smew); + } + } + } + } + + // constructors + + public AnnotatedRelationshipElement() { } + + public AnnotatedRelationshipElement(SubmodelElement src) + : base(src) + { + if (!(src is AnnotatedRelationshipElement arel)) + return; + if (arel.first != null) + this.first = new Reference(arel.first); + if (arel.second != null) + this.second = new Reference(arel.second); + if (arel.annotations != null) + this.annotations = new DataElementWrapperCollection(arel.annotations); + } + + public new static AnnotatedRelationshipElement CreateNew( + string idShort = null, string category = null, Key semanticIdKey = null, + Reference first = null, Reference second = null) + { + var x = new AnnotatedRelationshipElement(); + x.CreateNewLogic(idShort, category, semanticIdKey); + x.first = first; + x.second = second; + return (x); + } + + // enumerates its children + + public IEnumerable EnumerateChildren() + { + if (this.annotations != null) + foreach (var smw in this.annotations) + yield return smw; + } + + public EnumerationPlacmentBase GetChildrenPlacement(SubmodelElement child) + { + return null; + } + + public object AddChild(SubmodelElementWrapper smw, EnumerationPlacmentBase placement = null) + { + if (smw == null || !(smw.submodelElement is DataElement)) + return null; + if (this.annotations == null) + this.annotations = new DataElementWrapperCollection(); + if (smw.submodelElement != null) + smw.submodelElement.parent = this; + this.annotations.Add(smw); + return smw; + } + + // from IManageSubmodelElements + public void Add(SubmodelElement sme) + { + if (annotations == null) + annotations = new DataElementWrapperCollection(); + var sew = new SubmodelElementWrapper(); + sme.parent = this; // track parent here! + sew.submodelElement = sme; + annotations.Add(sew); + } + + public void Insert(int index, SubmodelElement sme) + { + if (annotations == null) + annotations = new DataElementWrapperCollection(); + var sew = new SubmodelElementWrapper(); + sme.parent = this; // track parent here! + if (index < 0 || index >= annotations.Count) + return; + annotations.Insert(index, sew); + } + + public void Remove(SubmodelElement sme) + { + if (annotations != null) + annotations.Remove(sme); + } + + // further + + public new void Set(Reference first = null, Reference second = null) + { + this.first = first; + this.second = second; + } + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("AnnotatedRelationshipElement", "RelA", + SubmodelElementWrapper.AdequateElementEnum.AnnotatedRelationshipElement); + } + + + } + + public class Capability : SubmodelElement + { + public Capability() { } + + public Capability(SubmodelElement src) + : base(src) + { } + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("Capability", "Cap", + SubmodelElementWrapper.AdequateElementEnum.Capability); + } + } + + + public class SubmodelElementCollection : SubmodelElement, IManageSubmodelElements, IEnumerateChildren + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public new JsonModelTypeWrapper JsonModelType + { + get { return new JsonModelTypeWrapper(GetElementName()); } + } + + // values == SMEs + [XmlIgnore] + [JsonIgnore] + [SkipForHash] // do NOT count children! + private SubmodelElementWrapperCollection _value = null; + + [JsonIgnore] + public SubmodelElementWrapperCollection value + { + get { return _value; } + set { _value = value; _value.Parent = this; } + } + + [XmlIgnore] + [JsonProperty(PropertyName = "value")] + public SubmodelElement[] JsonValue + { + get + { + var res = new ListOfSubmodelElement(); + if (value != null) + foreach (var smew in value) + res.Add(smew.submodelElement); + return res.ToArray(); + } + set + { + if (value != null) + { + this.value = new SubmodelElementWrapperCollection(); + foreach (var x in value) + { + var smew = new SubmodelElementWrapper() { submodelElement = x }; + this.value.Add(smew); + } + } + } + } + + // constant members + public bool ordered = false; + public bool allowDuplicates = false; + + // enumartes its children + + public IEnumerable EnumerateChildren() + { + if (this.value != null) + foreach (var smw in this.value) + yield return smw; + } + + public EnumerationPlacmentBase GetChildrenPlacement(SubmodelElement child) + { + return null; + } + + public object AddChild(SubmodelElementWrapper smw, EnumerationPlacmentBase placement = null) + { + if (smw == null) + return null; + if (this.value == null) + this.value = new SubmodelElementWrapperCollection(); + if (smw.submodelElement != null) + smw.submodelElement.parent = this; + this.value.Add(smw); + return smw; + } + + // constructors + + public SubmodelElementCollection() { } + + public SubmodelElementCollection(SubmodelElement src, bool shallowCopy = false) + : base(src) + { + if (!(src is SubmodelElementCollection smc)) + return; + + this.ordered = smc.ordered; + this.allowDuplicates = smc.allowDuplicates; + this.value = new SubmodelElementWrapperCollection(); + if (!shallowCopy) + foreach (var smw in smc.value) + value.Add(new SubmodelElementWrapper(smw.submodelElement)); + } + +#if !DoNotUseAasxCompatibilityModels + public SubmodelElementCollection( + AasxCompatibilityModels.AdminShellV10.SubmodelElementCollection src, bool shallowCopy = false) + : base(src) + { + if (src == null) + return; + + this.ordered = src.ordered; + this.allowDuplicates = src.allowDuplicates; + this.value = new SubmodelElementWrapperCollection(); + if (!shallowCopy) + foreach (var smw in src.value) + value.Add(new SubmodelElementWrapper(smw.submodelElement)); + } +#endif + + public static SubmodelElementCollection CreateNew( + string idShort = null, string category = null, Key semanticIdKey = null) + { + var x = new SubmodelElementCollection(); + x.CreateNewLogic(idShort, category, semanticIdKey); + return (x); + } + + // from IManageSubmodelElements + public void Add(SubmodelElement sme) + { + if (value == null) + value = new SubmodelElementWrapperCollection(); + var sew = new SubmodelElementWrapper(); + sme.parent = this; // track parent here! + sew.submodelElement = sme; + value.Add(sew); + } + + public void Insert(int index, SubmodelElement sme) + { + if (value == null) + value = new SubmodelElementWrapperCollection(); + var sew = new SubmodelElementWrapper(); + sme.parent = this; // track parent here! + sew.submodelElement = sme; + if (index < 0 || index >= value.Count) + return; + value.Insert(index, sew); + } + + public void Remove(SubmodelElement sme) + { + if (value != null) + value.Remove(sme); + } + + // further + + public void Set(bool allowDuplicates = false, bool ordered = false) + { + this.allowDuplicates = allowDuplicates; + this.ordered = ordered; + } + + public SubmodelElementWrapper FindFirstIdShort(string idShort) + { + return this.value?.FindFirstIdShort(idShort); + } + + public T CreateSMEForCD(ConceptDescription cd, string category = null, string idShort = null, + string idxTemplate = null, int maxNum = 999, bool addSme = false) where T : SubmodelElement, new() + { + if (this.value == null) + this.value = new SubmodelElementWrapperCollection(); + return this.value.CreateSMEForCD(cd, category, idShort, idxTemplate, maxNum, addSme); + } + + public T CreateSMEForIdShort(string idShort, string category = null, + string idxTemplate = null, int maxNum = 999, bool addSme = false) where T : SubmodelElement, new() + { + if (this.value == null) + this.value = new SubmodelElementWrapperCollection(); + return this.value.CreateSMEForIdShort(idShort, category, idxTemplate, maxNum, addSme); + } + + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("SubmodelElementCollection", "SMC", + SubmodelElementWrapper.AdequateElementEnum.SubmodelElementCollection); + } + + // Recursing + + /// + /// Recurses on all Submodel elements of a Submodel or SME, which allows children. + /// The state object will be passed to the lambda function in order to provide + /// stateful approaches. + /// + /// State object to be provided to lambda. Could be null. + /// The lambda function as (state, parents, SME) + /// The lambda shall return TRUE in order to deep into recursion. + /// + public void RecurseOnSubmodelElements( + object state, Func lambda) + { + this.value?.RecurseOnReferables(state, null, (o, par, rf) => + { + if (rf is SubmodelElement sme) + return lambda(o, par, sme); + else + return true; + }); + } + + /// + /// Recurses on all Submodel elements of a Submodel or SME, which allows children. + /// The state object will be passed to the lambda function in order to provide + /// stateful approaches. Include this element, as well. + /// + /// State object to be provided to lambda. Could be null. + /// The lambda function as (state, parents, SME) + /// The lambda shall return TRUE in order to deep into recursion. + /// Include this element as well. parents will then + /// include this element as well! + public override void RecurseOnReferables( + object state, Func lambda, + bool includeThis = false) + { + var parents = new ListOfReferable(); + if (includeThis) + { + lambda(state, null, this); + parents.Add(this); + } + this.value?.RecurseOnReferables(state, parents, lambda); + } + } + + public class OperationVariable : IAasElement + { + public enum Direction { In, Out, InOut }; + + // Note: for OperationVariable, the values of the SubmodelElement itself ARE NOT TO BE USED! + // only the SME attributes of "value" are counting + + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } + + // members + public SubmodelElementWrapper value = null; + + // constructors + + public OperationVariable() + { + } + + public OperationVariable(OperationVariable src, bool shallowCopy = false) + { + this.value = new SubmodelElementWrapper(src?.value?.submodelElement, shallowCopy); + } + +#if !DoNotUseAasxCompatibilityModels + public OperationVariable( + AasxCompatibilityModels.AdminShellV10.OperationVariable src, bool shallowCopy = false) + { + this.value = new SubmodelElementWrapper(src.value.submodelElement, shallowCopy); + } +#endif + + public OperationVariable(SubmodelElement elem) + : base() + { + this.value = new SubmodelElementWrapper(elem); + } + + public AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("OperationVariable", "OprVar"); + } + + public string GetElementName() + { + return this.GetSelfDescription()?.ElementName; + } + } + + public class Operation : SubmodelElement, IEnumerateChildren + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public new JsonModelTypeWrapper JsonModelType + { + get { return new JsonModelTypeWrapper(GetElementName()); } + } + + // members + [JsonIgnore] + [XmlElement(ElementName = "inputVariable")] + [SkipForHash] // do NOT count children! + public List inputVariable = new List(); + + [JsonIgnore] + [XmlElement(ElementName = "outputVariable")] + [SkipForHash] // do NOT count children! + public List outputVariable = new List(); + + [JsonIgnore] + [XmlElement(ElementName = "inoutputVariable")] + [SkipForHash] // do NOT count children! + public List inoutputVariable = new List(); + + [XmlIgnore] + // MICHA 190504: enabled JSON operation variables! + [JsonProperty(PropertyName = "inputVariable")] + public OperationVariable[] JsonInputVariable + { + get { return inputVariable?.ToArray(); } + set { inputVariable = (value != null) ? new List(value) : null; } + } + + [XmlIgnore] + [JsonProperty(PropertyName = "outputVariable")] + // MICHA 190504: enabled JSON operation variables! + public OperationVariable[] JsonOutputVariable + { + get { return outputVariable?.ToArray(); } + set { outputVariable = (value != null) ? new List(value) : null; } + } + + [XmlIgnore] + [JsonProperty(PropertyName = "inoutputVariable")] + // MICHA 190504: enabled JSON operation variables! + public OperationVariable[] JsonInOutputVariable + { + get { return inoutputVariable?.ToArray(); } + set { inoutputVariable = (value != null) ? new List(value) : null; } + } + + public List this[OperationVariable.Direction dir] + { + get + { + if (dir == OperationVariable.Direction.In) + return inputVariable; + else + if (dir == OperationVariable.Direction.Out) + return outputVariable; + else + return inoutputVariable; + } + set + { + if (dir == OperationVariable.Direction.In) + inputVariable = value; + else + if (dir == OperationVariable.Direction.Out) + outputVariable = value; + else + inoutputVariable = value; + } + } + + public List this[int dir] + { + get + { + if (dir == 0) + return inputVariable; + else + if (dir == 1) + return outputVariable; + else + return inoutputVariable; + } + set + { + if (dir == 0) + inputVariable = value; + else + if (dir == 1) + outputVariable = value; + else + inoutputVariable = value; + } + } + + public static SubmodelElementWrapperCollection GetWrappers(List ovl) + { + var res = new SubmodelElementWrapperCollection(); + foreach (var ov in ovl) + if (ov.value != null) + res.Add(ov.value); + return res; + } + + // enumartes its children + public IEnumerable EnumerateChildren() + { + if (this.inputVariable != null) + foreach (var smw in this.inputVariable) + yield return smw?.value; + + if (this.outputVariable != null) + foreach (var smw in this.outputVariable) + yield return smw?.value; + + if (this.inoutputVariable != null) + foreach (var smw in this.inoutputVariable) + yield return smw?.value; + } + + public class EnumerationPlacmentOperationVariable : EnumerationPlacmentBase + { + public OperationVariable.Direction Direction; + public OperationVariable OperationVariable; + } + + public EnumerationPlacmentBase GetChildrenPlacement(SubmodelElement child) + { + // trivial + if (child == null) + return null; + + // search + OperationVariable.Direction? dir = null; + OperationVariable opvar = null; + if (this.inputVariable != null) + foreach (var ov in this.inputVariable) + if (ov?.value?.submodelElement == child) + { + dir = OperationVariable.Direction.In; + opvar = ov; + } + + if (this.outputVariable != null) + foreach (var ov in this.outputVariable) + if (ov?.value?.submodelElement == child) + { + dir = OperationVariable.Direction.Out; + opvar = ov; + } + + if (this.inoutputVariable != null) + foreach (var ov in this.inoutputVariable) + if (ov?.value?.submodelElement == child) + { + dir = OperationVariable.Direction.InOut; + opvar = ov; + } + + // found + if (!dir.HasValue) + return null; + return new EnumerationPlacmentOperationVariable() + { + Direction = dir.Value, + OperationVariable = opvar + }; + } + + public object AddChild(SubmodelElementWrapper smw, EnumerationPlacmentBase placement = null) + { + // not enough information to select list of children? + var pl = placement as EnumerationPlacmentOperationVariable; + if (smw == null || pl == null) + return null; + + // ok, use information + var ov = new OperationVariable(); + ov.value = smw; + + if (smw.submodelElement != null) + smw.submodelElement.parent = this; + + if (pl.Direction == OperationVariable.Direction.In) + { + if (inputVariable == null) + inputVariable = new List(); + inputVariable.Add(ov); + } + + if (pl.Direction == OperationVariable.Direction.Out) + { + if (outputVariable == null) + outputVariable = new List(); + outputVariable.Add(ov); + } + + if (pl.Direction == OperationVariable.Direction.InOut) + { + if (inoutputVariable == null) + inoutputVariable = new List(); + inoutputVariable.Add(ov); + } + + return ov; + } + + // constructors + + public Operation() { } + + public Operation(SubmodelElement src) + : base(src) + { + if (!(src is Operation op)) + return; + + for (int i = 0; i < 2; i++) + if (op[i] != null) + { + if (this[i] == null) + this[i] = new List(); + foreach (var ov in op[i]) + this[i].Add(new OperationVariable(ov)); + } + } + +#if !DoNotUseAasxCompatibilityModels + public Operation(AasxCompatibilityModels.AdminShellV10.Operation src) + : base(src) + { + for (int i = 0; i < 2; i++) + if (src[i] != null) + { + if (this[i] == null) + this[i] = new List(); + foreach (var ov in src[i]) + this[i].Add(new OperationVariable(ov)); + } + } +#endif + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("Operation", "Opr", + SubmodelElementWrapper.AdequateElementEnum.Operation); + } + } + + public class Entity : SubmodelElement, IManageSubmodelElements, IEnumerateChildren + { + public enum EntityTypeEnum { CoManagedEntity = 0, SelfManagedEntity = 1, Undef = 3 } + public static string[] EntityTypeNames = new string[] { "CoManagedEntity", "SelfManagedEntity" }; + + // for JSON only + + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public new JsonModelTypeWrapper JsonModelType + { + get { return new JsonModelTypeWrapper(GetElementName()); } + } + + // from this very class + [XmlIgnore] + [JsonIgnore] + [SkipForHash] // do NOT count children! + private SubmodelElementWrapperCollection _statements = null; + + [JsonIgnore] + public SubmodelElementWrapperCollection statements + { + get { return _statements; } + set { _statements = value; _statements.Parent = this; } + } + + [XmlIgnore] + [JsonProperty(PropertyName = "statements")] + public SubmodelElement[] JsonStatements + { + get + { + var res = new ListOfSubmodelElement(); + if (statements != null) + foreach (var smew in statements) + res.Add(smew.submodelElement); + return res.ToArray(); + } + set + { + if (value != null) + { + this.statements = new SubmodelElementWrapperCollection(); + foreach (var x in value) + { + var smew = new SubmodelElementWrapper() { submodelElement = x }; + this.statements.Add(smew); + } + } + } + } + + // further members + + [CountForHash] + public string entityType = ""; + + [JsonProperty(PropertyName = "asset")] + public AssetRef assetRef = null; + + // enumerates its children + + public IEnumerable EnumerateChildren() + { + if (this.statements != null) + foreach (var smw in this.statements) + yield return smw; + } + + public EnumerationPlacmentBase GetChildrenPlacement(SubmodelElement child) + { + return null; + } + + public object AddChild(SubmodelElementWrapper smw, EnumerationPlacmentBase placement = null) + { + if (smw == null) + return null; + if (this.statements == null) + this.statements = new SubmodelElementWrapperCollection(); + if (smw.submodelElement != null) + smw.submodelElement.parent = this; + this.statements.Add(smw); + return smw; + } + + // constructors + + public Entity() { } + + public Entity(SubmodelElement src) + : base(src) + { + if (!(src is Entity ent)) + return; + + if (ent.statements != null) + { + this.statements = new SubmodelElementWrapperCollection(); + foreach (var smw in ent.statements) + this.statements.Add(new SubmodelElementWrapper(smw.submodelElement)); + } + this.entityType = ent.entityType; + if (ent.assetRef != null) + this.assetRef = new AssetRef(ent.assetRef); + } + + public Entity(EntityTypeEnum entityType, string idShort = null, AssetRef assetRef = null, + string category = null, Key semanticIdKey = null) + { + CreateNewLogic(idShort, null, semanticIdKey); + + this.entityType = EntityTypeNames[(int)entityType]; + this.assetRef = assetRef; + } + +#if !DoNotUseAasxCompatibilityModels + // not available in V1.0 +#endif + + public static Entity CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) + { + var x = new Entity(); + x.CreateNewLogic(idShort, category, semanticIdKey); + return (x); + } + + // from IManageSubmodelElements + public void Add(SubmodelElement sme) + { + if (statements == null) + statements = new SubmodelElementWrapperCollection(); + var sew = new SubmodelElementWrapper(); + sme.parent = this; // track parent here! + sew.submodelElement = sme; + statements.Add(sew); + } + + public void Insert(int index, SubmodelElement sme) + { + if (statements == null) + statements = new SubmodelElementWrapperCollection(); + var sew = new SubmodelElementWrapper(); + sme.parent = this; // track parent here! + sew.submodelElement = sme; + if (index < 0 || index >= statements.Count) + return; + statements.Insert(index, sew); + } + + public void Remove(SubmodelElement sme) + { + if (statements != null) + statements.Remove(sme); + } + + // management of elememts + + public SubmodelElementWrapper FindSubmodelElementWrapper(string idShort) + { + if (this.statements == null) + return null; + foreach (var smw in this.statements) + if (smw.submodelElement != null) + if (smw.submodelElement.idShort.Trim().ToLower() == idShort.Trim().ToLower()) + return smw; + return null; + } + + public T CreateSMEForCD(ConceptDescription cd, string category = null, string idShort = null, + string idxTemplate = null, int maxNum = 999, bool addSme = false) where T : SubmodelElement, new() + { + if (this.statements == null) + this.statements = new SubmodelElementWrapperCollection(); + return this.statements.CreateSMEForCD(cd, category, idShort, idxTemplate, maxNum, addSme); + } + + public T CreateSMEForIdShort(string idShort, string category = null, + string idxTemplate = null, int maxNum = 999, bool addSme = false) where T : SubmodelElement, new() + { + if (this.statements == null) + this.statements = new SubmodelElementWrapperCollection(); + return this.statements.CreateSMEForIdShort(idShort, category, idxTemplate, maxNum, addSme); + } + + // entity type + + public EntityTypeEnum GetEntityType() + { + EntityTypeEnum res = EntityTypeEnum.Undef; + if (this.entityType != null && this.entityType.Trim().ToLower() == EntityTypeNames[0].ToLower()) + res = EntityTypeEnum.CoManagedEntity; + if (this.entityType != null && this.entityType.Trim().ToLower() == EntityTypeNames[1].ToLower()) + res = EntityTypeEnum.SelfManagedEntity; + return res; + } + + // name + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("Entity", "Ent", + SubmodelElementWrapper.AdequateElementEnum.Entity); + } + } + + public class BasicEvent : SubmodelElement + { + // for JSON only + [XmlIgnore] + [JsonProperty(PropertyName = "modelType")] + public new JsonModelTypeWrapper JsonModelType + { + get { return new JsonModelTypeWrapper(GetElementName()); } + } + + // from this very class + public Reference observed = new Reference(); + + // constructors + + public BasicEvent() { } + + public BasicEvent(SubmodelElement src) + : base(src) + { + if (!(src is BasicEvent be)) + return; + + if (be.observed != null) + this.observed = new Reference(be.observed); + } + +#if !DoNotUseAasxCompatibilityModels + // not available in V1.0 +#endif + + public static BasicEvent CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) + { + var x = new BasicEvent(); + x.CreateNewLogic(idShort, category, semanticIdKey); + return (x); + } + + public override AasElementSelfDescription GetSelfDescription() + { + return new AasElementSelfDescription("BasicEvent", "Evt", + SubmodelElementWrapper.AdequateElementEnum.BasicEvent); + } + } + + // + // Handling of packages + // + } + + #endregion +} + diff --git a/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellConverters.cs b/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellConverters.cs new file mode 100644 index 000000000..ce541f0c0 --- /dev/null +++ b/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellConverters.cs @@ -0,0 +1,170 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ + +using System; +using System.Reflection; +using AasxCompatibilityModels; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Newtonsoft.Json.Serialization; + +//namespace AdminShellNS +namespace AdminShell_V20 +{ + public static class AdminShellConverters + { + /// + /// This converter is used for reading JSON files; it claims to be responsible for + /// "Referable" (the base class) + /// and decides, which sub-class of the base class shall be populated. + /// If the object is SubmodelElement, the decision, shich special sub-class to create is done in a factory + /// AdminShell.SubmodelElementWrapper.CreateAdequateType(), + /// in order to have all sub-class specific decisions in one place (SubmodelElementWrapper) + /// Remark: There is a NuGet package JsonSubTypes, which could have done the job, except the fact of having + /// "modelType" being a class property with a contained property "name". + /// + public class JsonAasxConverter : JsonConverter + { + private string UpperClassProperty = "modelType"; + private string LowerClassProperty = "name"; + + public JsonAasxConverter() : base() + { + } + + public JsonAasxConverter(string UpperClassProperty, string LowerClassProperty) : base() + { + this.UpperClassProperty = UpperClassProperty; + this.LowerClassProperty = LowerClassProperty; + } + + public override bool CanConvert(Type objectType) + { + // Info MIHO 21 APR 2020: changed this from SubmodelElement to Referable + if (typeof(AdminShell.Referable).IsAssignableFrom(objectType)) + return true; + return false; + } + + public override bool CanWrite + { + get { return false; } + } + + public override object ReadJson(JsonReader reader, + Type objectType, + object existingValue, + JsonSerializer serializer) + { + // Load JObject from stream + JObject jObject = JObject.Load(reader); + + // Create target object based on JObject + object target = new AdminShell.Referable(); + + if (jObject.ContainsKey(UpperClassProperty)) + { + var j2 = jObject[UpperClassProperty]; + if (j2 != null) + foreach (var c in j2.Children()) + { + var cprop = c as Newtonsoft.Json.Linq.JProperty; + if (cprop == null) + continue; + if (cprop.Name == LowerClassProperty && cprop.Value.Type.ToString() == "String") + { + var cpval = cprop.Value.ToObject(); + if (cpval == null) + continue; + // Info MIHO 21 APR 2020: use Referable.CreateAdequateType instead of SMW... + var o = AdminShell.Referable.CreateAdequateType(cpval); + if (o != null) + target = o; + } + } + } + + // Populate the object properties + serializer.Populate(jObject.CreateReader(), target); + + return target; + } + + /// + /// Introduced for JSON serialization, can create Referables based on a string name + /// + /// string name (standard PascalCased) + + + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + throw new NotImplementedException(); + } + } + + /// + /// This converter / contract resolver for Json.NET adaptively filters different levels of depth + /// of nested AASX structures. + /// + public class AdaptiveFilterContractResolver : DefaultContractResolver + { + public bool AasHasViews = true; + public bool BlobHasValue = true; + public bool SubmodelHasElements = true; + public bool SmcHasValue = true; + public bool OpHasVariables = true; + + public AdaptiveFilterContractResolver() { } + + public AdaptiveFilterContractResolver(bool deep = true, bool complete = true) + { + if (!deep) + { + this.SubmodelHasElements = false; + this.SmcHasValue = false; + this.OpHasVariables = false; + } + if (!complete) + { + this.AasHasViews = false; + this.BlobHasValue = false; + } + + } + + protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) + { + JsonProperty property = base.CreateProperty(member, memberSerialization); + + if (!BlobHasValue && property.DeclaringType == typeof(AdminShell.Blob) && + property.PropertyName == "value") + property.ShouldSerialize = instance => { return false; }; + + if (!SubmodelHasElements && property.DeclaringType == typeof(AdminShell.Submodel) && + property.PropertyName == "submodelElements") + property.ShouldSerialize = instance => { return false; }; + + if (!SmcHasValue && property.DeclaringType == typeof(AdminShell.SubmodelElementCollection) && + property.PropertyName == "value") + property.ShouldSerialize = instance => { return false; }; + + if (!OpHasVariables && property.DeclaringType == typeof(AdminShell.Operation) && + (property.PropertyName == "in" || property.PropertyName == "out")) + property.ShouldSerialize = instance => { return false; }; + + if (!AasHasViews && property.DeclaringType == typeof(AdminShell.AdministrationShell) && + property.PropertyName == "views") + property.ShouldSerialize = instance => { return false; }; + + return property; + } + } + + } +} diff --git a/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellUtil.cs b/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellUtil.cs new file mode 100644 index 000000000..1452421de --- /dev/null +++ b/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellUtil.cs @@ -0,0 +1,633 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ + +using AasxCompatibilityModels; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text.RegularExpressions; + +//namespace AdminShellNS +namespace AdminShell_V20 +{ + public static class AdminShellUtilV20 + { + public static string EvalToNonNullString(string fmt, object o, string elseString = "") + { + if (o == null) + return elseString; + return string.Format(fmt, o); + } + + public static string EvalToNonEmptyString(string fmt, string o, string elseString = "") + { + if (o == null || o == "") + return elseString; + return string.Format(fmt, o); + } + + /// Creates a filter-friendly name from the source. + /// + /// Assert.AreEqual("", AdminShellUtil.FilterFriendlyName("")); + /// Assert.AreEqual("someName", AdminShellUtil.FilterFriendlyName("someName")); + /// Assert.AreEqual("some__name", AdminShellUtil.FilterFriendlyName("some!;name")); + /// + public static string FilterFriendlyName(string src) + { + if (src == null) + return null; + return Regex.Replace(src, @"[^a-zA-Z0-9\-_]", "_"); + } + + /// + /// Assert.IsFalse(AdminShellUtil.HasWhitespace("")); + /// Assert.IsTrue(AdminShellUtil.HasWhitespace(" ")); + /// Assert.IsTrue(AdminShellUtil.HasWhitespace("aa bb")); + /// Assert.IsTrue(AdminShellUtil.HasWhitespace(" aabb")); + /// Assert.IsTrue(AdminShellUtil.HasWhitespace("aabb ")); + /// Assert.IsFalse(AdminShellUtil.HasWhitespace("aabb")); + /// + public static bool HasWhitespace(string src) + { + if (src == null) + throw new ArgumentNullException(nameof(src)); + foreach (var s in src) + if (char.IsWhiteSpace(s)) + return true; + return false; + } + + /// Assert.IsTrue(AdminShellUtil.ComplyIdShort("")); + public static bool ComplyIdShort(string src) + { + if (src == null) + throw new ArgumentNullException(nameof(src)); + var res = true; + foreach (var s in src) + if (!Char.IsLetterOrDigit(s) && s != '_') + res = false; + if (src.Length > 0 && !Char.IsLetter(src[0])) + res = false; + return res; + } + + public static string ByteSizeHumanReadable(long len) + { + // see: https://stackoverflow.com/questions/281640/ + // how-do-i-get-a-human-readable-file-size-in-bytes-abbreviation-using-net + string[] sizes = { "B", "KB", "MB", "GB", "TB" }; + int order = 0; + while (len >= 1024 && order < sizes.Length - 1) + { + order++; + len = len / 1024; + } + // Adjust the format string to your preferences. For example "{0:0.#}{1}" would + // show a single decimal place, and no space. + string res = String.Format("{0:0.##} {1}", len, sizes[order]); + return res; + } + + public static string ExtractPascalCasingLetters(string src) + { + // access + src = src?.Trim(); + if (src == null || src.Length < 1) + return null; + + // walk through + var res = ""; + var arm = true; + foreach (var c in src) + { + // take? + if (arm && Char.IsUpper(c)) + res += c; + // state for next iteration + arm = !Char.IsUpper(c); + } + + // result + return res; + } + + public static int CountHeadingSpaces(string line) + { + if (line == null) + return 0; + int j; + for (j = 0; j < line.Length; j++) + if (!Char.IsWhiteSpace(line[j])) + break; + return j; + } + + /// + /// Used to re-reformat a C# here string, which is multiline string introduced by @" ... "; + /// + public static string[] CleanHereStringToArray(string here) + { + if (here == null) + return null; + + // convert all weird breaks to pure new lines + here = here.Replace("\r\n", "\n"); + here = here.Replace("\n\r", "\n"); + + // convert all tabs to spaces + here = here.Replace("\t", " "); + + // split these + var lines = new List(here.Split('\n')); + if (lines.Count < 1) + return lines.ToArray(); + + // the first line could be special + string firstLine = null; + if (lines[0].Trim() != "") + { + firstLine = lines[0].Trim(); + lines.RemoveAt(0); + } + + // detect an constant amount of heading spaces + var headSpaces = int.MaxValue; + foreach (var line in lines) + if (line.Trim() != "") + headSpaces = Math.Min(headSpaces, CountHeadingSpaces(line)); + + // multi line trim possible? + if (headSpaces != int.MaxValue && headSpaces > 0) + for (int i = 0; i < lines.Count; i++) + if (lines[i].Length > headSpaces) + lines[i] = lines[i].Substring(headSpaces); + + // re-compose again + if (firstLine != null) + lines.Insert(0, firstLine); + + // return + return lines.ToArray(); + } + + /// + /// Used to re-reformat a C# here string, which is multiline string introduced by @" ... "; + /// + public static string CleanHereStringWithNewlines(string here, string nl = null) + { + if (nl == null) + nl = System.Environment.NewLine; + var lines = CleanHereStringToArray(here); + if (lines == null) + return null; + return String.Join(nl, lines); + } + + public static string ShortLocation(Exception ex) + { + if (ex == null || ex.StackTrace == null) + return ""; + string[] lines = ex.StackTrace.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None); + if (lines.Length < 1) + return ""; + // search for " in " + // as the most actual stacktrace might be a built-in function, this might not work and therefore + // go down in the stack + int currLine = 0; + while (true) + { + // nothing found at all + if (currLine >= lines.Length) + return ""; + // access current line + /* TODO (MIHO, 2020-11-12): replace with Regex for multi language. Ideally have Exception messages + always as English. */ + var p = lines[currLine].IndexOf(" in ", StringComparison.Ordinal); + if (p < 0) + p = lines[currLine].IndexOf(" bei ", StringComparison.Ordinal); + if (p < 0) + { + // advance to next oldest line + currLine++; + continue; + } + // search last "\" or "/", to get only filename portion and position + p = lines[currLine].LastIndexOfAny(new[] { '\\', '/' }); + if (p < 0) + { + // advance to next oldest line + currLine++; + continue; + } + // return this + return lines[currLine].Substring(p); + } + } + + public enum ConstantFoundEnum { No, AnyCase, ExactCase } + + public static ConstantFoundEnum CheckIfInConstantStringArray(string[] arr, string str) + { + if (arr == null || str == null) + return ConstantFoundEnum.No; + + bool anyCaseFound = false; + bool exactCaseFound = false; + foreach (var a in arr) + { + anyCaseFound = anyCaseFound || str.ToLower() == a.ToLower(); + exactCaseFound = exactCaseFound || str == a; + } + if (exactCaseFound) + return ConstantFoundEnum.ExactCase; + if (anyCaseFound) + return ConstantFoundEnum.AnyCase; + return ConstantFoundEnum.No; + } + + public static string CorrectCasingForConstantStringArray(string[] arr, string str) + { + if (arr == null || str == null) + return str; + + foreach (var a in arr) + if (str.ToLower() == a.ToLower()) + return a; + + return str; + } + + // + // + // + // + // + + public static void PrintSearchableProperties(object obj, int indent) + { + if (obj == null) return; + string indentString = new string(' ', indent); + Type objType = obj.GetType(); + PropertyInfo[] properties = objType.GetProperties(); + foreach (PropertyInfo property in properties) + { + object propValue = property.GetValue(obj, null); + var elems = propValue as IList; + if (elems != null) + { + foreach (var item in elems) + { + PrintSearchableProperties(item, indent + 3); + } + } + else + { + // This will not cut-off System.Collections because of the first check + if (property.PropertyType.Assembly == objType.Assembly) + { + Console.WriteLine("{0}{1}:", indentString, property.Name); + + PrintSearchableProperties(propValue, indent + 2); + } + else + { + Console.WriteLine("{0}{1}: {2}", indentString, property.Name, propValue); + } + } + } + } + + public class SearchOptions + { + public Assembly[] allowedAssemblies = null; + public int maxDepth = int.MaxValue; + public bool findFirst = false; + public int skipFirstResults = 0; + public string findText = null; + public bool isIgnoreCase = false; + public bool isRegex = false; + } + + public class SearchResultItem : IEquatable + { + public SearchOptions searchOptions; + public string qualifiedNameHead; + public string metaModelName; + public object businessObject; + public string foundText; + public object foundObject; + public object containingObject; + public int foundHash; + + public bool Equals(SearchResultItem other) + { + if (other == null) + return false; + + return this.qualifiedNameHead == other.qualifiedNameHead && + this.metaModelName == other.metaModelName && + this.businessObject == other.businessObject && + this.containingObject == other.containingObject && + this.foundText == other.foundText && + this.foundHash == other.foundHash; + } + } + + public class SearchResults + { + public int foundIndex = 0; + public List foundResults = new List(); + + public void Clear() + { + foundIndex = -1; + foundResults.Clear(); + } + } + + public static void CheckSearchable( + SearchResults results, SearchOptions options, string qualifiedNameHead, object businessObject, + MemberInfo mi, object memberValue, object containingObject, Func getMemberHash) + { + // try get a speaking name + var metaModelName = ""; + var x1 = mi.GetCustomAttribute(); + if (x1 != null && x1.name != null) + metaModelName = x1.name; + + // check if this object is searchable + var x2 = mi.GetCustomAttribute(); + if (x2 != null) + { + // what to check? + string foundText = "" + memberValue?.ToString(); + + // find options + var found = true; + if (options.findText != null) + found = foundText.IndexOf( + options.findText, options.isIgnoreCase ? StringComparison.CurrentCultureIgnoreCase : 0) >= 0; + + // add? + if (found) + { + var sri = new SearchResultItem(); + sri.searchOptions = options; + sri.qualifiedNameHead = qualifiedNameHead; + sri.metaModelName = metaModelName; + sri.businessObject = businessObject; + sri.foundText = foundText; + sri.foundObject = memberValue; + sri.containingObject = containingObject; + if (getMemberHash != null) + sri.foundHash = getMemberHash(); + + // avoid duplicates + if (!results.foundResults.Contains(sri)) + results.foundResults.Add(sri); + } + } + } + + public static void EnumerateSearchable( + SearchResults results, object obj, string qualifiedNameHead, int depth, SearchOptions options, + object businessObject = null) + { + // access + if (results == null || obj == null || options == null) + return; + Type objType = obj.GetType(); + + // depth + if (depth > options.maxDepth) + return; + + // try to get element name of an AAS entity + string elName = null; + if (obj is AdminShell.Referable) + { + elName = (obj as AdminShell.Referable).GetElementName(); + businessObject = obj; + } + + // enrich qualified name, accordingly + var qualifiedName = qualifiedNameHead; + if (elName != null) + qualifiedName = qualifiedName + (qualifiedName.Length > 0 ? "." : "") + elName; + + // do NOT dive into objects, which are not in the reight assembly + if (options.allowedAssemblies == null || !options.allowedAssemblies.Contains(objType.Assembly)) + return; + + // do not dive into enums + if (objType.IsEnum) + return; + + // look at fields, first + var fields = objType.GetFields(); + foreach (var fi in fields) + { + // is the object marked to be skipped? + var x3 = fi.GetCustomAttribute(); + if (x3 != null) + continue; + + var x4 = fi.GetCustomAttribute(); + if (x4 != null) + continue; + + // get value(s) + var fieldValue = fi.GetValue(obj); + if (fieldValue == null) + continue; + var valueElems = fieldValue as IList; + if (valueElems != null) + { + // field is a collection .. dive deeper, if allowed + foreach (var el in valueElems) + EnumerateSearchable(results, el, qualifiedName, depth + 1, options, businessObject); + } + else + { + // field is a single entity .. check it + CheckSearchable( + results, options, qualifiedName, businessObject, fi, fieldValue, obj, + () => { return fieldValue.GetHashCode(); }); + + // dive deeper .. + EnumerateSearchable(results, fieldValue, qualifiedName, depth + 1, options, businessObject); + } + } + + // properties & objects behind + var properties = objType.GetProperties(); + foreach (var pi in properties) + { + var gip = pi.GetIndexParameters(); + if (gip.Length > 0) + // no indexed properties, yet + continue; + + // is the object marked to be skipped? + var x3 = pi.GetCustomAttribute(); + if (x3 != null) + continue; + + var x4 = pi.GetCustomAttribute(); + if (x4 != null) + continue; + + // get value(s) + var propValue = pi.GetValue(obj, null); + if (propValue == null) + continue; + var valueElems = propValue as IList; + if (valueElems != null) + { + // property is a collection .. dive deeper, if allowed + foreach (var el in valueElems) + EnumerateSearchable(results, el, qualifiedName, depth + 1, options, businessObject); + } + else + { + // field is a single entity .. check it + CheckSearchable( + results, options, qualifiedName, businessObject, pi, propValue, obj, + () => { return propValue.GetHashCode(); }); + + // dive deeper .. + EnumerateSearchable(results, propValue, qualifiedName, depth + 1, options, businessObject); + } + } + } + + // + // String manipulations + // + + public static string ReplacePercentPlaceholder( + string input, + string searchFor, + Func substLamda, + StringComparison comparisonType = StringComparison.InvariantCulture) + { + // access + if (input == null || searchFor == null || searchFor == "") + return input; + + // find + while (true) + { + // any occurence + var p = input.IndexOf(searchFor, comparisonType); + if (p < 0) + break; + + // split + var left = input.Substring(0, p); + var right = ""; + var rp = p + searchFor.Length; + if (rp < input.Length) + right = input.Substring(rp); + + // lambda + var repl = "" + substLamda?.Invoke(); + + // build new + input = left + repl + right; + } + + // ok + return input; + } + + // + // Base 64 + // + + public static string Base64Encode(string plainText) + { + var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText); + return System.Convert.ToBase64String(plainTextBytes); + } + + public static string Base64Decode(string base64EncodedData) + { + var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData); + return System.Text.Encoding.UTF8.GetString(base64EncodedBytes); + } + + // + // Generation of Ids + // + + private static Random MyRnd = new Random(); + + public static string GenerateIdAccordingTemplate(string tpl) + { + // generate a deterministic decimal digit string + var decimals = String.Format("{0:ffffyyMMddHHmmss}", DateTime.UtcNow); + decimals = new string(decimals.Reverse().ToArray()); + // convert this to an int + if (!Int64.TryParse(decimals, out Int64 decii)) + decii = MyRnd.Next(Int32.MaxValue); + // make an hex out of this + string hexamals = decii.ToString("X"); + // make an alphanumeric string out of this + string alphamals = ""; + var dii = decii; + while (dii >= 1) + { + var m = dii % 26; + alphamals += Convert.ToChar(65 + m); + dii = dii / 26; + } + + // now, "salt" the strings + for (int i = 0; i < 32; i++) + { + var c = Convert.ToChar(48 + MyRnd.Next(10)); + decimals += c; + hexamals += c; + alphamals += c; + } + + // now, can just use the template + var id = ""; + foreach (var tpli in tpl) + { + if (tpli == 'D' && decimals.Length > 0) + { + id += decimals[0]; + decimals = decimals.Remove(0, 1); + } + else + if (tpli == 'X' && hexamals.Length > 0) + { + id += hexamals[0]; + hexamals = hexamals.Remove(0, 1); + } + else + if (tpli == 'A' && alphamals.Length > 0) + { + id += alphamals[0]; + alphamals = alphamals.Remove(0, 1); + } + else + id += tpli; + } + + // ok + return id; + } + + } +} diff --git a/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellValidate.cs b/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellValidate.cs new file mode 100644 index 000000000..1119c235e --- /dev/null +++ b/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellValidate.cs @@ -0,0 +1,320 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ + +using JetBrains.Annotations; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text.RegularExpressions; +using System.Xml; +using System.Xml.Schema; + +//namespace AdminShellNS +namespace AdminShell_V20 +{ + /// + /// validates the XML content against the AASX XML schema. + /// + /// Please produce instances with . + /// + public class XmlValidator + { + private System.Xml.Schema.XmlSchemaSet xmlSchemaSet; + + internal XmlValidator(XmlSchemaSet xmlSchemaSet) + { + this.xmlSchemaSet = xmlSchemaSet; + } + + /// + /// validates the given XML content and stores the results in the . + /// + /// Validation records + /// Content to be validated + public void Validate(AasValidationRecordList recs, Stream xmlContent) + { + if (recs == null) + throw new ArgumentException($"Unexpected null {nameof(recs)}"); + + if (xmlContent == null) + throw new ArgumentException($"Unexpected null {nameof(xmlContent)}"); + + // load/ validate on same records + var settings = new System.Xml.XmlReaderSettings(); + settings.ValidationType = System.Xml.ValidationType.Schema; + settings.Schemas = xmlSchemaSet; + + settings.ValidationEventHandler += + (object sender, System.Xml.Schema.ValidationEventArgs e) => + { + recs.Add( + new AasValidationRecord( + AasValidationSeverity.Serialization, null, + $"XML: {e?.Exception?.LineNumber}, {e?.Exception?.LinePosition}: {e?.Message}")); + }; + + // use the xml stream + using (var reader = System.Xml.XmlReader.Create(xmlContent, settings)) + { + while (reader.Read()) + { + // Invoke callbacks + }; + } + } + } + + public enum AasValidationSeverity + { + Hint, Warning, SpecViolation, SchemaViolation, Serialization + } + + [UsedImplicitlyAttribute] // for eventual use + public enum AasValidationAction + { + No, ToBeDeleted + } + + public class AasValidationRecord + { + public AasValidationSeverity Severity = AasValidationSeverity.Hint; + public AasxCompatibilityModels.AdminShellV20.Referable Source = null; + public string Message = ""; + + public Action Fix = null; + + public AasValidationRecord(AasValidationSeverity Severity, AasxCompatibilityModels.AdminShellV20.Referable Source, + string Message, Action Fix = null) + { + this.Severity = Severity; + this.Source = Source; + this.Message = Message; + this.Fix = Fix; + } + + public override string ToString() + { + return $"[{Severity.ToString()}] in {"" + Source?.ToString()}: {"" + Message}"; + } + + public string DisplaySeverity { get { return "" + Severity.ToString(); } } + public string DisplaySource + { + get + { + return "" + ((Source != null) ? Source.ToString() : "(whole content)"); + } + } + public string DisplayMessage { get { return "" + Message?.ToString(); } } + } + + public class AasValidationRecordList : List + { + } + + public static class AasSchemaValidation + { + public enum SerializationFormat { XML, JSON } + + public static string[] GetSchemaResources(SerializationFormat fmt) + { + if (fmt == SerializationFormat.XML) + { + return new[] + { + "AdminShellNS.Resources.schemaV201.AAS.xsd", + "AdminShellNS.Resources.schemaV201.AAS_ABAC.xsd", + "AdminShellNS.Resources.schemaV201.IEC61360.xsd" + }; + } + if (fmt == SerializationFormat.JSON) + { + return new[] + { + "AdminShellNS.Resources.schemaV201.aas.json" + }; + } + return null; + } + + /// + /// produces a validator which validates XML AASX files. + /// + /// initialized validator + public static XmlValidator NewXmlValidator() + { + // Load the schema files + var files = GetSchemaResources(SerializationFormat.XML); + if (files == null) + throw new InvalidOperationException("No XML schema files could be found in the resources."); + + var xmlSchemaSet = new System.Xml.Schema.XmlSchemaSet(); + xmlSchemaSet.XmlResolver = new System.Xml.XmlUrlResolver(); + + try + { + Assembly myAssembly = Assembly.GetExecutingAssembly(); + foreach (var schemaFn in files) + { + using (Stream schemaStream = myAssembly.GetManifestResourceStream(schemaFn)) + { + using (XmlReader schemaReader = XmlReader.Create(schemaStream)) + { + xmlSchemaSet.Add(null, schemaReader); + } + } + } + } + catch (Exception ex) + { + throw new FileNotFoundException( + $"Error accessing embedded resource schema files: {ex.Message}"); + } + + var newRecs = new AasValidationRecordList(); + + // set up messages + xmlSchemaSet.ValidationEventHandler += (object sender, System.Xml.Schema.ValidationEventArgs e) => + { + newRecs.Add( + new AasValidationRecord( + AasValidationSeverity.Serialization, null, + $"{e?.Exception?.LineNumber}, {e?.Exception?.LinePosition}: {e?.Message}")); + }; + + // compile + try + { + xmlSchemaSet.Compile(); + } + catch (Exception ex) + { + throw new InvalidOperationException( + $"Error compiling schema files: {ex.Message}"); + } + + if (newRecs.Count > 0) + { + var parts = new List { $"Failed to compile the schema files:" }; + parts.AddRange(newRecs.Select((r) => r.Message)); + throw new InvalidOperationException(string.Join(System.Environment.NewLine, parts)); + } + + return new XmlValidator(xmlSchemaSet); + } + + /// + /// creates an XML validator and applies it on the given content. + /// + /// If you repeatedly need to validate XML against a schema, re-use an instance of + /// produced with . + /// + /// Validation records + /// Content to be validated + public static void ValidateXML(AasValidationRecordList recs, Stream xmlContent) + { + var validator = NewXmlValidator(); + validator.Validate(recs, xmlContent); + } + + public static int ValidateJSONAlternative(AasValidationRecordList recs, Stream jsonContent) + { + // see: https://github.com/RicoSuter/NJsonSchema/wiki/JsonSchemaValidator + var newRecs = new AasValidationRecordList(); + + // access + if (recs == null || jsonContent == null) + return -1; + + // Load the schema files + // right now: exactly ONE schema file + var files = GetSchemaResources(SerializationFormat.JSON); + if (files == null || files.Length != 1) + return -1; + + NJsonSchema.JsonSchema schema = null; + + try + { + Assembly myAssembly = Assembly.GetExecutingAssembly(); + foreach (var schemaFn in files) + { + using (Stream schemaStream = myAssembly.GetManifestResourceStream(schemaFn)) + { + using (var streamReader = new StreamReader(schemaStream)) + { + var allTxt = streamReader.ReadToEnd(); + schema = NJsonSchema.JsonSchema.FromJsonAsync(allTxt).GetAwaiter().GetResult(); + break; + } + } + } + } + catch (Exception ex) + { + throw new FileNotFoundException("ValidateJSON: Error loading schema: " + + ex.Message); + } + + if (schema == null) + { + throw new FileNotFoundException("ValidateJSON: Schema not found properly."); + } + + // create validator + var validator = new NJsonSchema.Validation.JsonSchemaValidator(); + + // load the JSON content + string jsonTxt = null; + try + { + using (var streamReader = new StreamReader(jsonContent)) + { + jsonTxt = streamReader.ReadToEnd(); + } + } + catch (Exception ex) + { + throw new InvalidOperationException("ValidateJSON: Error loading JSON content: " + + ex.Message); + } + + if (jsonTxt == null || jsonTxt == "") + throw new InvalidOperationException("ValidateJSON: Error loading JSON content gave null."); + + // validate + ICollection errors; + try + { + errors = validator.Validate(jsonTxt, schema); + } + catch (Exception ex) + { + throw new InvalidOperationException("ValidateJSON: Error when validating: " + + ex.Message); + } + + // re-format messages + if (errors != null) + foreach (var ve in errors) + { + var msg = ("" + ve.ToString()); + msg = Regex.Replace(msg, @"\s+", " "); + newRecs.Add(new AasValidationRecord(AasValidationSeverity.Serialization, null, + $"JSON: {ve.LineNumber,5},{ve.LinePosition:3}: {msg}")); + } + + // result + recs.AddRange(newRecs); + return newRecs.Count; + } + } +} diff --git a/src/AasxCsharpLibrary/AasxCsharpLibrary.csproj b/src/AasxCsharpLibrary/AasxCsharpLibrary.csproj new file mode 100644 index 000000000..e195fc0ba --- /dev/null +++ b/src/AasxCsharpLibrary/AasxCsharpLibrary.csproj @@ -0,0 +1,43 @@ + + + net6.0 + Library + AdminShellNS + false + + + TRACE;UseAasxCompatibilityModels + + + + + + + PreserveNewest + + + + + Designer + PreserveNewest + + + Designer + PreserveNewest + + + Designer + PreserveNewest + + + + + + + + + + + + + diff --git a/src/AasxCsharpLibrary/AdminShellCollections.cs b/src/AasxCsharpLibrary/AdminShellCollections.cs new file mode 100644 index 000000000..32e6774ab --- /dev/null +++ b/src/AasxCsharpLibrary/AdminShellCollections.cs @@ -0,0 +1,92 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ + +using System.Collections.Generic; + +namespace AdminShellNS +{ + /// + /// Just add some convenience methods to Dictionary + /// Note: Not an extension class in order to not interfere with really + /// commonly used standard class. + /// + public class ConvenientDictionary : Dictionary + { + public V GetValueOrDefault(K key) + { + if (key != null && this.ContainsKey(key)) + return this[key]; + return default(V); + } + } + + public class MultiValueDictionary + { + private Dictionary> dict = new Dictionary>(); + public void Add(K key, V value) + { + if (dict.TryGetValue(key, out var list)) + list.Add(value); + else + dict.Add(key, new List { value }); + } + + public bool ContainsKey(K key) => dict.ContainsKey(key); + + public List this[K key] => dict[key]; + + public IEnumerable> Keys + { + get + { + return dict.Values; + } + } + } + + public class DoubleSidedDict + { + private Dictionary _forward = new Dictionary(); + private Dictionary _backward = new Dictionary(); + + public void AddPair(T1 item1, T2 item2) + { + _forward.Add(item1, item2); + _backward.Add(item2, item1); + } + + public bool Contains1(T1 key1) => _forward.ContainsKey(key1); + public bool Contains2(T2 key2) => _backward.ContainsKey(key2); + + public T2 Get2(T1 key1) => _forward[key1]; + public T1 Get1(T2 key2) => _backward[key2]; + + public T2 Get2OrDefault(T1 key1) + => (key1 != null && _forward.ContainsKey(key1)) ? _forward[key1] : default(T2); + public T1 Get1OrDefault(T2 key2) + => (key2 != null && _backward.ContainsKey(key2)) ? _backward[key2] : default(T1); + + public void Clear() { _forward.Clear(); _backward.Clear(); } + } + + public class IntValueDictionary : Dictionary + { + public void IncKey(K key) + { + if (!this.ContainsKey(key)) + this.Add(key, 1); + else + { + var i = this[key]; + this.Remove(key); + this.Add(key, i + 1); + } + } + } +} diff --git a/src/AasxCsharpLibrary/AdminShellConverters.cs b/src/AasxCsharpLibrary/AdminShellConverters.cs new file mode 100644 index 000000000..f75a1588c --- /dev/null +++ b/src/AasxCsharpLibrary/AdminShellConverters.cs @@ -0,0 +1,327 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ + +using Extensions; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Newtonsoft.Json.Serialization; +using System; +using System.IO; +using System.Reflection; + +namespace AdminShellNS +{ + public static class AdminShellConverters + { + /// + /// This converter is used for reading JSON files; it claims to be responsible for + /// "Referable" (the base class) + /// and decides, which sub-class of the base class shall be populated. + /// If the object is SubmodelElement, the decision, shich special sub-class to create is done in a factory + /// SubmodelElementWrapper.CreateAdequateType(), + /// in order to have all sub-class specific decisions in one place (SubmodelElementWrapper) + /// Remark: There is a NuGet package JsonSubTypes, which could have done the job, except the fact of having + /// "modelType" being a class property with a contained property "name". + /// + public class JsonAasxConverter : JsonConverter + { + private string UpperClassProperty = "modelType"; + private string LowerClassProperty = "name"; + + public JsonAasxConverter() : base() + { + } + + public JsonAasxConverter(string UpperClassProperty, string LowerClassProperty) : base() + { + this.UpperClassProperty = UpperClassProperty; + this.LowerClassProperty = LowerClassProperty; + } + + public override bool CanConvert(Type objectType) + { + // Info MIHO 21 APR 2020: changed this from SubmodelElement to Referable + if (typeof(IReferable).IsAssignableFrom(objectType)) + return true; + return false; + } + + public override bool CanWrite + { + get { return false; } + } + + public override object ReadJson(JsonReader reader, + Type objectType, + object existingValue, + JsonSerializer serializer) + { + // Load JObject from stream + JObject jObject = JObject.Load(reader); + + // Create target object based on JObject + IReferable target = null; + + if (jObject.ContainsKey(UpperClassProperty)) + { + var j2 = jObject[UpperClassProperty]; + if (j2 != null) + foreach (var c in j2.Children()) + { + var cprop = c as Newtonsoft.Json.Linq.JProperty; + if (cprop == null) + continue; + if (cprop.Name == LowerClassProperty && cprop.Value.Type.ToString() == "String") + { + var cpval = cprop.Value.ToObject(); + if (cpval == null) + continue; + // Info MIHO 21 APR 2020: use Referable.CreateAdequateType instead of SMW... + var o = CreateAdequateType(cpval); + if (o != null) + target = o; + } + } + } + + // Populate the object properties + serializer.Populate(jObject.CreateReader(), target); + + return target; + } + + public static IReferable CreateAdequateType(string elementName) + { + if (elementName == KeyTypes.AssetAdministrationShell.ToString()) + return new AssetAdministrationShell("", null); + // dead-csharp off + //TODO (jtikekar, 0000-00-00): refactor default + //if (elementName == "Asset") + //TODO (jtikekar, 0000-00-00): Change + // return new AssetInformation(AssetKind.Instance); + if (elementName == KeyTypes.ConceptDescription.ToString()) + return new ConceptDescription(""); + if (elementName == KeyTypes.Submodel.ToString()) + return new Submodel(""); + //if (elementName == KeyTypes.View) + // return new View(); + // dead-csharp on + return CreateSubmodelElementIstance(elementName); + } + + private static ISubmodelElement CreateSubmodelElementIstance(string typeName) + { + //TODO (jtikekar, 0000-00-00): Need to test + Type type = Type.GetType(typeName); + if (type == null || !type.IsSubclassOf(typeof(ISubmodelElement))) + return null; + var sme = Activator.CreateInstance(type) as ISubmodelElement; + return sme; + } + + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + throw new NotImplementedException(); + } + } + + /// + /// This converter / contract resolver for Json.NET adaptively filters different levels of depth + /// of nested AASX structures. + /// + public class AdaptiveFilterContractResolver : DefaultContractResolver + { + public bool AasHasViews = true; + public bool BlobHasValue = true; + public bool SubmodelHasElements = true; + public bool SmcHasValue = true; + public bool OpHasVariables = true; + + public AdaptiveFilterContractResolver() { } + + public AdaptiveFilterContractResolver(bool deep = true, bool complete = true) + { + if (!deep) + { + this.SubmodelHasElements = false; + this.SmcHasValue = false; + this.OpHasVariables = false; + } + if (!complete) + { + this.AasHasViews = false; + this.BlobHasValue = false; + } + + } + + // see: https://stackoverflow.com/questions/4963160/ + // how-to-determine-if-a-type-implements-an-interface-with-c-sharp-reflection + + protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) + { + JsonProperty property = base.CreateProperty(member, memberSerialization); + var icic = StringComparison.InvariantCultureIgnoreCase; + + if (!BlobHasValue && typeof(IBlob).IsAssignableFrom(property.DeclaringType) + && property.PropertyName.Equals("value", icic)) + property.ShouldSerialize = instance => { return false; }; + + if (!SubmodelHasElements && typeof(ISubmodel).IsAssignableFrom(property.DeclaringType) + && property.PropertyName.Equals("submodelElements", icic)) + property.ShouldSerialize = instance => { return false; }; + + if (!SmcHasValue && typeof(ISubmodelElementCollection).IsAssignableFrom(property.DeclaringType) + && property.PropertyName.Equals("value", icic)) + property.ShouldSerialize = instance => { return false; }; + + if (!OpHasVariables && typeof(IOperation).IsAssignableFrom(property.DeclaringType) + && (property.PropertyName.Equals("in", icic) + || property.PropertyName.Equals("out", icic))) + property.ShouldSerialize = instance => { return false; }; + + if (!AasHasViews && typeof(IAssetAdministrationShell).IsAssignableFrom(property.DeclaringType) + && property.PropertyName.Equals("views", icic)) + property.ShouldSerialize = instance => { return false; }; + + return property; + } + } + + public class AdaptiveAasIClassConverter : JsonConverter + { + public enum ConversionMode + { + /// + /// For (known) nodes of the AAS meta model, the converison of Newtonsoft.Json + /// is used. This is done by invoking creation of the real data type for the + /// desired interface types. + /// Assumption: fast, sloppy, fault-tolerant + /// + + Typecast, + /// + /// For (known) nodes of the AAS meta model, the sub-node content is converted + /// to string representation and subsequently converted by the AAS core deserialization. + /// Assumption: slow, precise but provide maximum compatibility. + /// + AasCore + }; + + public ConversionMode Mode = ConversionMode.Typecast; + + public bool WriteRawAasCore = false; + + /// + /// For **SERIALIZATION** and **JsonConverter attribute** a parameterless + /// constructor is needed. + /// + public AdaptiveAasIClassConverter() : base() + { + Mode = ConversionMode.AasCore; + } + + public AdaptiveAasIClassConverter(ConversionMode mode) : base() + { + Mode = mode; + } + + public override bool CanConvert(Type objectType) + { + if (typeof(IReference).IsAssignableFrom(objectType) + || typeof(IKey).IsAssignableFrom(objectType)) + return true; + return false; + } + + public override bool CanWrite + { + get { return true; } + } + + public override object ReadJson(JsonReader reader, + Type objectType, + object existingValue, + JsonSerializer serializer) + { + // check + if (reader.TokenType == JsonToken.Null) + return null; + + // spooky? + if (Mode == ConversionMode.AasCore) + { + var json = JRaw.Create(reader).ToString(); + var node = System.Text.Json.Nodes.JsonNode.Parse(json); + return ExtendIClass.IClassFrom(objectType, node); + } + + // Load JObject from stream + JObject jObject = JObject.Load(reader); + + // Create target object based on JObject + object target = null; + if (typeof(IReference).IsAssignableFrom(objectType)) + target = new Reference(ReferenceTypes.ExternalReference, null); + if (typeof(IKey).IsAssignableFrom(objectType)) + target = new Key(KeyTypes.GlobalReference, ""); + + // Populate the object properties + serializer.Populate(jObject.CreateReader(), target); + + return target; + } + + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + if (value is IClass ic) + { + // serialize by AAS core + var jsonStr = Jsonization.Serialize.ToJsonObject(ic) + .ToJsonString(new System.Text.Json.JsonSerializerOptions() + { + WriteIndented = true + }); + + // how to write + if (WriteRawAasCore) + { + // directly write raw string into serializer + // drawback: no indentation + writer.WriteStartObject(); + jsonStr = jsonStr.TrimStart('{').TrimEnd('}'); + writer.WriteRaw(jsonStr); + writer.WriteEndObject(); + } + else + { + // double-digest by a text reader and rewrite token stream + // pro: indentation + // con: run time performance, chance of de-serialization issues + using (var reader = new JsonTextReader(new StringReader(jsonStr)) + { + DateParseHandling = DateParseHandling.None, + FloatParseHandling = FloatParseHandling.Decimal + }) + { + writer.WriteToken(reader); + } + } + } + else + { + // normal serialization + var jo = JObject.FromObject(value); + jo.WriteTo(writer); + } + } + } + + } +} diff --git a/src/AasxCsharpLibrary/AdminShellPackageEnv.cs b/src/AasxCsharpLibrary/AdminShellPackageEnv.cs new file mode 100644 index 000000000..1d726e98a --- /dev/null +++ b/src/AasxCsharpLibrary/AdminShellPackageEnv.cs @@ -0,0 +1,1695 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ + +using Extensions; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.IO; +using System.IO.Packaging; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using System.Xml; +using System.Xml.Serialization; + +namespace AdminShellNS +{ + /// + /// This class lets an outer functionality keep track on the supplementary files, which are in or + /// are pending to be added or deleted to an Package. + /// + public class AdminShellPackageSupplementaryFile /*: IReferable*/ + { + public delegate byte[] SourceGetByteChunk(); + + public enum LocationType { InPackage, AddPending, DeletePending } + + public enum SpecialHandlingType { None, EmbedAsThumbnail } + + public readonly Uri Uri = null; + + public readonly string UseMimeType = null; + + public readonly string SourceLocalPath = null; + public readonly SourceGetByteChunk SourceGetBytesDel = null; + + public LocationType Location; + public readonly SpecialHandlingType SpecialHandling; + + public AdminShellPackageSupplementaryFile( + Uri uri, string sourceLocalPath = null, LocationType location = LocationType.InPackage, + SpecialHandlingType specialHandling = SpecialHandlingType.None, + SourceGetByteChunk sourceGetBytesDel = null, string useMimeType = null) + { + Uri = uri; + UseMimeType = useMimeType; + SourceLocalPath = sourceLocalPath; + SourceGetBytesDel = sourceGetBytesDel; + Location = location; + SpecialHandling = specialHandling; + } + + // class derives from Referable in order to provide GetElementName + public string GetElementName() + { + return "File"; + } + + } + + public class ListOfAasSupplementaryFile : List + { + public AdminShellPackageSupplementaryFile FindByUri(string path) + { + if (path == null) + return null; + + return this.FirstOrDefault( + x => x?.Uri?.ToString().Trim() == path.Trim()); + } + } + + /// + /// Provides (static?) helpers for serializing AAS.. + /// + public static class AdminShellSerializationHelper + { + + public static string TryReadXmlFirstElementNamespaceURI(Stream s) + { + string res = null; + try + { + var xr = System.Xml.XmlReader.Create(s); + int i = 0; + while (xr.Read()) + { + // limit amount of read + i++; + if (i > 99) + // obviously not found + break; + + // find element + if (xr.NodeType == System.Xml.XmlNodeType.Element) + { + res = xr.NamespaceURI; + break; + } + } + xr.Close(); + } + catch (Exception ex) + { + LogInternally.That.SilentlyIgnoredError(ex); + } + + // return to zero pos + s.Seek(0, SeekOrigin.Begin); + + // give back + return res; + } + + /// + /// Skips first few tokens of an XML content until first "real" element is encountered + /// + /// + public static void XmlSkipHeader(XmlReader xmlReader) + { + while (xmlReader.NodeType == XmlNodeType.XmlDeclaration || + xmlReader.NodeType == XmlNodeType.Whitespace || + xmlReader.NodeType == XmlNodeType.Comment || + xmlReader.NodeType == XmlNodeType.None) + xmlReader.Read(); + } + + /// + /// De-serialize an open stream into Environment. Does version/ compatibility management. + /// + /// Open for read stream + /// + public static AasCore.Aas3_0.Environment DeserializeXmlFromStreamWithCompat(Stream s) + { + // not sure + AasCore.Aas3_0.Environment res = null; + + // try get first element + var nsuri = TryReadXmlFirstElementNamespaceURI(s); + + // read V1.0? + if (nsuri != null && nsuri.Trim() == "http://www.admin-shell.io/aas/1/0") + { +#if !DoNotUseAasxCompatibilityModels + XmlSerializer serializer = new XmlSerializer( + typeof(AasxCompatibilityModels.AdminShellV10.AdministrationShellEnv), + "http://www.admin-shell.io/aas/1/0"); + var v10 = serializer.Deserialize(s) as AasxCompatibilityModels.AdminShellV10.AdministrationShellEnv; + res = new AasCore.Aas3_0.Environment(new List(), new List(), new List()); + res.ConvertFromV10(v10); + return res; +#else + throw (new Exception("Cannot handle AAS file format http://www.admin-shell.io/aas/1/0 !")); +#endif + } + + // read V2.0? + if (nsuri != null && nsuri.Trim() == "http://www.admin-shell.io/aas/2/0") + { +#if !DoNotUseAasxCompatibilityModels + XmlSerializer serializer = new XmlSerializer( + typeof(AasxCompatibilityModels.AdminShellV20.AdministrationShellEnv), + "http://www.admin-shell.io/aas/2/0"); + var v20 = serializer.Deserialize(s) as AasxCompatibilityModels.AdminShellV20.AdministrationShellEnv; + res = new AasCore.Aas3_0.Environment(new List(), new List(), new List()); + res.ConvertFromV20(v20); + return res; +#else + throw (new Exception("Cannot handle AAS file format http://www.admin-shell.io/aas/1/0 !")); +#endif + } + + // read V3.0? + if (nsuri != null && nsuri.Trim() == Xmlization.NS) + { + // dead-csharp off + //XmlSerializer serializer = new XmlSerializer( + // typeof(AasCore.Aas3_0_RC02.Environment), "http://www.admin-shell.io/aas/3/0"); + //res = serializer.Deserialize(s) as AasCore.Aas3_0_RC02.Environment; + // dead-csharp on + using (var xmlReader = XmlReader.Create(s)) + { + // TODO (MIHO, 2022-12-26): check if could be feature of AAS core + XmlSkipHeader(xmlReader); + res = Xmlization.Deserialize.EnvironmentFrom(xmlReader); + return res; + } + } + + // nope! + return null; + } + // dead-csharp off + //public static JsonSerializer BuildDefaultAasxJsonSerializer() + //{ + // var serializer = new JsonSerializer(); + // serializer.Converters.Add( + // new AdminShellConverters.JsonAasxConverter( + // "modelType", "name")); + // return serializer; + //} + public static T DeserializeFromJSON(string data) where T : IReferable + { + //using (var tr = new StringReader(data)) + //{ + //var serializer = BuildDefaultAasxJsonSerializer(); + //var rf = (T)serializer.Deserialize(tr, typeof(T)); + + var node = System.Text.Json.Nodes.JsonNode.Parse(data); + var rf = Jsonization.Deserialize.IReferableFrom(node); + + return (T)rf; + //} + } + + //public static T DeserializeFromJSON(JToken obj) where T : IReferable + //{ + // if (obj == null) + // return default(T); + // var serializer = BuildDefaultAasxJsonSerializer(); + // var rf = obj.ToObject(serializer); + // return rf; + //} + + ///// + ///// Use this, if DeserializeFromJSON is too tight. + ///// + //public static T DeserializePureObjectFromJSON(string data) + //{ + // using (var tr = new StringReader(data)) + // { + // //var serializer = BuildDefaultAasxJsonSerializer(); + // //var rf = (T)serializer.Deserialize(tr, typeof(T)); + // return null; + // } + //} + // dead-csharp on + } + + /// + /// This class encapsulates an AdminShellEnvironment and supplementary files into an AASX Package. + /// Specifically has the capability to load, update and store .XML, .JSON and .AASX packages. + /// + public class AdminShellPackageEnv : IDisposable + { + private string _fn = "New Package"; + + private string _tempFn = null; + + private AasCore.Aas3_0.Environment _aasEnv = new AasCore.Aas3_0.Environment(new List(), new List(), new List()); + private Package _openPackage = null; + private readonly ListOfAasSupplementaryFile _pendingFilesToAdd = new ListOfAasSupplementaryFile(); + private readonly ListOfAasSupplementaryFile _pendingFilesToDelete = new ListOfAasSupplementaryFile(); + + public AdminShellPackageEnv() { } + + public AdminShellPackageEnv(AasCore.Aas3_0.Environment env) + { + if (env != null) + _aasEnv = env; + } + + public AdminShellPackageEnv(string fn, bool indirectLoadSave = false) + { + Load(fn, indirectLoadSave); + } + + public bool IsOpen + { + get + { + return _openPackage != null; + } + } + + public void SetFilename(string fileName) + { + _fn = fileName; + } + + public string Filename + { + get + { + return _fn; + } + } + + public AasCore.Aas3_0.Environment AasEnv + { + get + { + return _aasEnv; + } + } + + private static AasCore.Aas3_0.Environment LoadXml(string fn) + { + try + { + using (var reader = new StreamReader(fn)) + { + var aasEnv = AdminShellSerializationHelper.DeserializeXmlFromStreamWithCompat( + reader.BaseStream); + + if (aasEnv == null) + throw new Exception("Type error for XML file"); + + return aasEnv; + } + } + catch (Exception ex) + { + throw new Exception( + $"While reading AAS {fn} at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); + } + } + + private static AasCore.Aas3_0.Environment LoadJson(string fn) + { + try + { + using (var file = System.IO.File.OpenRead(fn)) + { + // dead-csharp off + //// TODO (Michael Hoffmeister, 2020-08-01): use a unified function to create a serializer + //var serializer = new JsonSerializer(); + //serializer.Converters.Add( + // new AdminShellConverters.JsonAasxConverter( + // "modelType", "name")); + + //var aasEnv = (AasCore.Aas3_0_RC02.Environment)serializer.Deserialize( + // file, typeof(AasCore.Aas3_0_RC02.Environment)); + // dead-csharp on + var node = System.Text.Json.Nodes.JsonNode.Parse(file); + var aasEnv = Jsonization.Deserialize.EnvironmentFrom(node); + + return aasEnv; + } + } + catch (Exception ex) + { + throw new Exception( + $"While reading AAS {fn} at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); + } + } + + /// is unequal if indirectLoadSave is used. + private static (AasCore.Aas3_0.Environment, Package) LoadPackageAasx(string fn, string fnToLoad) + { + AasCore.Aas3_0.Environment aasEnv; + Package openPackage = null; + + Package package; + try + { + package = Package.Open(fnToLoad, FileMode.Open); + } + catch (Exception ex) + { + throw new Exception( + fn == fnToLoad + ? $"While opening the package to read AASX {fn} " + + $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}" + : $"While opening the package to read AASX {fn} indirectly from {fnToLoad} " + + $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); + } + + try + { + // get the origin from the package + PackagePart originPart = null; + var xs = package.GetRelationshipsByType( + "http://www.admin-shell.io/aasx/relationships/aasx-origin"); + foreach (var x in xs) + if (x.SourceUri.ToString() == "/") + { + //originPart = package.GetPart(x.TargetUri); + var absoluteURI = PackUriHelper.ResolvePartUri(x.SourceUri, x.TargetUri); + if (package.PartExists(absoluteURI)) + { + originPart = package.GetPart(absoluteURI); + } + break; + } + + if (originPart == null) + throw (new Exception("Unable to find AASX origin. Aborting!")); + + // get the specs from the package + PackagePart specPart = null; + xs = originPart.GetRelationshipsByType("http://www.admin-shell.io/aasx/relationships/aas-spec"); + foreach (var x in xs) + { + //specPart = package.GetPart(x.TargetUri); + var absoluteURI = PackUriHelper.ResolvePartUri(x.SourceUri, x.TargetUri); + if (package.PartExists(absoluteURI)) + { + specPart = package.GetPart(absoluteURI); + } + break; + } + + if (specPart == null) + throw (new Exception("Unable to find AASX spec(s). Aborting!")); + + // open spec part to read + try + { + if (specPart.Uri.ToString().ToLower().Trim().EndsWith("json")) + { + using (var s = specPart.GetStream(FileMode.Open)) + { + // dead-csharp off + //using (var file = new StreamReader(s)) + //{ + //JsonSerializer serializer = new JsonSerializer(); + //serializer.Converters.Add( + // new AdminShellConverters.JsonAasxConverter( + // "modelType", "name")); + + //aasEnv = (AasCore.Aas3_0_RC02.Environment)serializer.Deserialize( + // file, typeof(AasCore.Aas3_0_RC02.Environment)); + + var node = System.Text.Json.Nodes.JsonNode.Parse(s); + aasEnv = Jsonization.Deserialize.EnvironmentFrom(node); + //} + // dead-csharp on + } + } + else + { + using (var s = specPart.GetStream(FileMode.Open)) + { + // own catch loop to be more specific + aasEnv = AdminShellSerializationHelper.DeserializeXmlFromStreamWithCompat(s); + openPackage = package; + + if (aasEnv == null) + throw new Exception("Type error for XML file!"); + } + } + } + catch (Exception ex) + { + throw new Exception( + fn == fnToLoad + ? $"While reading spec from the AASX {fn} " + + $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}" + : $"While reading spec from the {fn} (and indirectly over {fnToLoad}) " + + $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); + } + } + catch (Exception ex) + { + throw new Exception( + fn == fnToLoad + ? $"While reading the AASX {fn} " + + $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}" + : $"While reading the {fn} (and indirectly over {fnToLoad}) " + + $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); + } + finally + { + if (openPackage == null) + { + package.Close(); + } + } + + return (aasEnv, openPackage); + } + + public void Load(string fn, bool indirectLoadSave = false) + { + _fn = fn; + _openPackage?.Close(); + _openPackage = null; + + string extension = Path.GetExtension(fn).ToLower(); + switch (extension) + { + case ".xml": + { + _aasEnv = LoadXml(fn); + break; + } + case ".json": + { + _aasEnv = LoadJson(fn); + break; + } + case ".aasx": + { + var fnToLoad = fn; + _tempFn = null; + if (indirectLoadSave) + { + try + { + _tempFn = System.IO.Path.GetTempFileName().Replace(".tmp", ".aasx"); + System.IO.File.Copy(fn, _tempFn); + fnToLoad = _tempFn; + + } + catch (Exception ex) + { + throw new Exception( + $"While copying AASX {fn} for indirect load to {fnToLoad} " + + $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); + } + } + + // load package AASX + (_aasEnv, _openPackage) = LoadPackageAasx(fn, fnToLoad); + break; + } + default: + throw new Exception( + $"Does not know how to handle the extension {extension} of the file: {fn}"); + } + } + + public void SetTempFn(string fn) + { + try + { + _tempFn = System.IO.Path.GetTempFileName().Replace(".tmp", ".aasx"); + System.IO.File.Copy(fn, _tempFn); + + } + catch (Exception ex) + { + throw new Exception( + $"While copying AASX {fn}" + + $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); + } + } + + public void LoadFromAasEnvString(string content) + { + try + { + // dead-csharp off + //using (var file = new StringReader(content)) + //{ + // TODO (Michael Hoffmeister, 2020-08-01): use a unified function to create a serializer + //JsonSerializer serializer = new JsonSerializer(); + //serializer.Converters.Add(new AdminShellConverters.JsonAasxConverter("modelType", "name")); + //_aasEnv = (AasCore.Aas3_0_RC02.Environment)serializer.Deserialize( + // file, typeof(AasCore.Aas3_0_RC02.Environment)); + + var node = System.Text.Json.Nodes.JsonNode.Parse(content); + _aasEnv = Jsonization.Deserialize.EnvironmentFrom(node); + //} + // dead-csharp on + } + catch (Exception ex) + { + throw (new Exception( + string.Format("While reading AASENV string {0} gave: {1}", + AdminShellUtil.ShortLocation(ex), ex.Message))); + } + } + + public enum SerializationFormat { None, Xml, Json }; + // dead-csharp off + //public static XmlSerializerNamespaces GetXmlDefaultNamespaces() + //{ + // var nss = new XmlSerializerNamespaces(); + // nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace); + // nss.Add("aas", "http://www.admin-shell.io/aas/2/0"); + // nss.Add("IEC", "http://www.admin-shell.io/IEC61360/2/0"); + // nss.Add("abac", "http://www.admin-shell.io/aas/abac/2/0"); + // return nss; + //} + // dead-csharp on + public bool SaveAs(string fn, bool writeFreshly = false, SerializationFormat prefFmt = SerializationFormat.None, + MemoryStream useMemoryStream = null, bool saveOnlyCopy = false) + { + // silently fix flaws + _aasEnv?.SilentFix30(); + + // ok, which format? + if (fn.ToLower().EndsWith(".xml")) + { + // save only XML + if (!saveOnlyCopy) + _fn = fn; + try + { + Stream s = (useMemoryStream != null) + ? (Stream)useMemoryStream + : System.IO.File.Open(fn, FileMode.Create, FileAccess.Write); + + try + { + // dead-csharp off + // TODO (Michael Hoffmeister, 2020-08-01): use a unified function to create a serializer + //var serializer = new XmlSerializer(typeof(AasCore.Aas3_0_RC02.Environment)); + //var nss = GetXmlDefaultNamespaces(); + //serializer.Serialize(s, _aasEnv, nss); + // dead-csharp on + var writer = XmlWriter.Create(s, new XmlWriterSettings() + { + Indent = true, + OmitXmlDeclaration = true + }); + Xmlization.Serialize.To( + _aasEnv, writer); + writer.Flush(); + writer.Close(); + s.Flush(); + } + finally + { + // close? + if (useMemoryStream == null) + s.Close(); + } + } + catch (Exception ex) + { + throw (new Exception( + string.Format("While writing AAS {0} at {1} gave: {2}", + fn, AdminShellUtil.ShortLocation(ex), ex.Message))); + } + return true; + } + + if (fn.ToLower().EndsWith(".json")) + { + // save only JSON + // This functionality is an initial test. + if (!saveOnlyCopy) + _fn = fn; + try + { + Stream s = (useMemoryStream != null) ? (Stream)useMemoryStream + : System.IO.File.Open(fn, FileMode.Create, FileAccess.Write); + + try + { + // dead-csharp off + //// TODO (Michael Hoffmeister, 2020-08-01): use a unified function to create a serializer + //JsonSerializer serializer = new JsonSerializer() + //{ + // NullValueHandling = NullValueHandling.Ignore, + // ReferenceLoopHandling = ReferenceLoopHandling.Serialize, + // Formatting = Newtonsoft.Json.Formatting.Indented + //}; + + //var sw = new StreamWriter(s); + //var writer = new JsonTextWriter(sw); + + //serializer.Serialize(writer, _aasEnv); + //writer.Flush(); + //sw.Flush(); + //s.Flush(); + + //if (useMemoryStream == null) + //{ + // writer.Close(); + // sw.Close(); + //} + // dead-csharp on + using (var wr = new System.Text.Json.Utf8JsonWriter(s)) + { + Jsonization.Serialize.ToJsonObject(_aasEnv).WriteTo(wr, + new System.Text.Json.JsonSerializerOptions() + { + WriteIndented = true + }); + wr.Flush(); + s.Flush(); + } + } + finally + { + // close? + if (useMemoryStream == null) + s.Close(); + } + } + catch (Exception ex) + { + throw (new Exception( + string.Format("While writing AAS {0} at {1} gave: {2}", + fn, AdminShellUtil.ShortLocation(ex), ex.Message))); + } + return true; + } + + if (fn.ToLower().EndsWith(".aasx")) + { + // save package AASX + try + { + // We want existing contents to be preserved, but do not want to allow the change of the file name. + // Therefore: copy the file to a new name, then re-open. + // fn could be changed, therefore close "old" package first + if (_openPackage != null) + { + try + { + _openPackage.Close(); + if (!writeFreshly) + { + if (_tempFn != null) + System.IO.File.Copy(_tempFn, fn); + else + { + /* TODO (MIHO, 2021-01-02): check again. + * Revisiting this code after a while, and after + * the code has undergo some changes by MR, the following copy command needed + * to be amended with a if to protect against self-copy. */ + if (_fn != fn) + System.IO.File.Copy(_fn, fn); + } + } + } + catch (Exception ex) + { + LogInternally.That.SilentlyIgnoredError(ex); + } + _openPackage = null; + } + + // approach is to utilize the existing package, if possible. If not, create from scratch + Package package = null; + if (useMemoryStream != null) + { + package = Package.Open( + useMemoryStream, (writeFreshly) ? FileMode.Create : FileMode.OpenOrCreate); + } + else + { + package = Package.Open( + (_tempFn != null) ? _tempFn : fn, + (writeFreshly) ? FileMode.Create : FileMode.OpenOrCreate); + } + _fn = fn; + + // get the origin from the package + PackagePart originPart = null; + var xs = package.GetRelationshipsByType( + "http://www.admin-shell.io/aasx/relationships/aasx-origin"); + foreach (var x in xs) + if (x.SourceUri.ToString() == "/") + { + //originPart = package.GetPart(x.TargetUri); + var absoluteURI = PackUriHelper.ResolvePartUri(x.SourceUri, x.TargetUri); + if (package.PartExists(absoluteURI)) + { + originPart = package.GetPart(absoluteURI); + } + break; + } + if (originPart == null) + { + // create, as not existing + originPart = package.CreatePart( + new Uri("/aasx/aasx-origin", UriKind.RelativeOrAbsolute), + System.Net.Mime.MediaTypeNames.Text.Plain, CompressionOption.Maximum); + using (var s = originPart.GetStream(FileMode.Create)) + { + var bytes = System.Text.Encoding.ASCII.GetBytes("Intentionally empty"); + s.Write(bytes, 0, bytes.Length); + } + package.CreateRelationship( + originPart.Uri, TargetMode.Internal, + "http://www.admin-shell.io/aasx/relationships/aasx-origin"); + } + + // get the specs from the package + PackagePart specPart = null; + PackageRelationship specRel = null; + xs = originPart.GetRelationshipsByType("http://www.admin-shell.io/aasx/relationships/aas-spec"); + foreach (var x in xs) + { + specRel = x; + //specPart = package.GetPart(x.TargetUri); + var absoluteURI = PackUriHelper.ResolvePartUri(x.SourceUri, x.TargetUri); + if (package.PartExists(absoluteURI)) + { + specPart = package.GetPart(absoluteURI); + } + break; + } + + // check, if we have to change the spec part + if (specPart != null && specRel != null) + { + var name = System.IO.Path.GetFileNameWithoutExtension( + specPart.Uri.ToString()).ToLower().Trim(); + var ext = System.IO.Path.GetExtension(specPart.Uri.ToString()).ToLower().Trim(); + if ((ext == ".json" && prefFmt == SerializationFormat.Xml) + || (ext == ".xml" && prefFmt == SerializationFormat.Json) + || (name.StartsWith("aasenv-with-no-id"))) + { + // try kill specpart + try + { + originPart.DeleteRelationship(specRel.Id); + package.DeletePart(specPart.Uri); + } + catch (Exception ex) + { + LogInternally.That.SilentlyIgnoredError(ex); + } + finally { specPart = null; specRel = null; } + } + } + + if (specPart == null) + { + // create, as not existing + var frn = "aasenv-with-no-id"; + if (_aasEnv.AssetAdministrationShells.Count > 0) + frn = _aasEnv.AssetAdministrationShells[0].GetFriendlyName() ?? frn; + var aas_spec_fn = "/aasx/#/#.aas"; + if (prefFmt == SerializationFormat.Json) + aas_spec_fn += ".json"; + else + aas_spec_fn += ".xml"; + aas_spec_fn = aas_spec_fn.Replace("#", "" + frn); + specPart = package.CreatePart( + new Uri(aas_spec_fn, UriKind.RelativeOrAbsolute), + System.Net.Mime.MediaTypeNames.Text.Xml, CompressionOption.Maximum); + originPart.CreateRelationship( + specPart.Uri, TargetMode.Internal, + "http://www.admin-shell.io/aasx/relationships/aas-spec"); + } + + // now, specPart shall be != null! + if (specPart.Uri.ToString().ToLower().Trim().EndsWith("json")) + { + using (var s = specPart.GetStream(FileMode.Create)) + { + JsonSerializer serializer = new JsonSerializer(); + serializer.NullValueHandling = NullValueHandling.Ignore; + serializer.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; + serializer.Formatting = Newtonsoft.Json.Formatting.Indented; + using (var sw = new StreamWriter(s)) + { + using (JsonWriter writer = new JsonTextWriter(sw)) + { + serializer.Serialize(writer, _aasEnv); + } + } + } + } + else + { + using (var s = specPart.GetStream(FileMode.Create)) + { + + var writer = XmlWriter.Create(s, new XmlWriterSettings() + { + Indent = true, + OmitXmlDeclaration = true + }); + Xmlization.Serialize.To( + _aasEnv, writer); + writer.Flush(); + writer.Close(); + s.Flush(); + } + } + + // there might be pending files to be deleted (first delete, then add, + // in case of identical files in both categories) + foreach (var psfDel in _pendingFilesToDelete) + { + // try find an existing part for that file .. + var found = false; + + // normal files + xs = specPart.GetRelationshipsByType("http://www.admin-shell.io/aasx/relationships/aas-suppl"); + foreach (var x in xs) + if (x.TargetUri == psfDel.Uri) + { + // try to delete + specPart.DeleteRelationship(x.Id); + package.DeletePart(psfDel.Uri); + found = true; + break; + } + + // thumbnails + xs = package.GetRelationshipsByType( + "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); + foreach (var x in xs) + if (x.TargetUri == psfDel.Uri) + { + // try to delete + package.DeleteRelationship(x.Id); + package.DeletePart(psfDel.Uri); + found = true; + break; + } + + if (!found) + throw (new Exception( + $"Not able to delete pending file {psfDel.Uri} in saving package {fn}")); + } + + // after this, there are no more pending for delete files + _pendingFilesToDelete.Clear(); + + // write pending supplementary files + foreach (var psfAdd in _pendingFilesToAdd) + { + // make sure .. + if ((psfAdd.SourceLocalPath == null && psfAdd.SourceGetBytesDel == null) || + psfAdd.Location != AdminShellPackageSupplementaryFile.LocationType.AddPending) + continue; + + // normal file? + if (psfAdd.SpecialHandling == AdminShellPackageSupplementaryFile.SpecialHandlingType.None || + psfAdd.SpecialHandling == + AdminShellPackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail) + { + + // try find an existing part for that file .. + PackagePart filePart = null; + if (psfAdd.SpecialHandling == AdminShellPackageSupplementaryFile.SpecialHandlingType.None) + { + xs = specPart.GetRelationshipsByType( + "http://www.admin-shell.io/aasx/relationships/aas-suppl"); + foreach (var x in xs) + if (x.TargetUri == psfAdd.Uri) + { + //filePart = package.GetPart(x.TargetUri); + var absoluteURI = PackUriHelper.ResolvePartUri(x.SourceUri, x.TargetUri); + if (package.PartExists(absoluteURI)) + { + filePart = package.GetPart(absoluteURI); + } + break; + } + } + if (psfAdd.SpecialHandling == + AdminShellPackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail) + { + xs = package.GetRelationshipsByType( + "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); + foreach (var x in xs) + if (x.SourceUri.ToString() == "/" && x.TargetUri == psfAdd.Uri) + { + //filePart = package.GetPart(x.TargetUri); + var absoluteURI = PackUriHelper.ResolvePartUri(x.SourceUri, x.TargetUri); + if (package.PartExists(absoluteURI)) + { + filePart = package.GetPart(absoluteURI); + } + break; + } + } + + if (filePart == null) + { + // determine mimeType + var mimeType = psfAdd.UseMimeType; + // reconcile mime + if (mimeType == null && psfAdd.SourceLocalPath != null) + mimeType = AdminShellPackageEnv.GuessMimeType(psfAdd.SourceLocalPath); + // still null? + if (mimeType == null) + // see: https://stackoverflow.com/questions/6783921/ + // which-mime-type-to-use-for-a-binary-file-thats-specific-to-my-program + mimeType = "application/octet-stream"; + + // create new part and link + filePart = package.CreatePart(psfAdd.Uri, mimeType, CompressionOption.Maximum); + if (psfAdd.SpecialHandling == + AdminShellPackageSupplementaryFile.SpecialHandlingType.None) + specPart.CreateRelationship( + filePart.Uri, TargetMode.Internal, + "http://www.admin-shell.io/aasx/relationships/aas-suppl"); + if (psfAdd.SpecialHandling == + AdminShellPackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail) + package.CreateRelationship( + filePart.Uri, TargetMode.Internal, + "http://schemas.openxmlformats.org/package/2006/" + + "relationships/metadata/thumbnail"); + } + + // now should be able to write + using (var s = filePart.GetStream(FileMode.Create)) + { + if (psfAdd.SourceLocalPath != null) + { + var bytes = System.IO.File.ReadAllBytes(psfAdd.SourceLocalPath); + s.Write(bytes, 0, bytes.Length); + } + + if (psfAdd.SourceGetBytesDel != null) + { + var bytes = psfAdd.SourceGetBytesDel(); + if (bytes != null) + s.Write(bytes, 0, bytes.Length); + } + } + } + } + + // after this, there are no more pending for add files + _pendingFilesToAdd.Clear(); + + // flush, but leave open + package.Flush(); + _openPackage = package; + + // if in temp fn, close the package, copy to original fn, re-open the package + if (_tempFn != null) + try + { + package.Close(); + System.IO.File.Copy(_tempFn, _fn, overwrite: true); + _openPackage = Package.Open(_tempFn, FileMode.OpenOrCreate); + } + catch (Exception ex) + { + throw (new Exception( + string.Format("While write AASX {0} indirectly at {1} gave: {2}", + fn, AdminShellUtil.ShortLocation(ex), ex.Message))); + } + } + catch (Exception ex) + { + throw (new Exception( + string.Format("While write AASX {0} at {1} gave: {2}", + fn, AdminShellUtil.ShortLocation(ex), ex.Message))); + } + return true; + } + + // Don't know to handle + throw new Exception($"Does not know how to handle the file: {fn}"); + } + + /// + /// Temporariyl saves & closes package and executes lambda. Afterwards, the package is re-opened + /// under the same file name + /// + /// Action which is to be executed while the file is CLOSED + /// Format for the saved file + public void TemporarilySaveCloseAndReOpenPackage( + Action lambda, + AdminShellPackageEnv.SerializationFormat prefFmt = AdminShellPackageEnv.SerializationFormat.None) + { + // access + if (!this.IsOpen) + throw (new Exception( + string.Format("Could not temporarily close and re-open AASX {0}, because package" + + "not open as expected!", Filename))); + + try + { + // save (it will be open, still) + SaveAs(this.Filename, prefFmt: prefFmt); + + // close + _openPackage.Flush(); + _openPackage.Close(); + + // execute lambda + lambda?.Invoke(); + } + catch (Exception ex) + { + throw (new Exception( + string.Format("While temporarily close and re-open AASX {0} at {1} gave: {2}", + Filename, AdminShellUtil.ShortLocation(ex), ex.Message))); + } + finally + { + // even after failing of the lambda, the package shall be re-opened + if (Filename.ToLower().EndsWith(".aasx")) + { + _openPackage = Package.Open(Filename, FileMode.OpenOrCreate); + + } + } + } + + private int BackupIndex = 0; + + public void BackupInDir(string backupDir, int maxFiles) + { + // access + if (backupDir == null || maxFiles < 1) + return; + + // we do it not caring on any errors + try + { + // get index in form + if (BackupIndex == 0) + { + // do not always start at 0!! + var rnd = new Random(); + BackupIndex = rnd.Next(maxFiles); + } + var ndx = BackupIndex % maxFiles; + BackupIndex += 1; + + // build a filename + var bdfn = Path.Combine(backupDir, $"backup{ndx:000}.xml"); + + // raw save + using (var s = new StreamWriter(bdfn)) + { + // dead-csharp off + //var serializer = new XmlSerializer(typeof(AasCore.Aas3_0_RC02.Environment)); + //var nss = new XmlSerializerNamespaces(); + //nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace); + //nss.Add("aas", "http://www.admin-shell.io/aas/2/0"); + //nss.Add("IEC61360", "http://www.admin-shell.io/IEC61360/2/0"); + //serializer.Serialize(s, _aasEnv, nss); + // dead-csharp on + var writer = XmlWriter.Create(s, new XmlWriterSettings() + { + Indent = true, + OmitXmlDeclaration = true + }); + Xmlization.Serialize.To( + _aasEnv, writer); + writer.Flush(); + writer.Close(); + s.Flush(); + } + } + catch (Exception ex) + { + LogInternally.That.SilentlyIgnoredError(ex); + } + } + + public Stream GetStreamFromUriOrLocalPackage(string uriString, + FileMode mode = FileMode.Open, + FileAccess access = FileAccess.Read) + { + // local + if (IsLocalFile(uriString)) + return GetLocalStreamFromPackage(uriString, mode, access); + + // no .. + return System.IO.File.Open(uriString, mode, access); + } + + public byte[] GetByteArrayFromUriOrLocalPackage(string uriString) + { + try + { + using (var input = GetStreamFromUriOrLocalPackage(uriString)) + { + using (MemoryStream ms = new MemoryStream()) + { + input.CopyTo(ms); + return ms.ToArray(); + } + } + } + catch (Exception ex) + { + AdminShellNS.LogInternally.That.SilentlyIgnoredError(ex); + return null; + } + } + + public bool IsLocalFile(string uriString) + { + // access + if (_openPackage == null) + return false; + if (uriString == null || uriString == "" || !uriString.StartsWith("/")) + return false; + + // check + var isLocal = _openPackage.PartExists(new Uri(uriString, UriKind.RelativeOrAbsolute)); + return isLocal; + } + + private static WebProxy proxy = null; + + public Stream GetLocalStreamFromPackage(string uriString, FileMode mode = FileMode.Open, FileAccess access = FileAccess.Read) + { + // Check, if remote + if (uriString.ToLower().Substring(0, 4) == "http") + { + if (proxy == null) + { + string proxyAddress = ""; + string username = ""; + string password = ""; + + string proxyFile = "proxy.txt"; + if (System.IO.File.Exists(proxyFile)) + { + try + { // Open the text file using a stream reader. + using (StreamReader sr = new StreamReader(proxyFile)) + { + proxyFile = sr.ReadLine(); + } + } + catch (IOException e) + { + Console.WriteLine("proxy.txt could not be read:"); + Console.WriteLine(e.Message); + } + } + + try + { + using (StreamReader sr = new StreamReader(proxyFile)) + { + proxyAddress = sr.ReadLine(); + username = sr.ReadLine(); + password = sr.ReadLine(); + } + } + catch (Exception e) + { + Console.WriteLine(e.Message); + Console.WriteLine(proxyFile + " not found!"); + } + + if (proxyAddress != "") + { + proxy = new WebProxy(); + Uri newUri = new Uri(proxyAddress); + proxy.Address = newUri; + proxy.Credentials = new NetworkCredential(username, password); + Console.WriteLine("Using proxy: " + proxyAddress); + } + } + + var handler = new HttpClientHandler(); + + if (proxy != null) + handler.Proxy = proxy; + else + handler.DefaultProxyCredentials = CredentialCache.DefaultCredentials; + var hc = new HttpClient(handler); + + var response = hc.GetAsync(uriString).GetAwaiter().GetResult(); + + // if you call response.EnsureSuccessStatusCode here it will throw an exception + if (response.StatusCode == HttpStatusCode.Moved + || response.StatusCode == HttpStatusCode.Found) + { + var location = response.Headers.Location; + response = hc.GetAsync(location).GetAwaiter().GetResult(); + } + + response.EnsureSuccessStatusCode(); + var s = response.Content.ReadAsStreamAsync().GetAwaiter().GetResult(); + + if (s.Length < 500) // indirect load? + { + StreamReader reader = new StreamReader(s); + string json = reader.ReadToEnd(); + var parsed = JObject.Parse(json); + try + { + string url = parsed.SelectToken("url").Value(); + response = hc.GetAsync(url).GetAwaiter().GetResult(); + response.EnsureSuccessStatusCode(); + s = response.Content.ReadAsStreamAsync().GetAwaiter().GetResult(); + } + catch + { + } + } + + return s; + } + + // access + if (_openPackage == null) + throw (new Exception(string.Format($"AASX Package {_fn} not opened. Aborting!"))); + + // exist + var puri = new Uri(uriString, UriKind.RelativeOrAbsolute); + if (!_openPackage.PartExists(puri)) + throw (new Exception(string.Format($"AASX Package has no part {uriString}. Aborting!"))); + + // get part + var part = _openPackage.GetPart(puri); + if (part == null) + throw (new Exception( + string.Format($"Cannot access part {uriString} in {_fn}. Aborting!"))); + return part.GetStream(mode, access); + } + + public async Task ReplaceSupplementaryFileInPackageAsync(string sourceUri, string targetFile, string targetContentType, Stream fileContent) + { + // access + if (_openPackage == null) + throw (new Exception(string.Format($"AASX Package {_fn} not opened. Aborting!"))); + + if (!string.IsNullOrEmpty(sourceUri)) + { + _openPackage.DeletePart(new Uri(sourceUri, UriKind.RelativeOrAbsolute)); + + } + var targetUri = PackUriHelper.CreatePartUri(new Uri(targetFile, UriKind.RelativeOrAbsolute)); + PackagePart packagePart = _openPackage.CreatePart(targetUri, targetContentType); + fileContent.Position = 0; + using (Stream dest = packagePart.GetStream()) + { + fileContent.CopyTo(dest); + } + } + + public long GetStreamSizeFromPackage(string uriString) + { + long res = 0; + try + { + if (_openPackage == null) + return 0; + + PackagePart part = null; + var uri = new Uri(uriString, UriKind.RelativeOrAbsolute); + if (_openPackage.PartExists(uri)) + { + part = _openPackage.GetPart(uri); + } + if (part != null) + { + using (var s = part.GetStream(FileMode.Open)) + { + res = s.Length; + } + } + } + catch (Exception ex) + { + LogInternally.That.SilentlyIgnoredError(ex); + return 0; + } + return res; + } + + /// + /// Ensures: + ///
  • result == null || result.CanRead
+ ///
+ public Stream GetLocalThumbnailStream(ref Uri thumbUri) + { + // access + if (_openPackage == null) + throw (new Exception(string.Format($"AASX Package {_fn} not opened. Aborting!"))); + // get the thumbnail over the relationship + PackagePart thumbPart = null; + var xs = _openPackage.GetRelationshipsByType( + "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); + foreach (var x in xs) + if (x.SourceUri.ToString() == "/") + { + //thumbPart = _openPackage.GetPart(x.TargetUri); + var absoluteURI = PackUriHelper.ResolvePartUri(x.SourceUri, x.TargetUri); + if (_openPackage.PartExists(absoluteURI)) + { + thumbPart = _openPackage.GetPart(absoluteURI); + } + thumbUri = x.TargetUri; + break; + } + if (thumbPart == null) + throw (new Exception("Unable to find AASX thumbnail. Aborting!")); + + var result = thumbPart.GetStream(FileMode.Open); + + // Post-condition + if (!(result == null || result.CanRead)) + { + throw new InvalidOperationException("Unexpected unreadable result stream"); + } + + return result; + } + + /// + /// Ensures: + ///
  • result == null || result.CanRead
+ ///
+ public Stream GetLocalThumbnailStream() + { + Uri dummy = null; + var result = GetLocalThumbnailStream(ref dummy); + + // Post-condition + if (!(result == null || result.CanRead)) + { + throw new InvalidOperationException("Unexpected unreadable result stream"); + } + + return result; + } + + public ListOfAasSupplementaryFile GetListOfSupplementaryFiles() + { + // new result + var result = new ListOfAasSupplementaryFile(); + + // access + if (_openPackage != null) + { + + // get the thumbnail(s) from the package + var xs = _openPackage.GetRelationshipsByType( + "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); + foreach (var x in xs) + if (x.SourceUri.ToString() == "/") + { + result.Add(new AdminShellPackageSupplementaryFile( + x.TargetUri, + location: AdminShellPackageSupplementaryFile.LocationType.InPackage, + specialHandling: AdminShellPackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail)); + } + + // get the origin from the package + PackagePart originPart = null; + xs = _openPackage.GetRelationshipsByType( + "http://www.admin-shell.io/aasx/relationships/aasx-origin"); + foreach (var x in xs) + if (x.SourceUri.ToString() == "/") + { + //originPart = _openPackage.GetPart(x.TargetUri); + var absoluteURI = PackUriHelper.ResolvePartUri(x.SourceUri, x.TargetUri); + if (_openPackage.PartExists(absoluteURI)) + { + originPart = _openPackage.GetPart(absoluteURI); + } + break; + } + + if (originPart != null) + { + // get the specs from the origin + PackagePart specPart = null; + xs = originPart.GetRelationshipsByType("http://www.admin-shell.io/aasx/relationships/aas-spec"); + foreach (var x in xs) + { + //specPart = _openPackage.GetPart(x.TargetUri); + var absoluteURI = PackUriHelper.ResolvePartUri(x.SourceUri, x.TargetUri); + if (_openPackage.PartExists(absoluteURI)) + { + specPart = _openPackage.GetPart(absoluteURI); + } + break; + } + + if (specPart != null) + { + // get the supplementaries from the package, derived from spec + xs = specPart.GetRelationshipsByType("http://www.admin-shell.io/aasx/relationships/aas-suppl"); + foreach (var x in xs) + { + result.Add( + new AdminShellPackageSupplementaryFile( + x.TargetUri, location: AdminShellPackageSupplementaryFile.LocationType.InPackage)); + } + } + } + } + + // add or modify the files to delete + foreach (var psfDel in _pendingFilesToDelete) + { + // already in + var found = result.Find(x => { return x.Uri == psfDel.Uri; }); + if (found != null) + found.Location = AdminShellPackageSupplementaryFile.LocationType.DeletePending; + else + { + psfDel.Location = AdminShellPackageSupplementaryFile.LocationType.DeletePending; + result.Add(psfDel); + } + } + + // add the files to store as well + foreach (var psfAdd in _pendingFilesToAdd) + { + // already in (should not happen ?!) + var found = result.Find(x => { return x.Uri == psfAdd.Uri; }); + if (found != null) + found.Location = AdminShellPackageSupplementaryFile.LocationType.AddPending; + else + { + psfAdd.Location = AdminShellPackageSupplementaryFile.LocationType.AddPending; + result.Add(psfAdd); + } + } + + // done + return result; + } + + public static string GuessMimeType(string fn) + { + var file_ext = System.IO.Path.GetExtension(fn).ToLower().Trim(); + var content_type = System.Net.Mime.MediaTypeNames.Text.Plain; + if (file_ext == ".pdf") content_type = System.Net.Mime.MediaTypeNames.Application.Pdf; + if (file_ext == ".xml") content_type = System.Net.Mime.MediaTypeNames.Text.Xml; + if (file_ext == ".txt") content_type = System.Net.Mime.MediaTypeNames.Text.Plain; + if (file_ext == ".igs") content_type = "application/iges"; + if (file_ext == ".iges") content_type = "application/iges"; + if (file_ext == ".stp") content_type = "application/step"; + if (file_ext == ".step") content_type = "application/step"; + if (file_ext == ".jpg") content_type = System.Net.Mime.MediaTypeNames.Image.Jpeg; + if (file_ext == ".jpeg") content_type = System.Net.Mime.MediaTypeNames.Image.Jpeg; + if (file_ext == ".png") content_type = "image/png"; + if (file_ext == ".gif") content_type = System.Net.Mime.MediaTypeNames.Image.Gif; + return content_type; + } + + public void PrepareSupplementaryFileParameters(ref string targetDir, ref string targetFn) + { + // re-work target dir + if (targetDir != null) + targetDir = targetDir.Replace(@"\", "/"); + + // rework targetFn + if (targetFn != null) + targetFn = Regex.Replace(targetFn, @"[^A-Za-z0-9-.]+", "_"); + } + + /// + /// Add a file as supplementary file to package. Operation will be pending, package needs to be saved in order + /// materialize embedding. + /// + /// Target path of file in package + public string AddSupplementaryFileToStore( + string sourcePath, string targetDir, string targetFn, bool embedAsThumb, + AdminShellPackageSupplementaryFile.SourceGetByteChunk sourceGetBytesDel = null, string useMimeType = null) + { + // beautify parameters + if ((sourcePath == null && sourceGetBytesDel == null) || targetDir == null || targetFn == null) + return null; + + // build target path + targetDir = targetDir.Trim(); + if (!targetDir.EndsWith("/")) + targetDir += "/"; + targetFn = targetFn.Trim(); + if (sourcePath == "" || targetDir == "" || targetFn == "") + throw (new Exception("Trying add supplementary file with empty name or path!")); + + var targetPath = "" + targetDir.Trim() + targetFn.Trim(); + + // base function + AddSupplementaryFileToStore(sourcePath, targetPath, embedAsThumb, sourceGetBytesDel, useMimeType); + + // return target path + return targetPath; + } + + public void AddSupplementaryFileToStore(string sourcePath, string targetPath, bool embedAsThumb, + AdminShellPackageSupplementaryFile.SourceGetByteChunk sourceGetBytesDel = null, string useMimeType = null) + { + // beautify parameters + if ((sourcePath == null && sourceGetBytesDel == null) || targetPath == null) + return; + + sourcePath = sourcePath?.Trim(); + targetPath = targetPath.Trim(); + + // add record + _pendingFilesToAdd.Add( + new AdminShellPackageSupplementaryFile( + new Uri(targetPath, UriKind.RelativeOrAbsolute), + sourcePath, + location: AdminShellPackageSupplementaryFile.LocationType.AddPending, + specialHandling: (embedAsThumb + ? AdminShellPackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail + : AdminShellPackageSupplementaryFile.SpecialHandlingType.None), + sourceGetBytesDel: sourceGetBytesDel, + useMimeType: useMimeType) + ); + + } + + public void DeleteSupplementaryFile(AdminShellPackageSupplementaryFile psf) + { + if (psf == null) + throw (new Exception("No supplementary file given!")); + + if (psf.Location == AdminShellPackageSupplementaryFile.LocationType.AddPending) + { + // is still pending in add list -> remove + _pendingFilesToAdd.RemoveAll((x) => { return x.Uri == psf.Uri; }); + } + + if (psf.Location == AdminShellPackageSupplementaryFile.LocationType.InPackage) + { + // add to pending delete list + _pendingFilesToDelete.Add(psf); + } + } + + public void Close() + { + _openPackage?.Close(); + _openPackage = null; + _fn = ""; + _aasEnv = null; + } + + public void Flush() + { + if (_openPackage != null) + _openPackage.Flush(); + } + + public void Dispose() + { + Close(); + } + + public string MakePackageFileAvailableAsTempFile(string packageUri, bool keepFilename = false) + { + // access + if (packageUri == null) + return null; + + // get input stream + using (var input = GetLocalStreamFromPackage(packageUri)) + { + // generate tempfile name + string tempext = System.IO.Path.GetExtension(packageUri); + string temppath = System.IO.Path.GetTempFileName().Replace(".tmp", tempext); + + // maybe modify tempfile name? + if (keepFilename) + { + var masterFn = System.IO.Path.GetFileNameWithoutExtension(packageUri); + var tmpDir = System.IO.Path.GetDirectoryName(temppath); + var tmpFnExt = System.IO.Path.GetFileName(temppath); + + temppath = System.IO.Path.Combine(tmpDir, "" + masterFn + "_" + tmpFnExt); + } + + // copy to temp file + using (var temp = System.IO.File.OpenWrite(temppath)) + { + input.CopyTo(temp); + return temppath; + } + } + } + + public void EmbeddAssetInformationThumbnail(IResource defaultThumbnail, Stream fileContent) + { + // access + if (_openPackage == null) + throw (new Exception(string.Format($"AASX Package {_fn} not opened. Aborting!"))); + + if (!string.IsNullOrEmpty(defaultThumbnail.Path)) + { + var sourceUri = defaultThumbnail.Path.Replace(Path.DirectorySeparatorChar, '/'); + _openPackage.DeletePart(new Uri(sourceUri, UriKind.RelativeOrAbsolute)); + + } + var targetUri = PackUriHelper.CreatePartUri(new Uri(defaultThumbnail.Path, UriKind.RelativeOrAbsolute)); + + PackagePart packagePart = _openPackage.CreatePart(targetUri, defaultThumbnail.ContentType, compressionOption: CompressionOption.Maximum); + + _openPackage.CreateRelationship(packagePart.Uri, TargetMode.Internal, + "http://schemas.openxmlformats.org/package/2006/" + + "relationships/metadata/thumbnail"); + + //Write to the part + fileContent.Position = 0; + using (Stream dest = packagePart.GetStream()) + { + fileContent.CopyTo(dest); + } + } + } +} \ No newline at end of file diff --git a/src/AasxCsharpLibrary/AdminShellUtil.cs b/src/AasxCsharpLibrary/AdminShellUtil.cs new file mode 100644 index 000000000..34ba39821 --- /dev/null +++ b/src/AasxCsharpLibrary/AdminShellUtil.cs @@ -0,0 +1,1129 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ + +using AasxCompatibilityModels; +using Extensions; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.IO.Packaging; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Text.RegularExpressions; + +namespace AdminShellNS +{ + public static class AdminShellUtil + { + + #region Various utilities + // ------------------------------------------------------------------------------------ + + public static T[] GetEnumValues() where T : Enum + => (T[])Enum.GetValues(typeof(T)); + + public static IEnumerable GetEnumValues(T[] excludes) where T : Enum + { + foreach (var v in (T[])Enum.GetValues(typeof(T))) + if (!excludes.Contains(v)) + yield return v; + } + + #endregion + + #region V3 Methods + + public static void EnumerateSearchable( + SearchResults results, object obj, string qualifiedNameHead, int depth, SearchOptions options, + object businessObject = null) + { + // access + if (results == null || obj == null || options == null) + return; + Type objType = obj.GetType(); + + // depth + if (depth > options.maxDepth) + return; + + // try to get element name of an AAS entity + string elName = null; + if (obj is IReferable) + { + elName = (obj as IReferable).GetType().Name; + businessObject = obj; + } + + // enrich qualified name, accordingly + var qualifiedName = qualifiedNameHead; + if (elName != null) + qualifiedName = qualifiedName + (qualifiedName.Length > 0 ? "." : "") + elName; + + // do NOT dive into objects, which are not in the reight assembly + if (options.allowedAssemblies == null || !options.allowedAssemblies.Contains(objType.Assembly)) + return; + + // do not dive into enums + if (objType.IsEnum) + return; + + // look at fields, first + var fields = objType.GetFields(); + foreach (var fi in fields) + { + // is the object marked to be skipped? + var x3 = fi.GetCustomAttribute(); + if (x3 != null) + continue; + + var x4 = fi.GetCustomAttribute(); + if (x4 != null) + continue; + + // get value(s) + var fieldValue = fi.GetValue(obj); + if (fieldValue == null) + continue; + var valueElems = fieldValue as IList; + if (valueElems != null) + { + // field is a collection .. dive deeper, if allowed + foreach (var el in valueElems) + EnumerateSearchable(results, el, qualifiedName, depth + 1, options, businessObject); + } + else + { + // field is a single entity .. check it + CheckSearchable( + results, options, qualifiedName, businessObject, fi, fieldValue, obj, + () => { return fieldValue.GetHashCode(); }); + + // dive deeper .. + EnumerateSearchable(results, fieldValue, qualifiedName, depth + 1, options, businessObject); + } + } + + // properties & objects behind + var properties = objType.GetProperties(); + foreach (var pi in properties) + { + var gip = pi.GetIndexParameters(); + if (gip.Length > 0) + // no indexed properties, yet + continue; + + // is the object marked to be skipped? + var x3 = pi.GetCustomAttribute(); + if (x3 != null) + continue; + + var x4 = pi.GetCustomAttribute(); + if (x4 != null) + continue; + + // get value(s) + var propValue = pi.GetValue(obj, null); + if (propValue == null) + continue; + var valueElems = propValue as IList; + if (valueElems != null) + { + // property is a collection .. dive deeper, if allowed + foreach (var el in valueElems) + EnumerateSearchable(results, el, qualifiedName, depth + 1, options, businessObject); + } + else + { + // field is a single entity .. check it + CheckSearchable( + results, options, qualifiedName, businessObject, pi, propValue, obj, + () => { return propValue.GetHashCode(); }); + + // dive deeper .. + EnumerateSearchable(results, propValue, qualifiedName, depth + 1, options, businessObject); + } + } + } + + public static void CheckSearchable( + SearchResults results, SearchOptions options, string qualifiedNameHead, object businessObject, + MemberInfo mi, object memberValue, object containingObject, Func getMemberHash) + { + // try get a speaking name + var metaModelName = ""; + var x1 = mi.GetCustomAttribute(); + if (x1 != null && x1.name != null) + metaModelName = x1.name; + + // check if this object is searchable + var x2 = mi.GetCustomAttribute(); + if (x2 != null) + { + // what to check? + string foundText = "" + memberValue?.ToString(); + + // find options + var found = true; + if (options.findText != null) + found = foundText.IndexOf( + options.findText, options.isIgnoreCase ? StringComparison.CurrentCultureIgnoreCase : 0) >= 0; + + // add? + if (found) + { + var sri = new SearchResultItem(); + sri.searchOptions = options; + sri.qualifiedNameHead = qualifiedNameHead; + sri.metaModelName = metaModelName; + sri.businessObject = businessObject; + sri.foundText = foundText; + sri.foundObject = memberValue; + sri.containingObject = containingObject; + if (getMemberHash != null) + sri.foundHash = getMemberHash(); + + // avoid duplicates + if (!results.foundResults.Contains(sri)) + results.foundResults.Add(sri); + } + } + } + + public class SearchResultItem : IEquatable + { + public SearchOptions searchOptions; + public string qualifiedNameHead; + public string metaModelName; + public object businessObject; + public string foundText; + public object foundObject; + public object containingObject; + public int foundHash; + + public bool Equals(SearchResultItem other) + { + if (other == null) + return false; + + return this.qualifiedNameHead == other.qualifiedNameHead && + this.metaModelName == other.metaModelName && + this.businessObject == other.businessObject && + this.containingObject == other.containingObject && + this.foundText == other.foundText && + this.foundHash == other.foundHash; + } + } + + public class SearchResults + { + public int foundIndex = 0; + public List foundResults = new List(); + + public void Clear() + { + foundIndex = -1; + foundResults.Clear(); + } + } + + public class SearchOptions + { + public Assembly[] allowedAssemblies = null; + public int maxDepth = int.MaxValue; + public bool findFirst = false; + public int skipFirstResults = 0; + public string findText = null; + public bool isIgnoreCase = false; + public bool isRegex = false; + } + + public static string[] GetPopularMimeTypes() + { + return + new[] { + System.Net.Mime.MediaTypeNames.Text.Plain, + System.Net.Mime.MediaTypeNames.Text.Xml, + System.Net.Mime.MediaTypeNames.Text.Html, + "text/markdown", + "text/asciidoc", + "application/json", + "application/rdf+xml", + System.Net.Mime.MediaTypeNames.Application.Pdf, + System.Net.Mime.MediaTypeNames.Image.Jpeg, + "image/png", + System.Net.Mime.MediaTypeNames.Image.Gif, + "application/iges", + "application/step" + }; + } + + public static bool CheckForTextContentType(string input) + { + if (input == null) + return false; + input = input.Trim().ToLower(); + foreach (var tst in new[] { + System.Net.Mime.MediaTypeNames.Text.Plain, + System.Net.Mime.MediaTypeNames.Text.Xml, + System.Net.Mime.MediaTypeNames.Text.Html, + "text/markdown", + "text/asciidoc", + "application/json", + "application/rdf+xml" + }) + if (input.Contains(tst.ToLower())) + return true; + return false; + } + + public static IEnumerable GetAdequateEnums(AasSubmodelElements[] excludeValues = null, AasSubmodelElements[] includeValues = null) + { + if (includeValues != null) + { + foreach (var en in includeValues) + yield return en; + } + else + { + foreach (var en in (AasSubmodelElements[])Enum.GetValues(typeof(AasSubmodelElements))) + { + if (en == AasSubmodelElements.SubmodelElement) + continue; + if (excludeValues != null && excludeValues.Contains(en)) + continue; + yield return en; + } + } + } + + public static AasSubmodelElements? AasSubmodelElementsFrom() where T : ISubmodelElement + { + if (typeof(T) == typeof(Property)) + return AasSubmodelElements.Property; + if (typeof(T) == typeof(MultiLanguageProperty)) + return AasSubmodelElements.MultiLanguageProperty; + if (typeof(T) == typeof(AasCore.Aas3_0.Range)) + return AasSubmodelElements.Range; + if (typeof(T) == typeof(AasCore.Aas3_0.File)) + return AasSubmodelElements.File; + if (typeof(T) == typeof(Blob)) + return AasSubmodelElements.Blob; + if (typeof(T) == typeof(ReferenceElement)) + return AasSubmodelElements.ReferenceElement; + if (typeof(T) == typeof(RelationshipElement)) + return AasSubmodelElements.RelationshipElement; + if (typeof(T) == typeof(AnnotatedRelationshipElement)) + return AasSubmodelElements.AnnotatedRelationshipElement; + if (typeof(T) == typeof(Capability)) + return AasSubmodelElements.Capability; + if (typeof(T) == typeof(SubmodelElementCollection)) + return AasSubmodelElements.SubmodelElementCollection; + if (typeof(T) == typeof(Operation)) + return AasSubmodelElements.Operation; + if (typeof(T) == typeof(BasicEventElement)) + return AasSubmodelElements.BasicEventElement; + if (typeof(T) == typeof(Entity)) + return AasSubmodelElements.Entity; + return null; + } + + public static ISubmodelElement CreateSubmodelElementFromEnum(AasSubmodelElements smeEnum, ISubmodelElement sourceSme = null) + { + switch (smeEnum) + { + case AasSubmodelElements.Property: + { + return new Property(DataTypeDefXsd.String).UpdateFrom(sourceSme); + } + case AasSubmodelElements.MultiLanguageProperty: + { + return new MultiLanguageProperty().UpdateFrom(sourceSme); + } + case AasSubmodelElements.Range: + { + return new AasCore.Aas3_0.Range(DataTypeDefXsd.String).UpdateFrom(sourceSme); + } + case AasSubmodelElements.File: + { + return new AasCore.Aas3_0.File("").UpdateFrom(sourceSme); + } + case AasSubmodelElements.Blob: + { + return new Blob("").UpdateFrom(sourceSme); + } + case AasSubmodelElements.ReferenceElement: + { + // TODO (??, 0000-00-00): AAS core crashes without this + return new ReferenceElement( + value: new Reference(ReferenceTypes.ExternalReference, new List()) + ).UpdateFrom(sourceSme); + } + case AasSubmodelElements.RelationshipElement: + { + return new RelationshipElement( + new Reference(ReferenceTypes.ExternalReference, new List()), + new Reference(ReferenceTypes.ExternalReference, new List())) + .UpdateFrom(sourceSme); + } + case AasSubmodelElements.AnnotatedRelationshipElement: + { + return new AnnotatedRelationshipElement( + new Reference(ReferenceTypes.ExternalReference, new List()), + new Reference(ReferenceTypes.ExternalReference, new List())) + .UpdateFrom(sourceSme); + } + case AasSubmodelElements.Capability: + { + return new Capability().UpdateFrom(sourceSme); + } + case AasSubmodelElements.SubmodelElementCollection: + { + return new SubmodelElementCollection().UpdateFrom(sourceSme); + } + case AasSubmodelElements.SubmodelElementList: + { + return new SubmodelElementList(AasSubmodelElements.SubmodelElement).UpdateFrom(sourceSme); + } + case AasSubmodelElements.Operation: + { + return new Operation().UpdateFrom(sourceSme); + } + case AasSubmodelElements.BasicEventElement: + { + return new BasicEventElement(null, Direction.Input, StateOfEvent.Off).UpdateFrom(sourceSme); + } + case AasSubmodelElements.Entity: + { + return new Entity(EntityType.SelfManagedEntity).UpdateFrom(sourceSme); + } + default: + { + return null; + } + } + } + + #endregion + public static string EvalToNonNullString(string fmt, object o, string elseString = "") + { + if (o == null) + return elseString; + return string.Format(fmt, o); + } + + public static string EvalToNonEmptyString(string fmt, string o, string elseString = "") + { + if (o == null || o == "") + return elseString; + return string.Format(fmt, o); + } + + /// + /// If len of exceeds then + /// string is shortened and returned with an ellipsis(…) at the end. + /// + /// Shortened string + public static string ShortenWithEllipses(string str, int maxLen) + { + if (str == null) + return null; + if (maxLen >= 0 && str.Length > maxLen) + str = str.Substring(0, maxLen) + "\u2026"; + return str; + } + + /// + /// Returns a string without newlines and shortened (with ellipsis) + /// to a certain length + /// + /// Single-line, shortened string + public static string ToSingleLineShortened(string str, int maxLen, string textNewLine = " ") + { + str = str.ReplaceLineEndings(textNewLine); + return ShortenWithEllipses(str, maxLen); + } + + /// Creates a filter-friendly name from the source. + /// + /// Assert.AreEqual("", AdminShellUtil.FilterFriendlyName("")); + /// Assert.AreEqual("someName", AdminShellUtil.FilterFriendlyName("someName")); + /// Assert.AreEqual("some__name", AdminShellUtil.FilterFriendlyName("some!;name")); + /// + public static string FilterFriendlyName(string src) + { + if (src == null) + return null; + return Regex.Replace(src, @"[^a-zA-Z0-9\-_]", "_"); + } + + /// + /// Assert.IsFalse(AdminShellUtil.HasWhitespace("")); + /// Assert.IsTrue(AdminShellUtil.HasWhitespace(" ")); + /// Assert.IsTrue(AdminShellUtil.HasWhitespace("aa bb")); + /// Assert.IsTrue(AdminShellUtil.HasWhitespace(" aabb")); + /// Assert.IsTrue(AdminShellUtil.HasWhitespace("aabb ")); + /// Assert.IsFalse(AdminShellUtil.HasWhitespace("aabb")); + /// + public static bool HasWhitespace(string src) + { + if (src == null) + throw new ArgumentNullException(nameof(src)); + foreach (var s in src) + if (char.IsWhiteSpace(s)) + return true; + return false; + } + + /// Assert.IsTrue(AdminShellUtil.ComplyIdShort("")); + public static bool ComplyIdShort(string src) + { + if (src == null) + throw new ArgumentNullException(nameof(src)); + var res = true; + foreach (var s in src) + if (!Char.IsLetterOrDigit(s) && s != '_') + res = false; + if (src.Length > 0 && !Char.IsLetter(src[0])) + res = false; + return res; + } + + public static string ByteSizeHumanReadable(long len) + { + // see: https://stackoverflow.com/questions/281640/ + // how-do-i-get-a-human-readable-file-size-in-bytes-abbreviation-using-net + string[] sizes = { "B", "KB", "MB", "GB", "TB" }; + int order = 0; + while (len >= 1024 && order < sizes.Length - 1) + { + order++; + len = len / 1024; + } + // Adjust the format string to your preferences. For example "{0:0.#}{1}" would + // show a single decimal place, and no space. + string res = String.Format("{0:0.##} {1}", len, sizes[order]); + return res; + } + + public static string ExtractPascalCasingLetters(string src) + { + // access + src = src?.Trim(); + if (src == null || src.Length < 1) + return null; + + // walk through + var res = ""; + var arm = true; + foreach (var c in src) + { + // take? + if (arm && Char.IsUpper(c)) + res += c; + // state for next iteration + arm = !Char.IsUpper(c); + } + + // result + return res; + } + + public static string FromDouble(double input, string format) + { + return string.Format(CultureInfo.InvariantCulture, format, input); + } + + public static int CountHeadingSpaces(string line) + { + if (line == null) + return 0; + int j; + for (j = 0; j < line.Length; j++) + if (!Char.IsWhiteSpace(line[j])) + break; + return j; + } + + /// + /// Used to re-reformat a C# here string, which is multiline string introduced by @" ... "; + /// + public static string[] CleanHereStringToArray(string here) + { + if (here == null) + return null; + + // convert all weird breaks to pure new lines + here = here.Replace("\r\n", "\n"); + here = here.Replace("\n\r", "\n"); + + // convert all tabs to spaces + here = here.Replace("\t", " "); + + // split these + var lines = new List(here.Split('\n')); + if (lines.Count < 1) + return lines.ToArray(); + + // the first line could be special + string firstLine = null; + if (lines[0].Trim() != "") + { + firstLine = lines[0].Trim(); + lines.RemoveAt(0); + } + + // detect an constant amount of heading spaces + var headSpaces = int.MaxValue; + foreach (var line in lines) + if (line.Trim() != "") + headSpaces = Math.Min(headSpaces, CountHeadingSpaces(line)); + + // multi line trim possible? + if (headSpaces != int.MaxValue && headSpaces > 0) + for (int i = 0; i < lines.Count; i++) + if (lines[i].Length > headSpaces) + lines[i] = lines[i].Substring(headSpaces); + + // re-compose again + if (firstLine != null) + lines.Insert(0, firstLine); + + // return + return lines.ToArray(); + } + + /// + /// Used to re-reformat a C# here string, which is multiline string introduced by @" ... "; + /// + public static string CleanHereStringWithNewlines(string here, string nl = null) + { + if (nl == null) + nl = System.Environment.NewLine; + var lines = CleanHereStringToArray(here); + if (lines == null) + return null; + return String.Join(nl, lines); + } + + public static string ShortLocation(Exception ex) + { + if (ex == null || ex.StackTrace == null) + return ""; + string[] lines = ex.StackTrace.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None); + if (lines.Length < 1) + return ""; + // search for " in " + // as the most actual stacktrace might be a built-in function, this might not work and therefore + // go down in the stack + int currLine = 0; + while (true) + { + // nothing found at all + if (currLine >= lines.Length) + return ""; + // access current line + /* TODO (MIHO, 2020-11-12): replace with Regex for multi language. Ideally have Exception messages + always as English. */ + var p = lines[currLine].IndexOf(" in ", StringComparison.Ordinal); + if (p < 0) + p = lines[currLine].IndexOf(" bei ", StringComparison.Ordinal); + if (p < 0) + { + // advance to next oldest line + currLine++; + continue; + } + // search last "\" or "/", to get only filename portion and position + p = lines[currLine].LastIndexOfAny(new[] { '\\', '/' }); + if (p < 0) + { + // advance to next oldest line + currLine++; + continue; + } + // return this + return lines[currLine].Substring(p); + } + } + + public static string MapIntToStringArray(int? input, string ifNull, string[] choices) + { + if (input == null || choices == null || choices.Length < 1) + return ifNull; + int i = input ?? 0; + if (i < 0 || i >= choices.Length) + return ifNull; + return choices[i]; + } + + public static string MapBoolToStringArray(bool? input, string ifNull, string[] choices) + { + if (input == null || choices == null || choices.Length != 2) + return ifNull; + bool b = input ?? false; + return choices[b ? 1 : 0]; + } + + public enum ConstantFoundEnum { No, AnyCase, ExactCase } + + public static ConstantFoundEnum CheckIfInConstantStringArray(string[] arr, string str) + { + if (arr == null || str == null) + return ConstantFoundEnum.No; + + bool anyCaseFound = false; + bool exactCaseFound = false; + foreach (var a in arr) + { + anyCaseFound = anyCaseFound || str.ToLower() == a.ToLower(); + exactCaseFound = exactCaseFound || str == a; + } + if (exactCaseFound) + return ConstantFoundEnum.ExactCase; + if (anyCaseFound) + return ConstantFoundEnum.AnyCase; + return ConstantFoundEnum.No; + } + + public static string CorrectCasingForConstantStringArray(string[] arr, string str) + { + if (arr == null || str == null) + return str; + + foreach (var a in arr) + if (str.ToLower() == a.ToLower()) + return a; + + return str; + } + + // + // String manipulations + // + + public static string ReplacePercentPlaceholder( + string input, + string searchFor, + Func substLamda, + StringComparison comparisonType = StringComparison.InvariantCulture) + { + // access + if (input == null || searchFor == null || searchFor == "") + return input; + + // find + while (true) + { + // any occurence + var p = input.IndexOf(searchFor, comparisonType); + if (p < 0) + break; + + // split + var left = input.Substring(0, p); + var right = ""; + var rp = p + searchFor.Length; + if (rp < input.Length) + right = input.Substring(rp); + + // lambda + var repl = "" + substLamda?.Invoke(); + + // build new + input = left + repl + right; + } + + // ok + return input; + } + + public static string WrapLinesAtColumn(string text, int columnLimit) + { + // access + if (text == null) + return null; + if (columnLimit < 10) + return text; + + // idea: + // https://stackoverflow.com/questions/3961278/word-wrap-a-string-in-multiple-lines + // but: outer loop to handle line breaks, inner loop to handle words + + // split lines, preserving empty lines + var lines = Regex.Split(text, "\r\n|\r|\n"); + var outLines = new StringBuilder(); + foreach (var textLine in lines) + { + // now words. In future, may use regex? + var words = text.Split(new string[] { " " }, StringSplitOptions.None); + var sumLine = ""; + foreach (var word in words) + { + sumLine += word + " "; + if (sumLine.Length >= columnLimit) + { + outLines.AppendLine(sumLine); + sumLine = ""; + } + } + } + + // ok, result + return outLines.ToString(); + } + + // + // Reflection + // + + public static void SetFieldLazyValue(FieldInfo f, object obj, object value) + { + // access + if (f == null || obj == null) + return; + + switch (Type.GetTypeCode(f.FieldType)) + { + case TypeCode.String: + f.SetValue(obj, "" + value); + break; + + case TypeCode.Byte: + if (Byte.TryParse("" + value, out var ui8)) + f.SetValue(obj, ui8); + break; + + case TypeCode.SByte: + if (SByte.TryParse("" + value, out var i8)) + f.SetValue(obj, i8); + break; + + case TypeCode.Int16: + if (Int16.TryParse("" + value, out var i16)) + f.SetValue(obj, i16); + break; + + case TypeCode.Int32: + if (Int32.TryParse("" + value, out var i32)) + f.SetValue(obj, i32); + break; + + case TypeCode.Int64: + if (Int64.TryParse("" + value, out var i64)) + f.SetValue(obj, i64); + break; + + case TypeCode.UInt16: + if (UInt16.TryParse("" + value, out var ui16)) + f.SetValue(obj, ui16); + break; + + case TypeCode.UInt32: + if (UInt32.TryParse("" + value, out var ui32)) + f.SetValue(obj, ui32); + break; + + case TypeCode.UInt64: + if (UInt64.TryParse("" + value, out var ui64)) + f.SetValue(obj, ui64); + break; + + case TypeCode.Single: + if (Single.TryParse("" + value, NumberStyles.Float, + CultureInfo.InvariantCulture, out var sgl)) + f.SetValue(obj, sgl); + break; + + case TypeCode.Double: + if (Double.TryParse("" + value, NumberStyles.Float, + CultureInfo.InvariantCulture, out var dbl)) + f.SetValue(obj, dbl); + break; + + case TypeCode.Boolean: + var isFalse = value == null + || (value is int vi && vi == 0) + || (value is string vs && (vs == "" || vs == "false")) + || (value is bool vb && !vb); + f.SetValue(obj, !isFalse); + break; + } + } + + // + // temp file utilities + // + + // see: https://stackoverflow.com/questions/278439/creating-a-temporary-directory-in-windows + public static string GetTemporaryDirectory() + { + string tempDirectory = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); + Directory.CreateDirectory(tempDirectory); + return tempDirectory; + } + + // see: https://stackoverflow.com/questions/6386113/using-system-io-packaging-to-generate-a-zip-file + public static void AddFileToZip( + string zipFilename, string fileToAdd, + CompressionOption compression = CompressionOption.Normal, + FileMode fileMode = FileMode.OpenOrCreate) + { + using (Package zip = System.IO.Packaging.Package.Open(zipFilename, FileMode.OpenOrCreate)) + { + string destFilename = ".\\" + Path.GetFileName(fileToAdd); + Uri uri = PackUriHelper.CreatePartUri(new Uri(destFilename, UriKind.Relative)); + if (zip.PartExists(uri)) + { + zip.DeletePart(uri); + } + PackagePart part = zip.CreatePart(uri, "", compression); + using (FileStream fileStream = new FileStream(fileToAdd, FileMode.Open, FileAccess.Read)) + { + using (Stream dest = part.GetStream()) + { + fileStream.CopyTo(dest); + } + } + } + } + + // + // some URL enabled path handling + // + + /// + /// Uses System.IO.Path.GetExtension() to determine the extension part + /// of a path. If a URL based query is added to the extension, remove this. + /// + public static string GetExtensionWoQuery(string fn) + { + // access + if (fn == null) + return null; + + // use system function + var ext = System.IO.Path.GetExtension(fn).ToLower().Trim(); + + // as URLs *might* have an extension, but a loto f query string afterwards, + // lets try to cut of it + var extMatch = Regex.Match(ext, @"([._A-Za-z0-9]+)"); + if (extMatch.Success) + ext = extMatch.Groups[1].ToString(); + + // ok + return ext; + } + + // + // Base 64 + // + + public static string Base64Encode(string plainText) + { + var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText); + return System.Convert.ToBase64String(plainTextBytes); + } + + public static string Base64Decode(string base64EncodedData) + { + var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData); + return System.Text.Encoding.UTF8.GetString(base64EncodedBytes); + } + + public static bool CheckIfAsciiOnly(byte[] data, int bytesToCheck = int.MaxValue) + { + if (data == null) + return true; + + var ascii = true; + for (int i = 0; i < Math.Min(data.Length, bytesToCheck); i++) + if (data[i] >= 128) + ascii = false; + return ascii; + } + + // see: https://stackoverflow.com/questions/5209506/how-can-i-know-what-image-format-i-get-from-a-stream + // based on https://devblogs.microsoft.com/scripting/psimaging-part-1-test-image/ + // see https://en.wikipedia.org/wiki/List_of_file_signatures + /* Bytes in c# have a range of 0 to 255 so each byte can be represented as + * a two digit hex string. */ + private static readonly Dictionary SignatureTable = new Dictionary + { + { + ".jpg", + new[] + { + new[] {"FF", "D8", "FF", "DB"}, + new[] {"FF", "D8", "FF", "EE"}, + new[] {"FF", "D8", "FF", "E0", "00", "10", "4A", "46", "49", "46", "00", "01"} + } + }, + { + ".gif", + new[] + { + new [] { "47", "49", "46", "38", "37", "61" }, + new [] { "47", "49", "46", "38", "39", "61" } + } + }, + { + ".png", + new[] + { + new[] {"89", "50", "4E", "47", "0D", "0A", "1A", "0A"} + } + }, + { + ".bmp", + new [] + { + new[] { "42", "4D" } + } + } + }; + + /// + /// Takes a byte array and determines the image file type by + /// comparing the first few bytes of the file to a list of known + /// image file signatures. + /// + public static string GuessImageTypeExtension(byte[] imageData) + { + foreach (KeyValuePair signatureEntry in SignatureTable) + { + foreach (string[] signature in signatureEntry.Value) + { + bool isMatch = true; + for (int i = 0; i < signature.Length; i++) + { + string signatureByte = signature[i]; + + // ToString("X") gets the hex representation and pads it to always be length 2 + string imageByte = imageData[i] + .ToString("X2"); + + if (signatureByte == imageByte) + continue; + isMatch = false; + break; + } + + if (isMatch) + { + return signatureEntry.Key; + } + } + } + + return null; + } + + // + // Generation of Ids + // + + private static Random MyRnd = new Random(); + + public static string GenerateIdAccordingTemplate(string tpl) + { + // generate a deterministic decimal digit string + var decimals = String.Format("{0:ffffyyMMddHHmmss}", DateTime.UtcNow); + decimals = new string(decimals.Reverse().ToArray()); + // convert this to an int + if (!Int64.TryParse(decimals, out Int64 decii)) + decii = MyRnd.Next(Int32.MaxValue); + // make an hex out of this + string hexamals = decii.ToString("X"); + // make an alphanumeric string out of this + string alphamals = ""; + var dii = decii; + while (dii >= 1) + { + var m = dii % 26; + alphamals += Convert.ToChar(65 + m); + dii = dii / 26; + } + + // now, "salt" the strings + for (int i = 0; i < 32; i++) + { + var c = Convert.ToChar(48 + MyRnd.Next(10)); + decimals += c; + hexamals += c; + alphamals += c; + } + + // now, can just use the template + var id = ""; + foreach (var tpli in tpl) + { + if (tpli == 'D' && decimals.Length > 0) + { + id += decimals[0]; + decimals = decimals.Remove(0, 1); + } + else + if (tpli == 'X' && hexamals.Length > 0) + { + id += hexamals[0]; + hexamals = hexamals.Remove(0, 1); + } + else + if (tpli == 'A' && alphamals.Length > 0) + { + id += alphamals[0]; + alphamals = alphamals.Remove(0, 1); + } + else + id += tpli; + } + + // ok + return id; + } + + public static string RemoveNewLinesAndLimit(string input, int maxLength = -1, string ellipsis = "..") + { + // access + if (input == null) + return null; + + // maybe do a generouse limit first + if (maxLength >= 1 && input.Length > 2 * maxLength) + input = input.Substring(0, 2 * maxLength); + + // now do expensive operations + input = input.Replace('\r', ' '); + input = input.Replace('\n', ' '); + input = Regex.Replace(input, @"\s+", " ", RegexOptions.Compiled); + + // now apply exact limit + if (maxLength >= 1 && input.Length > maxLength) + input = input.Substring(0, maxLength) + ellipsis; + + // ok + return input; + } + + // + // language handling + // (used by some function on this basic level) + // + + public static string DefaultLngIso639 = "en?"; + + public static string GetDefaultLngIso639() + { + return DefaultLngIso639; + } + } +} diff --git a/src/AasxCsharpLibrary/AdminShellValidate.cs b/src/AasxCsharpLibrary/AdminShellValidate.cs new file mode 100644 index 000000000..028062908 --- /dev/null +++ b/src/AasxCsharpLibrary/AdminShellValidate.cs @@ -0,0 +1,320 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ + +using JetBrains.Annotations; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text.RegularExpressions; +using System.Xml; +using System.Xml.Schema; +using Environment = System.Environment; + +namespace AdminShellNS +{ + /// + /// validates the XML content against the AASX XML schema. + /// + /// Please produce instances with . + /// + public class XmlValidator + { + private System.Xml.Schema.XmlSchemaSet xmlSchemaSet; + + internal XmlValidator(XmlSchemaSet xmlSchemaSet) + { + this.xmlSchemaSet = xmlSchemaSet; + } + + /// + /// validates the given XML content and stores the results in the . + /// + /// Validation records + /// Content to be validated + public void Validate(AasValidationRecordList recs, Stream xmlContent) + { + if (recs == null) + throw new ArgumentException($"Unexpected null {nameof(recs)}"); + + if (xmlContent == null) + throw new ArgumentException($"Unexpected null {nameof(xmlContent)}"); + + // load/ validate on same records + var settings = new System.Xml.XmlReaderSettings(); + settings.ValidationType = System.Xml.ValidationType.Schema; + settings.Schemas = xmlSchemaSet; + + settings.ValidationEventHandler += + (object sender, System.Xml.Schema.ValidationEventArgs e) => + { + recs.Add( + new AasValidationRecord( + AasValidationSeverity.Serialization, null, + $"XML: {e?.Exception?.LineNumber}, {e?.Exception?.LinePosition}: {e?.Message}")); + }; + + // use the xml stream + using (var reader = System.Xml.XmlReader.Create(xmlContent, settings)) + { + while (reader.Read()) + { + // Invoke callbacks + }; + } + } + } + + public enum AasValidationSeverity + { + Hint, Warning, SpecViolation, SchemaViolation, Serialization + } + + [UsedImplicitlyAttribute] // for eventual use + public enum AasValidationAction + { + No, ToBeDeleted + } + + public class AasValidationRecord + { + public AasValidationSeverity Severity = AasValidationSeverity.Hint; + public IReferable Source = null; + public string Message = ""; + + public Action Fix = null; + + public AasValidationRecord(AasValidationSeverity Severity, IReferable Source, + string Message, Action Fix = null) + { + this.Severity = Severity; + this.Source = Source; + this.Message = Message; + this.Fix = Fix; + } + + public override string ToString() + { + return $"[{Severity.ToString()}] in {"" + Source?.ToString()}: {"" + Message}"; + } + + public string DisplaySeverity { get { return "" + Severity.ToString(); } } + public string DisplaySource + { + get + { + return "" + ((Source != null) ? Source.ToString() : "(whole content)"); + } + } + public string DisplayMessage { get { return "" + Message?.ToString(); } } + } + + public class AasValidationRecordList : List + { + } + + public static class AasSchemaValidation + { + public enum SerializationFormat { XML, JSON } + + public static string[] GetSchemaResources(SerializationFormat fmt) + { + if (fmt == SerializationFormat.XML) + { + return new[] + { + "AdminShellNS.Resources.schemaV201.AAS.xsd", + "AdminShellNS.Resources.schemaV201.AAS_ABAC.xsd", + "AdminShellNS.Resources.schemaV201.IEC61360.xsd" + }; + } + if (fmt == SerializationFormat.JSON) + { + return new[] + { + "AdminShellNS.Resources.schemaV201.aas.json" + }; + } + return null; + } + + /// + /// produces a validator which validates XML AASX files. + /// + /// initialized validator + public static XmlValidator NewXmlValidator() + { + // Load the schema files + var files = GetSchemaResources(SerializationFormat.XML); + if (files == null) + throw new InvalidOperationException("No XML schema files could be found in the resources."); + + var xmlSchemaSet = new System.Xml.Schema.XmlSchemaSet(); + xmlSchemaSet.XmlResolver = new System.Xml.XmlUrlResolver(); + + try + { + Assembly myAssembly = Assembly.GetExecutingAssembly(); + foreach (var schemaFn in files) + { + using (Stream schemaStream = myAssembly.GetManifestResourceStream(schemaFn)) + { + using (XmlReader schemaReader = XmlReader.Create(schemaStream)) + { + xmlSchemaSet.Add(null, schemaReader); + } + } + } + } + catch (Exception ex) + { + throw new FileNotFoundException( + $"Error accessing embedded resource schema files: {ex.Message}"); + } + + var newRecs = new AasValidationRecordList(); + + // set up messages + xmlSchemaSet.ValidationEventHandler += (object sender, System.Xml.Schema.ValidationEventArgs e) => + { + newRecs.Add( + new AasValidationRecord( + AasValidationSeverity.Serialization, null, + $"{e?.Exception?.LineNumber}, {e?.Exception?.LinePosition}: {e?.Message}")); + }; + + // compile + try + { + xmlSchemaSet.Compile(); + } + catch (Exception ex) + { + throw new InvalidOperationException( + $"Error compiling schema files: {ex.Message}"); + } + + if (newRecs.Count > 0) + { + var parts = new List { $"Failed to compile the schema files:" }; + parts.AddRange(newRecs.Select((r) => r.Message)); + throw new InvalidOperationException(string.Join(Environment.NewLine, parts)); + } + + return new XmlValidator(xmlSchemaSet); + } + + /// + /// creates an XML validator and applies it on the given content. + /// + /// If you repeatedly need to validate XML against a schema, re-use an instance of + /// produced with . + /// + /// Validation records + /// Content to be validated + public static void ValidateXML(AasValidationRecordList recs, Stream xmlContent) + { + var validator = NewXmlValidator(); + validator.Validate(recs, xmlContent); + } + + public static int ValidateJSONAlternative(AasValidationRecordList recs, Stream jsonContent) + { + // see: https://github.com/RicoSuter/NJsonSchema/wiki/JsonSchemaValidator + var newRecs = new AasValidationRecordList(); + + // access + if (recs == null || jsonContent == null) + return -1; + + // Load the schema files + // right now: exactly ONE schema file + var files = GetSchemaResources(SerializationFormat.JSON); + if (files == null || files.Length != 1) + return -1; + + NJsonSchema.JsonSchema schema = null; + + try + { + Assembly myAssembly = Assembly.GetExecutingAssembly(); + foreach (var schemaFn in files) + { + using (Stream schemaStream = myAssembly.GetManifestResourceStream(schemaFn)) + { + using (var streamReader = new StreamReader(schemaStream)) + { + var allTxt = streamReader.ReadToEnd(); + schema = NJsonSchema.JsonSchema.FromJsonAsync(allTxt).GetAwaiter().GetResult(); + break; + } + } + } + } + catch (Exception ex) + { + throw new FileNotFoundException("ValidateJSON: Error loading schema: " + + ex.Message); + } + + if (schema == null) + { + throw new FileNotFoundException("ValidateJSON: Schema not found properly."); + } + + // create validator + var validator = new NJsonSchema.Validation.JsonSchemaValidator(); + + // load the JSON content + string jsonTxt = null; + try + { + using (var streamReader = new StreamReader(jsonContent)) + { + jsonTxt = streamReader.ReadToEnd(); + } + } + catch (Exception ex) + { + throw new InvalidOperationException("ValidateJSON: Error loading JSON content: " + + ex.Message); + } + + if (jsonTxt == null || jsonTxt == "") + throw new InvalidOperationException("ValidateJSON: Error loading JSON content gave null."); + + // validate + ICollection errors; + try + { + errors = validator.Validate(jsonTxt, schema); + } + catch (Exception ex) + { + throw new InvalidOperationException("ValidateJSON: Error when validating: " + + ex.Message); + } + + // re-format messages + if (errors != null) + foreach (var ve in errors) + { + var msg = ("" + ve.ToString()); + msg = Regex.Replace(msg, @"\s+", " "); + newRecs.Add(new AasValidationRecord(AasValidationSeverity.Serialization, null, + $"JSON: {ve.LineNumber,5},{ve.LinePosition:3}: {msg}")); + } + + // result + recs.AddRange(newRecs); + return newRecs.Count; + } + } +} diff --git a/src/AasxCsharpLibrary/Display/EnumerationPlacmentBase.cs b/src/AasxCsharpLibrary/Display/EnumerationPlacmentBase.cs new file mode 100644 index 000000000..cabfedcf0 --- /dev/null +++ b/src/AasxCsharpLibrary/Display/EnumerationPlacmentBase.cs @@ -0,0 +1,15 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +namespace AdminShellNS +{ + public class EnumerationPlacmentBase + { + + } +} diff --git a/src/AasxCsharpLibrary/Display/EnumerationPlacmentOperationVariable.cs b/src/AasxCsharpLibrary/Display/EnumerationPlacmentOperationVariable.cs new file mode 100644 index 000000000..39e005483 --- /dev/null +++ b/src/AasxCsharpLibrary/Display/EnumerationPlacmentOperationVariable.cs @@ -0,0 +1,16 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +namespace AdminShellNS +{ + public class EnumerationPlacmentOperationVariable : EnumerationPlacmentBase + { + public OperationVariableDirection Direction; + public OperationVariable OperationVariable; + } +} diff --git a/src/AasxCsharpLibrary/Display/OperationVariableDirection.cs b/src/AasxCsharpLibrary/Display/OperationVariableDirection.cs new file mode 100644 index 000000000..479344aa0 --- /dev/null +++ b/src/AasxCsharpLibrary/Display/OperationVariableDirection.cs @@ -0,0 +1,17 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +namespace AdminShellNS +{ + public enum OperationVariableDirection + { + In, + Out, + InOut + } +} diff --git a/src/AasxCsharpLibrary/Exceptions/MetamodelVerificationException.cs b/src/AasxCsharpLibrary/Exceptions/MetamodelVerificationException.cs new file mode 100644 index 000000000..c392c6441 --- /dev/null +++ b/src/AasxCsharpLibrary/Exceptions/MetamodelVerificationException.cs @@ -0,0 +1,26 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using System; +using System.Collections.Generic; +using static AasCore.Aas3_0.Reporting; + +namespace AdminShellNS.Exceptions +{ + public class MetamodelVerificationException : Exception + { + public List ErrorList { get; } + + public MetamodelVerificationException(List errorList) : base($"The request body not conformant with the metamodel. Found {errorList.Count} errors !!") + { + ErrorList = errorList; + } + + + } +} diff --git a/src/AasxCsharpLibrary/Exceptions/NullValueException.cs b/src/AasxCsharpLibrary/Exceptions/NullValueException.cs new file mode 100644 index 000000000..bd6eea201 --- /dev/null +++ b/src/AasxCsharpLibrary/Exceptions/NullValueException.cs @@ -0,0 +1,20 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using System; + +namespace AdminShellNS.Exceptions +{ + public class NullValueException : Exception + { + public NullValueException(string field) : base($"The field {field} is null!!") + { + + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/AasElementSelfDescription.cs b/src/AasxCsharpLibrary/Extensions/AasElementSelfDescription.cs new file mode 100644 index 000000000..30f50dee3 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/AasElementSelfDescription.cs @@ -0,0 +1,30 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +namespace Extensions +{ + public class AasElementSelfDescription + { + public string AasElementName { get; set; } + + public string ElementAbbreviation { get; set; } + + public KeyTypes? KeyType { get; set; } + + public AasSubmodelElements? SmeType { get; set; } + + public AasElementSelfDescription(string aasElementName, string elementAbbreviation, + KeyTypes? keyType, AasSubmodelElements? smeType) + { + AasElementName = aasElementName; + ElementAbbreviation = elementAbbreviation; + KeyType = keyType; + SmeType = smeType; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ComparerUtils.cs b/src/AasxCsharpLibrary/Extensions/ComparerUtils.cs new file mode 100644 index 000000000..b3cf12662 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ComparerUtils.cs @@ -0,0 +1,69 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using System.Collections.Generic; +using System.Globalization; + +namespace Extensions +{ + public static class CompareUtils + { + public static bool Compare(T x, T y) + { + return EqualityComparer.Default.Equals(x, y); + } + } + public class ComparerIdShort : IComparer + { + public int Compare(IReferable a, IReferable b) + { + return string.Compare(a?.IdShort, b?.IdShort, + CultureInfo.InvariantCulture, CompareOptions.IgnoreCase); + } + } + + public class ComparerIdentification : IComparer + { + public int Compare(IIdentifiable a, IIdentifiable b) + { + return string.Compare(a.Id, b.Id, + CultureInfo.InvariantCulture, CompareOptions.IgnoreCase | CompareOptions.IgnoreNonSpace); + } + } + + + + public class ComparerIndexed : IComparer + { + public int NullIndex = int.MaxValue; + public Dictionary Index = new(); + + public int Compare(IReferable a, IReferable b) + { + var ca = Index.ContainsKey(a); + var cb = Index.ContainsKey(b); + + if (!ca && !cb) + return 0; + // make CDs without usage to appear at end of list + if (!ca) + return +1; + if (!cb) + return -1; + + var ia = Index[a]; + var ib = Index[b]; + + if (ia == ib) + return 0; + if (ia < ib) + return -1; + return +1; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendAnnotatedRelationshipElement.cs b/src/AasxCsharpLibrary/Extensions/ExtendAnnotatedRelationshipElement.cs new file mode 100644 index 000000000..3538adfa1 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendAnnotatedRelationshipElement.cs @@ -0,0 +1,132 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using AdminShellNS; +using AdminShellNS.Extensions; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Extensions +{ + public static class ExtendAnnotatedRelationshipElement + { + #region AasxPackageExplorer + + public static void Add(this AnnotatedRelationshipElement annotatedRelationshipElement, ISubmodelElement submodelElement) + { + if (annotatedRelationshipElement != null) + { + annotatedRelationshipElement.Annotations ??= new(); + + submodelElement.Parent = annotatedRelationshipElement; + + annotatedRelationshipElement.Annotations.Add((IDataElement)submodelElement); + } + } + + public static void Remove(this AnnotatedRelationshipElement annotatedRelationshipElement, ISubmodelElement submodelElement) + { + if (annotatedRelationshipElement != null) + { + if (annotatedRelationshipElement.Annotations != null) + { + annotatedRelationshipElement.Annotations.Remove((IDataElement)submodelElement); + } + } + } + + public static object AddChild( + this AnnotatedRelationshipElement annotatedRelationshipElement, + ISubmodelElement childSubmodelElement, + EnumerationPlacmentBase placement = null) + { + if (childSubmodelElement == null || childSubmodelElement is not IDataElement) + return null; + + annotatedRelationshipElement.Annotations ??= new(); + + if (childSubmodelElement != null) + childSubmodelElement.Parent = annotatedRelationshipElement; + + annotatedRelationshipElement.Annotations.Add((IDataElement)childSubmodelElement); + return childSubmodelElement; + } + + #endregion + public static AnnotatedRelationshipElement ConvertAnnotationsFromV20(this AnnotatedRelationshipElement annotatedRelationshipElement, AasxCompatibilityModels.AdminShellV20.AnnotatedRelationshipElement sourceAnnotedRelElement) + { + if (sourceAnnotedRelElement == null) + { + return null; + } + + if (!sourceAnnotedRelElement.annotations.IsNullOrEmpty()) + { + annotatedRelationshipElement.Annotations ??= new List(); + foreach (var submodelElementWrapper in sourceAnnotedRelElement.annotations) + { + var sourceSubmodelElement = submodelElementWrapper.submodelElement; + ISubmodelElement outputSubmodelElement = null; + if (sourceSubmodelElement != null) + { + outputSubmodelElement = outputSubmodelElement.ConvertFromV20(sourceSubmodelElement); + } + annotatedRelationshipElement.Annotations.Add((IDataElement)outputSubmodelElement); + } + } + + return annotatedRelationshipElement; + } + + public static T FindFirstIdShortAs(this AnnotatedRelationshipElement annotedRelationshipElement, string idShort) where T : ISubmodelElement + { + + var submodelElements = annotedRelationshipElement.Annotations.Where(sme => sme != null && sme is T && sme.IdShort.Equals(idShort, StringComparison.OrdinalIgnoreCase)); + + if (submodelElements.Any()) + { + return (T)submodelElements.First(); + } + + return default; + } + + public static AnnotatedRelationshipElement Set(this AnnotatedRelationshipElement elem, + Reference first, Reference second) + { + elem.First = first; + elem.Second = second; + return elem; + } + + public static AnnotatedRelationshipElement UpdateFrom( + this AnnotatedRelationshipElement elem, ISubmodelElement source) + { + if (source == null) + return elem; + + ((ISubmodelElement)elem).UpdateFrom(source); + + if (source is ReferenceElement srcRef) + { + if (srcRef.Value != null) + elem.First = srcRef.Value.Copy(); + } + + if (source is RelationshipElement srcRel) + { + if (srcRel.First != null) + elem.First = srcRel.First.Copy(); + } + + return elem; + } + + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendAssetAdministrationShell.cs b/src/AasxCsharpLibrary/Extensions/ExtendAssetAdministrationShell.cs new file mode 100644 index 000000000..b2d2407b8 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendAssetAdministrationShell.cs @@ -0,0 +1,271 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using AdminShellNS; +using AdminShellNS.Extensions; +using System; +using System.Collections.Generic; +using System.Text.RegularExpressions; + +namespace Extensions +{ + public static class ExtendAssetAdministrationShell + { + #region AasxPackageExplorer + + public static Tuple ToCaptionInfo(this IAssetAdministrationShell assetAdministrationShell) + { + var caption = AdminShellUtil.EvalToNonNullString("\"{0}\" ", assetAdministrationShell.IdShort, "\"AAS\""); + if (assetAdministrationShell.Administration != null) + caption += "V" + assetAdministrationShell.Administration.Version + "." + assetAdministrationShell.Administration.Revision; + + var info = ""; + if (assetAdministrationShell.Id != null) + info = $"[{assetAdministrationShell.Id}]"; + return Tuple.Create(caption, info); + } + + public static IEnumerable FindAllReferences(this IAssetAdministrationShell assetAdministrationShell) + { + // dead-csharp off + // Asset + //TODO (jtikekar, 0000-00-00): support asset + //if (assetAdministrationShell.AssetInformation != null) + // yield return new LocatedReference(assetAdministrationShell, assetAdministrationShell.AssetInformation); + // dead-csharp on + // Submodel references + if (assetAdministrationShell.Submodels != null) + foreach (var r in assetAdministrationShell.Submodels) + yield return new LocatedReference(assetAdministrationShell, r); + + } + + #endregion + + public static bool HasSubmodelReference(this IAssetAdministrationShell assetAdministrationShell, Reference submodelReference) + { + if (submodelReference == null) + { + return false; + } + + foreach (var aasSubmodelReference in assetAdministrationShell.Submodels) + { + if (aasSubmodelReference.Matches(submodelReference)) + { + return true; + } + } + + return false; + } + + public static void AddSubmodelReference(this IAssetAdministrationShell assetAdministrationShell, IReference newSubmodelReference) + { + if (assetAdministrationShell.Submodels == null) + { + assetAdministrationShell.Submodels = new List(); + } + + assetAdministrationShell.Submodels.Add(newSubmodelReference); + } + + //TODO (jtikekar, 0000-00-00): Change the name, currently based on older implementation + public static string GetFriendlyName(this IAssetAdministrationShell assetAdministrationShell) + { + if (string.IsNullOrEmpty(assetAdministrationShell.IdShort)) + { + return null; + } + + return Regex.Replace(assetAdministrationShell.IdShort, @"[^a-zA-Z0-9\-_]", "_"); + } + + public static AssetAdministrationShell ConvertFromV10(this AssetAdministrationShell assetAdministrationShell, AasxCompatibilityModels.AdminShellV10.AdministrationShell sourceAas) + { + if (sourceAas == null) + { + return null; + } + + if (string.IsNullOrEmpty(sourceAas.idShort)) + { + assetAdministrationShell.IdShort = ""; + } + else + { + assetAdministrationShell.IdShort = sourceAas.idShort; + } + + if (sourceAas.description != null) + { + assetAdministrationShell.Description = ExtensionsUtil.ConvertDescriptionFromV10(sourceAas.description); + } + + if (sourceAas.administration != null) + { + assetAdministrationShell.Administration = new AdministrativeInformation(version: sourceAas.administration.version, revision: sourceAas.administration.revision); + } + + if (sourceAas.derivedFrom != null) + { + var newKeyList = new List(); + + foreach (var sourceKey in sourceAas.derivedFrom.Keys) + { + var keyType = Stringification.KeyTypesFromString(sourceKey.type); + if (keyType != null) + { + newKeyList.Add(new Key((KeyTypes)keyType, sourceKey.value)); + } + else + { + Console.WriteLine($"KeyType value {sourceKey.type} not found."); + } + } + assetAdministrationShell.DerivedFrom = new Reference(ReferenceTypes.ExternalReference, newKeyList); + } + + if (!sourceAas.submodelRefs.IsNullOrEmpty()) + { + foreach (var submodelRef in sourceAas.submodelRefs) + { + if (!submodelRef.IsEmpty) + { + var keyList = new List(); + foreach (var refKey in submodelRef.Keys) + { + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {refKey.type} not found."); + } + } + assetAdministrationShell.Submodels ??= new List(); + assetAdministrationShell.Submodels.Add(new Reference(ReferenceTypes.ModelReference, keyList)); + } + } + } + + if (sourceAas.hasDataSpecification != null && sourceAas.hasDataSpecification.reference.Count > 0) + { + //TODO (jtikekar, 0000-00-00): EmbeddedDataSpecification?? (as per old implementation) + assetAdministrationShell.EmbeddedDataSpecifications ??= new List(); + foreach (var dataSpecification in sourceAas.hasDataSpecification.reference) + { + if (!dataSpecification.IsEmpty) + { + assetAdministrationShell.EmbeddedDataSpecifications.Add(new EmbeddedDataSpecification( + ExtensionsUtil.ConvertReferenceFromV10(dataSpecification, ReferenceTypes.ExternalReference), + null)); + } + } + } + + return assetAdministrationShell; + } + + public static AssetAdministrationShell ConvertFromV20(this AssetAdministrationShell assetAdministrationShell, AasxCompatibilityModels.AdminShellV20.AdministrationShell sourceAas) + { + if (sourceAas == null) + { + return null; + } + + if (string.IsNullOrEmpty(sourceAas.idShort)) + { + assetAdministrationShell.IdShort = ""; + } + else + { + assetAdministrationShell.IdShort = sourceAas.idShort; + } + + if (sourceAas.description != null) + { + assetAdministrationShell.Description = ExtensionsUtil.ConvertDescriptionFromV20(sourceAas.description); + } + + if (sourceAas.administration != null) + { + assetAdministrationShell.Administration = new AdministrativeInformation(version: sourceAas.administration.version, revision: sourceAas.administration.revision); + } + + if (sourceAas.derivedFrom != null) + { + var newKeyList = new List(); + + foreach (var sourceKey in sourceAas.derivedFrom.Keys) + { + var keyType = Stringification.KeyTypesFromString(sourceKey.type); + if (keyType != null) + { + newKeyList.Add(new Key((KeyTypes)keyType, sourceKey.value)); + } + else + { + Console.WriteLine($"KeyType value {sourceKey.type} not found."); + } + } + assetAdministrationShell.DerivedFrom = new Reference(ReferenceTypes.ExternalReference, newKeyList); + } + + if (!sourceAas.submodelRefs.IsNullOrEmpty()) + { + foreach (var submodelRef in sourceAas.submodelRefs) + { + if (!submodelRef.IsEmpty) + { + var keyList = new List(); + foreach (var refKey in submodelRef.Keys) + { + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {refKey.type} not found."); + } + } + assetAdministrationShell.Submodels ??= new List(); + assetAdministrationShell.Submodels.Add(new Reference(ReferenceTypes.ModelReference, keyList)); + } + } + } + + if (sourceAas.hasDataSpecification != null && sourceAas.hasDataSpecification.Count > 0) + { + //TODO (jtikekar, 0000-00-00): EmbeddedDataSpecification?? (as per old implementation) + if (assetAdministrationShell.EmbeddedDataSpecifications == null) + { + assetAdministrationShell.EmbeddedDataSpecifications = new List(); + } + + //TODO (jtikekar, 0000-00-00): DataSpecificationContent?? (as per old implementation) + foreach (var sourceDataSpec in sourceAas.hasDataSpecification) + { + if (sourceDataSpec.dataSpecification != null) + { + assetAdministrationShell.EmbeddedDataSpecifications.Add( + new EmbeddedDataSpecification( + ExtensionsUtil.ConvertReferenceFromV20(sourceDataSpec.dataSpecification, ReferenceTypes.ExternalReference), + null)); + } + } + } + + return assetAdministrationShell; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendAssetInformation.cs b/src/AasxCsharpLibrary/Extensions/ExtendAssetInformation.cs new file mode 100644 index 000000000..29250c4c3 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendAssetInformation.cs @@ -0,0 +1,65 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using System; + +namespace Extensions +{ + public static class ExtendAssetInformation + { + #region AasxPackageExplorer + + public static Tuple ToCaptionInfo(this IAssetInformation assetInformation) + { + // dead-csharp off + //TODO (jtikekar, 0000-00-00): support KeyType.AssetInformation + //var caption = Key.AssetInformation; + // dead-csharp on + var caption = "AssetInformation"; + var info = "" + assetInformation.GlobalAssetId; + return Tuple.Create(caption, info); + } + + #endregion + public static AssetInformation ConvertFromV10(this AssetInformation assetInformation, AasxCompatibilityModels.AdminShellV10.Asset sourceAsset) + { + //Determine AssetKind + var assetKind = AssetKind.Instance; + if (sourceAsset.kind.IsType) + { + assetKind = AssetKind.Type; + } + + assetInformation.AssetKind = assetKind; + + + //Assign GlobalAssetId + assetInformation.GlobalAssetId = sourceAsset.identification.id; + + return assetInformation; + } + + public static AssetInformation ConvertFromV20(this AssetInformation assetInformation, AasxCompatibilityModels.AdminShellV20.Asset sourceAsset) + { + //Determine AssetKind + var assetKind = AssetKind.Instance; + if (sourceAsset.kind.IsType) + { + assetKind = AssetKind.Type; + } + + assetInformation.AssetKind = assetKind; + + + //Assign GlobalAssetId + assetInformation.GlobalAssetId = sourceAsset.identification.id; + + return assetInformation; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendBlob.cs b/src/AasxCsharpLibrary/Extensions/ExtendBlob.cs new file mode 100644 index 000000000..d8ee065e8 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendBlob.cs @@ -0,0 +1,75 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using System.Text; + +namespace Extensions +{ + public static class ExtendBlob + { + public static void Set(this Blob blob, + string contentType = "", byte[]? value = null) + { + blob.ContentType = contentType; + blob.Value = value; + } + + public static Blob ConvertFromV10(this Blob blob, AasxCompatibilityModels.AdminShellV10.Blob sourceBlob) + { + blob.ContentType = sourceBlob.mimeType; + blob.Value = Encoding.ASCII.GetBytes(sourceBlob.value); + return blob; + } + + public static Blob ConvertFromV20(this Blob blob, AasxCompatibilityModels.AdminShellV20.Blob sourceBlob) + { + blob.ContentType = sourceBlob.mimeType; + if (!string.IsNullOrEmpty(sourceBlob.value)) + { + blob.Value = Encoding.ASCII.GetBytes(sourceBlob.value); + } + return blob; + } + + public static Blob UpdateFrom(this Blob elem, ISubmodelElement source) + { + if (source == null) + return elem; + + ((ISubmodelElement)elem).UpdateFrom(source); + + if (source is Property srcProp) + { + if (srcProp.Value != null) + elem.Value = Encoding.Default.GetBytes(srcProp.Value); + } + + if (source is AasCore.Aas3_0.Range srcRng) + { + if (srcRng.Min != null) + elem.Value = Encoding.Default.GetBytes(srcRng.Min); + } + + if (source is MultiLanguageProperty srcMlp) + { + var s = srcMlp.Value?.GetDefaultString(); + if (s != null) + elem.Value = Encoding.Default.GetBytes(s); + } + + if (source is File srcFile) + { + if (srcFile.Value != null) + elem.Value = Encoding.Default.GetBytes(srcFile.Value); + } + + return elem; + } + + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendCollection.cs b/src/AasxCsharpLibrary/Extensions/ExtendCollection.cs new file mode 100644 index 000000000..3acde94a4 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendCollection.cs @@ -0,0 +1,17 @@ +using System.Collections.Generic; + +namespace AdminShellNS.Extensions +{ + public static class ExtendCollection + { + public static bool IsNullOrEmpty(this List list) + { + if (list != null && list.Count != 0) + { + return false; + } + + return true; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendConceptDescription.cs b/src/AasxCsharpLibrary/Extensions/ExtendConceptDescription.cs new file mode 100644 index 000000000..7bb64c7e8 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendConceptDescription.cs @@ -0,0 +1,320 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using AdminShellNS; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Extensions +{ + public static class ExtendConceptDescription + { + #region AasxPackageExplorer + + public static string GetDefaultPreferredName(this IConceptDescription conceptDescription, string defaultLang = null) + { + return "" + + conceptDescription.GetIEC61360()? + .PreferredName?.GetDefaultString(defaultLang); + } + + public static EmbeddedDataSpecification SetIEC61360Spec(this IConceptDescription conceptDescription, + string[] preferredNames = null, + string shortName = "", + string unit = "", + Reference unitId = null, + string valueFormat = null, + string sourceOfDefinition = null, + string symbol = null, + string dataType = "", + string[] definition = null + ) + { + var eds = new EmbeddedDataSpecification( + new Reference(ReferenceTypes.ExternalReference, + new List { ExtendIDataSpecificationContent.GetKeyForIec61360() }), + new DataSpecificationIec61360( + ExtendLangStringSet.CreateManyPreferredNamesFromStringArray(preferredNames), + new List { + new LangStringShortNameTypeIec61360(AdminShellUtil.GetDefaultLngIso639(), shortName) }, + unit, + unitId, + sourceOfDefinition, + symbol, + Stringification.DataTypeIec61360FromString(dataType), + ExtendLangStringSet.CreateManyDefinitionFromStringArray(definition) + )); + + conceptDescription.EmbeddedDataSpecifications = new List { eds }; + // dead-csharp off + // TODO (MIHO, 2022-12-22): Check, but I think it makes no sense + // conceptDescription.IsCaseOf ??= new List(); + // conceptDescription.IsCaseOf.Add(new Reference(ReferenceTypes.ModelReference, new List() { new Key(KeyTypes.ConceptDescription, conceptDescription.Id) })); + + return eds; + } + + /* + + public static DataSpecificationIec61360 CreateDataSpecWithContentIec61360(this ConceptDescription conceptDescription) + { + var eds = EmbeddedDataSpecification.CreateIEC61360WithContent(); + conceptDescription.EmbeddedDataSpecification ??= new HasDataSpecification(); + conceptDescription.EmbeddedDataSpecification.Add(eds); + return eds.DataSpecificationContent?.DataSpecificationIEC61360; + } + + */ + // dead-csharp on + + public static Tuple ToCaptionInfo(this IConceptDescription conceptDescription) + { + var caption = ""; + if (!string.IsNullOrEmpty(conceptDescription.IdShort)) + caption = $"\"{conceptDescription.IdShort.Trim()}\""; + if (conceptDescription.Id != null) + caption = (caption + " " + conceptDescription.Id).Trim(); + + var info = "" + conceptDescription.GetDefaultShortName(); + + return Tuple.Create(caption, info); + } + + public static string GetDefaultShortName(this IConceptDescription conceptDescription, string defaultLang = null) + { + return "" + + conceptDescription.GetIEC61360()? + .ShortName?.GetDefaultString(defaultLang); + } + + public static DataSpecificationIec61360 GetIEC61360(this IConceptDescription conceptDescription) + { + return conceptDescription.EmbeddedDataSpecifications?.GetIEC61360Content(); + } + + //TODO (jtikekar, 0000-00-00): DataSpecificationPhysicalUnit +#if SupportDataSpecificationPhysicalUnit + public static DataSpecificationPhysicalUnit GetPhysicalUnit(this ConceptDescription conceptDescription) + { + return conceptDescription.EmbeddedDataSpecifications?.GetPhysicalUnitContent(); + } +#endif + + public static IEnumerable FindAllReferences(this IConceptDescription conceptDescription) + { + yield break; + } + + #endregion + #region ListOfConceptDescription + public static IConceptDescription AddConceptDescriptionOrReturnExisting(this List conceptDescriptions, ConceptDescription newConceptDescription) + { + if (newConceptDescription == null) + { + return null; + } + if (conceptDescriptions != null) + { + var existingCd = conceptDescriptions.Where(c => c.Id == newConceptDescription.Id).FirstOrDefault(); + if (existingCd != null) + { + return existingCd; + } + else + { + conceptDescriptions.Add(newConceptDescription); + } + } + + return newConceptDescription; + } + #endregion + + public static void Validate( + this IConceptDescription conceptDescription, AasValidationRecordList results) + { + // access + if (results == null) + return; + + // dead-csharp off + // check CD itself + //Handled by BaseValidation Method + //conceptDescription.Validate(results); + + // check IEC61360 spec + + //TODO (jtikekar, 0000-00-00): Temporarily Removed + //var eds61360 = this.IEC61360DataSpec; + //if (eds61360 != null) + //{ + // // check data spec + // if (eds61360.dataSpecification == null || + // !(eds61360.dataSpecification.MatchesExactlyOneKey(DataSpecificationIEC61360.GetKey()))) + // results.Add(new AasValidationRecord( + // AasValidationSeverity.SpecViolation, this, + // "HasDataSpecification: data specification content set to IEC61360, but no " + + // "data specification reference set!", + // () => + // { + // eds61360.dataSpecification = new DataSpecificationRef( + // new Reference( + // DataSpecificationIEC61360.GetKey())); + // })); + + // // validate content + // if (eds61360.dataSpecificationContent?.dataSpecificationIEC61360 == null) + // { + // results.Add(new AasValidationRecord( + // AasValidationSeverity.SpecViolation, this, + // "HasDataSpecification: data specification reference set to IEC61360, but no " + + // "data specification content set!", + // () => + // { + // eds61360.dataSpecificationContent = new DataSpecificationContent(); + // eds61360.dataSpecificationContent.dataSpecificationIEC61360 = + // new DataSpecificationIEC61360(); + // })); + // } + // else + // { + // // validate + // eds61360.dataSpecificationContent.dataSpecificationIEC61360.Validate(results, this); + // } + // dead-csharp on + } + + public static Key GetSingleKey(this IConceptDescription conceptDescription) + { + return new Key(KeyTypes.ConceptDescription, conceptDescription.Id); + } + + public static ConceptDescription ConvertFromV10( + this ConceptDescription conceptDescription, AasxCompatibilityModels.AdminShellV10.ConceptDescription sourceConceptDescription) + { + if (sourceConceptDescription == null) + { + return null; + } + + if (string.IsNullOrEmpty(sourceConceptDescription.idShort)) + { + conceptDescription.IdShort = ""; + } + else + { + conceptDescription.IdShort = sourceConceptDescription.idShort; + } + + if (sourceConceptDescription.description != null) + { + conceptDescription.Description = ExtensionsUtil.ConvertDescriptionFromV10(sourceConceptDescription.description); + } + + if (sourceConceptDescription.administration != null) + { + conceptDescription.Administration = new AdministrativeInformation(version: sourceConceptDescription.administration.version, revision: sourceConceptDescription.administration.revision); + } + + if (sourceConceptDescription.IsCaseOf != null && sourceConceptDescription.IsCaseOf.Count != 0) + { + if (conceptDescription.IsCaseOf == null) + { + conceptDescription.IsCaseOf = new List(); + } + foreach (var caseOf in sourceConceptDescription.IsCaseOf) + { + conceptDescription.IsCaseOf.Add(ExtensionsUtil.ConvertReferenceFromV10(caseOf, ReferenceTypes.ModelReference)); + } + } + + return conceptDescription; + } + + public static ConceptDescription ConvertFromV20( + this ConceptDescription cd, AasxCompatibilityModels.AdminShellV20.ConceptDescription srcCD) + { + if (srcCD == null) + return null; + + if (string.IsNullOrEmpty(srcCD.idShort)) + cd.IdShort = ""; + else + cd.IdShort = srcCD.idShort; + + if (srcCD.identification?.id != null) + cd.Id = srcCD.identification.id; + + if (srcCD.description != null && srcCD.description.langString.Count >= 1) + cd.Description = ExtensionsUtil.ConvertDescriptionFromV20(srcCD.description); + + if (srcCD.administration != null) + cd.Administration = new AdministrativeInformation( + version: srcCD.administration.version, revision: srcCD.administration.revision); + + if (srcCD.IsCaseOf != null && srcCD.IsCaseOf.Count != 0) + { + foreach (var caseOf in srcCD.IsCaseOf) + { + IReference newCaseOf = null; + if(caseOf != null && !caseOf.IsEmpty) + { + newCaseOf = ExtensionsUtil.ConvertReferenceFromV20(caseOf, ReferenceTypes.ModelReference); + } + + if(newCaseOf != null) + { + cd.IsCaseOf ??= new List(); + cd.IsCaseOf.Add(newCaseOf); + } + } + } + + //jtikekar:as per old implementation + if (srcCD.embeddedDataSpecification != null && srcCD.embeddedDataSpecification.Count > 0) + { + foreach (var sourceEds in srcCD.embeddedDataSpecification) + { + var eds = new EmbeddedDataSpecification(null, null); + eds.ConvertFromV20(sourceEds); + cd.AddEmbeddedDataSpecification(eds); + } + } + + return cd; + } + + public static EmbeddedDataSpecification AddEmbeddedDataSpecification( + this IConceptDescription cd, EmbeddedDataSpecification eds) + { + if (cd == null) + return null; + if (cd.EmbeddedDataSpecifications == null) + cd.EmbeddedDataSpecifications = new List(); + if (eds == null) + return null; + cd.EmbeddedDataSpecifications.Add(eds); + return eds; + } + + public static Reference GetCdReference(this IConceptDescription conceptDescription) + { + var key = new Key(KeyTypes.GlobalReference, conceptDescription.Id); + return new Reference(ReferenceTypes.ExternalReference, new List { key }); + } + + public static void AddIsCaseOf(this IConceptDescription cd, + Reference ico) + { + if (cd.IsCaseOf == null) + cd.IsCaseOf = new List(); + cd.IsCaseOf.Add(ico); + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendDataElement.cs b/src/AasxCsharpLibrary/Extensions/ExtendDataElement.cs new file mode 100644 index 000000000..717fcefcb --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendDataElement.cs @@ -0,0 +1,20 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +namespace Extensions +{ + public static class ExtendDataElement + { + public static DataTypeDefXsd[] ValueTypes_Number = + new[] { DataTypeDefXsd.Decimal, DataTypeDefXsd.Double, DataTypeDefXsd.Float, + DataTypeDefXsd.Integer, DataTypeDefXsd.Long, DataTypeDefXsd.Int, DataTypeDefXsd.Short, + DataTypeDefXsd.Byte, DataTypeDefXsd.NonNegativeInteger, DataTypeDefXsd.NonPositiveInteger, + DataTypeDefXsd.UnsignedInt, DataTypeDefXsd.Integer, DataTypeDefXsd.UnsignedByte, + DataTypeDefXsd.UnsignedLong, DataTypeDefXsd.UnsignedShort, DataTypeDefXsd.NegativeInteger }; + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendDataSpecificationIEC61360.cs b/src/AasxCsharpLibrary/Extensions/ExtendDataSpecificationIEC61360.cs new file mode 100644 index 000000000..85f3cdee2 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendDataSpecificationIEC61360.cs @@ -0,0 +1,50 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using System.Collections.Generic; + +namespace Extensions +{ + public static class ExtendDataSpecificationIEC61360 + { + public static DataSpecificationIec61360 ConvertFromV20(this DataSpecificationIec61360 ds61360, AasxCompatibilityModels.AdminShellV20.DataSpecificationIEC61360 src616360) + { + if (src616360.preferredName != null) + ds61360.PreferredName = new List().ConvertFromV20(src616360.preferredName); + + if (src616360.shortName != null) + ds61360.ShortName = new List().ConvertFromV20(src616360.shortName); + + if (!string.IsNullOrEmpty(src616360.unit)) + { + ds61360.Unit = src616360.unit; + } + + if (src616360.unitId != null) + ds61360.UnitId = ExtensionsUtil.ConvertReferenceFromV20(AasxCompatibilityModels.AdminShellV20.Reference.CreateNew(src616360.unitId.keys), ReferenceTypes.ExternalReference); + + ds61360.ValueFormat = src616360.valueFormat; + ds61360.SourceOfDefinition = src616360.sourceOfDefinition; + ds61360.Symbol = src616360.symbol; + if (!(string.IsNullOrEmpty(src616360.dataType))) + { + var dt = src616360.dataType; + if (!dt.StartsWith("xs:")) + dt = "xs:" + dt; + ds61360.DataType = Stringification.DataTypeIec61360FromString(dt); + } + if (src616360.definition != null) + ds61360.Definition = new List().ConvertFromV20(src616360.definition); + + //TODO (jtikekar, 0000-00-00): check with Andreas + ds61360.Value = ""; + + return ds61360; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendEmbeddedDataSpecification.cs b/src/AasxCsharpLibrary/Extensions/ExtendEmbeddedDataSpecification.cs new file mode 100644 index 000000000..f914e75f8 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendEmbeddedDataSpecification.cs @@ -0,0 +1,118 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using System.Collections.Generic; + +namespace Extensions +{ + // TODO (Jui, 2022-12-21): I do not know, if to put the List<> extension here or in a separate file + public static class ExtendListOfEmbeddedDataSpecification + { + public static IEmbeddedDataSpecification FindFirstIEC61360Spec(this List list) + { + foreach (var eds in list) + if (eds?.DataSpecificationContent is DataSpecificationIec61360 + || eds?.DataSpecification?.MatchesExactlyOneKey( + ExtendIDataSpecificationContent.GetKeyForIec61360()) == true) + return eds; + return null; + } + + public static DataSpecificationIec61360 GetIEC61360Content(this List list) + { + foreach (var eds in list) + if (eds?.DataSpecificationContent is DataSpecificationIec61360 dsiec) + return dsiec; + return null; + } + + //TODO (jtikekar, 0000-00-00): DataSpecificationPhysicalUnit +#if SupportDataSpecificationPhysicalUnit + public static DataSpecificationPhysicalUnit GetPhysicalUnitContent(this List list) + { + foreach (var eds in list) + if (eds?.DataSpecificationContent is DataSpecificationPhysicalUnit dspu) + return dspu; + return null; + } +#endif + } + + public static class ExtendEmbeddedDataSpecification + { + public static EmbeddedDataSpecification ConvertFromV20(this EmbeddedDataSpecification embeddedDataSpecification, AasxCompatibilityModels.AdminShellV20.EmbeddedDataSpecification sourceEmbeddedSpec) + { + if (sourceEmbeddedSpec != null) + { + if (sourceEmbeddedSpec.dataSpecification != null) + { + embeddedDataSpecification.DataSpecification = ExtensionsUtil.ConvertReferenceFromV20(sourceEmbeddedSpec.dataSpecification, ReferenceTypes.ExternalReference); + + // TODO (MIHO, 2022-19-12): check again, see questions + var oldid = new[] { + "http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/2/0", + "http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360", + "www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360" + }; + var newid = "http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"; + + // map all "usable" old ids to new one .. + foreach (var oi in oldid) + if (sourceEmbeddedSpec.dataSpecification?.Matches("", false, "IRI", oi, + AasxCompatibilityModels.AdminShellV20.Key.MatchMode.Identification) == true) + { + embeddedDataSpecification.DataSpecification.Keys[0].Value = newid; + } + } + + if (sourceEmbeddedSpec.dataSpecificationContent != null) + { + if (sourceEmbeddedSpec.dataSpecificationContent?.dataSpecificationIEC61360 != null) + { + embeddedDataSpecification.DataSpecificationContent = + new DataSpecificationIec61360(null).ConvertFromV20( + sourceEmbeddedSpec.dataSpecificationContent.dataSpecificationIEC61360); + } + } + } + + return embeddedDataSpecification; + } + + public static EmbeddedDataSpecification CreateIec61360WithContent(DataSpecificationIec61360 content = null) + { + if (content == null) + content = new DataSpecificationIec61360( + new List()); + + var res = new EmbeddedDataSpecification( + new Reference(ReferenceTypes.ExternalReference, + new List(new[] { ExtendIDataSpecificationContent.GetKeyForIec61360() })), + content); + return res; + } + + public static bool FixReferenceWrtContent(this IEmbeddedDataSpecification eds) + { + // does content tell something? + var ctc = ExtendIDataSpecificationContent.GuessContentTypeFor(eds?.DataSpecificationContent); + var ctr = ExtendIDataSpecificationContent.GuessContentTypeFor(eds?.DataSpecification); + + if (ctc == ExtendIDataSpecificationContent.ContentTypes.NoInfo) + return false; + + if (ctr == ctc) + return false; + + // ok, fix + eds.DataSpecification = new Reference(ReferenceTypes.ExternalReference, + new List { ExtendIDataSpecificationContent.GetKeyFor(ctc) }); + return true; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendEntity.cs b/src/AasxCsharpLibrary/Extensions/ExtendEntity.cs new file mode 100644 index 000000000..7d0376105 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendEntity.cs @@ -0,0 +1,117 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using AdminShellNS; +using AdminShellNS.Extensions; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Extensions +{ + public static class ExtendEntity + { + #region AasxPackageExplorer + + public static void Add(this Entity entity, ISubmodelElement submodelElement) + { + if (entity != null) + { + entity.Statements ??= new(); + + submodelElement.Parent = entity; + + entity.Statements.Add(submodelElement); + } + } + + public static void Remove(this Entity entity, ISubmodelElement submodelElement) + { + if (entity != null) + { + if (entity.Statements != null) + { + entity.Statements.Remove(submodelElement); + } + } + } + + public static object AddChild(this Entity entity, ISubmodelElement childSubmodelElement, EnumerationPlacmentBase placement = null) + { + if (childSubmodelElement == null) + return null; + if (entity.Statements == null) + entity.Statements = new(); + if (childSubmodelElement != null) + childSubmodelElement.Parent = entity; + entity.Statements.Add(childSubmodelElement); + return childSubmodelElement; + } + + #endregion + public static Entity ConvertFromV20(this Entity entity, AasxCompatibilityModels.AdminShellV20.Entity sourceEntity) + { + if (sourceEntity == null) + { + return null; + } + + if (!sourceEntity.statements.IsNullOrEmpty()) + { + entity.Statements ??= new List(); + foreach (var submodelElementWrapper in sourceEntity.statements) + { + var sourceSubmodelElement = submodelElementWrapper.submodelElement; + ISubmodelElement outputSubmodelElement = null; + if (sourceSubmodelElement != null) + { + outputSubmodelElement = outputSubmodelElement.ConvertFromV20(sourceSubmodelElement); + } + entity.Statements.Add(outputSubmodelElement); + } + } + + if (sourceEntity.assetRef != null) + { + //TODO (jtikekar, 0000-00-00): whether to convert to Global or specific asset id + var assetRef = ExtensionsUtil.ConvertReferenceFromV20(sourceEntity.assetRef, ReferenceTypes.ExternalReference); + if (assetRef != null) + { + entity.GlobalAssetId = assetRef.GetAsIdentifier(); + } + } + + return entity; + } + + public static T FindFirstIdShortAs(this Entity entity, string idShort) where T : ISubmodelElement + { + + var submodelElements = entity.Statements.Where(sme => (sme != null) && (sme is T) && sme.IdShort.Equals(idShort, StringComparison.OrdinalIgnoreCase)); + + if (submodelElements.Any()) + { + return (T)submodelElements.First(); + } + + return default; + } + + public static T CreateSMEForCD( + this Entity ent, + ConceptDescription conceptDescription, string category = null, string idShort = null, + string idxTemplate = null, int maxNum = 999, bool addSme = false, bool isTemplate = false) + where T : ISubmodelElement + { + if (ent.Statements == null) + ent.Statements = new List(); + return ent.Statements.CreateSMEForCD( + conceptDescription, category, idShort, idxTemplate, maxNum, addSme, isTemplate); + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendEnvironment.cs b/src/AasxCsharpLibrary/Extensions/ExtendEnvironment.cs new file mode 100644 index 000000000..7440d83d3 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendEnvironment.cs @@ -0,0 +1,1092 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using AdminShellNS; +using AdminShellNS.Extensions; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace Extensions +{ + public static class ExtendEnvironment + { + #region Environment + + #region AasxPackageExplorer + + public static void RecurseOnReferables(this AasCore.Aas3_0.Environment environment, + object state, Func, IReferable, bool> lambda, bool includeThis = false) + { + // includeThis does not make sense, as no Referable + // just use the others + foreach (var idf in environment.FindAllReferable(onlyIdentifiables: true)) + idf?.RecurseOnReferables(state, lambda, includeThis); + } + + #endregion + + /// + /// Deprecated? Not compatible with AAS core? + /// + public static AasValidationRecordList ValidateAll(this AasCore.Aas3_0.Environment environment) + { + // collect results + var results = new AasValidationRecordList(); + + // all entities + foreach (var rf in environment.FindAllReferable()) + rf.Validate(results); + + // give back + return results; + } + + /// + /// Deprecated? Not compatible with AAS core? + /// + public static int AutoFix(this AasCore.Aas3_0.Environment environment, IEnumerable records) + { + // access + if (records == null) + return -1; + + // collect Referables (expensive safety measure) + var allowedReferables = environment.FindAllReferable().ToList(); + + // go thru records + int res = 0; + foreach (var rec in records) + { + // access + if (rec == null || rec.Fix == null || rec.Source == null) + continue; + + // minimal safety measure + if (!allowedReferables.Contains(rec.Source)) + continue; + + // apply fix + res++; + try + { + rec.Fix.Invoke(); + } + catch + { + res--; + } + } + + // return number of applied fixes + return res; + } + + /// + /// This function tries to silently fix some issues preventing the environment + /// are parts of it to be properly serilaized. + /// + /// Number of fixes taken + public static int SilentFix30(this AasCore.Aas3_0.Environment env) + { + // access + int res = 0; + if (env == null) + return res; + + // AAS core crashes without AssetInformation + if (env.AssetAdministrationShells != null) + foreach (var aas in env.AssetAdministrationShells) + if (aas.AssetInformation == null) + { + aas.AssetInformation = new AssetInformation(assetKind: AssetKind.NotApplicable); + res++; + } + + // AAS core crashes without EmbeddedDataSpecification.DataSpecificationContent + // AAS core crashes without EmbeddedDataSpecification.DataSpecificationContent.PreferredName + foreach (var rf in env.FindAllReferable()) + if (rf is IHasDataSpecification hds) + if (hds.EmbeddedDataSpecifications != null) + foreach (var eds in hds.EmbeddedDataSpecifications) + { + if (eds.DataSpecificationContent == null) + eds.DataSpecificationContent = + new DataSpecificationIec61360( + new List()); + } + + // ok + return res; + } + + public static IEnumerable FindAllReferable(this AasCore.Aas3_0.Environment environment, bool onlyIdentifiables = false) + { + if (environment.AssetAdministrationShells != null) + foreach (var aas in environment.AssetAdministrationShells) + if (aas != null) + { + // AAS itself + yield return aas; + } + + if (environment.Submodels != null) + foreach (var sm in environment.Submodels) + if (sm != null) + { + yield return sm; + + if (!onlyIdentifiables) + { + // TODO (MIHO, 2020-08-26): not very elegant, yet. Avoid temporary collection + var allsme = new List(); + sm.RecurseOnSubmodelElements(null, (state, parents, sme) => + { + allsme.Add(sme); return true; + }); + foreach (var sme in allsme) + yield return sme; + } + } + + if (environment.ConceptDescriptions != null) + foreach (var cd in environment.ConceptDescriptions) + if (cd != null) + yield return cd; + } + +#if !DoNotUseAasxCompatibilityModels + + public static AasCore.Aas3_0.Environment ConvertFromV10(this AasCore.Aas3_0.Environment environment, AasxCompatibilityModels.AdminShellV10.AdministrationShellEnv sourceEnvironement) + { + //Convert Administration Shells + if (!sourceEnvironement.AdministrationShells.IsNullOrEmpty()) + { + environment.AssetAdministrationShells ??= new List(); + foreach (var sourceAas in sourceEnvironement.AdministrationShells) + { + var sourceAsset = sourceEnvironement?.FindAsset(sourceAas.assetRef); + if (sourceAsset != null) + { + var newAssetInformation = new AssetInformation(AssetKind.Instance); + newAssetInformation = newAssetInformation.ConvertFromV10(sourceAsset); + + var newAas = new AssetAdministrationShell(id: sourceAas.identification.id, newAssetInformation); + newAas = newAas.ConvertFromV10(sourceAas); + + environment.AssetAdministrationShells.Add(newAas); + } + + } + } + + //Convert Submodels + if (!sourceEnvironement.Submodels.IsNullOrEmpty()) + { + environment.Submodels ??= new List(); + foreach (var sourceSubmodel in sourceEnvironement.Submodels) + { + var newSubmodel = new Submodel(sourceSubmodel.identification.id); + newSubmodel = newSubmodel.ConvertFromV10(sourceSubmodel); + environment.Submodels.Add(newSubmodel); + } + } + + if (!sourceEnvironement.ConceptDescriptions.IsNullOrEmpty()) + { + environment.ConceptDescriptions ??= new List(); + foreach (var sourceConceptDescription in sourceEnvironement.ConceptDescriptions) + { + var newConceptDescription = new ConceptDescription(sourceConceptDescription.identification.id); + newConceptDescription = newConceptDescription.ConvertFromV10(sourceConceptDescription); + environment.ConceptDescriptions.Add(newConceptDescription); + } + } + + return environment; + } + + + public static AasCore.Aas3_0.Environment ConvertFromV20(this AasCore.Aas3_0.Environment environment, AasxCompatibilityModels.AdminShellV20.AdministrationShellEnv sourceEnvironement) + { + //Convert Administration Shells + if (!sourceEnvironement.AdministrationShells.IsNullOrEmpty()) + { + environment.AssetAdministrationShells ??= new List(); + foreach (var sourceAas in sourceEnvironement.AdministrationShells) + { + // first make the AAS + var newAas = new AssetAdministrationShell(id: sourceAas.identification.id, null); + newAas = newAas.ConvertFromV20(sourceAas); + environment.AssetAdministrationShells.Add(newAas); + + var sourceAsset = sourceEnvironement?.FindAsset(sourceAas.assetRef); + if (sourceAsset != null) + { + var newAssetInformation = new AssetInformation(AssetKind.Instance); + newAssetInformation = newAssetInformation.ConvertFromV20(sourceAsset); + newAas.AssetInformation = newAssetInformation; + } + + } + } + + //Convert Submodels + if (!sourceEnvironement.Submodels.IsNullOrEmpty()) + { + environment.Submodels ??= new List(); + foreach (var sourceSubmodel in sourceEnvironement.Submodels) + { + var newSubmodel = new Submodel(sourceSubmodel.identification.id); + newSubmodel = newSubmodel.ConvertFromV20(sourceSubmodel); + environment.Submodels.Add(newSubmodel); + } + } + + if (!sourceEnvironement.ConceptDescriptions.IsNullOrEmpty()) + { + environment.ConceptDescriptions ??= new List(); + foreach (var sourceConceptDescription in sourceEnvironement.ConceptDescriptions) + { + var newConceptDescription = new ConceptDescription(sourceConceptDescription.identification.id); + newConceptDescription = newConceptDescription.ConvertFromV20(sourceConceptDescription); + environment.ConceptDescriptions.Add(newConceptDescription); + } + } + + return environment; + } + +#endif + + //TODO (jtikekar, 0000-00-00): to test + public static AasCore.Aas3_0.Environment CreateFromExistingEnvironment(this AasCore.Aas3_0.Environment environment, + AasCore.Aas3_0.Environment sourceEnvironment, List filterForAas = null, List filterForAssets = null, List filterForSubmodel = null, + List filterForConceptDescriptions = null) + { + if (filterForAas == null) + { + filterForAas = new List(); + } + + if (filterForAssets == null) + { + filterForAssets = new List(); + } + + if (filterForSubmodel == null) + { + filterForSubmodel = new List(); + } + + if (filterForConceptDescriptions == null) + { + filterForConceptDescriptions = new List(); + } + + //Copy AssetAdministrationShells + foreach (var aas in sourceEnvironment.AssetAdministrationShells) + { + if (filterForAas.Contains(aas)) + { + environment.AssetAdministrationShells.Add(aas); + + if (aas.Submodels != null && aas.Submodels.Count > 0) + { + foreach (var submodelReference in aas.Submodels) + { + var submodel = sourceEnvironment.FindSubmodel(submodelReference); + if (submodel != null) + { + filterForSubmodel.Add(submodel); + } + } + } + } + } + + //Copy Submodel + foreach (var submodel in sourceEnvironment.Submodels) + { + if (filterForSubmodel.Contains(submodel)) + { + environment.Submodels.Add(submodel); + + //Find Used CDs + environment.CreateFromExistingEnvRecurseForCDs(sourceEnvironment, submodel.SubmodelElements, ref filterForConceptDescriptions); + } + } + + //Copy ConceptDescription + foreach (var conceptDescription in sourceEnvironment.ConceptDescriptions) + { + if (filterForConceptDescriptions.Contains(conceptDescription)) + { + environment.ConceptDescriptions.Add(conceptDescription); + } + } + + return environment; + + } + + public static void CreateFromExistingEnvRecurseForCDs(this AasCore.Aas3_0.Environment environment, AasCore.Aas3_0.Environment sourceEnvironment, + List submodelElements, ref List filterForConceptDescription) + { + if (submodelElements == null || submodelElements.Count == 0 || filterForConceptDescription == null || filterForConceptDescription.Count == 0) + { + return; + } + + foreach (var submodelElement in submodelElements) + { + if (submodelElement == null) + { + return; + } + + if (submodelElement.SemanticId != null) + { + var conceptDescription = sourceEnvironment.FindConceptDescriptionByReference(submodelElement.SemanticId); + if (conceptDescription != null) + { + filterForConceptDescription.Add(conceptDescription); + } + } + + if (submodelElement is SubmodelElementCollection smeColl) + { + environment.CreateFromExistingEnvRecurseForCDs(sourceEnvironment, smeColl.Value, ref filterForConceptDescription); + } + + if (submodelElement is SubmodelElementList smeList) + { + environment.CreateFromExistingEnvRecurseForCDs(sourceEnvironment, smeList.Value, ref filterForConceptDescription); + } + + if (submodelElement is Entity entity) + { + environment.CreateFromExistingEnvRecurseForCDs(sourceEnvironment, entity.Statements, ref filterForConceptDescription); + } + + if (submodelElement is AnnotatedRelationshipElement annotatedRelationshipElement) + { + var annotedELements = new List(); + foreach (var annotation in annotatedRelationshipElement.Annotations) + { + annotedELements.Add(annotation); + } + environment.CreateFromExistingEnvRecurseForCDs(sourceEnvironment, annotedELements, ref filterForConceptDescription); + } + + if (submodelElement is Operation operation) + { + var operationELements = new List(); + foreach (var inputVariable in operation.InputVariables) + { + operationELements.Add(inputVariable.Value); + } + + foreach (var outputVariable in operation.OutputVariables) + { + operationELements.Add(outputVariable.Value); + } + + foreach (var inOutVariable in operation.InoutputVariables) + { + operationELements.Add(inOutVariable.Value); + } + + environment.CreateFromExistingEnvRecurseForCDs(sourceEnvironment, operationELements, ref filterForConceptDescription); + + } + } + } + + public static ConceptDescription Add(this AasCore.Aas3_0.Environment env, ConceptDescription cd) + { + if (cd == null) + return null; + if (env.ConceptDescriptions == null) + env.ConceptDescriptions = new(); + env.ConceptDescriptions.Add(cd); + return cd; + } + + public static Submodel Add(this AasCore.Aas3_0.Environment env, Submodel sm) + { + if (sm == null) + return null; + if (env.Submodels == null) + env.Submodels = new(); + env.Submodels.Add(sm); + return sm; + } + + public static AssetAdministrationShell Add(this AasCore.Aas3_0.Environment env, AssetAdministrationShell aas) + { + if (aas == null) + return null; + if (env.AssetAdministrationShells == null) + env.AssetAdministrationShells = new(); + env.AssetAdministrationShells.Add(aas); + return aas; + } + + public static JsonWriter SerialiazeJsonToStream(this AasCore.Aas3_0.Environment environment, StreamWriter streamWriter, bool leaveJsonWriterOpen = false) + { + streamWriter.AutoFlush = true; + + JsonSerializer serializer = new JsonSerializer() + { + NullValueHandling = NullValueHandling.Ignore, + ReferenceLoopHandling = ReferenceLoopHandling.Serialize, + Formatting = Newtonsoft.Json.Formatting.Indented + }; + + JsonWriter writer = new JsonTextWriter(streamWriter); + serializer.Serialize(writer, environment); + if (leaveJsonWriterOpen) + return writer; + writer.Close(); + return null; + } + + #endregion + + #region Submodel Queries + + public static IEnumerable FindAllSubmodelGroupedByAAS(this AasCore.Aas3_0.Environment environment, Func p = null) + { + if (environment.AssetAdministrationShells == null || environment.Submodels == null) + yield break; + foreach (var aas in environment.AssetAdministrationShells) + { + if (aas?.Submodels == null) + continue; + foreach (var smref in aas.Submodels) + { + var sm = environment.FindSubmodel(smref); + if (sm != null && (p == null || p(aas, sm))) + yield return sm; + } + } + } + public static ISubmodel FindSubmodel(this AasCore.Aas3_0.Environment environment, IReference submodelReference) + { + if (environment == null || submodelReference == null) + { + return null; + } + + if (submodelReference.Keys.Count != 1) // Can have only one reference key + { + return null; + } + + var key = submodelReference.Keys[0]; + if (key.Type != KeyTypes.Submodel) + { + return null; + } + + var submodels = environment.Submodels.Where(s => s.Id.Equals(key.Value, StringComparison.OrdinalIgnoreCase)); + if (submodels.Any()) + { + return submodels.First(); + } + + return null; + } + + public static ISubmodel FindSubmodelById(this AasCore.Aas3_0.Environment environment, string submodelId) + { + if (string.IsNullOrEmpty(submodelId)) + { + return null; + } + + var submodels = environment.Submodels.Where(s => s.Id.Equals(submodelId)); + if (submodels.Any()) + { + return submodels.First(); + } + + return null; + } + // dead-csharp off + //public static IEnumerable FindAllSubmodelsGroupedByAAS(this AasCore.Aas3_0.Environment environment, Func p = null) + //{ + // if (environment.AssetAdministrationShells == null || environment.Submodels == null) + // yield break; + // foreach (var aas in environment.AssetAdministrationShells) + // { + // if (aas?.Submodels == null) + // continue; + // foreach (var submodelReference in aas.Submodels) + // { + // var submodel = environment.FindSubmodel(submodelReference); + // if (submodel != null && (p == null || p(aas, submodel))) + // yield return submodel; + // } + // } + //} + // dead-csharp on + public static IEnumerable FindAllSubmodelBySemanticId(this AasCore.Aas3_0.Environment environment, string semanticId) + { + if (semanticId == null) + yield break; + + foreach (var submodel in environment.Submodels) + if (true == submodel.SemanticId?.Matches(semanticId)) + yield return submodel; + } + + #endregion + + #region AssetAdministrationShell Queries + public static IAssetAdministrationShell FindAasWithSubmodelId(this AasCore.Aas3_0.Environment environment, string submodelId) + { + if (submodelId == null) + { + return null; + } + + var aas = environment.AssetAdministrationShells.Where(a => (a.Submodels?.Where(s => s.Matches(submodelId)).FirstOrDefault()) != null).FirstOrDefault(); + + return aas; + } + + public static IAssetAdministrationShell FindAasById(this AasCore.Aas3_0.Environment environment, string aasId) + { + if (string.IsNullOrEmpty(aasId)) + { + return null; + } + + var aas = environment.AssetAdministrationShells.Where(a => a.Id.Equals(aasId)).First(); + + return aas; + } + + #endregion + + #region ConceptDescription Queries + + public static IConceptDescription FindConceptDescriptionById( + this AasCore.Aas3_0.Environment env, string cdId) + { + if (string.IsNullOrEmpty(cdId)) + return null; + + if (env.ConceptDescriptions == null || env.ConceptDescriptions.Count == 0) + return null; + + var conceptDescription = env.ConceptDescriptions.Where(c => c.Id.Equals(cdId)).FirstOrDefault(); + return conceptDescription; + } + + public static IConceptDescription FindConceptDescriptionByReference( + this AasCore.Aas3_0.Environment env, IReference rf) + { + if (rf == null) + return null; + + return env.FindConceptDescriptionById(rf.GetAsIdentifier()); + } + + #endregion + + #region Referable Queries + + /// + /// Result of FindReferable in Environment + /// + public class ReferableRootInfo + { + public AssetAdministrationShell AAS = null; + public AssetInformation Asset = null; + public Submodel Submodel = null; + public ConceptDescription CD = null; + + public int NrOfRootKeys = 0; + + public bool IsValid + { + get + { + return NrOfRootKeys > 0 && (AAS != null || Submodel != null || Asset != null); + } + } + } + + //TODO (jtikekar, 0000-00-00): Need to test + public static IReferable FindReferableByReference( + this AasCore.Aas3_0.Environment environment, + IReference reference, + int keyIndex = 0, + IEnumerable submodelElems = null, + ReferableRootInfo rootInfo = null) + { + // access + var keyList = reference?.Keys; + if (keyList == null || keyList.Count == 0 || keyIndex >= keyList.Count) + return null; + + // shortcuts + var firstKeyType = keyList[keyIndex].Type; + var firstKeyId = keyList[keyIndex].Value; + + // different pathes + switch (firstKeyType) + { + case KeyTypes.AssetAdministrationShell: + { + var aas = environment.FindAasById(firstKeyId); + + // side info? + if (rootInfo != null) + { + rootInfo.AAS = aas as AssetAdministrationShell; + rootInfo.NrOfRootKeys = 1 + keyIndex; + } + + //Not found or already at the end of our search + if (aas == null || keyIndex >= keyList.Count - 1) + { + return aas; + } + + return environment.FindReferableByReference(reference, ++keyIndex); + } + // dead-csharp off + // TODO (MIHO, 2023-01-01): stupid generalization :-( + case KeyTypes.GlobalReference: + case KeyTypes.ConceptDescription: + { + // In meta model V3, multiple important things might by identified + // by a flat GlobalReference :-( + + // find an Asset by that id? + + var keyedAas = environment.FindAasWithAssetInformation(firstKeyId); + if (keyedAas?.AssetInformation != null) + { + // found an Asset + + // side info? + if (rootInfo != null) + { + rootInfo.AAS = keyedAas as AssetAdministrationShell; + rootInfo.Asset = (AssetInformation)(keyedAas?.AssetInformation); + rootInfo.NrOfRootKeys = 1 + keyIndex; + } + + // give back the AAS + return keyedAas; + } + + // Concept?Description + var keyedCd = environment.FindConceptDescriptionById(firstKeyId); + if (keyedCd != null) + { + // side info? + if (rootInfo != null) + { + rootInfo.CD = keyedCd as ConceptDescription; + rootInfo.NrOfRootKeys = 1 + keyIndex; + } + + // give back the CD + return keyedCd; + } + + // Nope + return null; + } + // dead-csharp on + case KeyTypes.Submodel: + { + var submodel = environment.FindSubmodelById(firstKeyId); + // No? + if (submodel == null) + return null; + + // notice in side info + if (rootInfo != null) + { + rootInfo.Submodel = submodel as Submodel; + rootInfo.NrOfRootKeys = 1 + keyIndex; + + // add even more info + if (rootInfo.AAS == null) + { + foreach (var aas2 in environment.AssetAdministrationShells) + { + var smref2 = environment.FindSubmodelById(submodel.Id); + if (smref2 != null) + { + rootInfo.AAS = (AssetAdministrationShell)aas2; + break; + } + } + } + } + + // at the end of the journey? + if (keyIndex >= keyList.Count - 1) + return submodel; + + return environment.FindReferableByReference(reference, ++keyIndex, submodel.SubmodelElements); + } + } + + + + if (firstKeyType.IsSME() && submodelElems != null) + { + ISubmodelElement submodelElement; + //check if key.value is index + bool isIndex = int.TryParse(firstKeyId, out int index); + if (isIndex) + { + var smeList = submodelElems.ToList(); + submodelElement = smeList[index]; + } + else + { + submodelElement = submodelElems.Where( + sme => sme.IdShort.Equals(keyList[keyIndex].Value, + StringComparison.OrdinalIgnoreCase)).First(); + } + + //This is required element + if (keyIndex + 1 >= keyList.Count) + { + return submodelElement; + } + + //Recurse again + if (submodelElement?.EnumeratesChildren() == true) + return environment.FindReferableByReference(reference, ++keyIndex, submodelElement.EnumerateChildren()); + } + + //Nothing in this environment + return null; + } + + #endregion + + #region AasxPackageExplorer + + public static IEnumerable FindAllSubmodelElements(this AasCore.Aas3_0.Environment environment, + Predicate match = null, AssetAdministrationShell onlyForAAS = null) where T : ISubmodelElement + { + // more or less two different schemes + if (onlyForAAS != null) + { + if (onlyForAAS.Submodels == null) + yield break; + foreach (var smr in onlyForAAS.Submodels) + { + var sm = environment.FindSubmodel(smr); + if (sm?.SubmodelElements != null) + foreach (var x in sm.SubmodelElements.FindDeep(match)) + yield return x; + } + } + else + { + if (environment.Submodels != null) + foreach (var sm in environment.Submodels) + if (sm?.SubmodelElements != null) + foreach (var x in sm.SubmodelElements.FindDeep(match)) + yield return x; + } + } + + public static IEnumerable FindAllReferences(this AasCore.Aas3_0.Environment environment) + { + if (environment.AssetAdministrationShells != null) + foreach (var aas in environment.AssetAdministrationShells) + if (aas != null) + foreach (var r in aas.FindAllReferences()) + yield return r; + + if (environment.Submodels != null) + foreach (var sm in environment.Submodels) + if (sm != null) + foreach (var r in sm.FindAllReferences()) + yield return r; + + if (environment.ConceptDescriptions != null) + foreach (var cd in environment.ConceptDescriptions) + if (cd != null) + foreach (var r in cd.FindAllReferences()) + yield return new LocatedReference(cd, r); + } + + /// + /// Tries renaming an Identifiable, specifically: the identification of an Identifiable and + /// all references to it. + /// Currently supported: ConceptDescriptions + /// Returns a list of Referables, which were changed or null in case of error + /// + public static List RenameIdentifiable(this AasCore.Aas3_0.Environment environment, string oldId, string newId) + where T : IClass + { + // access + if (oldId == null || newId == null || oldId.Equals(newId)) + return null; + + var res = new List(); + + if (typeof(T) == typeof(ConceptDescription)) + { + // check, if exist or not exist + var cdOld = environment.FindConceptDescriptionById(oldId); + if (cdOld == null || environment.FindConceptDescriptionById(newId) != null) + return null; + + // rename old cd + cdOld.Id = newId; + res.Add(cdOld); + + // search all SMEs referring to this CD + foreach (var sme in environment.FindAllSubmodelElements(match: (s) => + { + return (s != null && s.SemanticId != null && s.SemanticId.Matches(oldId)); + })) + { + sme.SemanticId.Keys[0].Value = newId; + res.Add(sme); + } + + // seems fine + return res; + } + else + if (typeof(T) == typeof(Submodel)) + { + // check, if exist or not exist + var smOld = environment.FindSubmodelById(oldId); + if (smOld == null || environment.FindSubmodelById(newId) != null) + return null; + + // recurse all possible Referenes in the aas env + foreach (var lr in environment.FindAllReferences()) + { + var r = lr?.Reference; + if (r != null) + for (int i = 0; i < r.Keys.Count; i++) + if (r.Keys[i].Matches(KeyTypes.Submodel, oldId, MatchMode.Relaxed)) + { + // directly replace + r.Keys[i].Value = newId; + if (res.Contains(lr.Identifiable)) + res.Add(lr.Identifiable); + } + } + + // rename old Submodel + smOld.Id = newId; + + // seems fine + return res; + } + else + if (typeof(T) == typeof(AssetAdministrationShell)) + { + // check, if exist or not exist + var aasOld = environment.FindAasById(oldId); + if (aasOld == null || environment.FindAasById(newId) != null) + return null; + + // recurse? -> no? + + // rename old Asset + aasOld.Id = newId; + + // seems fine + return res; + } + else + //TODO (jtikekar, 0000-00-00): support asset + if (typeof(T) == typeof(AssetInformation)) + { + // check, if exist or not exist + var assetOld = environment.FindAasWithAssetInformation(oldId); + if (assetOld == null || environment.FindAasWithAssetInformation(newId) != null) + return null; + + // recurse all possible Referenes in the aas env + foreach (var lr in environment.FindAllReferences()) + { + var r = lr?.Reference; + if (r != null) + for (int i = 0; i < r.Keys.Count; i++) + if (r.Keys[i].Matches(KeyTypes.GlobalReference, oldId)) + { + // directly replace + r.Keys[i].Value = newId; + if (res.Contains(lr.Identifiable)) + res.Add(lr.Identifiable); + } + } + + // rename old Asset + assetOld.AssetInformation.GlobalAssetId = newId; + + // seems fine + return res; + } + + // no result is false, as well + return null; + } + + public static IAssetAdministrationShell FindAasWithAssetInformation(this AasCore.Aas3_0.Environment environment, string globalAssetId) + { + if (string.IsNullOrEmpty(globalAssetId)) + { + return null; + } + + foreach (var aas in environment.AssetAdministrationShells) + { + if (aas.AssetInformation.GlobalAssetId.Equals(globalAssetId)) + { + return aas; + } + } + + return null; + } + + public static ComparerIndexed CreateIndexedComparerCdsForSmUsage(this AasCore.Aas3_0.Environment environment) + { + var cmp = new ComparerIndexed(); + int nr = 0; + foreach (var sm in environment.FindAllSubmodelGroupedByAAS()) + foreach (var sme in sm.FindDeep()) + { + if (sme.SemanticId == null) + continue; + var cd = environment.FindConceptDescriptionByReference(sme.SemanticId); + if (cd == null) + continue; + if (cmp.Index.ContainsKey(cd)) + continue; + cmp.Index[cd] = nr++; + } + return cmp; + } + + public static ISubmodelElement CopySubmodelElementAndCD(this AasCore.Aas3_0.Environment environment, + AasCore.Aas3_0.Environment srcEnv, ISubmodelElement srcElem, bool copyCD = false, bool shallowCopy = false) + { + // access + if (srcEnv == null || srcElem == null) + return null; + + // 1st result pretty easy (calling function will add this to the appropriate Submodel) + var res = srcElem.Copy(); + + // copy the CDs.. + if (copyCD) + environment.CopyConceptDescriptionsFrom(srcEnv, srcElem, shallowCopy); + + // give back + return res; + } + + public static IReference CopySubmodelRefAndCD(this AasCore.Aas3_0.Environment environment, + AasCore.Aas3_0.Environment srcEnv, IReference srcSubRef, bool copySubmodel = false, bool copyCD = false, + bool shallowCopy = false) + { + // access + if (srcEnv == null || srcSubRef == null) + return null; + + // need to have the source Submodel + var srcSub = srcEnv.FindSubmodel(srcSubRef); + if (srcSub == null) + return null; + + // 1st result pretty easy (calling function will add this to the appropriate AAS) + var dstSubRef = srcSubRef.Copy(); + + // get the destination and shall src != dst + var dstSub = environment.FindSubmodel(dstSubRef); + if (srcSub == dstSub) + return null; + + // maybe we need the Submodel in our environment, as well + if (dstSub == null && copySubmodel) + { + dstSub = srcSub.Copy(); + environment.Submodels.Add(dstSub); + } + else + if (dstSub != null) + { + // there is already an submodel, just add members + if (!shallowCopy && srcSub.SubmodelElements != null) + { + if (dstSub.SubmodelElements == null) + dstSub.SubmodelElements = new List(); + foreach (var smw in srcSub.SubmodelElements) + dstSub.SubmodelElements.Add( + smw.Copy()); + } + } + + // copy the CDs.. + if (copyCD && srcSub.SubmodelElements != null) + foreach (var smw in srcSub.SubmodelElements) + environment.CopyConceptDescriptionsFrom(srcEnv, smw, shallowCopy); + + // give back + return dstSubRef; + } + + private static void CopyConceptDescriptionsFrom(this AasCore.Aas3_0.Environment environment, + AasCore.Aas3_0.Environment srcEnv, ISubmodelElement src, bool shallowCopy = false) + { + // access + if (srcEnv == null || src == null || src.SemanticId == null) + return; + + // check for this SubmodelElement in Source + var cdSrc = srcEnv.FindConceptDescriptionByReference(src.SemanticId); + if (cdSrc == null) + return; + + // check for this SubmodelElement in Destnation (this!) + var cdDest = environment.FindConceptDescriptionByReference(src.SemanticId); + if (cdDest == null) + { + // copy new + environment.ConceptDescriptions.Add(cdSrc.Copy()); + } + + // recurse? + if (!shallowCopy) + foreach (var m in src.EnumerateChildren()) + environment.CopyConceptDescriptionsFrom(srcEnv, m, shallowCopy: false); + + } + #endregion + + } + + + +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendFile.cs b/src/AasxCsharpLibrary/Extensions/ExtendFile.cs new file mode 100644 index 000000000..d2fbf79b0 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendFile.cs @@ -0,0 +1,69 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +namespace Extensions +{ + public static class ExtendFile + { + public static string ValueAsText(this File file) + { + return "" + file.Value; + } + + public static void Set(this File file, + string contentType = "", string value = "") + { + file.ContentType = contentType; + file.Value = value; + } + + public static File ConvertFromV10(this File file, AasxCompatibilityModels.AdminShellV10.File sourceFile) + { + file.ContentType = sourceFile.mimeType; + file.Value = sourceFile.value; + return file; + } + public static File ConvertFromV20(this File file, AasxCompatibilityModels.AdminShellV20.File sourceFile) + { + file.ContentType = sourceFile.mimeType; + file.Value = sourceFile.value; + return file; + } + + public static File UpdateFrom(this File elem, ISubmodelElement source) + { + if (source == null) + return elem; + + ((ISubmodelElement)elem).UpdateFrom(source); + + if (source is Property srcProp) + { + elem.Value = srcProp.Value; + } + + if (source is AasCore.Aas3_0.Range srcRng) + { + elem.Value = srcRng.Min; + } + + if (source is MultiLanguageProperty srcMlp) + { + elem.Value = "" + srcMlp.Value?.GetDefaultString(); + } + + if (source is File srcFile) + { + elem.Value = "" + srcFile.Value; + } + + return elem; + } + + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendHasDataSpecification.cs b/src/AasxCsharpLibrary/Extensions/ExtendHasDataSpecification.cs new file mode 100644 index 000000000..ca440e3cb --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendHasDataSpecification.cs @@ -0,0 +1,25 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +namespace Extensions +{ + public static class ExtendHasDataSpecification + { + public static IHasDataSpecification ConvertFromV20(this IHasDataSpecification embeddedDataSpecifications, AasxCompatibilityModels.AdminShellV20.HasDataSpecification sourceSpecification) + { + foreach (var sourceSpec in sourceSpecification) + { + var newEmbeddedSpec = new EmbeddedDataSpecification(null, null); + newEmbeddedSpec.ConvertFromV20(sourceSpec); + embeddedDataSpecifications.EmbeddedDataSpecifications.Add(newEmbeddedSpec); + } + + return embeddedDataSpecifications; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendIAdministrativeInformation.cs b/src/AasxCsharpLibrary/Extensions/ExtendIAdministrativeInformation.cs new file mode 100644 index 000000000..bb5617a66 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendIAdministrativeInformation.cs @@ -0,0 +1,25 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Extensions +{ + public static class ExtendIAdministrativeInformation + { + public static string ToStringExtended(this IAdministrativeInformation ls, int fmt) + { + if (fmt == 2) + return String.Format("/{0}/{1}", ls.Version, ls.Revision); + return String.Format("[ver={0}, rev={1}, tmpl={2}, crea={3}]", + ls.Version, ls.Revision, ls.TemplateId, ls.Creator?.ToStringExtended(fmt)); + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendIClass.cs b/src/AasxCsharpLibrary/Extensions/ExtendIClass.cs new file mode 100644 index 000000000..0db74f58a --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendIClass.cs @@ -0,0 +1,41 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using System.Collections.Generic; +using System.Linq; + +namespace Extensions +{ + public static class ExtendIClass + { + // TODO (MIHO, 2023-05-28): liase with AAS core team to provide a general desrialization + /// + /// Deserializes a given objectType from its given JSON node representation. + /// Operates on a range of known AAS IClass subtypes (not all!!) + /// + /// Hint for IClass subtype + /// JSON representation + /// Null, if not a known IClass subtype + public static IClass IClassFrom(System.Type objectType, System.Text.Json.Nodes.JsonNode node) + { + if (typeof(IReference).IsAssignableFrom(objectType)) + return Jsonization.Deserialize.ReferenceFrom(node); + + if (typeof(IKey).IsAssignableFrom(objectType)) + return Jsonization.Deserialize.KeyFrom(node); + + if (typeof(IReferable).IsAssignableFrom(objectType)) + return Jsonization.Deserialize.IReferableFrom(node); + + if (typeof(IIdentifiable).IsAssignableFrom(objectType)) + return Jsonization.Deserialize.IIdentifiableFrom(node); + + return null; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendIDataSpecificationContent.cs b/src/AasxCsharpLibrary/Extensions/ExtendIDataSpecificationContent.cs new file mode 100644 index 000000000..8e76f302e --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendIDataSpecificationContent.cs @@ -0,0 +1,77 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using AdminShellNS; +using System.Collections.Generic; + +namespace Extensions +{ + public static class ExtendIDataSpecificationContent + { + public enum ContentTypes { NoInfo, Iec61360, PhysicalUnit } + + public static Key GetKeyForIec61360() + { + return new Key(KeyTypes.GlobalReference, + "https://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"); + } + + public static Reference GetReferencForIec61360() + { + return new Reference(ReferenceTypes.ExternalReference, new List { GetKeyForIec61360() }); + } + + public static Key GetKeyForPhysicalUnit() + { + return new Key(KeyTypes.GlobalReference, + "https://admin-shell.io/DataSpecificationTemplates/DataSpecificationPhysicalUnit/3/0"); + } + + public static Key GetKeyFor(ContentTypes ct) + { + if (ct == ContentTypes.Iec61360) + return GetKeyForIec61360(); + if (ct == ContentTypes.PhysicalUnit) + return GetKeyForPhysicalUnit(); + return null; + } + + public static IDataSpecificationContent ContentFactoryFor(ContentTypes ct) + { + if (ct == ContentTypes.Iec61360) + return new DataSpecificationIec61360( + new List()); + //TODO (jtikekar, 0000-00-00): DataSpecificationPhysicalUnit +#if SupportDataSpecificationPhysicalUnit + if (ct == ContentTypes.PhysicalUnit) + return new DataSpecificationPhysicalUnit("", "", null); +#endif + return null; + } + + public static ContentTypes GuessContentTypeFor(IReference rf) + { + foreach (var v in AdminShellUtil.GetEnumValues(new[] { ContentTypes.NoInfo })) + if (rf?.MatchesExactlyOneKey(GetKeyFor(v)) == true) + return v; + return ContentTypes.NoInfo; + } + + public static ContentTypes GuessContentTypeFor(IDataSpecificationContent content) + { + if (content is DataSpecificationIec61360) + return ContentTypes.Iec61360; + //TODO (jtikekar, 0000-00-00): DataSpecificationPhysicalUnit +#if SupportDataSpecificationPhysicalUnit + if (content is DataSpecificationPhysicalUnit) + return ContentTypes.PhysicalUnit; +#endif + return ContentTypes.NoInfo; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendIIdentifiable.cs b/src/AasxCsharpLibrary/Extensions/ExtendIIdentifiable.cs new file mode 100644 index 000000000..97aa254c9 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendIIdentifiable.cs @@ -0,0 +1,33 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using System.Collections.Generic; +using System.Linq; + +namespace Extensions +{ + public static class ExtendIIdentifiable + { + #region List of Identifiers + + public static string ToStringExtended(this List identifiables, string delimiter = ",") + { + return string.Join(delimiter, identifiables.Select((x) => x.Id)); + } + + #endregion + public static IReference GetReference(this IIdentifiable identifiable) + { + var key = new Key(ExtensionsUtil.GetKeyType(identifiable), identifiable.Id); + //TODO (jtikekar, 0000-00-00): if model or Global reference? + var outputReference = new Reference(ReferenceTypes.ModelReference, new List() { key }); + + return outputReference; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendILangStringDefinitionTypeIec61360.cs b/src/AasxCsharpLibrary/Extensions/ExtendILangStringDefinitionTypeIec61360.cs new file mode 100644 index 000000000..46062fade --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendILangStringDefinitionTypeIec61360.cs @@ -0,0 +1,66 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using System; +using System.Collections.Generic; + +namespace Extensions +{ + public static class ExtendILangStringDefinitionTypeIec61360 + { + public static List CreateLangStringDefinitionType(string language, string text) + { + return new List { new LangStringDefinitionTypeIec61360(language, text) }; + } + public static string GetDefaultString(this List langStringSet, string defaultLang = null) + { + // start + if (defaultLang == null) + defaultLang = "en"; //Default Lang in old implementation is en + + string res = null; + + // search + foreach (var langString in langStringSet) + if (langString.Language.Equals(defaultLang, StringComparison.OrdinalIgnoreCase)) + res = langString.Text; + + if (res == null && langStringSet.Count > 0) + res = langStringSet[0].Text; + + // found? + return res; + } + public static List ConvertFromV20( + this List lss, + AasxCompatibilityModels.AdminShellV20.LangStringSetIEC61360 src) + { + lss = new List(); + if (src != null && src.Count != 0) + { + foreach (var sourceLangString in src) + { + //Remove ? in the end added by AdminShellV20, to avoid verification error + string lang = sourceLangString.lang; + if (!string.IsNullOrEmpty(sourceLangString.lang) && sourceLangString.lang.EndsWith("?")) + { + lang = sourceLangString.lang.Remove(sourceLangString.lang.Length - 1); + } + var langString = new LangStringDefinitionTypeIec61360(lang, sourceLangString.str); + lss.Add(langString); + } + } + else + { + //set default preferred name + lss.Add(new LangStringDefinitionTypeIec61360("en", "")); + } + return lss; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendILangStringNameType.cs b/src/AasxCsharpLibrary/Extensions/ExtendILangStringNameType.cs new file mode 100644 index 000000000..e222b5c20 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendILangStringNameType.cs @@ -0,0 +1,30 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Extensions +{ + public static class ExtendILangStringNameType + { + public static string ToStringExtended(this ILangStringNameType ls, int fmt) + { + if (fmt == 2) + return String.Format("{0}@{1}", ls.Text, ls.Language); + return String.Format("[{0},{1}]", ls.Language, ls.Text); + } + + public static string ToStringExtended(this List elems, + int format = 1, string delimiter = ",") + { + return string.Join(delimiter, elems.Select((k) => k.ToStringExtended(format))); + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendILangStringPreferredNameTypeIec61360.cs b/src/AasxCsharpLibrary/Extensions/ExtendILangStringPreferredNameTypeIec61360.cs new file mode 100644 index 000000000..abff939d3 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendILangStringPreferredNameTypeIec61360.cs @@ -0,0 +1,71 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using System; +using System.Collections.Generic; + +namespace Extensions +{ + public static class ExtendILangStringPreferredNameTypeIec61360 + { + public static List CreateLangStringPreferredNameType(string language, string text) + { + return new List { new LangStringPreferredNameTypeIec61360(language, text) }; + } + + public static string GetDefaultString(this List langStringSet, string defaultLang = null) + { + return ExtendLangString.GetDefaultStringGen(langStringSet, defaultLang); + // dead-csharp off + //// start + //if (defaultLang == null) + // defaultLang = "en"; //Default Lang in old implementation is en + + //string res = null; + + //// search + //foreach (var langString in langStringSet) + // if (langString.Language.Equals(defaultLang, StringComparison.OrdinalIgnoreCase)) + // res = langString.Text; + + //if (res == null && langStringSet.Count > 0) + // res = langStringSet[0].Text; + + //// found? + //return res; + // dead-csharp on + } + + public static List ConvertFromV20( + this List lss, + AasxCompatibilityModels.AdminShellV20.LangStringSetIEC61360 src) + { + lss = new List(); + if (src != null && src.Count != 0) + { + foreach (var sourceLangString in src) + { + //Remove ? in the end added by AdminShellV20, to avoid verification error + string lang = sourceLangString.lang; + if (!string.IsNullOrEmpty(sourceLangString.lang) && sourceLangString.lang.EndsWith("?")) + { + lang = sourceLangString.lang.Remove(sourceLangString.lang.Length - 1); + } + var langString = new LangStringPreferredNameTypeIec61360(lang, sourceLangString.str); + lss.Add(langString); + } + } + else + { + //set default preferred name + lss.Add(new LangStringPreferredNameTypeIec61360("en", "")); + } + return lss; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendILangStringShortNameTypeIec61360.cs b/src/AasxCsharpLibrary/Extensions/ExtendILangStringShortNameTypeIec61360.cs new file mode 100644 index 000000000..8cdb0e3e3 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendILangStringShortNameTypeIec61360.cs @@ -0,0 +1,71 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using System; +using System.Collections.Generic; + +namespace Extensions +{ + public static class ExtendILangStringShortNameTypeIec61360 + { + public static List CreateLangStringShortNameType(string language, string text) + { + return new List { new LangStringShortNameTypeIec61360(language, text) }; + } + + public static string GetDefaultString(this List langStringSet, string defaultLang = null) + { + return ExtendLangString.GetDefaultStringGen(langStringSet, defaultLang); + // dead-csharp off + //// start + //if (defaultLang == null) + // defaultLang = "en"; //Default Lang in old implementation is en + + //string res = null; + + //// search + //foreach (var langString in langStringSet) + // if (langString.Language.Equals(defaultLang, StringComparison.OrdinalIgnoreCase)) + // res = langString.Text; + + //if (res == null && langStringSet.Count > 0) + // res = langStringSet[0].Text; + + //// found? + //return res; + // dead-csharp on + } + + public static List ConvertFromV20( + this List lss, + AasxCompatibilityModels.AdminShellV20.LangStringSetIEC61360 src) + { + lss = new List(); + if (src != null && src.Count != 0) + { + foreach (var sourceLangString in src) + { + //Remove ? in the end added by AdminShellV20, to avoid verification error + string lang = sourceLangString.lang; + if (!string.IsNullOrEmpty(sourceLangString.lang) && sourceLangString.lang.EndsWith("?")) + { + lang = sourceLangString.lang.Remove(sourceLangString.lang.Length - 1); + } + var langString = new LangStringShortNameTypeIec61360(lang, sourceLangString.str); + lss.Add(langString); + } + } + else + { + //set default preferred name + lss.Add(new LangStringShortNameTypeIec61360("en", "")); + } + return lss; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendILangStringTextType.cs b/src/AasxCsharpLibrary/Extensions/ExtendILangStringTextType.cs new file mode 100644 index 000000000..bb5dfd3eb --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendILangStringTextType.cs @@ -0,0 +1,35 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Extensions +{ + public static class ExtendILangStringTextType + { + public static string GetDefaultString(this List langStringSet, string defaultLang = null) + { + return ExtendLangString.GetDefaultStringGen(langStringSet, defaultLang); + } + + public static string ToStringExtended(this ILangStringTextType ls, int fmt) + { + if (fmt == 2) + return String.Format("{0}@{1}", ls.Text, ls.Language); + return String.Format("[{0},{1}]", ls.Language, ls.Text); + } + + public static string ToStringExtended(this List elems, + int format = 1, string delimiter = ",") + { + return string.Join(delimiter, elems.Select((k) => k.ToStringExtended(format))); + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendIReferable.cs b/src/AasxCsharpLibrary/Extensions/ExtendIReferable.cs new file mode 100644 index 000000000..1c0e0597b --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendIReferable.cs @@ -0,0 +1,624 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using AdminShellNS; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Extensions +{ + public static class ExtendIReferable + { + #region AasxPackageExplorer + + /// + /// Recurses on all Submodel elements of a Submodel or SME, which allows children. + /// The state object will be passed to the lambda function in order to provide + /// stateful approaches. Include this element, as well. + /// + /// State object to be provided to lambda. Could be null. + /// The lambda function as (state, parents, SME) + /// The lambda shall return TRUE in order to deep into recursion. + /// Include this element as well. parents will then + /// include this element as well! + public static void RecurseOnReferables(this IReferable referable, + object state, Func, IReferable, bool> lambda, + bool includeThis = false) + { + // TODO (MIHO, 2023-07-28): not all elements are covered + if (referable is Submodel submodel) + { + submodel.RecurseOnReferables(state, lambda, includeThis); + } + else if (referable is SubmodelElementCollection submodelElementCollection) + { + submodelElementCollection.RecurseOnReferables(state, lambda, includeThis); + } + else if (referable is SubmodelElementList submodelElementList) + { + submodelElementList.RecurseOnReferables(state, lambda, includeThis); + } + else if (includeThis) + lambda(state, null, referable); + } + + public static void Remove(this IReferable referable, ISubmodelElement submodelElement) + { + if (referable is Submodel submodel) + { + submodel.Remove(submodelElement); + } + else if (referable is AnnotatedRelationshipElement annotatedRelationshipElement) + { + annotatedRelationshipElement.Remove(submodelElement); + } + else if (referable is SubmodelElementCollection submodelElementCollection) + { + submodelElementCollection.Remove(submodelElement); + } + else if (referable is SubmodelElementList submodelElementList) + { + submodelElementList.Remove(submodelElement); + } + else if (referable is Entity entity) + { + entity.Remove(submodelElement); + } + } + + public static void Add(this IReferable referable, ISubmodelElement submodelElement) + { + if (referable is Submodel submodel) + { + submodel.Add(submodelElement); + } + else if (referable is AnnotatedRelationshipElement annotatedRelationshipElement) + { + annotatedRelationshipElement.Add(submodelElement); + } + else if (referable is SubmodelElementCollection submodelElementCollection) + { + submodelElementCollection.Add(submodelElement); + } + else if (referable is SubmodelElementList submodelElementList) + { + submodelElementList.Add(submodelElement); + } + else if (referable is Entity entity) + { + entity.Add(submodelElement); + } + } + + #region Display + + public static EnumerationPlacmentBase GetChildrenPlacement(this IReferable referable, ISubmodelElement submodelElement) + { + if (referable is Operation operation) + { + return operation.GetChildrenPlacement(submodelElement); + } + + return null; + } + + #endregion + + public static IIdentifiable FindParentFirstIdentifiable(this IReferable referable) + { + IReferable curr = referable; + while (curr != null) + { + if (curr is IIdentifiable curri) + return curri; + curr = curr.Parent as IReferable; + } + return null; + } + + #endregion + + #region ListOfReferables + public static Reference GetReference(this List referables) + { + return new Reference(ReferenceTypes.ExternalReference, referables.ToKeyList()); + } + + public static List ToKeyList(this List referables) + { + var res = new List(); + foreach (var rf in referables) + res.Add(new Key(rf.GetSelfDescription()?.KeyType ?? KeyTypes.GlobalReference, rf.IdShort)); + return res; + } + #endregion + + public static string ToIdShortString(this IReferable rf) + { + if (rf.IdShort == null || rf.IdShort.Trim().Length < 1) + return (""); + return rf.IdShort.Trim(); + } + + public static IReference GetReference(this IReferable referable) + { + if (referable is IIdentifiable identifiable) + { + return identifiable.GetReference(); + } + else if (referable is ISubmodelElement submodelElement) + { + return submodelElement.GetModelReference(); + } + else + return null; + } + + public static void Validate(this IReferable referable, AasValidationRecordList results) + { + referable.BaseValidation(results); + + if (referable is ConceptDescription conceptDescription) + { + conceptDescription.Validate(results); + } + else if (referable is Submodel submodel) + { + submodel.Validate(results); + } + else if (referable is ISubmodelElement submodelElement) + { + // No further validation for SME + } + } + + public static void BaseValidation(this IReferable referable, AasValidationRecordList results) + { + // access + if (results == null) + return; + + // check + if (string.IsNullOrEmpty(referable.IdShort)) + results.Add(new AasValidationRecord( + AasValidationSeverity.SpecViolation, referable, + "Referable: missing idShort", + () => + { + referable.IdShort = "TO_FIX"; + })); + + if (referable.Description != null && (referable.Description.Count < 1)) + results.Add(new AasValidationRecord( + AasValidationSeverity.SchemaViolation, referable, + "Referable: existing description with missing langString", + () => + { + referable.Description = null; + })); + } + + /// + /// Tells, if the IReferable is used with an index instead of idShort. + /// + public static bool IsIndexed(this IReferable rf) + { + return rf is SubmodelElementList; + } + + public static AasElementSelfDescription GetSelfDescription(this IReferable referable) + { + if (referable is AssetAdministrationShell) + { + return new AasElementSelfDescription("AssetAdministrationShell", "AAS", + KeyTypes.AssetAdministrationShell, null); + } + else if (referable is ConceptDescription) + { + return new AasElementSelfDescription("ConceptDescription", "CD", + KeyTypes.ConceptDescription, null); + } + else if (referable is Submodel) + { + return new AasElementSelfDescription("Submodel", "SM", + KeyTypes.Submodel, null); + } + else if (referable is Property) + { + return new AasElementSelfDescription("Property", "Prop", + KeyTypes.Property, AasSubmodelElements.Property); + } + else if (referable is MultiLanguageProperty) + { + return new AasElementSelfDescription("MultiLanguageProperty", "MLP", + KeyTypes.MultiLanguageProperty, AasSubmodelElements.MultiLanguageProperty); + } + else if (referable is AasCore.Aas3_0.Range) + { + return new AasElementSelfDescription("Range", "Range", + KeyTypes.Range, AasSubmodelElements.Range); + } + else if (referable is Blob) + { + return new AasElementSelfDescription("Blob", "Blob", + KeyTypes.Blob, AasSubmodelElements.Blob); + } + else if (referable is AasCore.Aas3_0.File) + { + return new AasElementSelfDescription("File", "File", + KeyTypes.File, AasSubmodelElements.File); + } + else if (referable is ReferenceElement) + { + return new AasElementSelfDescription("ReferenceElement", "Ref", + KeyTypes.ReferenceElement, AasSubmodelElements.ReferenceElement); + } + else if (referable is RelationshipElement) + { + return new AasElementSelfDescription("RelationshipElement", "Rel", + KeyTypes.RelationshipElement, AasSubmodelElements.RelationshipElement); + } + else if (referable is AnnotatedRelationshipElement) + { + return new AasElementSelfDescription("AnnotatedRelationshipElement", "RelA", + KeyTypes.AnnotatedRelationshipElement, AasSubmodelElements.AnnotatedRelationshipElement); + } + else if (referable is Capability) + { + return new AasElementSelfDescription("Capability", "Cap", + KeyTypes.Capability, AasSubmodelElements.Capability); + } + else if (referable is SubmodelElementCollection) + { + return new AasElementSelfDescription("SubmodelElementCollection", "SMC", + KeyTypes.SubmodelElementCollection, AasSubmodelElements.SubmodelElementCollection); + } + else if (referable is SubmodelElementList) + { + return new AasElementSelfDescription("SubmodelElementList", "SML", + KeyTypes.SubmodelElementList, AasSubmodelElements.SubmodelElementList); + } + else if (referable is Operation) + { + return new AasElementSelfDescription("Operation", "Opr", + KeyTypes.Operation, AasSubmodelElements.Operation); + } + else if (referable is Entity) + { + return new AasElementSelfDescription("Entity", "Ent", + KeyTypes.Entity, AasSubmodelElements.Entity); + } + else if (referable is BasicEventElement) + { + return new AasElementSelfDescription("BasicEventElement", "Evt", + + KeyTypes.BasicEventElement, AasSubmodelElements.BasicEventElement); + } + else if (referable is IDataElement) + { + return new AasElementSelfDescription("DataElement", "DE", + KeyTypes.DataElement, AasSubmodelElements.DataElement); + } + else if (referable is ISubmodelElement) + { + return new AasElementSelfDescription("SubmodelElement", "SME", + KeyTypes.SubmodelElement, AasSubmodelElements.SubmodelElement); + } + else + { + return new AasElementSelfDescription("Referable", "Ref", + KeyTypes.Referable, null); + } + } + public static void CollectReferencesByParent(this IReferable referable, List refs) + { + // access + if (refs == null) + return; + + // check, if this is identifiable + if (referable is IIdentifiable) + { + var idf = referable as IIdentifiable; + if (idf != null) + { + + var key = new Key((KeyTypes)Stringification.KeyTypesFromString(idf.GetType().Name), idf.Id); + refs.Insert(0, key); + } + } + else + { + var key = new Key((KeyTypes)Stringification.KeyTypesFromString(referable.GetType().Name), referable.IdShort); + refs.Insert(0, key); + // recurse upwards! + if (referable.Parent is IReferable prf) + prf.CollectReferencesByParent(refs); + } + } + public static void SetTimeStamp(this IReferable referable, DateTime timeStamp) + { + IReferable newReferable = referable; + do + { + newReferable.TimeStamp = timeStamp; + if (newReferable != newReferable.Parent) + { + newReferable = (IReferable)newReferable.Parent; + } + else + newReferable = null; + } + while (newReferable != null); + } + + public static bool EnumeratesChildren(this ISubmodelElement elem) + { + var num = elem.EnumerateChildren().Count(); + return (num > 0); + } + + public static IEnumerable EnumerateChildren(this IReferable rf) + { + // the code below was done by Jui + // MIHO: I think, we should now use the methods of AAS core + + if (rf == null) + yield break; + + foreach (var desc in rf.DescendOnce()) + if (desc is ISubmodelElement sme) + yield return sme; + +#if __old + if (referable is Submodel submodel && submodel.SubmodelElements != null) + { + if (submodel.SubmodelElements != null) + { + foreach (var submodelElement in submodel.SubmodelElements) + { + yield return submodelElement; + } + } + } + else if (referable is SubmodelElementCollection submodelElementCollection) + { + if (submodelElementCollection.Value != null) + { + foreach (var submodelElement in submodelElementCollection.Value) + { + yield return submodelElement; + } + } + } + else if (referable is SubmodelElementList submodelElementList) + { + if (submodelElementList.Value != null) + { + foreach (var submodelElement in submodelElementList.Value) + { + yield return submodelElement; + } + } + } + else if (referable is AnnotatedRelationshipElement annotatedRelationshipElement) + { + if (annotatedRelationshipElement.Annotations != null) + { + foreach (var submodelElement in annotatedRelationshipElement.Annotations) + { + yield return submodelElement; + } + } + } + else if (referable is Entity entity) + { + if (entity.Statements != null) + { + foreach (var submodelElement in entity.Statements) + { + yield return submodelElement; + } + } + } + else if (referable is Operation operation) + { + if (operation.InputVariables != null) + foreach (var inputVariable in operation.InputVariables) + { + yield return inputVariable.Value; + } + + if (operation.OutputVariables != null) + foreach (var outputVariable in operation.OutputVariables) + { + yield return outputVariable.Value; + } + + if (operation.InoutputVariables != null) + foreach (var inOutVariable in operation.InoutputVariables) + { + yield return inOutVariable.Value; + } + } + else + { + yield break; + } +#endif + } + + + public static void SetAllParentsAndTimestamps(this IReferable referable, IReferable parent, DateTime timeStamp, DateTime timeStampCreate) + { + if (parent == null) + return; + + referable.Parent = parent; + referable.TimeStamp = timeStamp; + referable.TimeStampCreate = timeStampCreate; + + foreach (var submodelElement in referable.EnumerateChildren()) + { + submodelElement.SetAllParentsAndTimestamps(referable, timeStamp, timeStampCreate); + } + } + + public static Submodel GetParentSubmodel(this IReferable referable) + { + IReferable parent = referable; + while (parent is not Submodel && parent != null) + parent = (IReferable)parent.Parent; + return parent as Submodel; + } + + public static string CollectIdShortByParent(this IReferable referable) + { + // recurse first + var head = ""; + if (referable is not IIdentifiable && referable.Parent is IReferable parentReferable) + // can go up + head = parentReferable.CollectIdShortByParent() + "/"; + // add own + var myid = ""; + if (!string.IsNullOrEmpty(referable.IdShort)) + myid = referable.IdShort.Trim(); + // together + return head + myid; + } + + public static void AddDescription(this IReferable referable, string language, string Text) + { + if (referable.Description == null) + referable.Description = new List(); + referable.Description.Add(new LangStringTextType(language, Text)); + } + + public static List ListOfIReferableFrom( + System.Text.Json.Nodes.JsonNode node) + { + var res = new List(); + if (node == null) + return res; + var array = node.AsArray(); + foreach (var it in array) + { + var ir = Jsonization.Deserialize.IReferableFrom(it); + res.Add(ir); + } + return res; + } + + public static Key ToKey(this IReferable rf) + { + var sd = rf.GetSelfDescription(); + if (sd == null || !sd.KeyType.HasValue) + return null; + if (rf is IIdentifiable rfi) + return new Key(sd.KeyType.Value, rfi.Id); + return new Key(sd.KeyType.Value, rf.IdShort); + } + + public static System.Text.Json.Nodes.JsonNode ToJsonObject(List classes) + { + var jar = new System.Text.Json.Nodes.JsonArray(); + if (classes != null) + foreach (var c in classes) + jar.Add(Jsonization.Serialize.ToJsonObject(c)); + return jar; + } + + public static IEnumerable FindAllQualifierType(this IReferable rf, string qualifierType) + { + if (!(rf is IQualifiable rfq) || rfq.Qualifiers == null || qualifierType == null) + yield break; + foreach (var q in rfq.Qualifiers) + if (q.Type.Trim().ToLower() == qualifierType.Trim().ToLower()) + yield return q; + } + + public static IQualifier HasQualifierOfType(this IReferable rf, string qualifierType) + { + if (!(rf is IQualifiable rfq) || rfq.Qualifiers == null) + return null; + foreach (var q in rfq.Qualifiers) + if (q.Type?.Trim().ToLower() == qualifierType?.Trim().ToLower()) + return q; + return null; + } + + public static Qualifier Add(this IReferable rf, Qualifier q) + { + if (!(rf is IQualifiable rfq)) + return null; + if (rfq.Qualifiers == null) + rfq.Qualifiers = new List(); + rfq.Qualifiers.Add(q); + return q; + } + + public static IEnumerable FindAllExtensionName(this IReferable rf, string extensionName) + { + if (!(rf is IHasExtensions rfe) || rfe.Extensions == null) + yield break; + foreach (var e in rfe.Extensions) + if (e.Name?.Trim().ToLower() == extensionName?.Trim().ToLower()) + yield return e; + } + + + public static IExtension HasExtensionOfName(this IReferable rf, string extensionName) + { + if (!(rf is IHasExtensions rfe) || rfe.Extensions == null) + return null; + foreach (var e in rfe.Extensions) + if (e.Name?.Trim().ToLower() == extensionName?.Trim().ToLower()) + return e; + return null; + } + + public static Extension Add(this IReferable rf, Extension ext) + { + if (rf.Extensions == null) + rf.Extensions = new List(); + rf.Extensions.Add(ext); + return ext; + } + + public static void MigrateV20QualifiersToExtensions(this IReferable rf) + { + // access + if (!(rf is IQualifiable iq) || iq.Qualifiers == null || !(rf is IHasExtensions ihe)) + return; + + // Qualifiers to migrate + var toMigrate = new[] { + "Animate.Args", "Plotting.Args", "TimeSeries.Args", "BOM.Args", "ImageMap.Args" + }; + + List toMove = new List(); + foreach (var q in iq.Qualifiers) + foreach (var tm in toMigrate) + if (q?.Type?.Equals(tm, StringComparison.InvariantCultureIgnoreCase) == true) + toMove.Add(q); + + // now move these + for (int i = 0; i < toMove.Count; i++) + { + var q = toMove[i]; + var ext = new Extension( + name: q.Type, semanticId: q.SemanticId, + valueType: q.ValueType, value: q.Value); + rf.Add(ext); + iq.Qualifiers.Remove(q); + } + } + + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendISubmodelElement.cs b/src/AasxCsharpLibrary/Extensions/ExtendISubmodelElement.cs new file mode 100644 index 000000000..1d8e9fa37 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendISubmodelElement.cs @@ -0,0 +1,1551 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using AasxCompatibilityModels; +using AdminShellNS; +using AdminShellNS.Extensions; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Extensions +{ + public static class ExtendISubmodelElement + { + // constants + public static Type[] PROP_MLP = new Type[] { + typeof(MultiLanguageProperty), typeof(Property) }; + + #region AasxPackageExplorer + + public static List Copy(this List original) + { + var res = new List(); + if (original != null) + foreach (var o in original) + res.Add(o.Copy()); + return res; + } + + public static object AddChild(this ISubmodelElement submodelElement, ISubmodelElement childSubmodelElement, EnumerationPlacmentBase placement = null) + { + if (submodelElement is AnnotatedRelationshipElement annotatedRelationshipElement) + { + return annotatedRelationshipElement.AddChild(childSubmodelElement, placement); + } + else if (submodelElement is SubmodelElementCollection submodelElementCollection) + { + return submodelElementCollection.AddChild(childSubmodelElement, placement); + } + else if (submodelElement is SubmodelElementList submodelElementList) + { + return submodelElementList.AddChild(childSubmodelElement, placement); + } + else if (submodelElement is Operation operation) + { + return operation.AddChild(childSubmodelElement, placement); + } + else if (submodelElement is Entity entity) + { + return entity.AddChild(childSubmodelElement, placement); + } + else + return childSubmodelElement; + } + + public static List GetChildsAsList(this ISubmodelElement sme) + { + return sme.DescendOnce().Where((x) => x is ISubmodelElement).Cast().ToList(); + } + + public static Tuple ToCaptionInfo(this ISubmodelElement submodelElement) + { + var caption = AdminShellUtil.EvalToNonNullString("\"{0}\" ", submodelElement.IdShort, ""); + var info = ""; + // TODO (MIHO, 2021-07-08): obvious error .. info should receive semanticId .. but would change + // display presentation .. therefore to be checked again + if (submodelElement.SemanticId != null) + AdminShellUtil.EvalToNonEmptyString("\u21e8 {0}", submodelElement.SemanticId.ToStringExtended(), ""); + return Tuple.Create(caption, info); + } + + public static void ValueFromText(this ISubmodelElement submodelElement, string text, string defaultLang = null) + { + switch (submodelElement) + { + case Property property: + { + property.ValueFromText(text); + break; + } + case MultiLanguageProperty multiLanguageProperty: + { + multiLanguageProperty.ValueFromText(text, defaultLang); + break; + } + default: + { + throw new Exception("Unhandled submodel element type"); + } + } + } + + #endregion + public static IEnumerable FindAllParents(this ISubmodelElement submodelElement, + Predicate p, + bool includeThis = false, bool includeSubmodel = false, + bool passOverMiss = false) + { + // call for this? + if (includeThis) + { + if (p == null || p.Invoke(submodelElement)) + yield return submodelElement; + else + if (!passOverMiss) + yield break; + } + + // daisy chain all parents .. + if (submodelElement.Parent != null) + { + if (submodelElement.Parent is ISubmodelElement psme) + { + foreach (var q in psme.FindAllParents(p, includeThis: true, + passOverMiss: passOverMiss)) + yield return q; + } + else if (includeSubmodel && submodelElement.Parent is Submodel psm) + { + if (p == null || p.Invoke(psm)) + yield return submodelElement; + } + } + } + + public static IEnumerable FindAllParentsWithSemanticId( + this ISubmodelElement submodelElement, IReference semId, + bool includeThis = false, bool includeSubmodel = false, bool passOverMiss = false) + { + return (FindAllParents(submodelElement, + (rf) => (true == (rf as IHasSemantics)?.SemanticId?.Matches(semId, + matchMode: MatchMode.Relaxed)), + includeThis: includeThis, includeSubmodel: includeSubmodel, passOverMiss: passOverMiss)); + } + + public static string ValueAsText(this ISubmodelElement submodelElement, string defaultLang = null) + { + //TODO (??, 0000-00-00): Need to check/test this logic again + if (submodelElement is Property property) + { + return property.ValueAsText(); + } + + if (submodelElement is MultiLanguageProperty multiLanguageProperty) + { + return multiLanguageProperty.ValueAsText(defaultLang); + } + + if (submodelElement is AasCore.Aas3_0.Range range) + { + return range.ValueAsText(); + } + + if (submodelElement is File file) + { + return file.ValueAsText(); + } + + return ""; + } + + public static IQualifier FindQualifierOfType(this ISubmodelElement submodelElement, string qualifierType) + { + if (submodelElement.Qualifiers == null || submodelElement.Qualifiers.Count == 0) + { + return null; + } + + foreach (var qualifier in submodelElement.Qualifiers) + { + if (qualifier.Type.Equals(qualifierType, StringComparison.OrdinalIgnoreCase)) + { + return qualifier; + } + } + + return null; + + } + + public static IReference GetModelReference(this ISubmodelElement sme, bool includeParents = true) + { + // this will be the tail of our chain + var keyList = new List(); + var keyType = ExtensionsUtil.GetKeyType(sme); + var key = new Key(keyType, sme.IdShort); + keyList.Add(key); + + // keys for Parents will be INSERTED in front, iteratively + var currentParent = sme.Parent; + while (includeParents && currentParent != null) + { + if (currentParent is IIdentifiable identifiable) + { + var currentParentKey = new Key(ExtensionsUtil.GetKeyType(identifiable), identifiable.Id); + keyList.Insert(0, currentParentKey); + currentParent = null; + } + else if (currentParent is IReferable referable) + { + var currentParentKey = new Key(ExtensionsUtil.GetKeyType(referable), referable.IdShort); + keyList.Insert(0, currentParentKey); + currentParent = referable.Parent; + } + + } + + var outputReference = new Reference(ReferenceTypes.ModelReference, keyList); + outputReference.ReferredSemanticId = sme.SemanticId; + return outputReference; + } + + public static IEnumerable FindDeep(this ISubmodelElement submodelElement) + { + if (submodelElement is T) + { + yield return (T)submodelElement; + } + + foreach (var x in submodelElement.Descend().OfType()) + yield return x; + } + + public static ISubmodelElement ConvertFromV10(this ISubmodelElement submodelElement, AdminShellV10.SubmodelElement sourceSubmodelElement, bool shallowCopy = false) + { + ISubmodelElement outputSubmodelElement = null; + if (sourceSubmodelElement != null) + { + if (sourceSubmodelElement is AdminShellV10.SubmodelElementCollection collection) + { + var newSmeCollection = new SubmodelElementCollection(); + outputSubmodelElement = newSmeCollection.ConvertFromV10(collection, shallowCopy); + } + else if (sourceSubmodelElement is AdminShellV10.Property sourceProperty) + { + var newProperty = new Property(DataTypeDefXsd.String); + outputSubmodelElement = newProperty.ConvertFromV10(sourceProperty); + } + else if (sourceSubmodelElement is AdminShellV10.File sourceFile) + { + var newFile = new File(""); + outputSubmodelElement = newFile.ConvertFromV10(sourceFile); + } + else if (sourceSubmodelElement is AdminShellV10.Blob blob) + { + var newBlob = new Blob(""); + outputSubmodelElement = newBlob.ConvertFromV10(blob); + } + else if (sourceSubmodelElement is AdminShellV10.ReferenceElement sourceReferenceElement) + { + outputSubmodelElement = new ReferenceElement(); + } + else if (sourceSubmodelElement is AdminShellV10.RelationshipElement sourceRelationshipElement) + { + var newFirst = ExtensionsUtil.ConvertReferenceFromV10(sourceRelationshipElement.first, ReferenceTypes.ModelReference); + var newSecond = ExtensionsUtil.ConvertReferenceFromV10(sourceRelationshipElement.second, ReferenceTypes.ModelReference); + outputSubmodelElement = new RelationshipElement(newFirst, newSecond); + } + else if (sourceSubmodelElement is AdminShellV10.Operation sourceOperation) + { + var newInputVariables = new List(); + var newOutputVariables = new List(); + if (!sourceOperation.valueIn.IsNullOrEmpty()) + { + + foreach (var inputVariable in sourceOperation.valueIn) + { + if (inputVariable.value.submodelElement != null) + { + ISubmodelElement newSubmodelElement = null; + newSubmodelElement = newSubmodelElement.ConvertFromV10(inputVariable.value.submodelElement); + var newOpVariable = new OperationVariable(newSubmodelElement); + newInputVariables.Add(newOpVariable); + } + } + } + + if (!sourceOperation.valueOut.IsNullOrEmpty()) + { + foreach (var outputVariable in sourceOperation.valueOut) + { + if (outputVariable.value.submodelElement != null) + { + ISubmodelElement newSubmodelElement = null; + newSubmodelElement = newSubmodelElement.ConvertFromV10(outputVariable.value.submodelElement); + var newOpVariable = new OperationVariable(newSubmodelElement); + newOutputVariables.Add(newOpVariable); + } + } + } + + outputSubmodelElement = new Operation(inputVariables: newInputVariables, outputVariables: newOutputVariables); + } + + if (outputSubmodelElement != null) + { + outputSubmodelElement.BasicConversionFromV10(sourceSubmodelElement); + } + } + + return outputSubmodelElement; + } + + private static void BasicConversionFromV10(this ISubmodelElement submodelElement, AdminShellV10.SubmodelElement sourceSubmodelElement) + { + if (!string.IsNullOrEmpty(sourceSubmodelElement.idShort)) + { + submodelElement.IdShort = sourceSubmodelElement.idShort; + } + + if (!string.IsNullOrEmpty(sourceSubmodelElement.category)) + { + submodelElement.Category = sourceSubmodelElement.category; + } + + if (sourceSubmodelElement.description != null) + { + submodelElement.Description = ExtensionsUtil.ConvertDescriptionFromV10(sourceSubmodelElement.description); + } + + if (sourceSubmodelElement.semanticId != null && !sourceSubmodelElement.semanticId.IsEmpty) + { + var keyList = new List(); + foreach (var refKey in sourceSubmodelElement.semanticId.Keys) + { + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {refKey.type} not found."); + } + } + submodelElement.SemanticId = new Reference(ReferenceTypes.ExternalReference, keyList); + } + + if (sourceSubmodelElement.kind != null) + { + //SubmodelElement does not have kind anymore + } + + if (!sourceSubmodelElement.qualifiers.IsNullOrEmpty()) + { + if (submodelElement.Qualifiers == null && submodelElement.Qualifiers.Count != 0) + { + submodelElement.Qualifiers = new List(); + } + + foreach (var sourceQualifier in sourceSubmodelElement.qualifiers) + { + var newQualifier = new Qualifier("", DataTypeDefXsd.String); + newQualifier = newQualifier.ConvertFromV10(sourceQualifier); + submodelElement.Qualifiers.Add(newQualifier); + } + } + + if (sourceSubmodelElement.hasDataSpecification != null && !sourceSubmodelElement.hasDataSpecification.reference.IsNullOrEmpty()) + { + //TODO (jtikekar, 0000-00-00): EmbeddedDataSpecification?? (as per old implementation) + submodelElement.EmbeddedDataSpecifications ??= new List(); + foreach (var dataSpecification in sourceSubmodelElement.hasDataSpecification.reference) + { + if (!dataSpecification.IsEmpty) + { + submodelElement.EmbeddedDataSpecifications.Add( + new EmbeddedDataSpecification( + ExtensionsUtil.ConvertReferenceFromV10(dataSpecification, ReferenceTypes.ExternalReference), + null)); + } + } + } + } + + public static ISubmodelElement ConvertFromV20(this ISubmodelElement submodelElement, AdminShellV20.SubmodelElement sourceSubmodelElement, bool shallowCopy = false) + { + ISubmodelElement outputSubmodelElement = null; + if (sourceSubmodelElement != null) + { + if (sourceSubmodelElement is AdminShellV20.SubmodelElementCollection collection) + { + var newSmeCollection = new SubmodelElementCollection(); + outputSubmodelElement = newSmeCollection.ConvertFromV20(collection, shallowCopy); + } + else if (sourceSubmodelElement is AdminShellV20.Property sourceProperty) + { + var newProperty = new Property(DataTypeDefXsd.String); + outputSubmodelElement = newProperty.ConvertFromV20(sourceProperty); + } + else if (sourceSubmodelElement is AdminShellV20.MultiLanguageProperty sourceMultiLangProp) + { + var newMultiLangProperty = new MultiLanguageProperty(); + outputSubmodelElement = newMultiLangProperty.ConvertFromV20(sourceMultiLangProp); + } + else if (sourceSubmodelElement is AdminShellV20.Range sourceRange) + { + var newRange = new AasCore.Aas3_0.Range(DataTypeDefXsd.String); + outputSubmodelElement = newRange.ConvertFromV20(sourceRange); + } + else if (sourceSubmodelElement is AdminShellV20.File sourceFile) + { + var newFile = new File(""); + outputSubmodelElement = newFile.ConvertFromV20(sourceFile); + } + else if (sourceSubmodelElement is AdminShellV20.Blob blob) + { + var newBlob = new Blob(""); + outputSubmodelElement = newBlob.ConvertFromV20(blob); + } + else if (sourceSubmodelElement is AdminShellV20.ReferenceElement sourceReferenceElement) + { + var newReference = ExtensionsUtil.ConvertReferenceFromV20(sourceReferenceElement.value, ReferenceTypes.ModelReference); + outputSubmodelElement = new ReferenceElement(value: newReference); + } + else if (sourceSubmodelElement is AdminShellV20.AnnotatedRelationshipElement sourceAnnotedRelationshipElement) + { + var newFirst = ExtensionsUtil.ConvertReferenceFromV20(sourceAnnotedRelationshipElement.first, ReferenceTypes.ModelReference); + var newSecond = ExtensionsUtil.ConvertReferenceFromV20(sourceAnnotedRelationshipElement.second, ReferenceTypes.ModelReference); + var newAnnotedRelElement = new AnnotatedRelationshipElement(newFirst, newSecond); + outputSubmodelElement = newAnnotedRelElement.ConvertAnnotationsFromV20(sourceAnnotedRelationshipElement); + } + else if (sourceSubmodelElement is AdminShellV20.RelationshipElement sourceRelationshipElement) + { + var newFirst = ExtensionsUtil.ConvertReferenceFromV20(sourceRelationshipElement.first, ReferenceTypes.ModelReference); + var newSecond = ExtensionsUtil.ConvertReferenceFromV20(sourceRelationshipElement.second, ReferenceTypes.ModelReference); + outputSubmodelElement = new RelationshipElement(newFirst, newSecond); + } + else if (sourceSubmodelElement is AdminShellV20.BasicEvent sourceBasicEvent) + { + var newObserved = ExtensionsUtil.ConvertReferenceFromV20(sourceBasicEvent.observed, ReferenceTypes.ModelReference); + + outputSubmodelElement = new BasicEventElement(newObserved, Direction.Input, StateOfEvent.Off); + //TODO (jtikekar, 0000-00-00): default values of enums + } + else if (sourceSubmodelElement is AdminShellV20.Entity sourceEntity) + { + var entityType = Stringification.EntityTypeFromString(sourceEntity.entityType); + var newEntity = new Entity(entityType ?? EntityType.CoManagedEntity); + outputSubmodelElement = newEntity.ConvertFromV20(sourceEntity); + } + else if (sourceSubmodelElement is AdminShellV20.Operation sourceOperation) + { + var newInputVariables = new List(); + var newOutputVariables = new List(); + var newInOutVariables = new List(); + if (!sourceOperation.inputVariable.IsNullOrEmpty()) + { + + foreach (var inputVariable in sourceOperation.inputVariable) + { + if (inputVariable.value.submodelElement != null) + { + ISubmodelElement newSubmodelElement = null; + newSubmodelElement = newSubmodelElement.ConvertFromV20(inputVariable.value.submodelElement); + var newOpVariable = new OperationVariable(newSubmodelElement); + newInputVariables.Add(newOpVariable); + } + } + } + if (!sourceOperation.outputVariable.IsNullOrEmpty()) + { + foreach (var outputVariable in sourceOperation.outputVariable) + { + if (outputVariable.value.submodelElement != null) + { + ISubmodelElement newSubmodelElement = null; + newSubmodelElement = newSubmodelElement.ConvertFromV20(outputVariable.value.submodelElement); + var newOpVariable = new OperationVariable(newSubmodelElement); + newOutputVariables.Add(newOpVariable); + } + } + } + + if (!sourceOperation.inoutputVariable.IsNullOrEmpty()) + { + foreach (var inOutVariable in sourceOperation.inoutputVariable) + { + if (inOutVariable.value.submodelElement != null) + { + ISubmodelElement newSubmodelElement = null; + newSubmodelElement = newSubmodelElement.ConvertFromV20(inOutVariable.value.submodelElement); + var newOpVariable = new OperationVariable(newSubmodelElement); + newInOutVariables.Add(newOpVariable); + } + } + } + + outputSubmodelElement = new Operation(inputVariables: newInputVariables, outputVariables: newOutputVariables, inoutputVariables: newInOutVariables); + } + else if (sourceSubmodelElement is AdminShellV20.Capability) + { + outputSubmodelElement = new Capability(); + } + + if (outputSubmodelElement != null) + { + outputSubmodelElement.BasicConversionFromV20(sourceSubmodelElement); + } + } + + return outputSubmodelElement; + } + + private static void BasicConversionFromV20(this ISubmodelElement submodelElement, AdminShellV20.SubmodelElement sourceSubmodelElement) + { + if (!string.IsNullOrEmpty(sourceSubmodelElement.idShort)) + submodelElement.IdShort = sourceSubmodelElement.idShort; + + if (!string.IsNullOrEmpty(sourceSubmodelElement.category)) + submodelElement.Category = sourceSubmodelElement.category; + + if (sourceSubmodelElement.description != null) + submodelElement.Description = ExtensionsUtil.ConvertDescriptionFromV20(sourceSubmodelElement.description); + + if (sourceSubmodelElement.semanticId != null && !sourceSubmodelElement.semanticId.IsEmpty) + { + var keyList = new List(); + foreach (var refKey in sourceSubmodelElement.semanticId.Keys) + { + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + // DECISION: After phone call with Birgit, set all CD to GlobalReference + // assuming it is always a external concept + if (keyType == KeyTypes.ConceptDescription) + keyType = KeyTypes.GlobalReference; + + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {refKey.type} not found."); + } + } + submodelElement.SemanticId = new Reference(ReferenceTypes.ExternalReference, keyList); + } + + + if (!sourceSubmodelElement.qualifiers.IsNullOrEmpty()) + { + if (submodelElement.Qualifiers == null || submodelElement.Qualifiers.Count == 0) + submodelElement.Qualifiers = new List(); + + foreach (var sourceQualifier in sourceSubmodelElement.qualifiers) + { + var newQualifier = new Qualifier("", DataTypeDefXsd.String); + newQualifier = newQualifier.ConvertFromV20(sourceQualifier); + submodelElement.Qualifiers.Add(newQualifier); + } + } + + if (sourceSubmodelElement.hasDataSpecification != null && sourceSubmodelElement.hasDataSpecification.Count > 0) + { + foreach (var sourceEmbeddedDataSpec in sourceSubmodelElement.hasDataSpecification) + { + var newEmbeddedDataSpec = new EmbeddedDataSpecification (null, null); + newEmbeddedDataSpec.ConvertFromV20(sourceEmbeddedDataSpec); + if(newEmbeddedDataSpec.DataSpecification != null || newEmbeddedDataSpec.DataSpecificationContent != null) + { + submodelElement.EmbeddedDataSpecifications ??= new List(); + submodelElement.EmbeddedDataSpecifications.Add(newEmbeddedDataSpec); + } + } + } + + // move Qualifiers to Extensions + submodelElement.MigrateV20QualifiersToExtensions(); + } + + #region List + + public static IReferable FindReferableByReference( + this List submodelElements, Reference rf, int keyIndex) + { + return FindReferableByReference(submodelElements, rf?.Keys, keyIndex); + } + + public static IReferable FindReferableByReference( + this List submodelElements, List keys, int keyIndex) + { + // first index needs to exist .. + if (submodelElements == null || keys == null || keyIndex >= keys.Count) + return null; + + + // over all wrappers + foreach (var smw in submodelElements) + if (smw != null && smw.IdShort.Equals(keys[keyIndex].Value, StringComparison.OrdinalIgnoreCase)) + { + // match on this level. Did we find a leaf element? + if ((keyIndex + 1) >= keys.Count) + return smw; + + // dive into SMC? + if (smw is SubmodelElementCollection smc) + { + var found = FindReferableByReference(smc.Value, keys, keyIndex + 1); + if (found != null) + return found; + } + // dive into SML? + if (smw is SubmodelElementList submodelElementList) + { + var found = FindReferableByReference(submodelElementList.Value, keys, keyIndex + 1); + if (found != null) + return found; + } + + // dive into AnnotedRelationshipElement? + if (smw is AnnotatedRelationshipElement annotatedRelationshipElement) + { + var annotations = new List(annotatedRelationshipElement.Annotations); + var found = FindReferableByReference(annotations, keys, keyIndex + 1); + if (found != null) + return found; + } + + // dive into Entity statements? + if (smw is Entity ent) + { + var found = FindReferableByReference(ent.Statements, keys, keyIndex + 1); + if (found != null) + return found; + } + + // else: + return null; + } + + // no? + return null; + } + + public static IEnumerable FindDeep(this IEnumerable submodelElements, Predicate match = null) where T : ISubmodelElement + { + foreach (var smw in submodelElements) + { + var current = smw; + if (current == null) + continue; + + // call lambda for this element + if (current is T) + if (match == null || match.Invoke((T)current)) + yield return (T)current; + + // dive into? + // TODO (MIHO, 2020-07-31): would be nice to use IEnumerateChildren for this .. + // TODO (MIHO, 2023-01-01): would be nice to use AasCore.DescendOnce() for this .. +#if __old__ + if (current is SubmodelElementCollection smc && smc.Value != null) + foreach (var x in smc.Value.FindDeep(match)) + yield return x; + + if (current is AnnotatedRelationshipElement are && are.Annotations != null) + { + var annotationsList = new List(are.Annotations); + foreach (var x in annotationsList.FindDeep(match)) + yield return x; + } + + if (current is Entity ent && ent.Statements != null) + foreach (var x in ent.Statements.FindDeep(match)) + yield return x; + + if (current is Operation op) + { + var operationVariables = new List(); + foreach (var opVariable in op.InputVariables) + { + operationVariables.Add(opVariable.Value); + } + + foreach (var opVariable in op.InoutputVariables) + { + operationVariables.Add(opVariable.Value); + } + + foreach (var opVariable in op.OutputVariables) + { + operationVariables.Add(opVariable.Value); + } + + foreach (var x in operationVariables.FindDeep(match)) + yield return x; + } +#else + var smeChilds = current.DescendOnce().Where((ic) => ic is ISubmodelElement) + .Cast(); + foreach (var x in smeChilds.FindDeep(match)) + yield return x; +#endif + } + } + + public static void CopyManySMEbyCopy(this List submodelElements, ConceptDescription destCD, + List sourceSmc, ConceptDescription sourceCD, + bool createDefault = false, Action setDefault = null, + MatchMode matchMode = MatchMode.Relaxed) where T : ISubmodelElement + { + submodelElements.CopyManySMEbyCopy(destCD.GetSingleKey(), sourceSmc, sourceCD.GetSingleKey(), + createDefault ? destCD : null, setDefault, matchMode); + } + + public static void CopyManySMEbyCopy(this List submodelElements, Key destSemanticId, + List sourceSmc, Key sourceSemanticId, + ConceptDescription createDefault = null, Action setDefault = null, + MatchMode matchMode = MatchMode.Relaxed) where T : ISubmodelElement + { + // bool find possible sources + bool foundSrc = false; + if (sourceSmc == null) + return; + foreach (var src in sourceSmc.FindAllSemanticIdAs(sourceSemanticId, matchMode)) + { + // type of found src? + AasSubmodelElements aeSrc = (AasSubmodelElements)Enum.Parse(typeof(AasSubmodelElements), src.GetType().Name); + + // ok? + if (src == null || aeSrc == AasSubmodelElements.SubmodelElement) + continue; + foundSrc = true; + + // ok, create new one + var dst = AdminShellNS.AdminShellUtil.CreateSubmodelElementFromEnum(aeSrc, src); + if (dst != null) + { + // make same things sure + dst.IdShort = src.IdShort; + dst.Category = src.Category; + dst.SemanticId = new Reference(ReferenceTypes.ModelReference, new List() { destSemanticId }); + + // instantanously add it? + submodelElements.Add(dst); + } + } + + // default? + if (createDefault != null && !foundSrc) + { + // ok, default + var dflt = submodelElements.CreateSMEForCD(createDefault, addSme: true); + + // set default? + setDefault?.Invoke(dflt); + } + } + + public static T CopyOneSMEbyCopy(this List submodelElements, ConceptDescription destCD, + List sourceSmc, Key[] sourceKeys, + bool createDefault = false, Action setDefault = null, + MatchMode matchMode = MatchMode.Relaxed, + string idShort = null, bool addSme = false) where T : ISubmodelElement + { + return submodelElements.CopyOneSMEbyCopy(destCD?.GetSingleKey(), sourceSmc, sourceKeys, + createDefault ? destCD : null, setDefault, matchMode, idShort, addSme); + } + + public static T CopyOneSMEbyCopy(this List submodelELements, ConceptDescription destCD, + List sourceSmc, ConceptDescription sourceCD, + bool createDefault = false, Action setDefault = null, + MatchMode matchMode = MatchMode.Relaxed, + string idShort = null, bool addSme = false) where T : ISubmodelElement + { + return submodelELements.CopyOneSMEbyCopy(destCD?.GetSingleKey(), sourceSmc, new[] { sourceCD?.GetSingleKey() }, + createDefault ? destCD : null, setDefault, matchMode, idShort, addSme); + } + + public static T CopyOneSMEbyCopy(this List submodelElements, Key destSemanticId, + List sourceSmc, Key[] sourceSemanticId, + ConceptDescription createDefault = null, Action setDefault = null, + MatchMode matchMode = MatchMode.Relaxed, + string idShort = null, bool addSme = false) where T : ISubmodelElement + { + // get source + var src = sourceSmc.FindFirstAnySemanticIdAs(sourceSemanticId, matchMode); + + // may be make an adaptive conversion + if (src == null) + { + var anySrc = sourceSmc?.FindFirstAnySemanticId(sourceSemanticId, matchMode: matchMode); + src = submodelElements.AdaptiveConvertTo(anySrc, createDefault, + idShort: idShort, addSme: false); + } + + // proceed + AasSubmodelElements aeSrc = (AasSubmodelElements)Enum.Parse(typeof(AasSubmodelElements), src?.GetType().Name); + if (src == null || aeSrc == AasSubmodelElements.SubmodelElement) + { + // create a default? + if (createDefault == null) + return default(T); + + // ok, default + var dflt = submodelElements.CreateSMEForCD(createDefault, idShort: idShort, addSme: addSme); + + // set default? + setDefault?.Invoke(dflt); + + // return + return dflt; + } + + // ok, create new one + var dst = AdminShellNS.AdminShellUtil.CreateSubmodelElementFromEnum(aeSrc, src); + if (dst == null) + return default(T); + + // make same things sure + dst.IdShort = src.IdShort; + dst.Category = src.Category; + dst.SemanticId = new Reference(ReferenceTypes.ModelReference, new List() { destSemanticId }); + + // instantanously add it? + if (addSme) + submodelElements.Add(dst); + + // give back + return (T)dst; + } + + public static T AdaptiveConvertTo(this List submodelElements, + ISubmodelElement anySrc, + ConceptDescription createDefault = null, + string idShort = null, bool addSme = false) where T : ISubmodelElement + { + if (typeof(T) == typeof(MultiLanguageProperty) + && anySrc is Property srcProp) + { + var res = submodelElements.CreateSMEForCD(createDefault, idShort: idShort, addSme: addSme); + if (res is MultiLanguageProperty mlp) + { + mlp.Value = new List() { + new LangStringTextType(AdminShellUtil.GetDefaultLngIso639(), srcProp.Value) }; + mlp.ValueId = srcProp.ValueId; + return res; + } + } + + if (typeof(T) == typeof(Property) + && anySrc is MultiLanguageProperty srcMlp) + { + var res = submodelElements.CreateSMEForCD(createDefault, idShort: idShort, addSme: addSme); + if (res is Property prp) + { + prp.Value = "" + srcMlp.Value?.GetDefaultString(); + prp.ValueId = srcMlp.ValueId; + return res; + } + } + + return default(T); + } + + public static IEnumerable FindAllIdShort(this List submodelElements, + string idShort) + { + foreach (var smw in submodelElements) + if (smw != null) + if (smw.IdShort.Trim().ToLower() == idShort.Trim().ToLower()) + yield return smw; + } + + public static IEnumerable FindAllIdShortAs(this List submodelElements, + string idShort) where T : class, ISubmodelElement + { + foreach (var smw in submodelElements) + if (smw is T) + if (smw.IdShort.Trim().ToLower() == idShort.Trim().ToLower()) + yield return smw as T; + } + + public static ISubmodelElement FindFirstIdShort(this List submodelElements, + string idShort) + { + return submodelElements.FindAllIdShort(idShort)?.FirstOrDefault(); + } + + public static T FindFirstIdShortAs(this List submodelElements, + string idShort) where T : class, ISubmodelElement + { + return submodelElements.FindAllIdShortAs(idShort)?.FirstOrDefault(); + } + + + public static ISubmodelElement FindFirstAnySemanticId(this List submodelElements, + Key[] semId, Type[] allowedTypes = null, MatchMode matchMode = MatchMode.Strict) + { + if (semId == null) + return null; + foreach (var si in semId) + { + var found = submodelElements.FindAllSemanticId(si, allowedTypes, matchMode)? + .FirstOrDefault(); + if (found != null) + return found; + } + return null; + } + + public static T FindFirstAnySemanticIdAs( + this List submodelElements, IKey[] semId, MatchMode matchMode = MatchMode.Strict) + where T : ISubmodelElement + { + if (semId == null) + return default(T); + foreach (var si in semId) + { + var found = submodelElements.FindAllSemanticIdAs(si, matchMode).FirstOrDefault(); + if (found != null) + return found; + } + return default(T); + } + + public static T CreateNew( + string idShort = null, string category = null, IReference semanticId = null) + where T : ISubmodelElement, new() + { + var res = new T(); + if (idShort != null) + res.IdShort = idShort; + if (category != null) + res.Category = category; + if (semanticId != null) + res.SemanticId = semanticId.Copy(); + return res; + } + + public static T CreateSMEForCD(this List submodelELements, IConceptDescription conceptDescription, string category = null, string idShort = null, + string idxTemplate = null, int maxNum = 999, bool addSme = false, bool isTemplate = false) + where T : ISubmodelElement + { + // access + if (conceptDescription == null) + return default(T); + + // fin type enum + var smeType = AdminShellUtil.AasSubmodelElementsFrom(); + if (!smeType.HasValue) + return default(T); + + // try to potentially figure out idShort + var ids = conceptDescription.IdShort; + + //TODO (jtikekar, 0000-00-00): Temporarily removed + if ((ids == null || ids.Trim() == "") && conceptDescription.GetIEC61360() != null) + ids = conceptDescription.GetIEC61360().ShortName? + .GetDefaultString(); + + if (idShort != null) + ids = idShort; + + if (ids == null) + return default(T); + + // unique? + if (idxTemplate != null) + ids = submodelELements.IterateIdShortTemplateToBeUnique(idxTemplate, maxNum); + + // make a new instance + var semanticId = conceptDescription.GetCdReference(); + ISubmodelElement sme = AdminShellUtil.CreateSubmodelElementFromEnum(smeType.Value); + if (sme == null) + return default(T); + sme.IdShort = ids; + sme.SemanticId = semanticId.Copy(); + if (category != null) + sme.Category = category; + + // if its a SMC, make sure its accessible + if (sme is SubmodelElementCollection smc) + smc.Value = new List(); + + // instantanously add it? + if (addSme) + submodelELements.Add(sme); + + // give back + return (T)sme; + } + + public static IEnumerable FindAllSemanticIdAs(this List submodelELements, + IKey semId, MatchMode matchMode = MatchMode.Strict) + where T : ISubmodelElement + { + if (submodelELements.IsNullOrEmpty()) + yield return default(T); + foreach (var submodelElement in submodelELements) + if (submodelElement != null && submodelElement is T + && submodelElement.SemanticId != null) + if (submodelElement.SemanticId.MatchesExactlyOneKey(semId, matchMode)) + yield return (T)submodelElement; + } + + public static IEnumerable FindAllSemanticIdAs(this List submodelELements, + IReference semId, MatchMode matchMode = MatchMode.Strict) + where T : ISubmodelElement + { + foreach (var submodelElement in submodelELements) + if (submodelElement != null && submodelElement is T + && submodelElement.SemanticId != null) + if (submodelElement.SemanticId.Matches(semId, matchMode)) + yield return (T)submodelElement; + } + + public static T FindFirstSemanticIdAs(this List submodelElements, + IKey semId, MatchMode matchMode = MatchMode.Strict) + where T : ISubmodelElement + { + return submodelElements.FindAllSemanticIdAs(semId, matchMode).FirstOrDefault(); + } + + public static T FindFirstSemanticIdAs(this List submodelElements, + IReference semId, MatchMode matchMode = MatchMode.Strict) + where T : ISubmodelElement + { + return submodelElements.FindAllSemanticIdAs(semId, matchMode).FirstOrDefault(); + } + + public static List GetChildListFromFirstSemanticId( + this List submodelElements, + IKey semKey, MatchMode matchMode = MatchMode.Strict) + { + return FindFirstSemanticIdAs(submodelElements, semKey, matchMode)?.GetChildsAsList(); + } + + public static List GetChildListFromFirstSemanticId( + this List submodelElements, + IReference semId, MatchMode matchMode = MatchMode.Strict) + { + return FindFirstSemanticIdAs(submodelElements, semId, matchMode)?.GetChildsAsList(); + } + + public static IEnumerable> GetChildListsFromAllSemanticId( + this List submodelElements, + IKey semKey, MatchMode matchMode = MatchMode.Strict) + { + foreach (var child in FindAllSemanticIdAs(submodelElements, semKey, matchMode)) + yield return child.GetChildsAsList()?.ToList(); + } + + public static IEnumerable> GetChildListsFromAllSemanticId( + this List submodelElements, + IReference semId, MatchMode matchMode = MatchMode.Strict) + { + foreach (var child in FindAllSemanticIdAs(submodelElements, semId, matchMode)) + yield return child.GetChildsAsList()?.ToList(); + } + + public static IEnumerable Join(params IEnumerable[] lists) + { + if (lists == null || lists.Length < 1) + yield break; + foreach (var l in lists) + foreach (var sme in l) + yield return sme; + } + + public static void RecurseOnReferables( + this List submodelElements, object state, List parents, + Func, IReferable, bool> lambda) + { + if (lambda == null) + return; + if (parents == null) + parents = new List(); + + // over all elements + foreach (var submodelElement in submodelElements) + { + var current = submodelElement; + if (current == null) + continue; + + // call lambda for this element + // AND decide, if to recurse! + var goDeeper = lambda(state, parents, current); + + if (goDeeper) + { + // add to parents + parents.Add(current); + + // dive into? + if (current is SubmodelElementCollection smc) + smc.Value?.RecurseOnReferables(state, parents, lambda); + + if (current is Entity ent) + ent.Statements?.RecurseOnReferables(state, parents, lambda); + + if (current is Operation operation) + { + SubmodelElementCollection opVariableCollection = new SubmodelElementCollection(); + opVariableCollection.Value = new List(); + foreach (var inputVariable in operation.InputVariables) + { + opVariableCollection.Value.Add(inputVariable.Value); + } + + foreach (var outputVariable in operation.OutputVariables) + { + opVariableCollection.Value.Add(outputVariable.Value); + } + + foreach (var inOutVariable in operation.InoutputVariables) + { + opVariableCollection.Value.Add(inOutVariable.Value); + } + + opVariableCollection.Value.RecurseOnReferables(state, parents, lambda); + } + + if (current is AnnotatedRelationshipElement annotatedRelationshipElement) + { + var annotationElements = new List(); + if (annotatedRelationshipElement.Annotations != null) + foreach (var annotation in annotatedRelationshipElement.Annotations) + { + annotationElements.Add(annotation); + } + annotationElements.RecurseOnReferables(state, parents, lambda); + } + + // remove from parents + parents.RemoveAt(parents.Count - 1); + } + } + } + + public static void RecurseOnSubmodelElements( + this List submodelElements, object state, + List parents, Action, ISubmodelElement> lambda) + { + // trivial + if (lambda == null) + return; + if (parents == null) + parents = new List(); + + // over all elements + foreach (var smw in submodelElements) + { + var current = smw; + if (current == null) + continue; + + // call lambda for this element + lambda(state, parents, current); + + // add to parents + parents.Add(current); + + // dive into? + if (current is SubmodelElementCollection smc) + smc.Value?.RecurseOnSubmodelElements(state, parents, lambda); + + if (current is Entity ent) + ent.Statements?.RecurseOnSubmodelElements(state, parents, lambda); + + if (current is Operation operation) + { + SubmodelElementCollection opVariableCollection = new SubmodelElementCollection(); + foreach (var inputVariable in operation.InputVariables) + { + opVariableCollection.Value.Add(inputVariable.Value); + } + + foreach (var outputVariable in operation.OutputVariables) + { + opVariableCollection.Value.Add(outputVariable.Value); + } + + foreach (var inOutVariable in operation.InoutputVariables) + { + opVariableCollection.Value.Add(inOutVariable.Value); + } + + opVariableCollection.Value.RecurseOnSubmodelElements(state, parents, lambda); + } + + if (current is AnnotatedRelationshipElement annotatedRelationshipElement) + { + var annotationElements = new List(); + foreach (var annotation in annotatedRelationshipElement.Annotations) + { + annotationElements.Add(annotation); + } + annotationElements.RecurseOnSubmodelElements(state, parents, lambda); + } + + // remove from parents + parents.RemoveAt(parents.Count - 1); + } + } + + public static IEnumerable FindAllSemanticIdAs( + this List submodelELements, string semanticId) where T : ISubmodelElement + { + foreach (var submodelElement in submodelELements) + { + if (submodelElement != null && submodelElement is T && submodelElement.SemanticId != null) + { + if (submodelElement.SemanticId.Matches(semanticId)) + { + yield return (T)submodelElement; + } + } + } + } + + public static T FindFirstSemanticIdAs( + this List submodelELements, string semanticId) where T : ISubmodelElement + { + return submodelELements.FindAllSemanticIdAs(semanticId).FirstOrDefault(); + } + + public static T FindFirstAnySemanticIdAs( + this List submodelELements, string[] semanticIds) where T : ISubmodelElement + { + if (semanticIds == null) + return default; + foreach (var semanticId in semanticIds) + { + var found = submodelELements.FindFirstSemanticIdAs(semanticId); + if (found != null) + return found; + } + return default; + } + + public static IEnumerable FindAllSemanticId( + this List smes, + string[] allowedSemanticIds, + bool invertedAllowed = false) where T : ISubmodelElement + { + if (allowedSemanticIds == null || allowedSemanticIds.Length < 1) + yield break; + + foreach (var sme in smes) + { + if (sme == null || !(sme is T)) + continue; + + if (sme.SemanticId == null || sme.SemanticId.Keys.Count < 1) + { + if (invertedAllowed) + yield return (T)sme; + continue; + } + + var found = false; + foreach (var semanticId in allowedSemanticIds) + if (sme.SemanticId.Matches(semanticId)) + { + found = true; + break; + } + + if (invertedAllowed) + found = !found; + + if (found) + yield return (T)sme; + } + } + + public static T FindFirstAnySemanticId( + this List submodelElements, string[] allowedSemanticIds, + bool invertAllowed = false) where T : ISubmodelElement + { + return submodelElements.FindAllSemanticId(allowedSemanticIds, invertAllowed).FirstOrDefault(); + } + + public static IEnumerable FindAllSemanticId( + this List smes, + IKey[] allowedSemanticIds, MatchMode mm = MatchMode.Strict, + bool invertedAllowed = false) where T : ISubmodelElement + { + if (allowedSemanticIds == null || allowedSemanticIds.Length < 1) + yield break; + + foreach (var sme in smes) + { + if (sme == null || !(sme is T)) + continue; + + if (sme.SemanticId == null || sme.SemanticId.Keys.Count < 1) + { + if (invertedAllowed) + yield return (T)sme; + continue; + } + + var found = false; + foreach (var semanticId in allowedSemanticIds) + if (sme.SemanticId.MatchesExactlyOneKey(semanticId, mm)) + { + found = true; + break; + } + + if (invertedAllowed) + found = !found; + + if (found) + yield return (T)sme; + } + } + + public static T FindFirstAnySemanticId( + this List submodelElements, + IKey[] allowedSemanticIds, MatchMode mm = MatchMode.Strict, + bool invertAllowed = false) where T : ISubmodelElement + { + return submodelElements.FindAllSemanticId(allowedSemanticIds, mm, invertAllowed).FirstOrDefault(); + } + + public static IEnumerable FindAllSemanticId( + this List submodelElements, IKey semId, + Type[] allowedTypes = null, + MatchMode matchMode = MatchMode.Strict) + { + foreach (var smw in submodelElements) + if (smw != null && smw.SemanticId != null) + { + if (smw == null) + continue; + + if (allowedTypes != null) + { + var smwt = smw.GetType(); + if (!allowedTypes.Contains(smwt)) + continue; + } + + if (smw.SemanticId.MatchesExactlyOneKey(semId, matchMode)) + yield return smw; + } + } + + public static ISubmodelElement FindFirstSemanticId( + this List submodelElements, + IKey semId, Type[] allowedTypes = null, MatchMode matchMode = MatchMode.Strict) + { + return submodelElements.FindAllSemanticId(semId, allowedTypes, matchMode)?.FirstOrDefault(); + } + + public static IEnumerable FindAllSemanticIdAs( + this List smes, + ConceptDescription cd, MatchMode matchMode = MatchMode.Strict) + where T : ISubmodelElement + { + foreach (var x in FindAllSemanticIdAs(smes, cd.GetReference(), matchMode)) + yield return x; + } + + public static T FindFirstSemanticIdAs( + this List smes, + ConceptDescription cd, MatchMode matchMode = MatchMode.Strict) + where T : ISubmodelElement + { + return smes.FindAllSemanticIdAs(cd, matchMode).FirstOrDefault(); + } + + public static string IterateIdShortTemplateToBeUnique(this List submodelElements, string idShortTemplate, int maxNum) + { + if (idShortTemplate == null || maxNum < 1 || !idShortTemplate.Contains("{0")) + return null; + + int i = 1; + while (i < maxNum) + { + var ids = string.Format(idShortTemplate, i); + if (submodelElements.CheckIdShortIsUnique(ids)) + return ids; + i++; + } + + return null; + } + + /// + /// Returns false, if there is another element with same idShort in the list + /// + public static bool CheckIdShortIsUnique(this List submodelElements, string idShort) + { + idShort = idShort?.Trim(); + if (idShort == null || idShort.Length < 1) + return false; + + var res = true; + foreach (var smw in submodelElements) + if (smw != null && smw.IdShort != null && smw.IdShort == idShort) + { + res = false; + break; + } + + return res; + } + + #endregion + + public static ISubmodelElement UpdateFrom(this ISubmodelElement elem, ISubmodelElement source) + { + if (source == null) + return elem; + + // IReferable + elem.Category = source.Category; + elem.IdShort = source.IdShort; + elem.DisplayName = source.DisplayName?.Copy(); + elem.Description = source.Description?.Copy(); + + + // IHasSemantics + if (source.SemanticId != null) + elem.SemanticId = source.SemanticId.Copy(); + if (source.SupplementalSemanticIds != null) + elem.SupplementalSemanticIds = source.SupplementalSemanticIds.Copy(); + + // IQualifiable + if (source.Qualifiers != null) + elem.Qualifiers = source.Qualifiers.Copy(); + + // IHasDataSpecification + if (source.EmbeddedDataSpecifications != null) + elem.EmbeddedDataSpecifications = source.EmbeddedDataSpecifications.Copy(); + + return elem; + } + + // + // Factories + // + + private static readonly Dictionary AasSubmodelElementsToAbbrev = ( + new Dictionary() + { + { AasSubmodelElements.AnnotatedRelationshipElement, "RelA" }, + { AasSubmodelElements.BasicEventElement, "BEvt" }, + { AasSubmodelElements.Blob, "Blob" }, + { AasSubmodelElements.Capability, "Cap" }, + { AasSubmodelElements.DataElement, "DE" }, + { AasSubmodelElements.Entity, "Ent" }, + { AasSubmodelElements.EventElement, "Evt" }, + { AasSubmodelElements.File, "File" }, + { AasSubmodelElements.MultiLanguageProperty, "MLP" }, + { AasSubmodelElements.Operation, "Opr" }, + { AasSubmodelElements.Property, "Prop" }, + { AasSubmodelElements.Range, "Range" }, + { AasSubmodelElements.ReferenceElement, "Ref" }, + { AasSubmodelElements.RelationshipElement, "Rel" }, + { AasSubmodelElements.SubmodelElement, "SME" }, + { AasSubmodelElements.SubmodelElementList, "SML" }, + { AasSubmodelElements.SubmodelElementCollection, "SMC" } + }); + + /// + /// Retrieve the string abbreviation of . + /// + /// + /// If is not a valid literal, return null. + /// + public static string? ToString(AasSubmodelElements? that) + { + if (!that.HasValue) + { + return null; + } + else + { + if (AasSubmodelElementsToAbbrev.TryGetValue(that.Value, out string? value)) + { + return value; + } + else + { + return null; + } + } + } + + private static readonly Dictionary _aasSubmodelElementsFromAbbrev = ( + new Dictionary() + { + { "RelA", AasSubmodelElements.AnnotatedRelationshipElement }, + { "BEvt", AasSubmodelElements.BasicEventElement }, + { "Blob", AasSubmodelElements.Blob }, + { "Cap", AasSubmodelElements.Capability }, + { "DE", AasSubmodelElements.DataElement }, + { "Ent", AasSubmodelElements.Entity }, + { "Evt", AasSubmodelElements.EventElement }, + { "File", AasSubmodelElements.File }, + { "MLP", AasSubmodelElements.MultiLanguageProperty }, + { "Opr", AasSubmodelElements.Operation }, + { "Prop", AasSubmodelElements.Property }, + { "Range", AasSubmodelElements.Range }, + { "Ref", AasSubmodelElements.ReferenceElement }, + { "Rel", AasSubmodelElements.RelationshipElement }, + { "SME", AasSubmodelElements.SubmodelElement }, + { "SML", AasSubmodelElements.SubmodelElementList }, + { "SMC", AasSubmodelElements.SubmodelElementCollection } + }); + + /// + /// Parse the string abbreviation of . + /// + /// + /// If is not a valid string representation + /// of a literal of , + /// return null. + /// + public static AasSubmodelElements? AasSubmodelElementsFromAbbrev(string text) + { + if (_aasSubmodelElementsFromAbbrev.TryGetValue(text, out AasSubmodelElements value)) + { + return value; + } + else + { + return null; + } + } + + /// + /// Parse the string representation or the abbreviation of . + /// + /// + /// If is not a valid string representation + /// of a literal of , + /// return null. + /// + public static AasSubmodelElements? AasSubmodelElementsFromStringOrAbbrev(string text) + { + var res = Stringification.AasSubmodelElementsFromString(text); + if (res.HasValue) + return res; + + return AasSubmodelElementsFromAbbrev(text); + } + + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendKey.cs b/src/AasxCsharpLibrary/Extensions/ExtendKey.cs new file mode 100644 index 000000000..f2c09ffa6 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendKey.cs @@ -0,0 +1,268 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using AdminShellNS; +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; +using System.Text.RegularExpressions; + +namespace Extensions +{ + public static class ExtendKey + { + public static IKey CreateFrom(Reference r) + { + if (r == null || r.Count() != 1) + return null; + return r.Keys[0].Copy(); + } + + public static bool Matches(this IKey key, + KeyTypes type, string id, MatchMode matchMode = MatchMode.Strict) + { + key.Value = key.Value.Trim(); + id = id.Trim(); + + if (matchMode == MatchMode.Strict) + return key.Type == type && key.Value.Replace("*01", "") == id.Replace("*01", ""); + + if (matchMode == MatchMode.Relaxed) + return (key.Type == type || key.Type == KeyTypes.GlobalReference || type == KeyTypes.GlobalReference) + && key.Value.Replace("*01", "") == id.Replace("*01", ""); + + if (matchMode == MatchMode.Identification) + return key.Value.Replace("*01", "") == id.Replace("*01", ""); + + return false; + } + public static bool Matches(this IKey key, IKey otherKey) + { + key.Value = key.Value.Trim(); + otherKey.Value = otherKey.Value.Trim(); + + if (otherKey == null) + { + return false; + } + + if (key.Type == otherKey.Type && key.Value.Replace("*01", "").Equals(otherKey.Value.Replace("*01", ""))) + { + return true; + } + + return false; + } + + public static bool Matches(this IKey key, IKey otherKey, MatchMode matchMode = MatchMode.Strict) + { + key.Value = key.Value.Trim(); + otherKey.Value = otherKey.Value.Trim(); + + if (matchMode == MatchMode.Strict) + return key.Type == otherKey.Type && key.Value.Replace("*01", "") == otherKey.Value.Replace("*01", ""); + + if (matchMode == MatchMode.Relaxed) + return (key.Type == otherKey.Type || key.Type == KeyTypes.GlobalReference || otherKey.Type == KeyTypes.GlobalReference) + && (key.Value.Replace("*01", "") == otherKey.Value.Replace("*01", "")); + + if (matchMode == MatchMode.Identification) + return key.Value.Replace("*01", "") == otherKey.Value.Replace("*01", ""); + + return false; + } + + public static bool MatchesSetOfTypes(this IKey key, IEnumerable set) + { + foreach (var kt in set) + if (key.Type == kt) + return true; + return false; + } + + public static AasValidationAction Validate(this IKey key, AasValidationRecordList results, IReferable container) + { + // access + if (results == null || container == null) + return AasValidationAction.No; + + var res = AasValidationAction.No; + + // check + if (key == null) + { + // violation case + results.Add(new AasValidationRecord( + AasValidationSeverity.SpecViolation, container, + "Key: is null", + () => + { + res = AasValidationAction.ToBeDeleted; + })); + } + else + { + + // check type + var tf = AdminShellUtil.CheckIfInConstantStringArray(Enum.GetNames(typeof(KeyTypes)), Stringification.ToString(key.Type)); + if (tf == AdminShellUtil.ConstantFoundEnum.No) + // violation case + results.Add(new AasValidationRecord( + AasValidationSeverity.SchemaViolation, container, + "Key: type is not in allowed enumeration values", + () => + { + key.Type = KeyTypes.GlobalReference; + })); + if (tf == AdminShellUtil.ConstantFoundEnum.AnyCase) + // violation case + // dead-csharp off + results.Add(new AasValidationRecord( + AasValidationSeverity.SchemaViolation, container, + "Key: type in wrong casing", + () => + { + //NO IdType in V3 + //key.idType = AdminShellUtil.CorrectCasingForConstantStringArray( + // KeyElements, key.type); + })); + // dead-csharp on + } + + // may give result "to be deleted" + return res; + } + + public static string ToStringExtended(this IKey key, int format = 1) + { + if (format == 2) + return "" + key.Value; + return $"[{key.Type}, {key.Value}]"; + } + + public static bool IsAbsolute(this IKey key) + { + return key.Type == KeyTypes.GlobalReference || key.Type == KeyTypes.AssetAdministrationShell || key.Type == KeyTypes.Submodel; + } + + public static Key Parse(string cell, KeyTypes typeIfNotSet = KeyTypes.GlobalReference, + bool allowFmtAll = false, bool allowFmt0 = false, + bool allowFmt1 = false, bool allowFmt2 = false) + { + // access and defaults? + if (cell == null || cell.Trim().Length < 1) + return null; + + // format == 1 + if (allowFmtAll || allowFmt1) + { + var m = Regex.Match(cell, @"\((\w+)\)( ?)(.*)$"); + if (m.Success) + { + return new Key( + Stringification.KeyTypesFromString(m.Groups[1].ToString()) ?? KeyTypes.GlobalReference, + m.Groups[3].ToString()); + } + } + + // format == 2 + if (allowFmtAll || allowFmt2) + { + var m = Regex.Match(cell, @"( ?)(.*)$"); + if (m.Success) + { + return new Key( + typeIfNotSet, m.Groups[2].ToString()); + } + } + + // format == 0 + if (allowFmtAll || allowFmt0) + { + var m = Regex.Match(cell, @"\[(\w+),( ?)(.*)\]"); + if (m.Success) + { + return new Key( + Stringification.KeyTypesFromString(m.Groups[1].ToString()) ?? KeyTypes.GlobalReference, + m.Groups[3].ToString()); + } + } + + // no + return null; + } + + #region Guess identification types + + public enum IdType { Unknown = 0, IRI, IRDI }; + + public static IdType GuessIdType(string id) + { + // start + if (id == null) + return IdType.Unknown; + id = id.Trim().ToLower(); + + // IRDI? + if (Regex.IsMatch(id, @"(\d{3,4})\W+")) + return IdType.IRDI; + + // IRI? + // TODO (??, 0000-00-00): check for escaping + if (Regex.IsMatch(id, @"(\w{3,5})://")) + return IdType.IRI; + + // unsure + return IdType.Unknown; + } + + #endregion + + // dead-csharp off + // ------------------------------------------------------------------------------------------------------------- + #region Handling with enums for KeyTypes + + // see: https://stackoverflow.com/questions/27372816/how-to-read-the-value-for-an-enummember-attribute + //public static string? GetEnumMemberValue(this T value) + // where T : Enum + //{ + // return typeof(T) + // .GetTypeInfo() + // .DeclaredMembers + // .SingleOrDefault(x => x.Name == value.ToString()) + // ?.GetCustomAttribute(false) + // ?.Value; + //} + + //public static KeyTypes? MapFrom(AasReferables input) + //{ + // var st = input.GetEnumMemberValue(); + // var res = Stringification.KeyTypesFromString(st); + // return res; + //} + + //public static List MapFrom(IEnumerable input) + //{ + // List res = new(); + // foreach (var i in input) + // { + // var x = MapFrom(i); + // if (x.HasValue) + // res.Add(x.Value); + // } + // return res; + //} + + //public static List GetAllKeyTypesForAasReferables() + // => ExtendKey.MapFrom(Enum.GetValues(typeof(AasReferables)).OfType()); + + #endregion + // dead-csharp on + + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendKeyList.cs b/src/AasxCsharpLibrary/Extensions/ExtendKeyList.cs new file mode 100644 index 000000000..d33903f44 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendKeyList.cs @@ -0,0 +1,194 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using Extensions; +using System.Collections.Generic; +using System.Linq; +using AdminShellNS; +using Aas = AasCore.Aas3_0; + +namespace Extensions +{ + public static class ExtendKeyList + { + public static bool IsEmpty(this List keys) + { + return keys.Count < 1; + } + + public static bool Matches(this List keys, List other, MatchMode matchMode = MatchMode.Strict) + { + if (other == null || other.Count != keys.Count) + return false; + + var same = true; + for (int i = 0; i < keys.Count; i++) + same = same && keys[i].Matches(other[i], matchMode); + + return same; + } + + public static List ReplaceLastKey(this List keys, List newKeys) + { + var res = new List(keys); + if (res.Count < 1 || newKeys == null || newKeys.Count < 1) + return res; + + res.Remove(res.Last()); + res.AddRange(newKeys); + return res; + } + + public static bool StartsWith(this List keyList, List otherKeyList) + { + if (otherKeyList == null || otherKeyList.Count == 0) + return false; + + // simply test element-wise + for (int i = 0; i < otherKeyList.Count; i++) + { + // does head have more elements than this list? + if (i >= keyList.Count) + return false; + + if (!otherKeyList[i].Matches(keyList[i])) + return false; + } + + // ok! + return true; + } + + public static bool StartsWith(this List keyList, List head, bool emptyIsTrue = false, + MatchMode matchMode = MatchMode.Relaxed) + { + // access + if (head == null) + return false; + if (head.Count == 0) + return emptyIsTrue; + + // simply test element-wise + for (int i = 0; i < head.Count; i++) + { + // does head have more elements than this list? + if (i >= keyList.Count) + return false; + + if (!head[i].Matches(keyList[i], matchMode)) + return false; + } + + // ok! + return true; + } + + public static string ToStringExtended(this List keys, int format = 1, string delimiter = ",") + { + return string.Join(delimiter, keys.Select((k) => k.ToStringExtended(format))); + } + + public static void Validate(this List keys, AasValidationRecordList results, + IReferable container) + { + // access + if (results == null || keys == null || container == null) + return; + + // iterate thru + var idx = 0; + while (idx < keys.Count) + { + var act = keys[idx].Validate(results, container); + if (act == AasValidationAction.ToBeDeleted) + { + keys.RemoveAt(idx); + continue; + } + idx++; + } + } + + public static bool MatchesSetOfTypes(this List key, IEnumerable set) + { + var res = true; + foreach (var kt in key) + if (!key.MatchesSetOfTypes(set)) + res = false; + return res; + } + + public static List Parse(string input) + { + // access + if (input == null) + return null; + + // split + var parts = input.Split(',', ';'); + var kl = new List(); + + foreach (var p in parts) + { + var k = ExtendKey.Parse(p); + if (k != null) + kl.Add(k); + } + + return kl; + } + + /// + /// Take only idShort from Referables, ignore all other key-types and create a '/'-separated list + /// + /// Empty string or list of idShorts + public static string BuildIdShortPath(this List keyList, + int startPos = 0, int count = int.MaxValue) + { + if (keyList == null || startPos >= keyList.Count) + return ""; + int nr = 0; + var res = ""; + for (int i = startPos; i < keyList.Count && nr < count; i++) + { + nr++; + //// if (keyList[i].Type.Trim().ToLower() == Key.IdShort.Trim().ToLower()) + if (Aas.Constants.AasReferableNonIdentifiables.Contains(keyList[i].Type)) + { + if (res != "") + res += "/"; + res += keyList[i].Value; + } + } + return res; + } + + public static List SubList(this List keyList, + int startPos, int count = int.MaxValue) + { + var res = new List(); + if (startPos >= keyList.Count()) + return res; + int nr = 0; + for (int i = startPos; i < keyList.Count() && nr < count; i++) + { + nr++; + res.Add(keyList[i]); + } + return res; + } + + public static List ToKeyList(this List keyList) + { + var res = new List(); + foreach (var ki in keyList) + res.Add(new Key(ki.Type, ki.Value)); + return res; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendKeyTypes.cs b/src/AasxCsharpLibrary/Extensions/ExtendKeyTypes.cs new file mode 100644 index 000000000..c8dc4ae40 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendKeyTypes.cs @@ -0,0 +1,21 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +namespace Extensions +{ + public static class ExtendKeyTypes + { + public static bool IsSME(this KeyTypes keyType) + { + foreach (var kt in Constants.AasSubmodelElementsAsKeys) + if (kt.HasValue && kt.Value == keyType) + return true; + return false; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendLangString.cs b/src/AasxCsharpLibrary/Extensions/ExtendLangString.cs new file mode 100644 index 000000000..24f54f9af --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendLangString.cs @@ -0,0 +1,66 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using System.Collections.Generic; + +namespace Extensions +{ + //TODO (jtikekar, 0000-00-00): remove + public static class ExtendLangString + { + // constants + public static string LANG_DEFAULT = "en"; + + // new version + public static string GetDefaultStringGen(List langStrings, string defaultLang = null) + where T : IAbstractLangString + { + // start + if (defaultLang == null) + defaultLang = "en"; + defaultLang = defaultLang.Trim().ToLower(); + string res = null; + + // search + foreach (var ls in langStrings) + if (ls.Language.Trim().ToLower() == defaultLang) + res = ls.Text; + if (res == null && langStrings.Count > 0) + res = langStrings[0].Text; + + // found? + return res; + } + + public static IAbstractLangString Create(string language, string text) where T : IAbstractLangString + { + if (typeof(T).IsAssignableFrom(typeof(ILangStringTextType))) + { + return new LangStringTextType(language, text); + } + else if (typeof(T).IsAssignableFrom(typeof(ILangStringNameType))) + { + return new LangStringNameType(language, text); + } + else if (typeof(T).IsAssignableFrom(typeof(ILangStringPreferredNameTypeIec61360))) + { + return new LangStringPreferredNameTypeIec61360(language, text); + } + else if (typeof(T).IsAssignableFrom(typeof(ILangStringShortNameTypeIec61360))) + { + return new LangStringShortNameTypeIec61360(language, text); + } + else if (typeof(T).IsAssignableFrom(typeof(ILangStringDefinitionTypeIec61360))) + { + return new LangStringDefinitionTypeIec61360(language, text); + } + else + return null; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendLangStringSet.cs b/src/AasxCsharpLibrary/Extensions/ExtendLangStringSet.cs new file mode 100644 index 000000000..de4477e3f --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendLangStringSet.cs @@ -0,0 +1,199 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using System; +using System.Collections.Generic; +using System.Text.RegularExpressions; + +namespace Extensions +{ + //TODO (jtikekar, 0000-00-00): remove or seperate + public static class ExtendLangStringSet + { + #region AasxPackageExplorer + + public static bool IsValid(this List langStringSet) + { + if (langStringSet != null && langStringSet.Count >= 1) + { + return true; + } + + return false; + } + + #endregion + public static bool IsEmpty(this List langStringSet) + { + if (langStringSet == null || langStringSet.Count == 0) + { + return true; + } + + return false; + } + // dead-csharp off + //public static string GetDefaultString(this List langStringSet, string defaultLang = null) + //{ + // return ExtendLangString.GetDefaultStringGen(langStringSet, defaultLang); + //// start + //if (defaultLang == null) + // defaultLang = "en"; //Default Lang in old implementation is en + + //string res = null; + + //// search + //foreach (var langString in langStringSet) + // if (langString.Language.Equals(defaultLang, StringComparison.OrdinalIgnoreCase)) + // res = langString.Text; + + //if (res == null && langStringSet.Count > 0) + // res = langStringSet[0].Text; + + //// found? + //return res; + //} + // dead-csharp on + public static List Create(string language, string text) where T : IAbstractLangString, new() + { + return new List { new T { Language = language, Text = text } }; + } + + public static List CreateLangStringNameType(string language, string text) + { + return new List { new LangStringNameType(language, text) }; + } + + public static List CreateLangStringTextType(string language, string text) + { + return new List { new LangStringTextType(language, text) }; + } + + public static List CreateManyPreferredNamesFromStringArray(string[] s) + { + if (s == null) + return null; + var r = new List(); + var i = 0; + while ((i + 1) < s.Length) + { + r.Add(new LangStringPreferredNameTypeIec61360(s[i], s[i + 1])); + i += 2; + } + return r; + } + public static List CreateManyDefinitionFromStringArray(string[] s) + { + if (s == null) + return null; + var r = new List(); + var i = 0; + while ((i + 1) < s.Length) + { + r.Add(new LangStringDefinitionTypeIec61360(s[i], s[i + 1])); + i += 2; + } + return r; + } + + public static List Set(this List lss, string lang, string text) + { + foreach (var ls in lss) + if (ls.Language.Trim().ToLower() == lang?.Trim().ToLower()) + { + ls.Text = text; + return lss; + } + lss.Add(new LangStringTextType(lang, text)); + return lss; + } + + public static List ConvertFromV20( + this List langStringSet, + AasxCompatibilityModels.AdminShellV20.LangStringSet sourceLangStrings) + { + + if (sourceLangStrings.langString != null && sourceLangStrings.langString.Count != 0) + { + langStringSet = new List(); + foreach (var sourceLangString in sourceLangStrings.langString) + { + var langString = new LangStringTextType(sourceLangString.lang, sourceLangString.str); + langStringSet.Add(langString); + } + } + return langStringSet; + } + + public static List Parse(string cell, + Func createLs) where T : class + { + // access + if (cell == null || createLs == null) + return null; + + // iterative approach + var res = new List(); + while (true) + { + // trivial case and finite end + if (!cell.Contains("@")) + { + if (cell.Trim() != "") + { + res.Add(createLs(ExtendLangString.LANG_DEFAULT, cell)); + } + break; + } + + // OK, pick the next couple + var m = Regex.Match(cell, @"(.*?)@(\w+)", RegexOptions.Singleline); + if (!m.Success) + { + // take emergency exit? + res.Add(createLs("??", cell)); + } + + // use the match and shorten cell .. + res.Add(createLs(m.Groups[2].ToString(), m.Groups[1].ToString().Trim())); + cell = cell.Substring(m.Index + m.Length); + } + + return res; + } + + public static void Add(this List list, string language, string text) where T : IAbstractLangString + { + if (typeof(T).IsAssignableFrom(typeof(ILangStringTextType))) + { + (list as List) + .Add(new LangStringTextType(language, text)); + } + else if (typeof(T).IsAssignableFrom(typeof(ILangStringNameType))) + { + (list as List) + .Add(new LangStringNameType(language, text)); + } + else if (typeof(T).IsAssignableFrom(typeof(ILangStringPreferredNameTypeIec61360))) + { + (list as List) + .Add(new LangStringPreferredNameTypeIec61360(language, text)); + } + else if (typeof(T).IsAssignableFrom(typeof(ILangStringShortNameTypeIec61360))) + { + (list as List) + .Add(new LangStringShortNameTypeIec61360(language, text)); + } + else if (typeof(T).IsAssignableFrom(typeof(ILangStringDefinitionTypeIec61360))) + { + (list as List) + .Add(new LangStringDefinitionTypeIec61360(language, text)); + } + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendModelKind.cs b/src/AasxCsharpLibrary/Extensions/ExtendModelKind.cs new file mode 100644 index 000000000..75ad82fba --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendModelKind.cs @@ -0,0 +1,35 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using AdminShellNS; + +namespace Extensions +{ + public static class ExtendModelKind + { + public static void Validate(this ModellingKind modelingKind, AasValidationRecordList results, IReferable container) + { + // access + if (results == null || container == null) + return; + + // check + if (modelingKind != ModellingKind.Template && modelingKind != ModellingKind.Instance) + { + // violation case + results.Add(new AasValidationRecord( + AasValidationSeverity.SchemaViolation, container, + $"ModelingKind: enumeration value neither Template nor Instance", + () => + { + modelingKind = ModellingKind.Instance; + })); + } + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendMultiLanguageProperty.cs b/src/AasxCsharpLibrary/Extensions/ExtendMultiLanguageProperty.cs new file mode 100644 index 000000000..4d0c9f65b --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendMultiLanguageProperty.cs @@ -0,0 +1,140 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using AdminShellNS; +using System; +using System.Collections.Generic; + +namespace Extensions +{ + public static class ExtendMultiLanguageProperty + { + #region AasxPackageExplorer + + public static void ValueFromText(this MultiLanguageProperty multiLanguageProperty, string text, string defaultLang) + { + multiLanguageProperty.Value ??= new List(); + + multiLanguageProperty.Value.Add(new LangStringTextType(defaultLang == null ? "en" : defaultLang, text)); + } + + #endregion + + public static string ValueAsText(this MultiLanguageProperty multiLanguageProperty, string defaultLang = null) + { + // dead-csharp off + //TODO (jtikekar, 0000-00-00): need to check/test again + //return "" + multiLanguageProperty.Value?.LangStrings.FirstOrDefault().Text; + // dead-csharp on + return "" + multiLanguageProperty.Value?.GetDefaultString(defaultLang); + } + + public static MultiLanguageProperty ConvertFromV20(this MultiLanguageProperty property, AasxCompatibilityModels.AdminShellV20.MultiLanguageProperty sourceProperty) + { + if (sourceProperty == null) + { + return null; + } + + if (sourceProperty.valueId != null) + { + var keyList = new List(); + foreach (var refKey in sourceProperty.valueId.Keys) + { + + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value not found for property {property.IdShort}"); + } + } + property.ValueId = new Reference(ReferenceTypes.ExternalReference, keyList); + } + + if (sourceProperty.value != null && !sourceProperty.value.IsEmpty) + { + var newLangStrings = new List(); + + List newLangStringSet = new(newLangStrings); + + property.Value = newLangStringSet.ConvertFromV20(sourceProperty.value); + } + + return property; + + } + + public static MultiLanguageProperty UpdateFrom( + this MultiLanguageProperty elem, ISubmodelElement source) + { + if (source == null) + return elem; + + ((ISubmodelElement)elem).UpdateFrom(source); + + if (source is Property srcProp) + { + elem.Value = new List { + new LangStringTextType(AdminShellUtil.GetDefaultLngIso639(), srcProp.Value) }; + if (srcProp.ValueId != null) + elem.ValueId = srcProp.ValueId.Copy(); + } + + if (source is MultiLanguageProperty srcMlp) + { + if (srcMlp.Value != null) + elem.Value = srcMlp.Value.Copy(); + if (srcMlp.ValueId != null) + elem.ValueId = srcMlp.ValueId.Copy(); + } + + if (source is AasCore.Aas3_0.Range srcRng) + { + if (srcRng.Min != null) + elem.Value = new List { + new LangStringTextType(AdminShellUtil.GetDefaultLngIso639(), srcRng.Min) }; + } + + if (source is File srcFile) + { + elem.Value = new List { + new LangStringTextType(AdminShellUtil.GetDefaultLngIso639(), srcFile.Value) }; + } + + return elem; + } + + public static MultiLanguageProperty Set(this MultiLanguageProperty mlp, + List ls) + { + mlp.Value = ls; + return mlp; + } + + public static MultiLanguageProperty Set(this MultiLanguageProperty mlp, + LangStringTextType ls) + { + if (ls == null) + return mlp; + if (mlp.Value == null) + mlp.Value = new List(); + mlp.Value.Set(ls.Language, ls.Text); + return mlp; + } + + public static MultiLanguageProperty Set(this MultiLanguageProperty mlp, + string lang, string str) + { + return mlp.Set(new LangStringTextType(lang, str)); + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendObject.cs b/src/AasxCsharpLibrary/Extensions/ExtendObject.cs new file mode 100644 index 000000000..ccc968476 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendObject.cs @@ -0,0 +1,144 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using System; +using System.Collections.Generic; +using System.Reflection; +using Extensions.ArrayExtensions; + +namespace Extensions +{ + public static class ExtendObject + { + private static readonly MethodInfo CloneMethod = typeof(Object).GetMethod("MemberwiseClone", BindingFlags.NonPublic | BindingFlags.Instance); + + public static bool IsPrimitive(this Type type) + { + if (type == typeof(String)) return true; + return (type.IsValueType & type.IsPrimitive); + } + + public static Object Copy(this Object originalObject) + { + return InternalCopy(originalObject, new Dictionary(new ReferenceEqualityComparer())); + } + + private static Object InternalCopy(Object originalObject, IDictionary visited) + { + if (originalObject == null) return null; + var typeToReflect = originalObject.GetType(); + if (IsPrimitive(typeToReflect)) return originalObject; + if (visited.ContainsKey(originalObject)) return visited[originalObject]; + if (typeof(Delegate).IsAssignableFrom(typeToReflect)) return null; + var cloneObject = CloneMethod.Invoke(originalObject, null); + if (typeToReflect.IsArray) + { + var arrayType = typeToReflect.GetElementType(); + if (IsPrimitive(arrayType) == false) + { + Array clonedArray = (Array)cloneObject; + clonedArray.ForEach((array, indices) => array.SetValue(InternalCopy(clonedArray.GetValue(indices), visited), indices)); + } + + } + visited.Add(originalObject, cloneObject); + CopyFields(originalObject, visited, cloneObject, typeToReflect); + RecursiveCopyBaseTypePrivateFields(originalObject, visited, cloneObject, typeToReflect); + return cloneObject; + } + + private static void RecursiveCopyBaseTypePrivateFields(object originalObject, IDictionary visited, object cloneObject, Type typeToReflect) + { + if (typeToReflect.BaseType != null) + { + RecursiveCopyBaseTypePrivateFields(originalObject, visited, cloneObject, typeToReflect.BaseType); + CopyFields(originalObject, visited, cloneObject, typeToReflect.BaseType, BindingFlags.Instance | BindingFlags.NonPublic, info => info.IsPrivate); + } + } + + private static void CopyFields(object originalObject, IDictionary visited, object cloneObject, Type typeToReflect, + BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.FlattenHierarchy, + Func filter = null) + { + foreach (FieldInfo fieldInfo in typeToReflect.GetFields(bindingFlags)) + { + if (filter != null && filter(fieldInfo) == false) continue; + if (IsPrimitive(fieldInfo.FieldType)) continue; + var originalFieldValue = fieldInfo.GetValue(originalObject); + var clonedFieldValue = InternalCopy(originalFieldValue, visited); + fieldInfo.SetValue(cloneObject, clonedFieldValue); + } + } + public static T Copy(this T original) + { + return (T)Copy((Object)original); + } + } + + public class ReferenceEqualityComparer : EqualityComparer + { + public override bool Equals(object x, object y) + { + return ReferenceEquals(x, y); + } + public override int GetHashCode(object obj) + { + if (obj == null) return 0; + return obj.GetHashCode(); + } + } + + namespace ArrayExtensions + { + public static class ArrayExtensions + { + public static void ForEach(this Array array, Action action) + { + if (array.LongLength == 0) return; + ArrayTraverse walker = new ArrayTraverse(array); + do action(array, walker.Position); + while (walker.Step()); + } + } + + internal class ArrayTraverse + { + public int[] Position; + private int[] maxLengths; + + public ArrayTraverse(Array array) + { + maxLengths = new int[array.Rank]; + for (int i = 0; i < array.Rank; ++i) + { + maxLengths[i] = array.GetLength(i) - 1; + } + Position = new int[array.Rank]; + } + + public bool Step() + { + for (int i = 0; i < Position.Length; ++i) + { + if (Position[i] < maxLengths[i]) + { + Position[i]++; + for (int j = 0; j < i; j++) + { + Position[j] = 0; + } + return true; + } + } + return false; + } + } + } + +} + diff --git a/src/AasxCsharpLibrary/Extensions/ExtendOperation.cs b/src/AasxCsharpLibrary/Extensions/ExtendOperation.cs new file mode 100644 index 000000000..d6ff4e2c1 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendOperation.cs @@ -0,0 +1,157 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using AdminShellNS; +using System.Collections.Generic; +using System.Linq; + +namespace Extensions +{ + public static class ExtendOperation + { + #region AasxPackageExplorer + + public static object AddChild(this IOperation operation, ISubmodelElement childSubmodelElement, EnumerationPlacmentBase placement = null) + { + // not enough information to select list of children? + var pl = placement as EnumerationPlacmentOperationVariable; + if (childSubmodelElement == null || pl == null) + return null; + + // ok, use information + var ov = new OperationVariable(childSubmodelElement); + + if (childSubmodelElement != null) + childSubmodelElement.Parent = operation; + + if (pl.Direction == OperationVariableDirection.In) + { + operation.InputVariables ??= new List(); + operation.InputVariables.Add(ov); + } + + if (pl.Direction == OperationVariableDirection.Out) + { + operation.OutputVariables ??= new List(); + operation.OutputVariables.Add(ov); + } + + if (pl.Direction == OperationVariableDirection.InOut) + { + operation.InoutputVariables ??= new List(); + operation.InoutputVariables.Add(ov); + } + + return ov; + } + + public static EnumerationPlacmentBase GetChildrenPlacement(this IOperation operation, ISubmodelElement child) + { + // trivial + if (child == null) + return null; + + // search + OperationVariableDirection? dir = null; + IOperationVariable opvar = null; + if (operation.InputVariables != null) + foreach (var ov in operation.InputVariables) + if (ov?.Value == child) + { + dir = OperationVariableDirection.In; + opvar = ov; + } + + if (operation.OutputVariables != null) + foreach (var ov in operation.OutputVariables) + if (ov?.Value == child) + { + dir = OperationVariableDirection.Out; + opvar = ov; + } + + if (operation.InoutputVariables != null) + foreach (var ov in operation.InoutputVariables) + if (ov?.Value == child) + { + dir = OperationVariableDirection.InOut; + opvar = ov; + } + + // found + if (!dir.HasValue) + return null; + return new EnumerationPlacmentOperationVariable() + { + Direction = dir.Value, + OperationVariable = opvar as OperationVariable + }; + } + + public static List GetVars(this IOperation op, OperationVariableDirection dir) + { + if (dir == OperationVariableDirection.In) + return op.InputVariables; + if (dir == OperationVariableDirection.Out) + return op.OutputVariables; + return op.InoutputVariables; + } + + public static List SetVars( + this IOperation op, OperationVariableDirection dir, List value) + { + if (dir == OperationVariableDirection.In) + { + op.InputVariables = value; + return op.InputVariables; + } + if (dir == OperationVariableDirection.Out) + { + op.OutputVariables = value; + return op.OutputVariables; + } + + op.InoutputVariables = value; + return op.InoutputVariables; + } + + #endregion + + public static IOperation UpdateFrom( + this IOperation elem, ISubmodelElement source) + { + if (source == null) + return elem; + + ((ISubmodelElement)elem).UpdateFrom(source); + + if (source is SubmodelElementCollection srcColl) + { + if (srcColl.Value != null) + { + List operationVariables = srcColl.Value.Copy().Select( + (isme) => new OperationVariable(isme)).ToList(); + elem.InputVariables = operationVariables.ConvertAll(op => (IOperationVariable)op); + } + + } + + if (source is SubmodelElementCollection srcList) + { + if (srcList.Value != null) + { + List operationVariables = srcList.Value.Copy().Select( + (isme) => new OperationVariable(isme)).ToList(); + elem.InputVariables = operationVariables.ConvertAll(op => (IOperationVariable)op); + } + } + + return elem; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendProperty.cs b/src/AasxCsharpLibrary/Extensions/ExtendProperty.cs new file mode 100644 index 000000000..f77a3765f --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendProperty.cs @@ -0,0 +1,269 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; + +namespace Extensions +{ + public static class ExtendProperty + { + #region AasxPackageExplorer + + public static void ValueFromText(this Property property, string text) + { + property.Value = text; + } + + #endregion + public static bool IsValueTrue(this Property property) + { + if (property.ValueType == DataTypeDefXsd.Boolean) + { + if (property.Value.Equals("true", StringComparison.OrdinalIgnoreCase)) + { + return true; + } + } + + return false; + } + + public static string ValueAsText(this Property property) + { + return "" + property.Value; + } + + public static double? ValueAsDouble(this Property prop) + { + // pointless + if (prop.Value == null || prop.Value.Trim() == "") + return null; + + // type? + if (!ExtendDataElement.ValueTypes_Number.Contains(prop.ValueType)) + return null; + + // try convert + if (double.TryParse(prop.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out double dbl)) + return dbl; + + // no + return null; + } + public static Property ConvertFromV10(this Property property, AasxCompatibilityModels.AdminShellV10.Property sourceProperty) + { + if (sourceProperty == null) + { + return null; + } + var propertyType = Stringification.DataTypeDefXsdFromString("xs:" + sourceProperty.valueType); + if (propertyType != null) + { + property.ValueType = (DataTypeDefXsd)propertyType; + } + else + { + Console.WriteLine($"ValueType {sourceProperty.valueType} not found for property {sourceProperty.idShort}"); + } + property.Value = sourceProperty.value; + if (sourceProperty.valueId != null && !sourceProperty.valueId.IsEmpty) + { + var keyList = new List(); + foreach (var refKey in sourceProperty.valueId.Keys) + { + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {sourceProperty.valueType} not found for property {property.IdShort}"); + } + } + property.ValueId = new Reference(ReferenceTypes.ExternalReference, keyList); + } + + return property; + } + + public static Property ConvertFromV20(this Property property, AasxCompatibilityModels.AdminShellV20.Property sourceProperty) + { + if (sourceProperty == null) + { + return null; + } + + var propertyType = Stringification.DataTypeDefXsdFromString("xs:" + sourceProperty.valueType); + if (propertyType != null) + { + property.ValueType = (DataTypeDefXsd)propertyType; + } + else + { + Console.WriteLine($"ValueType {sourceProperty.valueType} not found for property {sourceProperty.idShort}"); + } + property.Value = sourceProperty.value; + if (sourceProperty.valueId != null && !sourceProperty.valueId.IsEmpty) + { + var keyList = new List(); + foreach (var refKey in sourceProperty.valueId.Keys) + { + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {sourceProperty.valueType} not found for property {property.IdShort}"); + } + } + property.ValueId = new Reference(ReferenceTypes.ExternalReference, keyList); + } + + return property; + } + + public static Property UpdateFrom(this Property elem, ISubmodelElement source) + { + if (source == null) + return elem; + + ((ISubmodelElement)elem).UpdateFrom(source); + + if (source is Property srcProp) + { + elem.ValueType = srcProp.ValueType; + elem.Value = srcProp.Value; + if (srcProp.ValueId != null) + elem.ValueId = srcProp.ValueId.Copy(); + } + + if (source is AasCore.Aas3_0.Range srcRng) + { + elem.ValueType = srcRng.ValueType; + elem.Value = srcRng.Min; + } + + if (source is MultiLanguageProperty srcMlp) + { + elem.ValueType = DataTypeDefXsd.String; + elem.Value = "" + srcMlp.Value?.GetDefaultString(); + if (srcMlp.ValueId != null) + elem.ValueId = srcMlp.ValueId.Copy(); + } + + if (source is File srcFile) + { + elem.ValueType = DataTypeDefXsd.String; + elem.Value = "" + srcFile.Value; + } + + return elem; + } + + // MIHO: Jui, why was this required? +#if OLD + + public static void UpdatePropertyFrom(this Property property, Property sourceProperty) + { + if (sourceProperty.Extensions != null) + { + property.Extensions = sourceProperty.Extensions; + } + if (sourceProperty.Category != null) + { + property.Category = sourceProperty.Category; + } + if (sourceProperty.IdShort != null) + { + property.IdShort = sourceProperty.IdShort; + } + if (sourceProperty.DisplayName != null) + { + property.DisplayName = sourceProperty.DisplayName; + } + if (sourceProperty.Description != null) + { + property.Description = sourceProperty.Description; + } + if (sourceProperty.Checksum != null) + { + property.Checksum = sourceProperty.Checksum; + } + if (sourceProperty.Kind != null) + { + property.Kind = sourceProperty.Kind; + } + if (sourceProperty.SemanticId != null) + { + property.SemanticId = sourceProperty.SemanticId; + } + if (sourceProperty.SupplementalSemanticIds != null) + { + property.SupplementalSemanticIds = sourceProperty.SupplementalSemanticIds; + } + if (sourceProperty.Qualifiers != null) + { + property.Qualifiers = sourceProperty.Qualifiers; + } + if (sourceProperty.EmbeddedDataSpecifications != null) + { + property.EmbeddedDataSpecifications = sourceProperty.EmbeddedDataSpecifications; + } + if (true) + { + property.ValueType = sourceProperty.ValueType; + } + if (sourceProperty.ValueId != null) + { + property.ValueId = sourceProperty.ValueId; + } + if (sourceProperty.Value != null) + { + property.Value = sourceProperty.Value; + } + } +#endif + + public static Property Set(this Property prop, + DataTypeDefXsd valueType = DataTypeDefXsd.String, string value = "") + { + prop.ValueType = valueType; + prop.Value = value; + return prop; + } + + public static Property Set(this Property prop, + KeyTypes type, string value) + { + prop.ValueId = ExtendReference.CreateFromKey(new Key(type, value)); + return prop; + } + + public static Property Set(this Property prop, + Qualifier q) + { + if (q != null) + prop.Add(q); + return prop; + } + + public static Property Set(this Property prop, + Extension ext) + { + if (ext != null) + prop.Add(ext); + return prop; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendQualifier.cs b/src/AasxCsharpLibrary/Extensions/ExtendQualifier.cs new file mode 100644 index 000000000..1851d4f06 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendQualifier.cs @@ -0,0 +1,195 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using System; +using System.Collections.Generic; +using System.Text.RegularExpressions; + +namespace Extensions +{ + public static class ExtendQualifier + { + public static Qualifier ConvertFromV10(this Qualifier qualifier, AasxCompatibilityModels.AdminShellV10.Qualifier sourceQualifier) + { + if (sourceQualifier.semanticId != null && !sourceQualifier.semanticId.IsEmpty) + { + var keyList = new List(); + foreach (var refKey in sourceQualifier.semanticId.Keys) + { + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {refKey.type} not found."); + } + } + qualifier.SemanticId = new Reference(ReferenceTypes.ExternalReference, keyList); + } + + qualifier.Type = sourceQualifier.qualifierType; + qualifier.Value = sourceQualifier.qualifierValue; + + if (sourceQualifier.qualifierValueId != null && !sourceQualifier.qualifierValueId.IsEmpty) + { + var keyList = new List(); + foreach (var refKey in sourceQualifier.qualifierValueId.Keys) + { + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {refKey.type} not found."); + } + } + qualifier.ValueId = new Reference(ReferenceTypes.ExternalReference, keyList); + } + + return qualifier; + } + + public static Qualifier ConvertFromV20(this Qualifier qualifier, AasxCompatibilityModels.AdminShellV20.Qualifier sourceQualifier) + { + if (sourceQualifier.semanticId != null && !sourceQualifier.semanticId.IsEmpty) + { + var keyList = new List(); + foreach (var refKey in sourceQualifier.semanticId.Keys) + { + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {refKey.type} not found."); + } + + } + qualifier.SemanticId = new Reference(ReferenceTypes.ExternalReference, keyList); + } + + qualifier.Type = sourceQualifier.type; + qualifier.Value = sourceQualifier.value; + + if (sourceQualifier.valueId != null && !sourceQualifier.valueId.IsEmpty) + { + var keyList = new List(); + foreach (var refKey in sourceQualifier.valueId.Keys) + { + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {refKey.type} not found."); + } + } + qualifier.ValueId = new Reference(ReferenceTypes.ExternalReference, keyList); + } + + return qualifier; + } + + // ReSharper disable MethodOverloadWithOptionalParameter .. this seems to work, anyhow + // ReSharper disable RedundantArgumentDefaultValue + public static string ToStringExtended(this IQualifier q, + int format = 0, string delimiter = ",") + { + var res = "" + q.Type; + if (res == "") + res += "" + q.SemanticId?.ToStringExtended(format, delimiter); + + if (q.Value != null) + res += " = " + q.Value; + else if (q.ValueId != null) + res += " = " + q.ValueId?.ToStringExtended(format, delimiter); + + return res; + } + // ReSharper enable MethodOverloadWithOptionalParameter + // ReSharper enable RedundantArgumentDefaultValue + + // + // + // List + // + // + + #region QualifierCollection + + public static IQualifier FindQualifierOfType(this List qualifiers, string qualifierType) + { + if (qualifierType == null) + { + return null; + } + + foreach (var qualifier in qualifiers) + { + if (qualifier != null && qualifierType.Equals(qualifier.Type)) + { + return qualifier; + } + } + + return null; + } + + // ReSharper disable MethodOverloadWithOptionalParameter .. this seems to work, anyhow + // ReSharper disable RedundantArgumentDefaultValue + public static string ToStringExtended(this List qualifiers, + int format = 0, string delimiter = ";", string referencesDelimiter = ",") + { + var res = ""; + foreach (var q in qualifiers) + { + if (res != "") + res += delimiter; + res += q.ToStringExtended(format, referencesDelimiter); + } + return res; + } + // ReSharper enable MethodOverloadWithOptionalParameter + // ReSharper enable RedundantArgumentDefaultValue + + public static IQualifier FindType(this List qualifiers, string type) + { + if (type == null || qualifiers == null) + return null; + foreach (var q in qualifiers) + if (q != null && q.Type != null && q.Type.Trim() == type.Trim()) + return q; + return null; + } + + public static Qualifier Parse(string input) + { + var m = Regex.Match(input, @"\s*([^,]*)(,[^=]+){0,1}\s*=\s*([^,]*)(,.+){0,1}\s*"); + if (!m.Success) + return null; + + return new Qualifier( + valueType: DataTypeDefXsd.String, + type: m.Groups[1].ToString().Trim(), + semanticId: ExtendReference.Parse(m.Groups[1].ToString().Trim()), + value: m.Groups[3].ToString().Trim(), + valueId: ExtendReference.Parse(m.Groups[1].ToString().Trim()) + ); + } + + #endregion + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendRange.cs b/src/AasxCsharpLibrary/Extensions/ExtendRange.cs new file mode 100644 index 000000000..e3317b77a --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendRange.cs @@ -0,0 +1,75 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using System; +using AAS = AasCore.Aas3_0; + +namespace Extensions +{ + public static class ExtendRange + { + public static string ValueAsText(this AasCore.Aas3_0.Range range) + { + return "" + range.Min + " .. " + range.Max; + } + + public static AasCore.Aas3_0.Range ConvertFromV20(this AasCore.Aas3_0.Range range, AasxCompatibilityModels.AdminShellV20.Range sourceRange) + { + if (sourceRange == null) + { + return null; + } + + var propertyType = AAS.Stringification.DataTypeDefXsdFromString("xs:" + sourceRange.valueType); + if (propertyType != null) + { + range.ValueType = (AAS.DataTypeDefXsd)propertyType; + } + else + { + Console.WriteLine($"ValueType {sourceRange.valueType} not found for property {range.IdShort}"); + } + + range.Max = sourceRange.max; + range.Min = sourceRange.min; + + return range; + } + + public static AAS.Range UpdateFrom(this AAS.Range elem, AAS.ISubmodelElement source) + { + if (source == null) + return elem; + + ((AAS.ISubmodelElement)elem).UpdateFrom(source); + + if (source is AAS.Property srcProp) + { + elem.ValueType = srcProp.ValueType; + elem.Min = srcProp.Value; + elem.Max = elem.Min; + } + + if (source is AAS.MultiLanguageProperty srcMlp) + { + elem.ValueType = AAS.DataTypeDefXsd.String; + elem.Min = "" + srcMlp.Value?.GetDefaultString(); + elem.Max = elem.Min; + } + + if (source is AAS.File srcFile) + { + elem.ValueType = AAS.DataTypeDefXsd.String; + elem.Min = "" + srcFile.Value; + elem.Max = elem.Min; + } + + return elem; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendReference.cs b/src/AasxCsharpLibrary/Extensions/ExtendReference.cs new file mode 100644 index 000000000..61bb53df6 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendReference.cs @@ -0,0 +1,309 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using AdminShellNS.Exceptions; +using System.Collections.Generic; +using System.Linq; + +namespace Extensions +{ + public static class ExtendReference + { + #region AasxPackageExplorer + + public static AasElementSelfDescription GetSelfDescription(this Reference reference) + { + return new AasElementSelfDescription("Reference", "Rfc", null, null); + } + + public static bool IsValid(this IReference reference) + { + return reference.Keys != null && !reference.Keys.IsEmpty(); + } + + public static bool IsValid(this List references) + { + bool isValid = false; + foreach (var reference in references) + { + isValid = IsValid(reference); + if (!isValid) + { + return false; + } + } + return isValid; + } + + /// + /// Formaly a static constructor. + /// Creates a Reference from a key, guessing Reference.Type. + /// + /// Given single Key + /// Reference with guessed type + public static Reference CreateFromKey(IKey k) + { + var res = new Reference(ReferenceTypes.ExternalReference, new List { k }); + res.Type = res.GuessType(); + return res; + } + + /// + /// Formaly a static constructor. + /// Creates a Reference from a key, guessing Reference.Type. + /// + public static Reference CreateFromKey(KeyTypes type, + string value) + { + var res = new Reference(ReferenceTypes.ExternalReference, + new List { new Key(type, value) }); + res.Type = res.GuessType(); + return res; + } + + /// + /// Formaly a static constructor. + /// Creates a Reference from a list of keys, guessing Reference.Type. + /// + /// + /// + public static Reference CreateNew(List lk) + { + var res = new Reference(ReferenceTypes.ExternalReference, new List()); + if (lk == null) + return res; + res.Keys.AddRange(lk.Copy()); + res.Type = res.GuessType(); + return res; + } + + // TODO (Jui, 2023-01-05): Check why the generic Copy does not apply here?! + public static Reference Copy(this Reference original) + { + var res = new Reference(original.Type, new List()); + if (original != null) + foreach (var o in original.Keys) + res.Add(o.Copy()); + return res; + } + + + public static Reference Parse(string input) + { + var res = new Reference(ReferenceTypes.ExternalReference, new List()); + if (input == null) + return res; + + res.Keys = ExtendKeyList.Parse(input); + res.Type = res.GuessType(); + return res; + } + + //This is alternative for operator overloding method +, as operator overloading cannot be done in extension classes + public static IReference Add(this IReference a, IReference b) + { + a.Keys?.AddRange(b?.Keys); + return a; + } + + public static IReference Add(this IReference a, IKey k) + { + if (k != null) + a.Keys?.Add(k); + return a; + } + + public static bool IsEmpty(this IReference reference) + { + if (reference == null || reference.Keys == null || reference.Keys.Count < 1) + { + return true; + } + + return false; + } + + #endregion + + public static bool Matches(this IReference reference, KeyTypes keyType, string id, MatchMode matchMode = MatchMode.Strict) + { + if (reference.IsEmpty()) + { + return false; + } + + if (reference.Keys.Count == 1) + { + var key = reference.Keys[0]; + return key.Matches(new Key(keyType, id), matchMode); + } + + return false; + } + + public static bool Matches(this IReference reference, string id) + { + if (string.IsNullOrEmpty(id)) + { + return false; + } + + if (reference.Keys.Count == 1) // As per old implementation + { + if (reference.Keys[0].Value == id) + return true; + } + + return false; + } + + public static bool Matches(this IReference reference, IReference otherReference, MatchMode matchMode = MatchMode.Strict) + { + if (reference.Keys == null || reference.Keys.Count == 0 + || otherReference?.Keys == null || otherReference.Keys.Count == 0 + || reference.Keys.Count != otherReference.Keys.Count) + { + return false; + } + + bool match = true; + for (int i = 0; i < reference.Keys.Count; i++) + { + match = match && reference.Keys[i].Matches(otherReference.Keys[i], matchMode); + } + + return match; + } + + public static bool MatchesExactlyOneKey(this IReference reference, IKey key, MatchMode matchMode = MatchMode.Strict) + { + if (key == null || reference.Keys == null || reference.Keys.Count != 1) + { + return false; + } + + var referenceKey = reference.Keys[0]; + return referenceKey.Matches(key, matchMode); + } + + public static string GetAsIdentifier(this IReference reference) + { + + if (reference != null && reference.Type == ReferenceTypes.ExternalReference) // Applying only to Global Reference, based on older implementation, TODO:Make it Generic + { + if (reference.Keys == null || reference.Keys.Count < 1) + { + return null; + } + + return reference.Keys[0].Value; + } + + //TODO (jtikekar, 2024-03-06): Refactor, added w.r.t. GitHub issue 11 + if(reference.Type == ReferenceTypes.ModelReference) + { + if (reference.Keys == null || reference.Keys.Count < 1) + { + return null; + } + + return reference.Keys[0].Value; + } + + return null; + } + + public static string MostSignificantInfo(this IReference reference) + { + if (reference.Keys.Count < 1) + { + return "-"; + } + + var i = reference.Keys.Count - 1; + var output = reference.Keys[i].Value; + if (reference.Keys[i].Type == KeyTypes.FragmentReference && i > 0) + output += reference.Keys[i - 1].Value; + return output; + } + + public static Key GetAsExactlyOneKey(this IReference reference) + { + if (reference.Keys == null || reference.Keys.Count != 1) + { + return null; + } + + var key = reference.Keys[0]; + return new Key(key.Type, key.Value); + } + + /// + /// Formats: 1 = [key, value] 2 = value + /// + public static string ToStringExtended(this IReference reference, int format = 1, string delimiter = ",") + { + if (reference.Keys == null) + { + throw new NullValueException("Keys"); + } + + return reference.Keys.ToStringExtended(format, delimiter); + } + + public static ReferenceTypes GuessType(this IReference reference) + { + var setAasRefs = Constants.AasReferables.Where((kt) => kt != null).Select(kt => kt.Value).ToArray(); + var allAasRefs = true; + foreach (var k in reference.Keys) + if (!k.MatchesSetOfTypes(setAasRefs)) + allAasRefs = false; + if (allAasRefs) + return ReferenceTypes.ModelReference; + else + return ReferenceTypes.ExternalReference; + } + + public static int Count(this IReference rf) + { + return rf.Keys.Count; + } + // dead-csharp off + //TODO (??, 0000-00-00): check if required + //public static int Count(this Reference rf) + //{ + // return rf.Keys.Count; + //} + // dead-csharp on + public static IKey Last(this IReference rf) + { + return rf.Keys.Last(); + } + // dead-csharp off + //TODO (??, 0000-00-00): check if required + //public static IKey Last(this Reference rf) + //{ + // return rf.Keys.Last(); + //} + // dead-csharp on + public static string ListOfValues(this Reference rf, string delim) + { + string res = ""; + if (rf.Keys != null) + foreach (var x in rf.Keys) + { + if (x == null) + continue; + if (res != "") res += delim; + res += x.Value; + } + return res; + } + } + +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendReferenceElement.cs b/src/AasxCsharpLibrary/Extensions/ExtendReferenceElement.cs new file mode 100644 index 000000000..e68d0065d --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendReferenceElement.cs @@ -0,0 +1,45 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using AAS = AasCore.Aas3_0; + +namespace Extensions +{ + public static class ExtendReferenceElement + { + public static AAS.ReferenceElement Set(this AAS.ReferenceElement elem, + Reference rf) + { + elem.Value = rf; + return elem; + } + + public static AAS.ReferenceElement UpdateFrom( + this AAS.ReferenceElement elem, AAS.ISubmodelElement source) + { + if (source == null) + return elem; + + ((AAS.ISubmodelElement)elem).UpdateFrom(source); + + if (source is AAS.RelationshipElement srcRel) + { + if (srcRel.First != null) + elem.Value = srcRel.First.Copy(); + } + + if (source is AAS.AnnotatedRelationshipElement srcRelA) + { + if (srcRelA.First != null) + elem.Value = srcRelA.First.Copy(); + } + + return elem; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendRelationshipElement.cs b/src/AasxCsharpLibrary/Extensions/ExtendRelationshipElement.cs new file mode 100644 index 000000000..04634059a --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendRelationshipElement.cs @@ -0,0 +1,46 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using AAS = AasCore.Aas3_0; + +namespace Extensions +{ + public static class ExtendRelationshipElement + { + public static AAS.RelationshipElement Set(this AAS.RelationshipElement elem, + AAS.Reference first, AAS.Reference second) + { + elem.First = first; + elem.Second = second; + return elem; + } + + public static AAS.RelationshipElement UpdateFrom( + this AAS.RelationshipElement elem, AAS.ISubmodelElement source) + { + if (source == null) + return elem; + + ((AAS.ISubmodelElement)elem).UpdateFrom(source); + + if (source is AAS.ReferenceElement srcRef) + { + if (srcRef.Value != null) + elem.First = srcRef.Value.Copy(); + } + + if (source is AAS.AnnotatedRelationshipElement srcRelA) + { + if (srcRelA.First != null) + elem.First = srcRelA.First.Copy(); + } + + return elem; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendSpecificAssetId.cs b/src/AasxCsharpLibrary/Extensions/ExtendSpecificAssetId.cs new file mode 100644 index 000000000..6aa1552c6 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendSpecificAssetId.cs @@ -0,0 +1,48 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using Extensions; +using System.Collections.Generic; +using System.Linq; + +namespace AdminShellNS.Extensions +{ + public static class ExtendSpecificAssetId + { + public static bool Matches(this ISpecificAssetId specificAssetId, ISpecificAssetId other) + { + if (specificAssetId == null) return false; + if (other == null) return false; + + //check mandatory parameters first + if (specificAssetId.Name != other.Name) return false; + if (specificAssetId.Value != other.Value) return false; + if (!specificAssetId.ExternalSubjectId.Matches(other.ExternalSubjectId)) return false; + + //TODO (jtikekar, 0000-00-00): Check optional parameter i.e., Semantic Id and supplementatry semantic id + + return true; + } + + #region ListOfSpecificAssetIds + + public static bool ContainsSpecificAssetId(this List specificAssetIds, ISpecificAssetId other) + { + if (specificAssetIds == null) return false; + if (other == null) return false; + + var foundIds = specificAssetIds.Where(assetId => assetId.Matches(other)); + if (foundIds.Any()) return true; + + return false; + } + + #endregion + + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendStream.cs b/src/AasxCsharpLibrary/Extensions/ExtendStream.cs new file mode 100644 index 000000000..09f582d5b --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendStream.cs @@ -0,0 +1,25 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using System.IO; + +namespace Extensions +{ + public static class ExtendStream + { + public static byte[] ToByteArray(this Stream stream) + { + using (stream) + { + using MemoryStream memStream = new(); + stream.CopyTo(memStream); + return memStream.ToArray(); + } + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendStringification.cs b/src/AasxCsharpLibrary/Extensions/ExtendStringification.cs new file mode 100644 index 000000000..0e153f191 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendStringification.cs @@ -0,0 +1,20 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Extensions +{ + public static class ExtendStringification + { + public static IEnumerable DataTypeXsdToStringArray() => + Enum.GetValues(typeof(DataTypeDefXsd)).OfType().Select((dt) => Stringification.ToString(dt)); + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendSubmodel.cs b/src/AasxCsharpLibrary/Extensions/ExtendSubmodel.cs new file mode 100644 index 000000000..d008af091 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendSubmodel.cs @@ -0,0 +1,470 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using AdminShellNS; +using AdminShellNS.Extensions; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Extensions +{ + public static class ExtendSubmodel + { + #region AasxPackageExplorer + + /// + /// Recurses on all Submodel elements of a Submodel or SME, which allows children. + /// The state object will be passed to the lambda function in order to provide + /// stateful approaches. Include this element, as well. + /// + /// State object to be provided to lambda. Could be null. + /// The lambda function as (state, parents, SME) + /// The lambda shall return TRUE in order to deep into recursion. + /// Include this element as well. parents will then + /// include this element as well! + public static void RecurseOnReferables(this Submodel submodel, + object state, Func, IReferable, bool> lambda, + bool includeThis = false) + { + var parents = new List(); + if (includeThis) + { + lambda(state, null, submodel); + parents.Add(submodel); + } + submodel.SubmodelElements?.RecurseOnReferables(state, parents, lambda); + } + + public static void Remove(this Submodel submodel, ISubmodelElement submodelElement) + { + if (submodel != null) + { + if (submodel.SubmodelElements != null) + { + submodel.SubmodelElements.Remove(submodelElement); + } + } + } + + public static object AddChild( + this ISubmodel submodel, ISubmodelElement childSubmodelElement, + EnumerationPlacmentBase placement = null) + { + if (childSubmodelElement == null) + return null; + submodel.SubmodelElements ??= new(); + if (childSubmodelElement != null) + childSubmodelElement.Parent = submodel; + submodel.SubmodelElements.Add(childSubmodelElement); + return childSubmodelElement; + } + + public static Tuple ToCaptionInfo(this ISubmodel submodel) + { + var caption = AdminShellUtil.EvalToNonNullString("\"{0}\" ", submodel.IdShort, ""); + if (submodel.Administration != null) + caption += "V" + submodel.Administration.Version + "." + submodel.Administration.Revision; + var info = ""; + if (submodel.Id != null) + info = $"[{submodel.Id}]"; + return Tuple.Create(caption, info); + } + + public static IEnumerable FindAllReferences(this ISubmodel submodel) + { + // not nice: use temp list + var temp = new List(); + + // recurse + submodel.RecurseOnSubmodelElements(null, (state, parents, sme) => + { + if (sme is ReferenceElement re) + if (re.Value != null) + temp.Add(re.Value); + if (sme is RelationshipElement rl) + { + if (rl.First != null) + temp.Add(rl.First); + if (rl.Second != null) + temp.Add(rl.Second); + } + // recurse + return true; + }); + + // now, give back + foreach (var r in temp) + yield return new LocatedReference(submodel, r); + } + + #endregion + public static void Validate(this Submodel submodel, AasValidationRecordList results) + { + // access + if (results == null) + return; + + // check + submodel.BaseValidation(results); + submodel.Kind?.Validate(results, submodel); + if (submodel.SemanticId != null && !submodel.SemanticId.IsEmpty()) + { + submodel.SemanticId.Keys.Validate(results, submodel); + } + } + + public static Submodel ConvertFromV10(this Submodel submodel, AasxCompatibilityModels.AdminShellV10.Submodel sourceSubmodel, bool shallowCopy = false) + { + if (sourceSubmodel == null) + { + return null; + } + + if (string.IsNullOrEmpty(sourceSubmodel.idShort)) + { + submodel.IdShort = ""; + } + else + { + submodel.IdShort = sourceSubmodel.idShort; + } + + if (sourceSubmodel.description != null) + { + submodel.Description = ExtensionsUtil.ConvertDescriptionFromV10(sourceSubmodel.description); + } + + if (sourceSubmodel.administration != null) + { + submodel.Administration = new AdministrativeInformation(version: sourceSubmodel.administration.version, revision: sourceSubmodel.administration.revision); + } + + if (sourceSubmodel.semanticId != null && !sourceSubmodel.semanticId.IsEmpty) + { + var keyList = new List(); + foreach (var refKey in sourceSubmodel.semanticId.Keys) + { + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {refKey.type} not found."); + } + } + submodel.SemanticId = new Reference(ReferenceTypes.ExternalReference, keyList); + } + + if (sourceSubmodel.kind != null) + { + if (sourceSubmodel.kind.IsInstance) + { + submodel.Kind = ModellingKind.Instance; + } + else + { + submodel.Kind = ModellingKind.Template; + } + } + + if (!sourceSubmodel.qualifiers.IsNullOrEmpty()) + { + if (submodel.Qualifiers == null && submodel.Qualifiers.Count != 0) + { + submodel.Qualifiers = new List(); + } + + foreach (var sourceQualifier in sourceSubmodel.qualifiers) + { + var newQualifier = new Qualifier("", DataTypeDefXsd.String); + newQualifier = newQualifier.ConvertFromV10(sourceQualifier); + submodel.Qualifiers.Add(newQualifier); + } + } + + if (!shallowCopy && !sourceSubmodel.submodelElements.IsNullOrEmpty()) + { + submodel.SubmodelElements ??= new List(); + + foreach (var submodelElementWrapper in sourceSubmodel.submodelElements) + { + var sourceSubmodelELement = submodelElementWrapper.submodelElement; + ISubmodelElement outputSubmodelElement = null; + if (sourceSubmodelELement != null) + { + outputSubmodelElement = outputSubmodelElement.ConvertFromV10(sourceSubmodelELement, shallowCopy); + submodel.SubmodelElements.Add(outputSubmodelElement); + } + + } + } + + return submodel; + + } + + public static Submodel ConvertFromV20(this Submodel sm, AasxCompatibilityModels.AdminShellV20.Submodel srcSM, bool shallowCopy = false) + { + if (srcSM == null) + return null; + + if (string.IsNullOrEmpty(srcSM.idShort)) + sm.IdShort = ""; + else + sm.IdShort = srcSM.idShort; + + if (srcSM.identification?.id != null) + sm.Id = srcSM.identification.id; + + if (srcSM.description != null) + sm.Description = ExtensionsUtil.ConvertDescriptionFromV20(srcSM.description); + + if (srcSM.administration != null) + sm.Administration = new AdministrativeInformation( + version: srcSM.administration.version, revision: srcSM.administration.revision); + + if (srcSM.semanticId != null && !srcSM.semanticId.IsEmpty) + { + var keyList = new List(); + foreach (var refKey in srcSM.semanticId.Keys) + { + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {refKey.type} not found."); + } + } + sm.SemanticId = new Reference(ReferenceTypes.ExternalReference, keyList); + } + + if (srcSM.kind != null) + { + if (srcSM.kind.IsInstance) + { + sm.Kind = ModellingKind.Instance; + } + else + { + sm.Kind = ModellingKind.Template; + } + } + + if (!srcSM.qualifiers.IsNullOrEmpty()) + { + sm.Qualifiers ??= new List(); + + foreach (var sourceQualifier in srcSM.qualifiers) + { + var newQualifier = new Qualifier("", DataTypeDefXsd.String); + newQualifier = newQualifier.ConvertFromV20(sourceQualifier); + sm.Qualifiers.Add(newQualifier); + } + } + + if (!shallowCopy && !srcSM.submodelElements.IsNullOrEmpty()) + { + sm.SubmodelElements ??= new List(); + + foreach (var submodelElementWrapper in srcSM.submodelElements) + { + var sourceSubmodelELement = submodelElementWrapper.submodelElement; + ISubmodelElement outputSubmodelElement = null; + if (sourceSubmodelELement != null) + { + outputSubmodelElement = outputSubmodelElement.ConvertFromV20(sourceSubmodelELement, shallowCopy); + sm.SubmodelElements.Add(outputSubmodelElement); + } + + } + } + + // move Qualifiers to Extensions + sm.MigrateV20QualifiersToExtensions(); + + return sm; + } + + public static T FindFirstIdShortAs(this ISubmodel submodel, string idShort) where T : ISubmodelElement + { + + var submodelElement = submodel.SubmodelElements.Where(sme => (sme != null) && (sme is T) && sme.IdShort.Equals(idShort, StringComparison.OrdinalIgnoreCase)).FirstOrDefault(); + + return (T)submodelElement; + } + + public static IEnumerable FindDeep(this ISubmodel submodel) + { + if (submodel.SubmodelElements == null || submodel.SubmodelElements.Count == 0) + { + yield break; + } + + foreach (var submodelElement in submodel.SubmodelElements) + { + foreach (var x in submodelElement.FindDeep()) + yield return x; + } + } + + public static Reference GetModelReference(this ISubmodel submodel) + { + var key = new Key(KeyTypes.Submodel, submodel.Id); + var outputReference = new Reference(ReferenceTypes.ModelReference, new List() { key }) + { + ReferredSemanticId = submodel.SemanticId + }; + + return outputReference; + } + + /// + /// If instance, return semanticId as one key. + /// If template, return identification as key. + /// + public static Key GetSemanticKey(this Submodel submodel) + { + if (submodel.Kind == ModellingKind.Instance) + return submodel.SemanticId.GetAsExactlyOneKey(); + else + return new Key(KeyTypes.Submodel, submodel.Id); + } + + /// + /// If instance, return semanticId as one key. + /// If template, return identification as key. + /// + public static IReference GetSemanticRef(this Submodel submodel) + { + if (submodel.Kind == ModellingKind.Instance) + return submodel.SemanticId; + else + return new Reference(ReferenceTypes.ModelReference, new[] { + new Key(KeyTypes.Submodel, submodel.Id) }.Cast().ToList()); + } + + public static List SmeForWrite(this Submodel submodel) + { + if (submodel.SubmodelElements == null) + submodel.SubmodelElements = new(); + return submodel.SubmodelElements; + } + + public static void RecurseOnSubmodelElements(this ISubmodel submodel, object state, Func, ISubmodelElement, bool> lambda) + { + submodel.SubmodelElements?.RecurseOnReferables(state, null, (o, par, rf) => + { + if (rf is ISubmodelElement sme) + return lambda(o, par, sme); + else + return true; + }); + } + + public static ISubmodelElement FindSubmodelElementByIdShort(this ISubmodel submodel, string smeIdShort) + { + if (submodel.SubmodelElements == null || submodel.SubmodelElements.Count == 0) + { + return null; + } + + var submodelElements = submodel.SubmodelElements.Where(sme => (sme != null) && sme.IdShort.Equals(smeIdShort, StringComparison.OrdinalIgnoreCase)); + if (submodelElements.Any()) + { + return submodelElements.First(); + } + else + { + return null; + } + } + + public static void SetAllParents(this ISubmodel submodel, DateTime timestamp) + { + if (submodel.SubmodelElements != null) + foreach (var sme in submodel.SubmodelElements) + SetParentsForSME(submodel, sme, timestamp); + } + + public static void SetParentsForSME(IReferable parent, ISubmodelElement submodelElement, DateTime timestamp) + { + if (submodelElement == null) + return; + + submodelElement.Parent = parent; + submodelElement.TimeStamp = timestamp; + submodelElement.TimeStampCreate = timestamp; + + foreach (var childElement in submodelElement.EnumerateChildren()) + { + SetParentsForSME(submodelElement, childElement, timestamp); + } + } + + public static void SetParentsForSME(IReferable parent, ISubmodelElement submodelElement) + { + if (submodelElement == null) + return; + + submodelElement.Parent = parent; + + foreach (var childElement in submodelElement.EnumerateChildren()) + { + SetParentsForSME(submodelElement, childElement); + } + } + + public static void SetAllParents(this ISubmodel submodel) + { + if (submodel.SubmodelElements != null) + foreach (var sme in submodel.SubmodelElements) + SetParentsForSME(submodel, sme); + } + + public static void Add(this Submodel submodel, ISubmodelElement submodelElement) + { + if (submodel.SubmodelElements == null) + { + submodel.SubmodelElements = new List(); + } + + submodelElement.Parent = submodel; + submodel.SubmodelElements.Add(submodelElement); + } + + public static void Insert(this ISubmodel submodel, int index, ISubmodelElement submodelElement) + { + if (submodel.SubmodelElements == null) + { + submodel.SubmodelElements = new List(); + } + + submodelElement.Parent = submodel; + submodel.SubmodelElements.Insert(index, submodelElement); + } + + public static T CreateSMEForCD( + this Submodel sm, + ConceptDescription conceptDescription, string category = null, string idShort = null, + string idxTemplate = null, int maxNum = 999, bool addSme = false, bool isTemplate = false) + where T : ISubmodelElement + { + if (sm.SubmodelElements == null) + sm.SubmodelElements = new List(); + return sm.SubmodelElements.CreateSMEForCD( + conceptDescription, category, idShort, idxTemplate, maxNum, addSme, isTemplate); + } + + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendSubmodelElementCollection.cs b/src/AasxCsharpLibrary/Extensions/ExtendSubmodelElementCollection.cs new file mode 100644 index 000000000..628561c52 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendSubmodelElementCollection.cs @@ -0,0 +1,193 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using AdminShellNS; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Extensions +{ + public static class ExtendSubmodelElementCollection + { + #region AasxPackageExplorer + + /// + /// Recurses on all Submodel elements of a Submodel or SME, which allows children. + /// The state object will be passed to the lambda function in order to provide + /// stateful approaches. Include this element, as well. + /// + /// State object to be provided to lambda. Could be null. + /// The lambda function as (state, parents, SME) + /// The lambda shall return TRUE in order to deep into recursion. + /// Include this element as well. parents will then + /// include this element as well! + public static void RecurseOnReferables(this SubmodelElementCollection submodelElementCollection, + object state, Func, IReferable, bool> lambda, + bool includeThis = false) + { + var parents = new List(); + if (includeThis) + { + lambda(state, null, submodelElementCollection); + parents.Add(submodelElementCollection); + } + submodelElementCollection.Value?.RecurseOnReferables(state, parents, lambda); + } + + public static void Remove(this SubmodelElementCollection submodelElementCollection, ISubmodelElement submodelElement) + { + if (submodelElementCollection != null) + { + if (submodelElementCollection.Value != null) + { + submodelElementCollection.Value.Remove(submodelElement); + } + } + } + + public static object AddChild(this SubmodelElementCollection submodelElementCollection, ISubmodelElement childSubmodelElement, EnumerationPlacmentBase placement = null) + { + if (childSubmodelElement == null) + return null; + if (submodelElementCollection.Value == null) + submodelElementCollection.Value = new(); + if (childSubmodelElement != null) + childSubmodelElement.Parent = submodelElementCollection; + submodelElementCollection.Value.Add(childSubmodelElement); + return childSubmodelElement; + } + + #endregion + public static T FindFirstIdShortAs(this SubmodelElementCollection submodelElementCollection, string idShort) where T : ISubmodelElement + { + + var submodelElement = submodelElementCollection.Value.Where(sme => (sme != null) && (sme is T) && sme.IdShort.Equals(idShort, StringComparison.OrdinalIgnoreCase)).FirstOrDefault(); + + return (T)submodelElement; + } + + public static SubmodelElementCollection ConvertFromV10(this SubmodelElementCollection submodelElementCollection, AasxCompatibilityModels.AdminShellV10.SubmodelElementCollection sourceSmeCollection, bool shallowCopy = false) + { + if (sourceSmeCollection == null) + return null; + + submodelElementCollection.Value ??= new List(); + + if (!shallowCopy) + { + foreach (var submodelElementWrapper in sourceSmeCollection.value) + { + var sourceSubmodelElement = submodelElementWrapper.submodelElement; + ISubmodelElement outputSubmodelElement = null; + if (sourceSubmodelElement != null) + { + outputSubmodelElement = outputSubmodelElement.ConvertFromV10(sourceSubmodelElement, shallowCopy); + } + + submodelElementCollection.Value.Add(outputSubmodelElement); + } + } + + return submodelElementCollection; + } + + public static SubmodelElementCollection ConvertFromV20(this SubmodelElementCollection submodelElementCollection, AasxCompatibilityModels.AdminShellV20.SubmodelElementCollection sourceSmeCollection, bool shallowCopy = false) + { + if (sourceSmeCollection == null) + return null; + + submodelElementCollection.Value ??= new List(); + + if (!shallowCopy) + { + foreach (var submodelElementWrapper in sourceSmeCollection.value) + { + var sourceSubmodelElement = submodelElementWrapper.submodelElement; + ISubmodelElement outputSubmodelElement = null; + if (sourceSubmodelElement != null) + { + outputSubmodelElement = outputSubmodelElement.ConvertFromV20(sourceSubmodelElement, shallowCopy); + } + + submodelElementCollection.Value.Add(outputSubmodelElement); + } + } + + return submodelElementCollection; + } + + public static void Add(this SubmodelElementCollection submodelElementCollection, ISubmodelElement submodelElement) + { + submodelElementCollection.Value ??= new List(); + + submodelElement.Parent = submodelElementCollection; + submodelElementCollection.Value.Add(submodelElement); + } + + public static void Insert(this SubmodelElementCollection submodelElementCollection, int index, ISubmodelElement submodelElement) + { + if (submodelElementCollection.Value == null) + { + submodelElementCollection.Value = new List(); + } + + submodelElement.Parent = submodelElementCollection; + submodelElementCollection.Value.Insert(index, submodelElement); + } + + public static T CreateSMEForCD( + this SubmodelElementCollection smc, + ConceptDescription conceptDescription, string category = null, string idShort = null, + string idxTemplate = null, int maxNum = 999, bool addSme = false, bool isTemplate = false) + where T : ISubmodelElement + { + if (smc.Value == null) + smc.Value = new List(); + return smc.Value.CreateSMEForCD( + conceptDescription, category, idShort, idxTemplate, maxNum, addSme, isTemplate); + } + + public static SubmodelElementCollection UpdateFrom( + this SubmodelElementCollection elem, ISubmodelElement source) + { + if (source == null) + return elem; + + ((ISubmodelElement)elem).UpdateFrom(source); + + if (source is SubmodelElementList srcList) + { + if (srcList.Value != null) + elem.Value = srcList.Value.Copy(); + } + + if (source is Operation srcOp) + { + Action, List> appov = (dst, src) => + { + if (src == null) + return; + foreach (var ov in src) + if (ov.Value != null) + dst.Append(ov.Value.Copy()); + }; + + elem.Value = new(); + appov(elem.Value, srcOp.InputVariables); + appov(elem.Value, srcOp.InoutputVariables); + appov(elem.Value, srcOp.OutputVariables); + if (elem.Value.Count < 1) + elem.Value = null; + } + + return elem; + } + + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendSubmodelElementList.cs b/src/AasxCsharpLibrary/Extensions/ExtendSubmodelElementList.cs new file mode 100644 index 000000000..a3a27c53d --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtendSubmodelElementList.cs @@ -0,0 +1,206 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using AdminShellNS; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Extensions +{ + public static class ExtendSubmodelElementList + { + #region AasxPackageExplorer + + /// + /// Recurses on all Submodel elements of a Submodel or SME, which allows children. + /// The state object will be passed to the lambda function in order to provide + /// stateful approaches. Include this element, as well. + /// + /// State object to be provided to lambda. Could be null. + /// The lambda function as (state, parents, SME) + /// The lambda shall return TRUE in order to deep into recursion. + /// Include this element as well. parents will then + /// include this element as well! + public static void RecurseOnReferables(this SubmodelElementList submodelElementList, + object state, Func, IReferable, bool> lambda, + bool includeThis = false) + { + var parents = new List(); + if (includeThis) + { + lambda(state, null, submodelElementList); + parents.Add(submodelElementList); + } + submodelElementList.Value?.RecurseOnReferables(state, parents, lambda); + } + + public static void Add(this SubmodelElementList submodelElementList, ISubmodelElement submodelElement) + { + if (submodelElementList != null) + { + submodelElementList.Value ??= new(); + + submodelElement.Parent = submodelElementList; + + submodelElementList.Value.Add(submodelElement); + } + } + + public static void Remove(this SubmodelElementList submodelElementList, ISubmodelElement submodelElement) + { + if (submodelElementList != null) + { + if (submodelElementList.Value != null) + { + submodelElementList.Value.Remove(submodelElement); + } + } + } + + public static object AddChild( + this SubmodelElementList submodelElementList, ISubmodelElement childSubmodelElement, + EnumerationPlacmentBase placement = null) + { + if (childSubmodelElement == null) + return null; + if (submodelElementList.Value == null) + submodelElementList.Value = new(); + if (childSubmodelElement != null) + childSubmodelElement.Parent = submodelElementList; + submodelElementList.Value.Add(childSubmodelElement); + return childSubmodelElement; + } + + #endregion + public static T FindFirstIdShortAs(this SubmodelElementList submodelElementList, string idShort) where T : ISubmodelElement + { + + var submodelElements = submodelElementList.Value.Where(sme => sme != null && sme is T && sme.IdShort.Equals(idShort, StringComparison.OrdinalIgnoreCase)); + + if (submodelElements.Any()) + { + return (T)submodelElements.First(); + } + + return default; + } + + public static SubmodelElementList UpdateFrom( + this SubmodelElementList elem, ISubmodelElement source) + { + if (source == null) + return elem; + + ((ISubmodelElement)elem).UpdateFrom(source); + + if (source is SubmodelElementCollection srcColl) + { + if (srcColl.Value != null) + elem.Value = srcColl.Value.Copy(); + } + + if (source is Operation srcOp) + { + Action, List> appov = (dst, src) => + { + if (src == null) + return; + foreach (var ov in src) + if (ov.Value != null) + dst.Append(ov.Value.Copy()); + }; + + elem.Value = new(); + appov(elem.Value, srcOp.InputVariables); + appov(elem.Value, srcOp.InoutputVariables); + appov(elem.Value, srcOp.OutputVariables); + if (elem.Value.Count < 1) + elem.Value = null; + } + + return elem; + } + + // advanced checks + + public class ConstraintStat + { + /// + /// Constraint AASd-107: If a first level child element in a SubmodelElementList has a semanticId + /// it shall be identical to SubmodelElementList/semanticIdListElement. + /// + public bool AllChildSemIdMatch = true; + + /// + /// Constraint AASd-108: All first level child elements in a SubmodelElementList shall have the + /// same submodel element type as specified in SubmodelElementList/typeValueListElement. + /// + public bool AllChildSmeTypeMatch = true; + + /// + /// Constraint AASd-109: If SubmodelElementList/typeValueListElement equal to Property or Range, + /// SubmodelElementList/valueTypeListElement shall be set and all first level child elements in + /// the SubmodelElementList shall have the the value type as specified in + /// SubmodelElementList/valueTypeListElement + /// + public bool AllChildValueTypeMatch = true; + } + + public static ConstraintStat EvalConstraintStat(this SubmodelElementList list) + { + // access + var res = new ConstraintStat(); + if (list.Value == null) + return res; + + // prepare SME type + var smeTypeToCheck = list.TypeValueListElement; + + // prepare value type + var valueTypeToCheck = list.ValueTypeListElement; + + // eval + foreach (var sme in list.Value) + { + // need self description + var smesd = sme.GetSelfDescription(); + if (smesd == null) + continue; + + // sem id? + if (res.AllChildSemIdMatch + && list.SemanticIdListElement?.IsValid() == true + && sme.SemanticId?.IsValid() == true + && !list.SemanticIdListElement.Matches(sme.SemanticId)) + res.AllChildSemIdMatch = false; + + // type of SME? + if (res.AllChildSmeTypeMatch + && smesd.SmeType != smeTypeToCheck) + res.AllChildSmeTypeMatch = false; + + // value type to check + if (valueTypeToCheck.HasValue + && res.AllChildValueTypeMatch + && sme is Property prop + && prop.ValueType != valueTypeToCheck.Value) + res.AllChildValueTypeMatch = false; + + if (valueTypeToCheck.HasValue + && res.AllChildValueTypeMatch + && sme is AasCore.Aas3_0.Range range + && range.ValueType != valueTypeToCheck.Value) + res.AllChildValueTypeMatch = false; + } + + // ok + return res; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/ExtensionsUtil.cs b/src/AasxCsharpLibrary/Extensions/ExtensionsUtil.cs new file mode 100644 index 000000000..32200d1a7 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/ExtensionsUtil.cs @@ -0,0 +1,120 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +using AasxCompatibilityModels; +using System; +using System.Collections.Generic; + +namespace Extensions +{ + public static class ExtensionsUtil + { + + public static Reference ConvertReferenceFromV10(AdminShellV10.Reference sourceReference, ReferenceTypes referenceTypes) + { + Reference outputReference = null; + if (sourceReference != null && !sourceReference.IsEmpty) + { + var keyList = new List(); + foreach (var refKey in sourceReference.Keys) + { + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {refKey.type} not found."); + } + } + outputReference = new Reference(referenceTypes, keyList); + } + + return outputReference; + } + + public static Reference ConvertReferenceFromV20(AdminShellV20.Reference sourceReference, ReferenceTypes referenceTypes) + { + Reference outputReference = null; + if (sourceReference != null && !sourceReference.IsEmpty) + { + var keyList = new List(); + foreach (var refKey in sourceReference.Keys) + { + // Fix, as Asset does not exist anymore + if (refKey.type?.Trim().Equals("Asset", StringComparison.InvariantCultureIgnoreCase) == true) + refKey.type = "GlobalReference"; + + var keyType = Stringification.KeyTypesFromString(refKey.type); + if (keyType != null) + { + keyList.Add(new Key((KeyTypes)keyType, refKey.value)); + } + else + { + Console.WriteLine($"KeyType value {refKey.type} not found."); + } + } + outputReference = new Reference(referenceTypes, keyList); + } + + return outputReference; + } + + internal static List ConvertDescriptionFromV10(AdminShellV10.Description sourceDescription) + { + var newLangStrList = new List(); + foreach (var ls in sourceDescription.langString) + { + newLangStrList.Add(new LangStringTextType(ls.lang, ls.str)); + } + + return new List(newLangStrList); + } + + internal static List ConvertDescriptionFromV20(AdminShellV20.Description sourceDescription) + { + var newLangStrList = new List(); + foreach (var ls in sourceDescription.langString) + { + newLangStrList.Add(new LangStringTextType(ls.lang, ls.str)); + } + + return new List(newLangStrList); + } + + internal static KeyTypes GetKeyType(IClass aasElement) + { + return aasElement switch + { + AssetAdministrationShell => KeyTypes.AssetAdministrationShell, + Submodel => KeyTypes.Submodel, + ConceptDescription => KeyTypes.ConceptDescription, + SubmodelElementCollection => KeyTypes.SubmodelElementCollection, + SubmodelElementList => KeyTypes.SubmodelElementList, + BasicEventElement => KeyTypes.BasicEventElement, + Blob => KeyTypes.Blob, + Entity => KeyTypes.Entity, + File => KeyTypes.File, + MultiLanguageProperty => KeyTypes.MultiLanguageProperty, + Property => KeyTypes.Property, + Operation => KeyTypes.Operation, + AasCore.Aas3_0.Range => KeyTypes.Range, + ReferenceElement => KeyTypes.ReferenceElement, + RelationshipElement => KeyTypes.RelationshipElement, + AnnotatedRelationshipElement => KeyTypes.AnnotatedRelationshipElement, + IIdentifiable => KeyTypes.Identifiable, + IReferable => KeyTypes.Referable, + Reference => KeyTypes.GlobalReference, + //TODO (jtikekar, 0000-00-00): what about model reference + _ => KeyTypes.SubmodelElement, // default case + }; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/LocatedReference.cs b/src/AasxCsharpLibrary/Extensions/LocatedReference.cs new file mode 100644 index 000000000..26916c5b7 --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/LocatedReference.cs @@ -0,0 +1,23 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +namespace Extensions +{ + public class LocatedReference + { + public IIdentifiable Identifiable; + public IReference Reference; + + public LocatedReference() { } + public LocatedReference(IIdentifiable identifiable, IReference reference) + { + Identifiable = identifiable; + Reference = reference; + } + } +} diff --git a/src/AasxCsharpLibrary/Extensions/MatchMode.cs b/src/AasxCsharpLibrary/Extensions/MatchMode.cs new file mode 100644 index 000000000..12792aa1a --- /dev/null +++ b/src/AasxCsharpLibrary/Extensions/MatchMode.cs @@ -0,0 +1,17 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ +namespace Extensions +{ + public enum MatchMode + { + Strict, //may be not needed in future, as no local flag in V3 + Relaxed, //should be as default + Identification + } +} diff --git a/src/AasxCsharpLibrary/IAasxOnlineConnection.cs b/src/AasxCsharpLibrary/IAasxOnlineConnection.cs new file mode 100644 index 000000000..550bd7e21 --- /dev/null +++ b/src/AasxCsharpLibrary/IAasxOnlineConnection.cs @@ -0,0 +1,26 @@ +/* +Copyright (c) 2018-2023 Festo SE & Co. KG +Author: Michael Hoffmeister + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ + +using System.IO; + +namespace AasxIntegrationBase +{ + /// + /// This interface describes a connection for a server resource of AASX contents, such as OPC UA or REST + /// + public interface IAasxOnlineConnection + { + bool IsValid(); + bool IsConnected(); + string GetInfo(); + Stream GetThumbnailStream(); + string UpdatePropertyValue( + AasCore.Aas3_0.Environment env, Submodel submodel, ISubmodelElement sme); + } +} diff --git a/src/AasxCsharpLibrary/LICENSE.txt b/src/AasxCsharpLibrary/LICENSE.txt new file mode 100644 index 000000000..01f9cb5eb --- /dev/null +++ b/src/AasxCsharpLibrary/LICENSE.txt @@ -0,0 +1,1475 @@ +Copyright (c) 2018-2023 Festo SE & Co. KG +, +author: Michael Hoffmeister + +Copyright (c) 2019-2021 PHOENIX CONTACT GmbH & Co. KG +, +author: Andreas Orzelski + +Copyright (c) 2019-2020 Fraunhofer IOSB-INA Lemgo, + eine rechtlich nicht selbstaendige Einrichtung der Fraunhofer-Gesellschaft + zur Foerderung der angewandten Forschung e.V. + +Copyright (c) 2020 Schneider Electric Automation GmbH +, +author: Marco Mendes + +Copyright (c) 2020 SICK AG + +Copyright (c) 2021 KEB Automation KG + +Copyright (c) 2021 Lenze SE +author: Jonas Grote, Denis Göllner, Sebastian Bischof + +The AASX Package Explorer is licensed under the Apache License 2.0 +(Apache-2.0, see below). + +The AASX Package Explorer is a sample application for demonstration of the +features of the Asset Administration Shell. +The implementation uses the concepts of the document "Details of the Asset +Administration Shell" published on www.plattform-i40.de which is licensed +under Creative Commons CC BY-ND 3.0 DE. + +When using eCl@ss or IEC CDD data, please check the corresponding license +conditions. + +------------------------------------------------------------------------------- + +The components below are used in AASX Package Explorer. +The related licenses are listed for information purposes only. +Some licenses may only apply to their related plugins. + +The browser functionality is licensed under the cefSharp license (see below). + +The Newtonsoft.JSON serialization is licensed under the MIT License +(MIT, see below). + +The QR code generation is licensed under the MIT license (MIT, see below). + +The Zxing.Net Dot Matrix Code (DMC) generation is licensed under +the Apache License 2.0 (Apache-2.0, see below). + +The Grapevine REST server framework is licensed under Apache License 2.0 +(Apache-2.0, see below). + +The AutomationML.Engine is licensed under the MIT license (MIT, see below). + +The MQTT server and client is licensed under the MIT license (MIT, see below). + +The ClosedXML Excel reader/writer is licensed under the MIT license (MIT, +see below). + +The CountryFlag WPF control is licensed under the Code Project Open License +(CPOL, see below). + +The DocumentFormat.OpenXml SDK is licensed under the MIT license (MIT, +see below). + +The ExcelNumberFormat number parser is licensed under the MIT license (MIT, +see below). + +The FastMember reflection access is licensed under Apache License 2.0 +(Apache-2.0, see below). + +The IdentityModel OpenID client is licensed under Apache License 2.0 +(Apache-2.0, see below). + +The jose-jwt object signing and encryption is licensed under the +MIT license (MIT, see below). + +The ExcelDataReader is licensed under the MIT license (MIT, see below). + +Portions copyright (c) by OPC Foundation, Inc. and licensed under the +Reciprocal Community License (RCL, see below) + +The OPC UA Example Code of OPC UA Standard is licensed under the MIT license +(MIT, see below). + +The MSAGL (Microsoft Automatic Graph Layout) is licensed under the MIT license +(MIT, see below) + +Glob (https://www.nuget.org/packages/Glob/) is licensed under the MIT license +(MIT, see below). + +The Magick.NET library is licensed under Apache License 2.0 +(Apache-2.0, see below). + +The SSharp.NET library (https://github.com/PetroProtsyk/SSharp) is licensed +under Apache License 2.0 (Apache-2.0, see below). + +------------------------------------------------------------------------------- + + +With respect to AASX Package Explorer +===================================== + +(http://www.apache.org/licenses/LICENSE-2.0) + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + +With respect to cefSharp +======================== + +(https://raw.githubusercontent.com/cefsharp/CefSharp/master/LICENSE) + +Copyright © The CefSharp Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + + * Neither the name of Google Inc. nor the name Chromium Embedded + Framework nor the name CefSharp nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +With respect to Newtonsoft.Json +=============================== + +(https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md) + +The MIT License (MIT) + +Copyright (c) 2007 James Newton-King + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +With respect to QRcoder +======================= + +(https://github.com/codebude/QRCoder/blob/master/LICENSE.txt) + +The MIT License (MIT) + +Copyright (c) 2013-2018 Raffael Herrmann + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +With respect to ZXing.Net +========================= +With respect to Grapevine +========================= +With respect to FastMember +========================== +With respect to IdentityModel +============================= + +(http://www.apache.org/licenses/LICENSE-2.0) + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + +With respect to AutomationML.Engine +=================================== + +(https://raw.githubusercontent.com/AutomationML/AMLEngine2.1/master/license.txt) + +The MIT License (MIT) + +Copyright 2017 AutomationML e.V. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + + +With respect to MQTTnet +======================= + +(https://github.com/chkr1011/MQTTnet/blob/master/LICENSE) + +MIT License + +MQTTnet Copyright (c) 2016-2019 Christian Kratky + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +With resepct to ClosedXML +========================= + +(https://github.com/ClosedXML/ClosedXML/blob/develop/LICENSE) + +MIT License + +Copyright (c) 2016 ClosedXML + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +With resepct to CountryFlag +=========================== + +(https://www.codeproject.com/Articles/190722/WPF-CountryFlag-Control) + +The Code Project Open License (CPOL) 1.02 + +Copyright © 2017 Meshack Musundi + +Preamble + +This License governs Your use of the Work. This License is intended to allow +developers to use the Source Code and Executable Files provided as part of +the Work in any application in any form. + +The main points subject to the terms of the License are: + + Source Code and Executable Files can be used in commercial applications; + Source Code and Executable Files can be redistributed; and + Source Code can be modified to create derivative works. + No claim of suitability, guarantee, or any warranty whatsoever is provided. + The software is provided "as-is". + The Article(s) accompanying the Work may not be distributed or republished + without the Author's consent + +This License is entered between You, the individual or other entity reading or +otherwise making use of the Work licensed pursuant to this License and the +individual or other entity which offers the Work under the terms of this +License ("Author"). + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS +CODE PROJECT OPEN LICENSE ("LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT +AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED +UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HEREIN, YOU ACCEPT AND AGREE +TO BE BOUND BY THE TERMS OF THIS LICENSE. THE AUTHOR GRANTS YOU THE RIGHTS +CONTAINED HEREIN IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND +CONDITIONS. IF YOU DO NOT AGREE TO ACCEPT AND BE BOUND BY THE TERMS OF THIS +LICENSE, YOU CANNOT MAKE ANY USE OF THE WORK. + +Definitions. + "Articles" means, collectively, all articles written by Author which +describes how the Source Code and Executable Files for the Work may +be used by a user. + "Author" means the individual or entity that offers the Work under +the terms of this License. + "Derivative Work" means a work based upon the Work or upon the Work +and other pre-existing works. + "Executable Files" refer to the executables, binary files, +configuration and any required data files included in the Work. + "Publisher" means the provider of the website, magazine, CD-ROM, +DVD or other medium from or by which the Work is obtained by You. + "Source Code" refers to the collection of source code and +configuration files used to create the Executable Files. + "Standard Version" refers to such a Work if it has not been modified, +or has been modified in accordance with the consent of the Author, +such consent being in the full discretion of the Author. + "Work" refers to the collection of files distributed by the Publisher, +including the Source Code, Executable Files, binaries, data files, +documentation, whitepapers and the Articles. + "You" is you, an individual or entity wishing to use the Work and +exercise your rights under this License. + +Fair Use/Fair Use Rights. Nothing in this License is intended to reduce, +limit, or restrict any rights arising from fair use, fair dealing, +first sale or other limitations on the exclusive rights of the +copyright owner under copyright law or other applicable laws. + +License Grant. Subject to the terms and conditions of this License, the +Author hereby grants You a worldwide, royalty-free, non-exclusive, +perpetual (for the duration of the applicable copyright) license +to exercise the rights in the Work as stated below: + You may use the standard version of the Source Code or Executable +Files in Your own applications. + You may apply bug fixes, portability fixes and other modifications +obtained from the Public Domain or from the Author. A Work modified +in such a way shall still be considered the standard version and will +be subject to this License. + You may otherwise modify Your copy of this Work (excluding the Articles) +in any way to create a Derivative Work, provided that You insert a prominent +notice in each changed file stating how, when and where You changed that file. + You may distribute the standard version of the Executable Files and Source +Code or Derivative Work in aggregate with other (possibly commercial) +programs as part of a larger (possibly commercial) software distribution. + The Articles discussing the Work published in any form by the author may +not be distributed or republished without the Author's consent. The author +retains copyright to any such Articles. You may use the Executable Files and +Source Code pursuant to this License but you may not repost or republish or +otherwise distribute or make available the Articles, without the prior written +consent of the Author. + +Any subroutines or modules supplied by You and linked into the Source Code +or Executable Files of this Work shall not be considered part of this Work +and will not be subject to the terms of this License. + +Patent License. Subject to the terms and conditions of this License, each +Author hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, +royalty-free, irrevocable (except as stated in this section) patent license +to make, have made, use, import, and otherwise transfer the Work. + +Restrictions. The license granted in Section 3 above is expressly made subject +to and limited by the following restrictions: + You agree not to remove any of the original copyright, patent, trademark, +and attribution notices and associated disclaimers that may appear in the +Source Code or Executable Files. + You agree not to advertise or in any way imply that this Work is a product +of Your own. + The name of the Author may not be used to endorse or promote products +derived from the Work without the prior written consent of the Author. + You agree not to sell, lease, or rent any part of the Work. This does +not restrict you from including the Work or any part of the Work inside +a larger software distribution that itself is being sold. The Work by itself, +though, cannot be sold, leased or rented. + You may distribute the Executable Files and Source Code only under the terms +of this License, and You must include a copy of, or the Uniform Resource +Identifier for, this License with every copy of the Executable Files or +Source Code You distribute and ensure that anyone receiving such Executable +Files and Source Code agrees that the terms of this License apply to such +Executable Files and/or Source Code. You may not offer or impose any terms +on the Work that alter or restrict the terms of this License or the +recipients' exercise of the rights granted hereunder. You may not sublicense +the Work. You must keep intact all notices that refer to this License and to +the disclaimer of warranties. You may not distribute the Executable Files or +Source Code with any technological measures that control access or use of the +Work in a manner inconsistent with the terms of this License. + You agree not to use the Work for illegal, immoral or improper +purposes, or on pages containing illegal, immoral or improper material. +The Work is subject to applicable export laws. You agree to comply with all +such laws and regulations that may apply to the Work after Your receipt of +the Work. + +Representations, Warranties and Disclaimer. THIS WORK IS PROVIDED "AS IS", +"WHERE IS" AND "AS AVAILABLE", WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES OR +CONDITIONS OR GUARANTEES. YOU, THE USER, ASSUME ALL RISK IN ITS USE, +INCLUDING COPYRIGHT INFRINGEMENT, PATENT INFRINGEMENT, SUITABILITY, ETC. +AUTHOR EXPRESSLY DISCLAIMS ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES +OR CONDITIONS, INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS +OF MERCHANTABILITY, MERCHANTABLE QUALITY OR FITNESS FOR A PARTICULAR +PURPOSE, OR ANY WARRANTY OF TITLE OR NON-INFRINGEMENT, OR THAT THE WORK +(OR ANY PORTION THEREOF) IS CORRECT, USEFUL, BUG-FREE OR FREE OF VIRUSES. +YOU MUST PASS THIS DISCLAIMER ON WHENEVER YOU DISTRIBUTE THE WORK OR DERIVATIVE +WORKS. + +Indemnity. You agree to defend, indemnify and hold harmless the Author and the +Publisher from and against any claims, suits, losses, damages, liabilities, +costs, and expenses (including reasonable legal or attorneys’ fees) +resulting from or relating to any use of the Work by You. + +Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, +IN NO EVENT WILL THE AUTHOR OR THE PUBLISHER BE LIABLE TO YOU ON ANY LEGAL +THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY +DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK OR OTHERWISE, +EVEN IF THE AUTHOR OR THE PUBLISHER HAS BEEN ADVISED OF THE POSSIBILITY +OF SUCH DAMAGES. + +Termination. + This License and the rights granted hereunder will terminate +automatically upon any breach by You of any term of this License. +Individuals or entities who have received Derivative Works from You under +this License, however, will not have their licenses terminated provided such +individuals or entities remain in full compliance with those licenses. +Sections 1, 2, 6, 7, 8, 9, 10 and 11 will survive any termination of +this License. + If You bring a copyright, trademark, patent or any other infringement +claim against any contributor over infringements You claim are made by the +Work, your License from such contributor to the Work ends automatically. + Subject to the above terms and conditions, this License is perpetual +(for the duration of the applicable copyright in the Work). +Notwithstanding the above, the Author reserves the right to release the Work +under different license terms or to stop distributing the Work at any time; +provided, however that any such election will not serve to withdraw this +License (or any other license that has been, or is required to be, +granted under the terms of this License), and this License will continue +in full force and effect unless terminated as stated above. + +Publisher. The parties hereby confirm that the Publisher shall not, under +any circumstances, be responsible for and shall not have any liability +in respect of the subject matter of this License. The Publisher makes no +warranty whatsoever in connection with the Work and shall not be liable +to You or any party on any legal theory for any damages whatsoever, including +without limitation any general, special, incidental or consequential damages +arising in connection to this license. The Publisher reserves the right to +cease making the Work available to You at any time without notice + +Miscellaneous + This License shall be governed by the laws of the location of the head +office of the Author or if the Author is an individual, the laws of +location of the principal place of residence of the Author. + If any provision of this License is invalid or unenforceable under +applicable law, it shall not affect the validity or enforceability of the +remainder of the terms of this License, and without further action by the +parties to this License, such provision shall be reformed to the minimum +extent necessary to make such provision valid and enforceable. + No term or provision of this License shall be deemed waived and no +breach consented to unless such waiver or consent shall be in writing +and signed by the party to be charged with such waiver or consent. + This License constitutes the entire agreement between the parties +with respect to the Work licensed herein. There are no understandings, +agreements or representations with respect to the Work not specified herein. +The Author shall not be bound by any additional provisions that may appear +in any communication from You. This License may not be modified without +the mutual written agreement of the Author and You. + + +With respect to DocumentFormat.OpenXml +====================================== + +(https://github.com/OfficeDev/Open-XML-SDK/blob/master/LICENSE) + +The MIT License (MIT) + +Copyright (c) Microsoft Corporation + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +With respect to ExcelNumberFormat +================================= + +(https://github.com/andersnm/ExcelNumberFormat/blob/master/LICENSE) + +The MIT License (MIT) + +Copyright (c) 2017 andersnm + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +With respect to jose-jwt +======================== + +(https://github.com/dvsekhvalnov/jose-jwt/blob/master/LICENSE) + +The MIT License (MIT) + +Copyright (c) 2014-2019 dvsekhvalnov + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +With resepect to ExcelDataReader +================================ + +(https://github.com/ExcelDataReader/ExcelDataReader/blob/develop/LICENSE) + +The MIT License (MIT) + +Copyright (c) 2014 ExcelDataReader + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +With resepect to OPC UA Example Code +==================================== + + * Copyright (c) 2005-2019 The OPC Foundation, Inc. All rights reserved. + * + * OPC Foundation MIT License 1.00 + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * The complete license agreement can be found here: + * http://opcfoundation.org/License/MIT/1.00/ + + +With respect to OPC Foundation +============================== + +RCL License +Reciprocal Community License 1.00 (RCL1.00) +Version 1.00, June 24, 2009 +Copyright (C) 2008,2009 OPC Foundation, Inc., All Rights Reserved. + +https://opcfoundation.org/license/rcl.html + +Remark: PHOENIX CONTACT GmbH & Co. KG and Festo SE & Co. KG are members +of OPC foundation. + +With respect to MSAGL (Microsoft Automatic Graph Layout) +======================================================== +(see: https://github.com/microsoft/automatic-graph-layout/blob/master/LICENSE) + +Microsoft Automatic Graph Layout, MSAGL + +Copyright (c) Microsoft Corporation + +All rights reserved. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +""Software""), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +With respect to Glob (https://www.nuget.org/packages/Glob/) +=========================================================== +(see: https://raw.githubusercontent.com/kthompson/glob/master/LICENSE) + +The MIT License (MIT) + +Copyright (c) 2013-2019 Kevin Thompson + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +With respect to Magick.NET +========================== + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. + +With respect to SSharp.NET library +================================== + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/src/AasxCsharpLibrary/LogInternally.cs b/src/AasxCsharpLibrary/LogInternally.cs new file mode 100644 index 000000000..5b8061292 --- /dev/null +++ b/src/AasxCsharpLibrary/LogInternally.cs @@ -0,0 +1,83 @@ +/* +Copyright (c) 2020 ZHAW Zürcher Hochschule für Angewandte Wissenschaften +Author: Marko Ristin + +This source code is licensed under the Apache License 2.0 (see LICENSE.txt). + +This source code may use other Open Source software components (see LICENSE.txt). +*/ + +using Exception = System.Exception; + +namespace AdminShellNS +{ + public static class Logging + { + // see: https://stackoverflow.com/questions/9314172/getting-all-messages-from-innerexceptions + private static string GetExceptionMessages(this Exception e, string msgs = "") + { + if (e == null) return string.Empty; + if (msgs == "") msgs = e.Message; + if (e.InnerException != null) + msgs += "\r\nInnerException: " + GetExceptionMessages(e.InnerException); + return msgs; + } + + public static string FormatError(Exception ex, string where) + { + var res = string.Format("Error: {0}: {1} {2} at {3}.", + where, + ex.Message, + ex.GetExceptionMessages(), + ex.StackTrace); + + var inner = ex.InnerException; + while (inner != null) + { + res += $"Inner message: {inner.Message}" + System.Environment.NewLine; + inner = inner.InnerException; + } + + return res; + } + } + + public class InternalLog + { + /// + /// Logs the exception to STDERR. + /// + public void Error(Exception ex, string where) + { + System.Console.Error.WriteLine(Logging.FormatError(ex, where)); + } + + /// + /// Logs that the exception is silently ignored to STDERR. + /// + public void SilentlyIgnoredError(Exception ex) + { + System.Console.Error.WriteLine("The exception is silently ignored: {0} {1} at {2}.", + ex.Message, + ((ex.InnerException != null) ? ex.InnerException.Message : ""), + ex.StackTrace); + } + + /// + /// Does no logging at all. Allows to have non-empty catch clauses. + /// + public void CompletelyIgnoredError(Exception ex) + { + } + } + + /// + /// Handles logging meant to be read by developers (*i.e*, not by the users of the software). + /// + /// Please see AasxIntegrationBase\LogInstance.cs for how to keep logs intended + /// for the user. + public static class LogInternally + { + public static readonly InternalLog That = new InternalLog(); + } +} \ No newline at end of file diff --git a/src/AasxCsharpLibrary/Properties/AssemblyInfo.cs b/src/AasxCsharpLibrary/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..1c46e4aa6 --- /dev/null +++ b/src/AasxCsharpLibrary/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +// Allgemeine Informationen über eine Assembly werden über die folgenden +// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, +// die einer Assembly zugeordnet sind. +[assembly: AssemblyTitle("AasxCsharpLibrary")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("AasxCsharpLibrary")] +[assembly: AssemblyCopyright("Copyright © 2019")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly +// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von +// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen. +[assembly: ComVisible(false)] + +// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird +[assembly: Guid("9863799b-4e44-4da2-9120-c85c7985bc6d")] + +// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: +// +// Hauptversion +// Nebenversion +// Buildnummer +// Revision +// +// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, +// indem Sie "*" wie unten gezeigt eingeben: +//// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/AasxCsharpLibrary/Resources/schemaV201/AAS.xsd b/src/AasxCsharpLibrary/Resources/schemaV201/AAS.xsd new file mode 100644 index 000000000..2e6c24f6b --- /dev/null +++ b/src/AasxCsharpLibrary/Resources/schemaV201/AAS.xsd @@ -0,0 +1,555 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/AasxCsharpLibrary/Resources/schemaV201/AAS_ABAC.xsd b/src/AasxCsharpLibrary/Resources/schemaV201/AAS_ABAC.xsd new file mode 100644 index 000000000..4048a5746 --- /dev/null +++ b/src/AasxCsharpLibrary/Resources/schemaV201/AAS_ABAC.xsd @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AasxCsharpLibrary/Resources/schemaV201/IEC61360.xsd b/src/AasxCsharpLibrary/Resources/schemaV201/IEC61360.xsd new file mode 100644 index 000000000..d52f04f1e --- /dev/null +++ b/src/AasxCsharpLibrary/Resources/schemaV201/IEC61360.xsd @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/AasxCsharpLibrary/Resources/schemaV201/aas.json b/src/AasxCsharpLibrary/Resources/schemaV201/aas.json new file mode 100644 index 000000000..9583c2b1f --- /dev/null +++ b/src/AasxCsharpLibrary/Resources/schemaV201/aas.json @@ -0,0 +1,1148 @@ +{ + "$schema": "https://json-schema.org/draft/2019-09/schema", + "title": "AssetAdministrationShellEnvironment", + "$id": "http://www.admin-shell.io/schema/json/v2.0.1", + "type": "object", + "required": ["assetAdministrationShells", "submodels", "assets", "conceptDescriptions"], + "properties": { + "assetAdministrationShells": { + "type": "array", + "items": { + "$ref": "#/definitions/AssetAdministrationShell" + } + }, + "submodels": { + "type": "array", + "items": { + "$ref": "#/definitions/Submodel" + } + }, + "assets": { + "type": "array", + "items": { + "$ref": "#/definitions/Asset" + } + }, + "conceptDescriptions": { + "type": "array", + "items": { + "$ref": "#/definitions/ConceptDescription" + } + } + }, + "definitions": { + "Referable": { + "type": "object", + "properties": { + "idShort": { + "type": "string" + }, + "category": { + "type": "string" + }, + "description": { + "type": "array", + "items": { + "$ref": "#/definitions/LangString" + } + }, + "parent": { + "$ref": "#/definitions/Reference" + }, + "modelType": { + "$ref": "#/definitions/ModelType" + } + }, + "required": [ "idShort", "modelType" ] + }, + "Identifiable": { + "allOf": [ + { "$ref": "#/definitions/Referable" }, + { "properties": { + "identification": { + "$ref": "#/definitions/Identifier" + }, + "administration": { + "$ref": "#/definitions/AdministrativeInformation" + } + }, + "required": [ "identification" ] + } + ] + }, + "Qualifiable": { + "type": "object", + "properties": { + "qualifiers": { + "type": "array", + "items": { + "$ref": "#/definitions/Constraint" + } + } + } + }, + "HasSemantics": { + "type": "object", + "properties": { + "semanticId": { + "$ref": "#/definitions/Reference" + } + } + }, + "HasDataSpecification": { + "type": "object", + "properties": { + "embeddedDataSpecifications": { + "type": "array", + "items": { + "$ref": "#/definitions/EmbeddedDataSpecification" + } + } + } + }, + "AssetAdministrationShell": { + "allOf": [ + { "$ref": "#/definitions/Identifiable" }, + { "$ref": "#/definitions/HasDataSpecification" }, + { "properties": { + "derivedFrom": { + "$ref": "#/definitions/Reference" + }, + "asset": { + "$ref": "#/definitions/Reference" + }, + "submodels": { + "type": "array", + "items": { + "$ref": "#/definitions/Reference" + } + }, + "views": { + "type": "array", + "items": { + "$ref": "#/definitions/View" + } + }, + "conceptDictionaries": { + "type": "array", + "items": { + "$ref": "#/definitions/ConceptDictionary" + } + }, + "security": { + "$ref": "#/definitions/Security" + } + }, + "required": [ "asset" ] + } + ] + }, + "Identifier": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "idType": { + "$ref": "#/definitions/KeyType" + } + }, + "required": [ "id", "idType" ] + }, + "KeyType": { + "type": "string", + "enum": ["Custom", "IRDI", "IRI", "IdShort", "FragmentId"] + }, + "AdministrativeInformation": { + "type": "object", + "properties": { + "version": { + "type": "string" + }, + "revision": { + "type": "string" + } + } + }, + "LangString": { + "type": "object", + "properties": { + "language": { + "type": "string" + }, + "text": { + "type": "string" + } + }, + "required": [ "language", "text" ] + }, + "Reference": { + "type": "object", + "properties": { + "keys": { + "type": "array", + "items": { + "$ref": "#/definitions/Key" + } + } + }, + "required": [ "keys" ] + }, + "Key": { + "type": "object", + "properties": { + "type": { + "$ref": "#/definitions/KeyElements" + }, + "idType": { + "$ref": "#/definitions/KeyType" + }, + "value": { + "type": "string" + }, + "local": { + "type": "boolean" + } + }, + "required": [ "type", "idType", "value", "local" ] + }, + "KeyElements": { + "type": "string", + "enum": [ + "Asset", + "AssetAdministrationShell", + "ConceptDescription", + "Submodel", + "AccessPermissionRule", + "AnnotatedRelationshipElement", + "BasicEvent", + "Blob", + "Capability", + "ConceptDictionary", + "DataElement", + "File", + "Entity", + "Event", + "MultiLanguageProperty", + "Operation", + "Property", + "Range", + "ReferenceElement", + "RelationshipElement", + "SubmodelElement", + "SubmodelElementCollection", + "View", + "GlobalReference", + "FragmentReference" + ] + }, + "ModelTypes": { + "type": "string", + "enum": [ + "Asset", + "AssetAdministrationShell", + "ConceptDescription", + "Submodel", + "AccessPermissionRule", + "AnnotatedRelationshipElement", + "BasicEvent", + "Blob", + "Capability", + "ConceptDictionary", + "DataElement", + "File", + "Entity", + "Event", + "MultiLanguageProperty", + "Operation", + "Property", + "Range", + "ReferenceElement", + "RelationshipElement", + "SubmodelElement", + "SubmodelElementCollection", + "View", + "GlobalReference", + "FragmentReference", + "Constraint", + "Formula", + "Qualifier" + ] + }, + "ModelType": { + "type": "object", + "properties": { + "name": { + "$ref": "#/definitions/ModelTypes" + } + }, + "required": [ "name" ] + }, + "EmbeddedDataSpecification": { + "type": "object", + "properties": { + "dataSpecification": { + "$ref": "#/definitions/Reference" + }, + "dataSpecificationContent": { + "$ref": "#/definitions/DataSpecificationContent" + } + }, + "required": [ "dataSpecification", "dataSpecificationContent" ] + }, + "DataSpecificationContent": { + "oneOf": [ + { "$ref": "#/definitions/DataSpecificationIEC61360Content" }, + { "$ref": "#/definitions/DataSpecificationPhysicalUnitContent" } + ] + }, + "DataSpecificationPhysicalUnitContent": { + "type": "object", + "properties": { + "unitName": { + "type": "string" + }, + "unitSymbol": { + "type": "string" + }, + "definition": { + "type": "array", + "items": { + "$ref": "#/definitions/LangString" + } + }, + "siNotation": { + "type": "string" + }, + "siName": { + "type": "string" + }, + "dinNotation": { + "type": "string" + }, + "eceName": { + "type": "string" + }, + "eceCode": { + "type": "string" + }, + "nistName": { + "type": "string" + }, + "sourceOfDefinition": { + "type": "string" + }, + "conversionFactor": { + "type": "string" + }, + "registrationAuthorityId": { + "type": "string" + }, + "supplier": { + "type": "string" + } + }, + "required": [ "unitName", "unitSymbol", "definition" ] + }, + "DataSpecificationIEC61360Content": { + "allOf": [ + { "$ref": "#/definitions/ValueObject" }, + { + "type": "object", + "properties": { + "dataType": { + "enum": [ + "DATE", + "STRING", + "STRING_TRANSLATABLE", + "REAL_MEASURE", + "REAL_COUNT", + "REAL_CURRENCY", + "BOOLEAN", + "URL", + "RATIONAL", + "RATIONAL_MEASURE", + "TIME", + "TIMESTAMP", + "INTEGER_COUNT", + "INTEGER_MEASURE", + "INTEGER_CURRENCY" + ] + }, + "definition": { + "type": "array", + "items": { + "$ref": "#/definitions/LangString" + } + }, + "preferredName": { + "type": "array", + "items": { + "$ref": "#/definitions/LangString" + } + }, + "shortName": { + "type": "array", + "items": { + "$ref": "#/definitions/LangString" + } + }, + "sourceOfDefinition": { + "type": "string" + }, + "symbol": { + "type": "string" + }, + "unit": { + "type": "string" + }, + "unitId": { + "$ref": "#/definitions/Reference" + }, + "valueFormat": { + "type": "string" + }, + "valueList": { + "$ref": "#/definitions/ValueList" + }, + "levelType": { + "type": "array", + "items": { + "$ref": "#/definitions/LevelType" + } + } + }, + "required": [ "preferredName" ] + } + ] + }, + "LevelType": { + "type": "string", + "enum": [ "Min", "Max", "Nom", "Typ" ] + }, + "ValueList": { + "type": "object", + "properties": { + "valueReferencePairTypes": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/definitions/ValueReferencePairType" + } + } + }, + "required": [ "valueReferencePairTypes" ] + }, + "ValueReferencePairType": { + "allOf": [ + { "$ref": "#/definitions/ValueObject" } + ] + }, + "ValueObject": { + "type": "object", + "properties": { + "value": { "type": "string" }, + "valueId": { + "$ref": "#/definitions/Reference" + }, + "valueType": { + "type": "string", + "enum": [ + "anyUri", + "base64Binary", + "boolean", + "date", + "dateTime", + "dateTimeStamp", + "decimal", + "integer", + "long", + "int", + "short", + "byte", + "nonNegativeInteger", + "positiveInteger", + "unsignedLong", + "unsignedInt", + "unsignedShort", + "unsignedByte", + "nonPositiveInteger", + "negativeInteger", + "double", + "duration", + "dayTimeDuration", + "yearMonthDuration", + "float", + "gDay", + "gMonth", + "gMonthDay", + "gYear", + "gYearMonth", + "hexBinary", + "NOTATION", + "QName", + "string", + "normalizedString", + "token", + "language", + "Name", + "NCName", + "ENTITY", + "ID", + "IDREF", + "NMTOKEN", + "time" + ]} + } + }, + "Asset": { + "allOf": [ + { "$ref": "#/definitions/Identifiable" }, + { "$ref": "#/definitions/HasDataSpecification" }, + { "properties": { + "kind": { + "$ref": "#/definitions/AssetKind" + }, + "assetIdentificationModel": { + "$ref": "#/definitions/Reference" + }, + "billOfMaterial": { + "$ref": "#/definitions/Reference" + } + }, + "required": [ "kind" ] + } + ] + }, + "AssetKind": { + "type": "string", + "enum": ["Type", "Instance"] + }, + "ModelingKind": { + "type": "string", + "enum": ["Template", "Instance"] + }, + "Submodel": { + "allOf": [ + { "$ref": "#/definitions/Identifiable" }, + { "$ref": "#/definitions/HasDataSpecification" }, + { "$ref": "#/definitions/Qualifiable" }, + { "$ref": "#/definitions/HasSemantics" }, + { "properties": { + "kind": { + "$ref": "#/definitions/ModelingKind" + }, + "submodelElements": { + "type": "array", + "items": { + "$ref": "#/definitions/SubmodelElement" + } + } + } + } + ] + }, + "Constraint": { + "type": "object", + "properties": { + "modelType": { + "$ref": "#/definitions/ModelType" + } + }, + "required": [ "modelType" ] + }, + "Operation": { + "allOf": [ + { "$ref": "#/definitions/SubmodelElement" }, + { "properties": { + "inputVariable": { + "type": "array", + "items": { + "$ref": "#/definitions/OperationVariable" + } + }, + "outputVariable": { + "type": "array", + "items": { + "$ref": "#/definitions/OperationVariable" + } + }, + "inoutputVariable": { + "type": "array", + "items": { + "$ref": "#/definitions/OperationVariable" + } + } + } + } + ] + }, + "OperationVariable": { + "type": "object", + "properties": { + "value": { + "oneOf": [ + { "$ref": "#/definitions/Blob" }, + { "$ref": "#/definitions/File" }, + { "$ref": "#/definitions/Capability" }, + { "$ref": "#/definitions/Entity" }, + { "$ref": "#/definitions/Event" }, + { "$ref": "#/definitions/BasicEvent" }, + { "$ref": "#/definitions/MultiLanguageProperty" }, + { "$ref": "#/definitions/Operation" }, + { "$ref": "#/definitions/Property" }, + { "$ref": "#/definitions/Range" }, + { "$ref": "#/definitions/ReferenceElement" }, + { "$ref": "#/definitions/RelationshipElement" }, + { "$ref": "#/definitions/SubmodelElementCollection" } + ] + } + }, + "required": [ "value" ] + }, + "SubmodelElement": { + "allOf": [ + { "$ref": "#/definitions/Referable" }, + { "$ref": "#/definitions/HasDataSpecification" }, + { "$ref": "#/definitions/HasSemantics" }, + { "$ref": "#/definitions/Qualifiable" }, + { "properties": { + "kind": { + "$ref": "#/definitions/ModelingKind" + } + } + } + ] + }, + "Event": { + "allOf": [ + { "$ref": "#/definitions/SubmodelElement" } + ] + }, + "BasicEvent": { + "allOf": [ + { "$ref": "#/definitions/Event" }, + { "properties": { + "observed": { + "$ref": "#/definitions/Reference" + } + }, + "required": [ "observed" ] + } + ] + }, + "EntityType": { + "type": "string", + "enum": ["CoManagedEntity", "SelfManagedEntity"] + }, + "Entity": { + "allOf": [ + { "$ref": "#/definitions/SubmodelElement" }, + { "properties": { + "statements": { + "type": "array", + "items": { + "$ref": "#/definitions/SubmodelElement" + } + }, + "entityType": { + "$ref": "#/definitions/EntityType" + }, + "asset": { + "$ref": "#/definitions/Reference" + } + }, + "required": [ "entityType" ] + } + ] + }, + "View": { + "allOf": [ + { "$ref": "#/definitions/Referable" }, + { "$ref": "#/definitions/HasDataSpecification" }, + { "$ref": "#/definitions/HasSemantics" }, + { "properties": { + "containedElements": { + "type": "array", + "items": { + "$ref": "#/definitions/Reference" + } + } + } + } + ] + }, + "ConceptDictionary": { + "allOf": [ + { "$ref": "#/definitions/Referable" }, + { "$ref": "#/definitions/HasDataSpecification" }, + { "properties": { + "conceptDescriptions": { + "type": "array", + "items": { + "$ref": "#/definitions/Reference" + } + } + } + } + ] + }, + "ConceptDescription": { + "allOf": [ + { "$ref": "#/definitions/Identifiable" }, + { "$ref": "#/definitions/HasDataSpecification" }, + { "properties": { + "isCaseOf": { + "type": "array", + "items": { + "$ref": "#/definitions/Reference" + } + } + } + } + ] + }, + "Capability": { + "allOf": [ + { "$ref": "#/definitions/SubmodelElement" } + ] + }, + "Property": { + "allOf": [ + { "$ref": "#/definitions/SubmodelElement" }, + { "$ref": "#/definitions/ValueObject" } + ] + }, + "Range": { + "allOf": [ + { "$ref": "#/definitions/SubmodelElement" }, + { "properties": { + "valueType": { + "type": "string", + "enum": [ + "anyUri", + "base64Binary", + "boolean", + "date", + "dateTime", + "dateTimeStamp", + "decimal", + "integer", + "long", + "int", + "short", + "byte", + "nonNegativeInteger", + "positiveInteger", + "unsignedLong", + "unsignedInt", + "unsignedShort", + "unsignedByte", + "nonPositiveInteger", + "negativeInteger", + "double", + "duration", + "dayTimeDuration", + "yearMonthDuration", + "float", + "gDay", + "gMonth", + "gMonthDay", + "gYear", + "gYearMonth", + "hexBinary", + "NOTATION", + "QName", + "string", + "normalizedString", + "token", + "language", + "Name", + "NCName", + "ENTITY", + "ID", + "IDREF", + "NMTOKEN", + "time" + ] + }, + "min": { "type": "string" }, + "max": { "type": "string" } + }, + "required": [ "valueType"] + } + ] + }, + "MultiLanguageProperty": { + "allOf": [ + { "$ref": "#/definitions/SubmodelElement" }, + { "properties": { + "value": { + "type": "array", + "items": { + "$ref": "#/definitions/LangString" + } + }, + "valueId": { + "$ref": "#/definitions/Reference" + } + } + } + ] + }, + "File": { + "allOf": [ + { "$ref": "#/definitions/SubmodelElement" }, + { "properties": { + "value": { + "type": "string" + }, + "mimeType": { + "type": "string" + } + }, + "required": [ "mimeType" ] + } + ] + }, + "Blob": { + "allOf": [ + { "$ref": "#/definitions/SubmodelElement" }, + { "properties": { + "value": { + "type": "string" + }, + "mimeType": { + "type": "string" + } + }, + "required": [ "mimeType" ] + } + ] + }, + "ReferenceElement": { + "allOf": [ + { "$ref": "#/definitions/SubmodelElement" }, + { "properties": { + "value": { + "$ref": "#/definitions/Reference" + } + } + } + ] + }, + "SubmodelElementCollection": { + "allOf": [ + { "$ref": "#/definitions/SubmodelElement" }, + { "properties": { + "value": { + "type": "array", + "items": { + "oneOf": [ + { "$ref": "#/definitions/Blob" }, + { "$ref": "#/definitions/File" }, + { "$ref": "#/definitions/Capability" }, + { "$ref": "#/definitions/Entity" }, + { "$ref": "#/definitions/Event" }, + { "$ref": "#/definitions/BasicEvent" }, + { "$ref": "#/definitions/MultiLanguageProperty" }, + { "$ref": "#/definitions/Operation" }, + { "$ref": "#/definitions/Property" }, + { "$ref": "#/definitions/Range" }, + { "$ref": "#/definitions/ReferenceElement" }, + { "$ref": "#/definitions/RelationshipElement" }, + { "$ref": "#/definitions/SubmodelElementCollection" } + ] + } + }, + "allowDuplicates": { + "type": "boolean" + }, + "ordered": { + "type": "boolean" + } + } + } + ] + }, + "RelationshipElement": { + "allOf": [ + { "$ref": "#/definitions/SubmodelElement" }, + { "properties": { + "first": { + "$ref": "#/definitions/Reference" + }, + "second": { + "$ref": "#/definitions/Reference" + } + }, + "required": [ "first", "second" ] + } + ] + }, + "AnnotatedRelationshipElement": { + "allOf": [ + { "$ref": "#/definitions/RelationshipElement" }, + { "properties": { + "annotation": { + "type": "array", + "items": { + "oneOf": [ + { "$ref": "#/definitions/Blob" }, + { "$ref": "#/definitions/File" }, + { "$ref": "#/definitions/MultiLanguageProperty" }, + { "$ref": "#/definitions/Property" }, + { "$ref": "#/definitions/Range" }, + { "$ref": "#/definitions/ReferenceElement" } + ] + } + } + } + } + ] + }, + "Qualifier": { + "allOf": [ + { "$ref": "#/definitions/Constraint" }, + { "$ref": "#/definitions/HasSemantics" }, + { "$ref": "#/definitions/ValueObject" }, + { "properties": { + "type": { + "type": "string" + } + }, + "required": [ "type" ] + } + ] + }, + "Formula": { + "allOf": [ + { "$ref": "#/definitions/Constraint" }, + { "properties": { + "dependsOn": { + "type": "array", + "items": { + "$ref": "#/definitions/Reference" + } + } + } + } + ] + }, + "Security": { + "type": "object", + "properties": { + "accessControlPolicyPoints": { + "$ref": "#/definitions/AccessControlPolicyPoints" + }, + "certificate": { + "type": "array", + "items": { + "oneOf": [ + { "$ref": "#/definitions/BlobCertificate" } + ] + } + }, + "requiredCertificateExtension": { + "type": "array", + "items": { + "$ref": "#/definitions/Reference" + } + } + }, + "required": [ "accessControlPolicyPoints" ] + }, + "Certificate": { + "type": "object" + }, + "BlobCertificate": { + "allOf": [ + { "$ref": "#/definitions/Certificate" }, + { "properties": { + "blobCertificate": { + "$ref": "#/definitions/Blob" + }, + "containedExtension": { + "type": "array", + "items": { + "$ref": "#/definitions/Reference" + } + }, + "lastCertificate": { + "type": "boolean" + } + } + } + ] + }, + "AccessControlPolicyPoints": { + "type": "object", + "properties": { + "policyAdministrationPoint": { + "$ref": "#/definitions/PolicyAdministrationPoint" + }, + "policyDecisionPoint": { + "$ref": "#/definitions/PolicyDecisionPoint" + }, + "policyEnforcementPoint": { + "$ref": "#/definitions/PolicyEnforcementPoint" + }, + "policyInformationPoints": { + "$ref": "#/definitions/PolicyInformationPoints" + } + }, + "required": [ "policyAdministrationPoint", "policyDecisionPoint", "policyEnforcementPoint" ] + }, + "PolicyAdministrationPoint": { + "type": "object", + "properties": { + "localAccessControl": { + "$ref": "#/definitions/AccessControl" + }, + "externalAccessControl": { + "type": "boolean" + } + }, + "required": [ "externalAccessControl" ] + }, + "PolicyInformationPoints": { + "type": "object", + "properties": { + "internalInformationPoint": { + "type": "array", + "items": { + "$ref": "#/definitions/Reference" + } + }, + "externalInformationPoint": { + "type": "boolean" + } + }, + "required": [ "externalInformationPoint" ] + }, + "PolicyEnforcementPoint": { + "type": "object", + "properties": { + "externalPolicyEnforcementPoint": { + "type": "boolean" + } + }, + "required": [ "externalPolicyEnforcementPoint" ] + }, + "PolicyDecisionPoint": { + "type": "object", + "properties": { + "externalPolicyDecisionPoints": { + "type": "boolean" + } + }, + "required": [ "externalPolicyDecisionPoints" ] + }, + "AccessControl": { + "type": "object", + "properties": { + "selectableSubjectAttributes": { + "$ref": "#/definitions/Reference" + }, + "defaultSubjectAttributes": { + "$ref": "#/definitions/Reference" + }, + "selectablePermissions": { + "$ref": "#/definitions/Reference" + }, + "defaultPermissions": { + "$ref": "#/definitions/Reference" + }, + "selectableEnvironmentAttributes": { + "$ref": "#/definitions/Reference" + }, + "defaultEnvironmentAttributes": { + "$ref": "#/definitions/Reference" + }, + "accessPermissionRule": { + "type": "array", + "items": { + "$ref": "#/definitions/AccessPermissionRule" + } + } + } + }, + "AccessPermissionRule": { + "allOf": [ + { "$ref": "#/definitions/Referable" }, + { "$ref": "#/definitions/Qualifiable" }, + { "properties": { + "targetSubjectAttributes": { + "type": "array", + "items": { + "$ref": "#/definitions/SubjectAttributes" + }, + "minItems": 1 + }, + "permissionsPerObject": { + "type": "array", + "items": { + "$ref": "#/definitions/PermissionsPerObject" + } + } + }, + "required": [ "targetSubjectAttributes" ] + } + ] + }, + "SubjectAttributes": { + "type": "object", + "properties": { + "subjectAttributes": { + "type": "array", + "items": { + "$ref": "#/definitions/Reference" + }, + "minItems": 1 + } + } + }, + "PermissionsPerObject": { + "type": "object", + "properties": { + "object": { + "$ref": "#/definitions/Reference" + }, + "targetObjectAttributes": { + "$ref": "#/definitions/ObjectAttributes" + }, + "permission": { + "type": "array", + "items": { + "$ref": "#/definitions/Permission" + } + } + } + }, + "ObjectAttributes": { + "type": "object", + "properties": { + "objectAttribute": { + "type": "array", + "items": { + "$ref": "#/definitions/Property" + }, + "minItems": 1 + } + } + }, + "Permission": { + "type": "object", + "properties": { + "permission": { + "$ref": "#/definitions/Reference" + }, + "kindOfPermission": { + "type": "string", + "enum": ["Allow", "Deny", "NotApplicable", "Undefined"] + } + }, + "required": [ "permission", "kindOfPermission" ] + } + } +} diff --git a/src/AasxOpenidClient/AasxOpenidClient.csproj b/src/AasxOpenidClient/AasxOpenidClient.csproj new file mode 100644 index 000000000..9a1817fd1 --- /dev/null +++ b/src/AasxOpenidClient/AasxOpenidClient.csproj @@ -0,0 +1,35 @@ + + + net6.0-windows + Library + false + true + true + false + + + + Always + + + Always + + + Always + + + Always + + + + + + + + + + + + + + diff --git a/src/AasxOpenidClient/Andreas_Orzelski_Chain.pfx b/src/AasxOpenidClient/Andreas_Orzelski_Chain.pfx new file mode 100644 index 0000000000000000000000000000000000000000..390288b42b0c5ca15f275670d2bacb4d8680cf89 GIT binary patch literal 4362 zcmY+IWl$81x5k%c=@MxPiA7+k1?difC6$tr5NVJu>0P>6>5?U+rTe9&LFw*BI)o(z zuK$^P?|biuGv_?dnK>Vy`OSeMNU?z!m{7!%F>E|Y7%U7;gn@&BLOkgLA)d7TwVR;` z0^xsG*eC=6`(FzT!~pzl^#5)!pmf;y|9ycF0~<;V!o8x>o6?EP{|E%)0)i0ur#FRH zMn8MR?07FM_aU|HpZrWa_3I?$8Q^a1nnWa9b?LXqjtTh;FJy%Wt*q&C{HK@hD*(%M zSdzk%-aTp}f>GHYkI#UeJXUn8?$V^I3)ua16;F+X1y??mv-r8$7<|wZVxHjGb(2UX z6?+!T;G(Mp?lv;q3=>(HwIiv*_v^%u`?(EWJHjI~22;|EaA{G|GkuEx)|#k)qbThHgB^J=MO`n%~@?K%5j4n`4Y2(wq-oz*7H zF=qXwp=g=`Q6fE8q3SIm$PqF8QQfI%Tyur;JBLhM-eKp72`g!AAK_02XH#ik%H+;# zyR-KZ;tw(60p$+H!gVagNS-AhNINhjorhPfpg36P6$y(*V2luM$>es2X=NlXj@+w; zsbP(TBq;E{Z(1Z%B!E1g%#oq6L>ap;OnPZ~*!)%rHLzBUVZ}u`On$F$&8Yi!Le);o zsqxsFkmUN_JRYk%mN-g~%3$}du_?;m|K^N#i_)VZV82&if zp^i4ni1)I1cdJH+p(On5aTywKv2Y8Uwoe3FT@A_!Aa$rQaXky3LFN7fbgLVL^ntziEKuAR@n0t=A8Ywy3>mMTTpbGl+$cLyYmDx4CA_k)MrpQW+76%QQ4(n%^@0CEheD z4m?K>FZh7teD=1?m`8VUKUOdj<51tKq$hfwhOLpvAaJ*5K7UFKRY#Qm60b)lkkv!S zn0>jX0!Zf(CzzD9ZX&DWnCq6mulQ#APe+KPg&NT~%|(=p*2WiZv!-X!yn)Obc`)p8 ziei)g^@cW8cTqObB;xANepu4f2}a5SF>IpDrItLYz92h|u>B&B@s~@3K)8E@bs(c1 zXP-cK3|#s&i{HP0FoS&oE=HOY7Ww%!LJuuP`8#j#_DkHV(MuH@R_s3{Y0Ld)*+t)M zHxGvY2m~TCdnK#k3JG7|*Jo7S@VSc>=X?8RcL(Y>59p=OjgdjVtgK_M8;f-RFbqbe zjb5*+8(DTJX0$vN8eY1tW8^X9NGB`j6e9MWNz-kT;|yztlvSJrZZ&-HjtpxSVbpyb z)zuaa54HWLWc1c|5j{dnHGH&iNKQGE)Gw*Si+CleBR@hQGF2OalDGZ`=GwV3lk-BJ z9W{=7m@KCObNlv8+SQp*uBq$vs7FZ0tkT&joo`D}f0V8X0acP;5j744DZjT@)jW9P zbwWt=f>}2uUwMsGA%eFE-qY3;`}$|DPrJ0t+j{~vO~ZvPGZ2}j$CtmUG=L_Ie~UMeinWC@?A(E+=7&V`v$DH`y5DJkGi=0*(_7W$ z_3@IPfyv3f+uJm9)kr-f@>s4AZwt9ny&#_tZ5dibV{c?$jx(%7#Z%)q@J;S9Pr^G$ z2~17>2{tf&DCu1W!%y$5E3f)vuda?=eJn-B@skmkoeKU~-LSC=lqQ?80*SzG7h69E zXGqDp!U_^qNNCQGWxK|Bg$@|kf&?g1`sQ$+gwz5qg=68agI|%x?}Nu&93i>`!Tr`T z+BrU~wMeD+T%-v6Y z2bOjM#N>8!wKH;#X^wQCIsEulr;^#yP~>nq0Qf2DZ+yeEvLyeqFL9|}#75z9u%Vjj zc4FQnc?{oKWnQAJcjY|W{Y-d8X*%C1+*C_KhsT2EWJFVtRO~_qI!VFL4rAah)BF&m z*mZ}8`zok3GHEgtKdgQ)^7^*Lo02DV00u0aAOUpi}|}VoRH1 zN=Di~y2fzp?LUaLe0zZ7@DesH3U~y1OIC4g^)kE5(Fcc-O=jxg5W`kT|1kGyRdGZ~ zz9aUyV#LE7*S})3OR}zgk2}~5Q5rxFvZRwsX=*Ad+yXuiHQM9;dI|A3N9}AU;dtT> zH7B)x2C0Dg9L|loy%Iz0IIQz>oyq87_v!6T;T7~C`>0#`oJtP#>~^Dq+|15XY8J7J zI>mCiYyRkSschQnq5HJ@9o+DyL+>AaDg*68L`-=z5BEp$DqO06d~eo?H)iV-=zCi~ zd*V?`&=6g}y0g3_nknx=hO3vT-Ex!rWVV$6HzRc)(pcZg?j}?jf^)6e1jjP7SOK<& z(W3g?mzwI!sKHMb1npkM5mcMLjPm!C`#ZXC4g?iFpNY!yv1Q!%b0l(`3FDAHW0ZLLZ{6J(P$D>9nX-6ojYir47=TqLQqW;G{LxaR_@ykqG6z-r-d&c`vP zFZ1d-AGUb^yOTG_`!jKu()$X+>Lw92y5mUBt;WMX;WVB zCH=g(d?@WAx4?jEDA42{_3JSgK|fPUo_bH5;ydsdc%zR4Z0W^2`!wF`=W z=!n{^?m)eKSf7fco;3CmNTEYOLy9pLY(M?(p=3+dK4)R<16l+h$XMKB7{w68a)zMz zK4sSq^oD>c5z5DzKYrIP&-xIOGJ*sKp;-bpj1rwL;J)w1MUP@3YiX--+I@REm}}WX zOiQ~YeNTkLj1*og4~TFa694Eq7;vLby?`8#`2S(a6N%24$(o<1^4(qot<6q<_E?pn zwODp8ah3L#sgk!PykyGT6B_zts<%OSm02U7o43glYW8O^eCM^y&q$**daeLqU5+)W zhI&o3{elb9_6BcGHiosBdsnbmb9=i1>;323M%rD9^Ar_Ek%L$1bmFK^03cpZHPxwb zf7XGw&I|3YYP)r^lJRQjVo~tmJ=b{ka7V~vboyzI=?dS+62txkCb&b)^Tb-LjNTpn z=@xRTQ`EtOuK<_^vrxV=C|Rl@QYWIA-T=DXAC?1|FWz2&*vBgW)2c?qr|Hv3_~j#p z%d$JWnjiehkM@h)>K5SV6D&QQ@I&N?YQ7CwF5aWs{CeA_nWcX&lN1zz<@0|48HK>I z2O+Sm|Jon^mMJ#D|KKt{1`ve+9YYbI{r^YNnE#>Z;D)n^Ol0EQ|4=jt0U8L(720p| zJkGDQ(x?1V!Duj7w70DrewU04)ejfEUz=lgH|ro1#<5?LcxMqvX0&7_6IswiJZdxF zmoYI)UZBeh?S_xxsrSW77~Ry-_(+^#JH6*JzuCKR|7W*8?7`@8M~W>VYKQ`p_527< zR-Ehr383ZtKF687B~KMYlD#y0wH5NRLbH!oI(uZwOu3B}!4R(HwZ_F2Gm#ALO`j{; z^a9L+y*oQp((RNxIHyN56uwJWX2TnUT^9;U!zXp{GIIPhtJa3$`(st2^XL7u!(ATfu0#T<*;k?8%x@l~C`ag6D^)t#6atuZy5S(iPgQ8a^ z+Mn`_!AodNvdZm1T6d?aTT}tHmklw?zEohXtX<1b0Q$l!lU%VSBYL&-?rNU;)`aeH z^Em>Yw0{(+e$fr_egOjqiBj;Wd75q2Elyj+K&OsXbNmQIwagfv3I6W-F7d|jj_fgE z!zcV!@NC$!@bhz>JGCPFQ~tX`de_#VfveUaWuBSpMa&;(K5;oEY{DzO)BoIFFPANk zLyg}_q#s4k&G67^757Fyc)VWPA;-@v0P@^f=+{O4AOH=cd$|O1WH4lCL5}5eV83+y z%<~8PeBjM!k)t6_{y&o$H#BK9-m?ugN$lHqsRXaXC)i2I?6T?{;ILYedxlGfCkv8u z;gEpyvPGd65GJ8M(4lx`r4?{)mo*z!Y5ws{d-u{T!_QMMf|r!1eN5-ItZZdNC;~45 z`Ct;uZM>Mw4Jw}I%blky%4DDE!sQ>&^67r_G9%R1bE#9LDVwrWd8y_^zDm@HFR``t z7Ced9bKC?ZtTopu3b-8^sK?A~LCUqE4KUnWEsQ;`CzyA4)PfE5zwgQNWRJy7Xv|u} z%vVk7a2muC6vkZ;G$?-$&4rtvk>D~i$K@4XR$)!)s3yTDlw%ex!)Tcp+EcC2~hrV3LY-6FjeRmWN+h3cynpBj+-@gk)y zV7K{2%CZa*%Tjh3tSGCrPlonMZX{NmMQzQj+?l} zYv!eeD(lE&Ve+oh@G_37$ITioJ`*U*|E41z1s^4dTwONuo0aB-OfgBcW-n+JTd-g) z7W(h^0gs#y!oUtt1_%J407if;z!6{pa0OTb-UHnJ>eqi~pTElCud)Z&Lb;(#P&{lb rPGU^pGb{jzTuKN6RpPx^IbWDDYFaJC4jH~71L1BAofh^I&r|&uZ$~P& literal 0 HcmV?d00001 diff --git a/src/AasxOpenidClient/ConsoleExtensions.cs b/src/AasxOpenidClient/ConsoleExtensions.cs new file mode 100644 index 000000000..568c2b6a6 --- /dev/null +++ b/src/AasxOpenidClient/ConsoleExtensions.cs @@ -0,0 +1,59 @@ +/* +Copyright (c) 2020 see https://github.com/IdentityServer/IdentityServer4 + +We adapted the code marginally and removed the parts that we do not use. +*/ + +using System; +using System.Diagnostics; + +// ReSharper disable All .. as this is code from others (adapted from IdentityServer4). + +namespace AasxOpenIdClient +{ + public static class ConsoleExtensions + { + /// + /// Writes green text to the console. + /// + /// The text. + [DebuggerStepThrough] + public static void ConsoleGreen(this string text) + { + text.ColoredWriteLine(ConsoleColor.Green); + } + + /// + /// Writes red text to the console. + /// + /// The text. + [DebuggerStepThrough] + public static void ConsoleRed(this string text) + { + text.ColoredWriteLine(ConsoleColor.Red); + } + + /// + /// Writes yellow text to the console. + /// + /// The text. + [DebuggerStepThrough] + public static void ConsoleYellow(this string text) + { + text.ColoredWriteLine(ConsoleColor.Yellow); + } + + /// + /// Writes out text with the specified ConsoleColor. + /// + /// The text. + /// The color. + [DebuggerStepThrough] + public static void ColoredWriteLine(this string text, ConsoleColor color) + { + Console.ForegroundColor = color; + Console.WriteLine(text); + Console.ResetColor(); + } + } +} diff --git a/src/AasxOpenidClient/Constants.cs b/src/AasxOpenidClient/Constants.cs new file mode 100644 index 000000000..677110848 --- /dev/null +++ b/src/AasxOpenidClient/Constants.cs @@ -0,0 +1,19 @@ +/* +Copyright (c) 2020 see https://github.com/IdentityServer/IdentityServer4 + +We adapted the code marginally and removed the parts that we do not use. +*/ + +// ReSharper disable All .. as this is code from others (adapted from IdentityServer4). + +namespace AasxOpenIdClient +{ + public class Constants + { + public const string Authority = "https://localhost:5001"; + public const string AuthorityMtls = "https://identityserver.local"; + + public const string SampleApi = "https://localhost:5005/"; + public const string SampleApiMtls = "https://api.identityserver.local/"; + } +} diff --git a/src/AasxOpenidClient/LICENSE.txt b/src/AasxOpenidClient/LICENSE.txt new file mode 100644 index 000000000..01f9cb5eb --- /dev/null +++ b/src/AasxOpenidClient/LICENSE.txt @@ -0,0 +1,1475 @@ +Copyright (c) 2018-2023 Festo SE & Co. KG +, +author: Michael Hoffmeister + +Copyright (c) 2019-2021 PHOENIX CONTACT GmbH & Co. KG +, +author: Andreas Orzelski + +Copyright (c) 2019-2020 Fraunhofer IOSB-INA Lemgo, + eine rechtlich nicht selbstaendige Einrichtung der Fraunhofer-Gesellschaft + zur Foerderung der angewandten Forschung e.V. + +Copyright (c) 2020 Schneider Electric Automation GmbH +, +author: Marco Mendes + +Copyright (c) 2020 SICK AG + +Copyright (c) 2021 KEB Automation KG + +Copyright (c) 2021 Lenze SE +author: Jonas Grote, Denis Göllner, Sebastian Bischof + +The AASX Package Explorer is licensed under the Apache License 2.0 +(Apache-2.0, see below). + +The AASX Package Explorer is a sample application for demonstration of the +features of the Asset Administration Shell. +The implementation uses the concepts of the document "Details of the Asset +Administration Shell" published on www.plattform-i40.de which is licensed +under Creative Commons CC BY-ND 3.0 DE. + +When using eCl@ss or IEC CDD data, please check the corresponding license +conditions. + +------------------------------------------------------------------------------- + +The components below are used in AASX Package Explorer. +The related licenses are listed for information purposes only. +Some licenses may only apply to their related plugins. + +The browser functionality is licensed under the cefSharp license (see below). + +The Newtonsoft.JSON serialization is licensed under the MIT License +(MIT, see below). + +The QR code generation is licensed under the MIT license (MIT, see below). + +The Zxing.Net Dot Matrix Code (DMC) generation is licensed under +the Apache License 2.0 (Apache-2.0, see below). + +The Grapevine REST server framework is licensed under Apache License 2.0 +(Apache-2.0, see below). + +The AutomationML.Engine is licensed under the MIT license (MIT, see below). + +The MQTT server and client is licensed under the MIT license (MIT, see below). + +The ClosedXML Excel reader/writer is licensed under the MIT license (MIT, +see below). + +The CountryFlag WPF control is licensed under the Code Project Open License +(CPOL, see below). + +The DocumentFormat.OpenXml SDK is licensed under the MIT license (MIT, +see below). + +The ExcelNumberFormat number parser is licensed under the MIT license (MIT, +see below). + +The FastMember reflection access is licensed under Apache License 2.0 +(Apache-2.0, see below). + +The IdentityModel OpenID client is licensed under Apache License 2.0 +(Apache-2.0, see below). + +The jose-jwt object signing and encryption is licensed under the +MIT license (MIT, see below). + +The ExcelDataReader is licensed under the MIT license (MIT, see below). + +Portions copyright (c) by OPC Foundation, Inc. and licensed under the +Reciprocal Community License (RCL, see below) + +The OPC UA Example Code of OPC UA Standard is licensed under the MIT license +(MIT, see below). + +The MSAGL (Microsoft Automatic Graph Layout) is licensed under the MIT license +(MIT, see below) + +Glob (https://www.nuget.org/packages/Glob/) is licensed under the MIT license +(MIT, see below). + +The Magick.NET library is licensed under Apache License 2.0 +(Apache-2.0, see below). + +The SSharp.NET library (https://github.com/PetroProtsyk/SSharp) is licensed +under Apache License 2.0 (Apache-2.0, see below). + +------------------------------------------------------------------------------- + + +With respect to AASX Package Explorer +===================================== + +(http://www.apache.org/licenses/LICENSE-2.0) + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + +With respect to cefSharp +======================== + +(https://raw.githubusercontent.com/cefsharp/CefSharp/master/LICENSE) + +Copyright © The CefSharp Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + + * Neither the name of Google Inc. nor the name Chromium Embedded + Framework nor the name CefSharp nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +With respect to Newtonsoft.Json +=============================== + +(https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md) + +The MIT License (MIT) + +Copyright (c) 2007 James Newton-King + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +With respect to QRcoder +======================= + +(https://github.com/codebude/QRCoder/blob/master/LICENSE.txt) + +The MIT License (MIT) + +Copyright (c) 2013-2018 Raffael Herrmann + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +With respect to ZXing.Net +========================= +With respect to Grapevine +========================= +With respect to FastMember +========================== +With respect to IdentityModel +============================= + +(http://www.apache.org/licenses/LICENSE-2.0) + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + +With respect to AutomationML.Engine +=================================== + +(https://raw.githubusercontent.com/AutomationML/AMLEngine2.1/master/license.txt) + +The MIT License (MIT) + +Copyright 2017 AutomationML e.V. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + + +With respect to MQTTnet +======================= + +(https://github.com/chkr1011/MQTTnet/blob/master/LICENSE) + +MIT License + +MQTTnet Copyright (c) 2016-2019 Christian Kratky + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +With resepct to ClosedXML +========================= + +(https://github.com/ClosedXML/ClosedXML/blob/develop/LICENSE) + +MIT License + +Copyright (c) 2016 ClosedXML + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +With resepct to CountryFlag +=========================== + +(https://www.codeproject.com/Articles/190722/WPF-CountryFlag-Control) + +The Code Project Open License (CPOL) 1.02 + +Copyright © 2017 Meshack Musundi + +Preamble + +This License governs Your use of the Work. This License is intended to allow +developers to use the Source Code and Executable Files provided as part of +the Work in any application in any form. + +The main points subject to the terms of the License are: + + Source Code and Executable Files can be used in commercial applications; + Source Code and Executable Files can be redistributed; and + Source Code can be modified to create derivative works. + No claim of suitability, guarantee, or any warranty whatsoever is provided. + The software is provided "as-is". + The Article(s) accompanying the Work may not be distributed or republished + without the Author's consent + +This License is entered between You, the individual or other entity reading or +otherwise making use of the Work licensed pursuant to this License and the +individual or other entity which offers the Work under the terms of this +License ("Author"). + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS +CODE PROJECT OPEN LICENSE ("LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT +AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED +UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HEREIN, YOU ACCEPT AND AGREE +TO BE BOUND BY THE TERMS OF THIS LICENSE. THE AUTHOR GRANTS YOU THE RIGHTS +CONTAINED HEREIN IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND +CONDITIONS. IF YOU DO NOT AGREE TO ACCEPT AND BE BOUND BY THE TERMS OF THIS +LICENSE, YOU CANNOT MAKE ANY USE OF THE WORK. + +Definitions. + "Articles" means, collectively, all articles written by Author which +describes how the Source Code and Executable Files for the Work may +be used by a user. + "Author" means the individual or entity that offers the Work under +the terms of this License. + "Derivative Work" means a work based upon the Work or upon the Work +and other pre-existing works. + "Executable Files" refer to the executables, binary files, +configuration and any required data files included in the Work. + "Publisher" means the provider of the website, magazine, CD-ROM, +DVD or other medium from or by which the Work is obtained by You. + "Source Code" refers to the collection of source code and +configuration files used to create the Executable Files. + "Standard Version" refers to such a Work if it has not been modified, +or has been modified in accordance with the consent of the Author, +such consent being in the full discretion of the Author. + "Work" refers to the collection of files distributed by the Publisher, +including the Source Code, Executable Files, binaries, data files, +documentation, whitepapers and the Articles. + "You" is you, an individual or entity wishing to use the Work and +exercise your rights under this License. + +Fair Use/Fair Use Rights. Nothing in this License is intended to reduce, +limit, or restrict any rights arising from fair use, fair dealing, +first sale or other limitations on the exclusive rights of the +copyright owner under copyright law or other applicable laws. + +License Grant. Subject to the terms and conditions of this License, the +Author hereby grants You a worldwide, royalty-free, non-exclusive, +perpetual (for the duration of the applicable copyright) license +to exercise the rights in the Work as stated below: + You may use the standard version of the Source Code or Executable +Files in Your own applications. + You may apply bug fixes, portability fixes and other modifications +obtained from the Public Domain or from the Author. A Work modified +in such a way shall still be considered the standard version and will +be subject to this License. + You may otherwise modify Your copy of this Work (excluding the Articles) +in any way to create a Derivative Work, provided that You insert a prominent +notice in each changed file stating how, when and where You changed that file. + You may distribute the standard version of the Executable Files and Source +Code or Derivative Work in aggregate with other (possibly commercial) +programs as part of a larger (possibly commercial) software distribution. + The Articles discussing the Work published in any form by the author may +not be distributed or republished without the Author's consent. The author +retains copyright to any such Articles. You may use the Executable Files and +Source Code pursuant to this License but you may not repost or republish or +otherwise distribute or make available the Articles, without the prior written +consent of the Author. + +Any subroutines or modules supplied by You and linked into the Source Code +or Executable Files of this Work shall not be considered part of this Work +and will not be subject to the terms of this License. + +Patent License. Subject to the terms and conditions of this License, each +Author hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, +royalty-free, irrevocable (except as stated in this section) patent license +to make, have made, use, import, and otherwise transfer the Work. + +Restrictions. The license granted in Section 3 above is expressly made subject +to and limited by the following restrictions: + You agree not to remove any of the original copyright, patent, trademark, +and attribution notices and associated disclaimers that may appear in the +Source Code or Executable Files. + You agree not to advertise or in any way imply that this Work is a product +of Your own. + The name of the Author may not be used to endorse or promote products +derived from the Work without the prior written consent of the Author. + You agree not to sell, lease, or rent any part of the Work. This does +not restrict you from including the Work or any part of the Work inside +a larger software distribution that itself is being sold. The Work by itself, +though, cannot be sold, leased or rented. + You may distribute the Executable Files and Source Code only under the terms +of this License, and You must include a copy of, or the Uniform Resource +Identifier for, this License with every copy of the Executable Files or +Source Code You distribute and ensure that anyone receiving such Executable +Files and Source Code agrees that the terms of this License apply to such +Executable Files and/or Source Code. You may not offer or impose any terms +on the Work that alter or restrict the terms of this License or the +recipients' exercise of the rights granted hereunder. You may not sublicense +the Work. You must keep intact all notices that refer to this License and to +the disclaimer of warranties. You may not distribute the Executable Files or +Source Code with any technological measures that control access or use of the +Work in a manner inconsistent with the terms of this License. + You agree not to use the Work for illegal, immoral or improper +purposes, or on pages containing illegal, immoral or improper material. +The Work is subject to applicable export laws. You agree to comply with all +such laws and regulations that may apply to the Work after Your receipt of +the Work. + +Representations, Warranties and Disclaimer. THIS WORK IS PROVIDED "AS IS", +"WHERE IS" AND "AS AVAILABLE", WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES OR +CONDITIONS OR GUARANTEES. YOU, THE USER, ASSUME ALL RISK IN ITS USE, +INCLUDING COPYRIGHT INFRINGEMENT, PATENT INFRINGEMENT, SUITABILITY, ETC. +AUTHOR EXPRESSLY DISCLAIMS ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES +OR CONDITIONS, INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS +OF MERCHANTABILITY, MERCHANTABLE QUALITY OR FITNESS FOR A PARTICULAR +PURPOSE, OR ANY WARRANTY OF TITLE OR NON-INFRINGEMENT, OR THAT THE WORK +(OR ANY PORTION THEREOF) IS CORRECT, USEFUL, BUG-FREE OR FREE OF VIRUSES. +YOU MUST PASS THIS DISCLAIMER ON WHENEVER YOU DISTRIBUTE THE WORK OR DERIVATIVE +WORKS. + +Indemnity. You agree to defend, indemnify and hold harmless the Author and the +Publisher from and against any claims, suits, losses, damages, liabilities, +costs, and expenses (including reasonable legal or attorneys’ fees) +resulting from or relating to any use of the Work by You. + +Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, +IN NO EVENT WILL THE AUTHOR OR THE PUBLISHER BE LIABLE TO YOU ON ANY LEGAL +THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY +DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK OR OTHERWISE, +EVEN IF THE AUTHOR OR THE PUBLISHER HAS BEEN ADVISED OF THE POSSIBILITY +OF SUCH DAMAGES. + +Termination. + This License and the rights granted hereunder will terminate +automatically upon any breach by You of any term of this License. +Individuals or entities who have received Derivative Works from You under +this License, however, will not have their licenses terminated provided such +individuals or entities remain in full compliance with those licenses. +Sections 1, 2, 6, 7, 8, 9, 10 and 11 will survive any termination of +this License. + If You bring a copyright, trademark, patent or any other infringement +claim against any contributor over infringements You claim are made by the +Work, your License from such contributor to the Work ends automatically. + Subject to the above terms and conditions, this License is perpetual +(for the duration of the applicable copyright in the Work). +Notwithstanding the above, the Author reserves the right to release the Work +under different license terms or to stop distributing the Work at any time; +provided, however that any such election will not serve to withdraw this +License (or any other license that has been, or is required to be, +granted under the terms of this License), and this License will continue +in full force and effect unless terminated as stated above. + +Publisher. The parties hereby confirm that the Publisher shall not, under +any circumstances, be responsible for and shall not have any liability +in respect of the subject matter of this License. The Publisher makes no +warranty whatsoever in connection with the Work and shall not be liable +to You or any party on any legal theory for any damages whatsoever, including +without limitation any general, special, incidental or consequential damages +arising in connection to this license. The Publisher reserves the right to +cease making the Work available to You at any time without notice + +Miscellaneous + This License shall be governed by the laws of the location of the head +office of the Author or if the Author is an individual, the laws of +location of the principal place of residence of the Author. + If any provision of this License is invalid or unenforceable under +applicable law, it shall not affect the validity or enforceability of the +remainder of the terms of this License, and without further action by the +parties to this License, such provision shall be reformed to the minimum +extent necessary to make such provision valid and enforceable. + No term or provision of this License shall be deemed waived and no +breach consented to unless such waiver or consent shall be in writing +and signed by the party to be charged with such waiver or consent. + This License constitutes the entire agreement between the parties +with respect to the Work licensed herein. There are no understandings, +agreements or representations with respect to the Work not specified herein. +The Author shall not be bound by any additional provisions that may appear +in any communication from You. This License may not be modified without +the mutual written agreement of the Author and You. + + +With respect to DocumentFormat.OpenXml +====================================== + +(https://github.com/OfficeDev/Open-XML-SDK/blob/master/LICENSE) + +The MIT License (MIT) + +Copyright (c) Microsoft Corporation + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +With respect to ExcelNumberFormat +================================= + +(https://github.com/andersnm/ExcelNumberFormat/blob/master/LICENSE) + +The MIT License (MIT) + +Copyright (c) 2017 andersnm + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +With respect to jose-jwt +======================== + +(https://github.com/dvsekhvalnov/jose-jwt/blob/master/LICENSE) + +The MIT License (MIT) + +Copyright (c) 2014-2019 dvsekhvalnov + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +With resepect to ExcelDataReader +================================ + +(https://github.com/ExcelDataReader/ExcelDataReader/blob/develop/LICENSE) + +The MIT License (MIT) + +Copyright (c) 2014 ExcelDataReader + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +With resepect to OPC UA Example Code +==================================== + + * Copyright (c) 2005-2019 The OPC Foundation, Inc. All rights reserved. + * + * OPC Foundation MIT License 1.00 + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * The complete license agreement can be found here: + * http://opcfoundation.org/License/MIT/1.00/ + + +With respect to OPC Foundation +============================== + +RCL License +Reciprocal Community License 1.00 (RCL1.00) +Version 1.00, June 24, 2009 +Copyright (C) 2008,2009 OPC Foundation, Inc., All Rights Reserved. + +https://opcfoundation.org/license/rcl.html + +Remark: PHOENIX CONTACT GmbH & Co. KG and Festo SE & Co. KG are members +of OPC foundation. + +With respect to MSAGL (Microsoft Automatic Graph Layout) +======================================================== +(see: https://github.com/microsoft/automatic-graph-layout/blob/master/LICENSE) + +Microsoft Automatic Graph Layout, MSAGL + +Copyright (c) Microsoft Corporation + +All rights reserved. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +""Software""), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +With respect to Glob (https://www.nuget.org/packages/Glob/) +=========================================================== +(see: https://raw.githubusercontent.com/kthompson/glob/master/LICENSE) + +The MIT License (MIT) + +Copyright (c) 2013-2019 Kevin Thompson + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +With respect to Magick.NET +========================== + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. + +With respect to SSharp.NET library +================================== + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/src/AasxOpenidClient/OpenIDCLient.cs b/src/AasxOpenidClient/OpenIDCLient.cs new file mode 100644 index 000000000..94e24bea4 --- /dev/null +++ b/src/AasxOpenidClient/OpenIDCLient.cs @@ -0,0 +1,522 @@ +using IdentityModel; +using IdentityModel.Client; +using Jose; +using Microsoft.IdentityModel.Tokens; +using Newtonsoft.Json.Linq; +using SSIExtension; +using System; +using System.Collections.Generic; +using System.IdentityModel.Tokens.Jwt; +using System.IO; +using System.Net; +using System.Net.Http; +using System.Security.Claims; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +/* +Copyright (c) 2020 see https://github.com/IdentityServer/IdentityServer4 + +We adapted the code marginally and removed the parts that we do not use. +*/ + +// ReSharper disable All .. as this is code from others (adapted from IdentityServer4). + +namespace AasxOpenIdClient +{ + public class OpenIDClient + { + static public bool AcceptAllCertifications( + object sender, System.Security.Cryptography.X509Certificates.X509Certificate certification, + System.Security.Cryptography.X509Certificates.X509Chain chain, + System.Net.Security.SslPolicyErrors sslPolicyErrors) + { + return true; + } + + public class UiLambdaSet + { + public delegate DialogResult ShowMessageDelegate( + string content, string text, string caption, MessageBoxButtons buttons = 0); + public ShowMessageDelegate MesssageBox; + + public static DialogResult MesssageBoxShow( + UiLambdaSet lambdaSet, + string content, string text, string caption, MessageBoxButtons buttons = 0) + { + if (lambdaSet?.MesssageBox != null) + return lambdaSet.MesssageBox(content, text, caption, buttons); + return System.Windows.Forms.MessageBox.Show(content + text, caption, buttons); + } + } + + public static string authServer = "https://localhost:50001"; + public static string dataServer = "http://localhost:51310"; + public static string certPfx = "Andreas_Orzelski_Chain.pfx"; + public static string certPfxPW = "i40"; + public static string outputDir = "."; + + public static bool auth = false; + public static string ssiURL = ""; + public static string keycloak = ""; + public static string email = ""; + public static string token = ""; + public static async Task Run(string tag, string value, UiLambdaSet uiLambda = null) + { + ServicePointManager.ServerCertificateValidationCallback = + new System.Net.Security.RemoteCertificateValidationCallback(AcceptAllCertifications); + + // Initializes the variables to pass to the MessageBox.Show method. + string caption = "Connect with " + tag + ".dat"; + string message = ""; + + bool withOpenidFile = false; + if (value != "") + { + dataServer = value; + authServer = ""; + certPfx = ""; + certPfxPW = ""; + value = ""; + } + else + { + // read openx.dat + try + { + using (StreamReader sr = new StreamReader(tag + ".dat")) + { + authServer = sr.ReadLine(); + dataServer = sr.ReadLine(); + certPfx = sr.ReadLine(); + certPfxPW = sr.ReadLine(); + outputDir = sr.ReadLine(); + } + } + catch (Exception ex) + { + AdminShellNS.LogInternally.That.Error(ex, $"The file {tag}.dat can not be read."); + return; + } + withOpenidFile = true; + } + + message = + "authServer: " + authServer + "\n" + + "dataServer: " + dataServer + "\n" + + "certPfx: " + certPfx + "\n" + + "certPfxPW: " + certPfxPW + "\n" + + "outputDir: " + outputDir + "\n" + + "\nConinue?"; + + // Displays the MessageBox. + var result = UiLambdaSet.MesssageBoxShow( + uiLambda, message, "", caption, MessageBoxButtons.YesNo); + if (result != System.Windows.Forms.DialogResult.Yes) + { + // Closes the parent form. + return; + } + + UiLambdaSet.MesssageBoxShow(uiLambda, "", "Access Aasx Server at " + dataServer, + "Data Server", MessageBoxButtons.OK); + + var handler = new HttpClientHandler(); + handler.DefaultProxyCredentials = CredentialCache.DefaultCredentials; + handler.AllowAutoRedirect = false; + var client = new HttpClient(handler) + { + BaseAddress = new Uri(dataServer) + }; + if (token != "") + client.SetBearerToken(token); + + string operation = ""; + string lastOperation = ""; + if (withOpenidFile) + { + operation = "authenticate"; + lastOperation = "/server/listaas/"; + } + else + { + operation = "/server/listaas/"; + } + + while (operation != "") + { + UiLambdaSet.MesssageBoxShow(uiLambda, "", "operation: " + operation + value + "\ntoken: " + token, + "Operation", MessageBoxButtons.OK); + + switch (operation) + { + case "/server/listaas/": + case "/server/getaasx2/": + try + { + HttpResponseMessage response2 = null; + switch (operation) + { + case "/server/listaas/": + response2 = await client.GetAsync(operation); + break; + case "/server/getaasx2/": + response2 = await client.GetAsync(operation + value); + break; + } + + if (response2.StatusCode == System.Net.HttpStatusCode.TemporaryRedirect) + { + string redirectUrl = response2.Headers.Location.ToString(); + string[] splitResult = redirectUrl.Split(new string[] { "?" }, + StringSplitOptions.RemoveEmptyEntries); + Console.WriteLine("Redirect to:" + splitResult[0]); + authServer = splitResult[0]; + UiLambdaSet.MesssageBoxShow( + uiLambda, authServer, "", "Redirect to", MessageBoxButtons.OK); + lastOperation = operation; + operation = "authenticate"; + continue; + } + if (!response2.IsSuccessStatusCode) + { + lastOperation = operation; + operation = "error"; + continue; + } + String urlContents = await response2.Content.ReadAsStringAsync(); + switch (operation) + { + case "/server/listaas/": + UiLambdaSet.MesssageBoxShow(uiLambda, + "", "SelectFromListFlyoutItem missing", "SelectFromListFlyoutItem missing", + MessageBoxButtons.OK); + value = "0"; + operation = "/server/getaasx2/"; + break; + //// return; + case "/server/getaasx2/": + try + { + var parsed3 = JObject.Parse(urlContents); + + string fileName = parsed3.SelectToken("fileName").Value(); + string fileData = parsed3.SelectToken("fileData").Value(); + + var enc = new System.Text.ASCIIEncoding(); + var fileString4 = Jose.JWT.Decode(fileData, enc.GetBytes(secretString), + JwsAlgorithm.HS256); + var parsed4 = JObject.Parse(fileString4); + + string binaryBase64_4 = parsed4.SelectToken("file").Value(); + Byte[] fileBytes4 = Convert.FromBase64String(binaryBase64_4); + + Console.WriteLine("Writing file: " + outputDir + "\\" + "download.aasx"); + File.WriteAllBytes(outputDir + "\\" + "download.aasx", fileBytes4); + } + catch (Exception ex) + { + AdminShellNS.LogInternally.That.Error(ex, $"Failed at operation: {operation}"); + lastOperation = operation; + operation = "error"; + } + operation = ""; + break; + } + } + catch (Exception ex) + { + AdminShellNS.LogInternally.That.Error(ex, $"Failed at operation: {operation}"); + lastOperation = operation; + operation = "error"; + } + break; + case "authenticate": + try + { + X509SigningCredentials x509Credential = null; + if (withOpenidFile) + { + x509Credential = new X509SigningCredentials(new X509Certificate2(certPfx, certPfxPW)); + } + + var response = await RequestTokenAsync(x509Credential, uiLambda); + token = response.AccessToken; + client.SetBearerToken(token); + + response.Show(); + UiLambdaSet.MesssageBoxShow(uiLambda, response.AccessToken, "", + "Access Token", MessageBoxButtons.OK); + + operation = lastOperation; + lastOperation = ""; + } + catch (Exception ex) + { + AdminShellNS.LogInternally.That.Error(ex, $"Failed at operation: {operation}"); + lastOperation = operation; + operation = "error"; + } + break; + case "error": + UiLambdaSet.MesssageBoxShow(uiLambda, "", $"Can not perform: {lastOperation}", + "Error", MessageBoxButtons.OK); + operation = ""; + break; + } + } + } + + public static async Task RequestTokenAsync( + SigningCredentials credential, + UiLambdaSet uiLambda = null) + { + var handler = new HttpClientHandler(); + handler.DefaultProxyCredentials = CredentialCache.DefaultCredentials; + var client = new HttpClient(handler); + + var disco = await client.GetDiscoveryDocumentAsync(authServer); + if (disco.IsError) throw new Exception(disco.Error); + + UiLambdaSet.MesssageBoxShow(uiLambda, disco.Raw, "", "Discovery JSON", MessageBoxButtons.OK); + + List rootCertSubject = new List(); + dynamic discoObject = null; + if (discoObject.rootCertSubjects != null) + { + int i = 0; + while (i < discoObject.rootCertSubjects.Length) + { + rootCertSubject.Add(discoObject.rootCertSubjects[i++]); + } + } + + var clientToken = CreateClientToken(credential, "client.jwt", + disco.TokenEndpoint, rootCertSubject, uiLambda); + + Console.ForegroundColor = ConsoleColor.Green; + Console.WriteLine("\nClientToken with x5c in header: \n"); + Console.ResetColor(); + Console.WriteLine(clientToken + "\n"); + + UiLambdaSet.MesssageBoxShow(uiLambda, clientToken, "", "Client Token", MessageBoxButtons.OK); + + var response = await client.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest + { + Address = disco.TokenEndpoint, + // Scope = "feature1", + // Scope = "scope1", + Scope = "resource1.scope1", + + ClientAssertion = + { + Type = OidcConstants.ClientAssertionTypes.JwtBearer, + Value = clientToken + } + }); + + if (response.IsError) + { + throw new Exception(response.Error); + } + + return response; + } + + public static string secretString = "Industrie4.0-Asset-Administration-Shell"; + static async Task CallServiceAsync(string token, string value) + { + var handler = new HttpClientHandler(); + handler.DefaultProxyCredentials = CredentialCache.DefaultCredentials; + var client = new HttpClient(handler) + { + BaseAddress = new Uri(dataServer) + }; + + client.SetBearerToken(token); + + try + { + var response = await client.GetStringAsync("/server/getaasx2/" + value); + + var parsed3 = JObject.Parse(response); + + string fileName = parsed3.SelectToken("fileName").Value(); + string fileData = parsed3.SelectToken("fileData").Value(); + + var enc = new System.Text.ASCIIEncoding(); + var fileString4 = Jose.JWT.Decode(fileData, enc.GetBytes(secretString), JwsAlgorithm.HS256); + var parsed4 = JObject.Parse(fileString4); + + string binaryBase64_4 = parsed4.SelectToken("file").Value(); + Byte[] fileBytes4 = Convert.FromBase64String(binaryBase64_4); + + Console.WriteLine("Writing file: " + outputDir + "\\" + "download.aasx"); + File.WriteAllBytes(outputDir + "\\" + "download.aasx", fileBytes4); + } + catch (Exception ex) + { + AdminShellNS.LogInternally.That.Error(ex, $"Can not get .AASX."); + return; + } + } + + private static string CreateClientToken(SigningCredentials credential, string clientId, string audience, + List rootCertSubject, + UiLambdaSet uiLambda = null) + { + // oz + // dead-csharp off + // string x5c = ""; + // dead-csharp on + string[] x5c = null; + string certFileName = certPfx; + string password = certPfxPW; + X509Certificate2 certificate = null; + + if (credential == null) + { + var res = UiLambdaSet.MesssageBoxShow(uiLambda, "", + "Select certificate chain from certificate store? \n" + + "(otherwise use file Andreas_Orzelski_Chain.pfx)", + "Select certificate chain", MessageBoxButtons.YesNo); + + if (res == DialogResult.No) + { + certFileName = "Andreas_Orzelski_Chain.pfx"; + password = "i40"; + credential = new X509SigningCredentials(new X509Certificate2(certFileName, password)); + } + } + + if (credential == null) + { + X509Store store = new X509Store("MY", StoreLocation.CurrentUser); + store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly); + + X509Certificate2Collection collection = (X509Certificate2Collection)store.Certificates; + X509Certificate2Collection fcollection = (X509Certificate2Collection)collection.Find( + X509FindType.FindByTimeValid, DateTime.Now, false); + + Boolean rootCertFound = false; + X509Certificate2Collection fcollection2 = new X509Certificate2Collection(); + foreach (X509Certificate2 fc in fcollection) + { + X509Chain fch = new X509Chain(); + fch.Build(fc); + foreach (X509ChainElement element in fch.ChainElements) + { + if (rootCertSubject.Contains(element.Certificate.Subject)) + { + rootCertFound = true; + fcollection2.Add(fc); + } + } + } + if (rootCertFound) + fcollection = fcollection2; + + X509Certificate2Collection scollection = X509Certificate2UI.SelectFromCollection(fcollection, + "Test Certificate Select", + "Select a certificate from the following list to get information on that certificate", + X509SelectionFlag.SingleSelection); + if (scollection.Count != 0) + { + certificate = scollection[0]; + X509Chain ch = new X509Chain(); + ch.Build(certificate); + + string[] X509Base64 = new string[ch.ChainElements.Count]; + + int j = 0; + foreach (X509ChainElement element in ch.ChainElements) + { + X509Base64[j++] = Convert.ToBase64String(element.Certificate.GetRawCertData()); + } + + x5c = X509Base64; + } + } + else + { + // use old fixed certificate chain + X509Certificate2Collection xc = new X509Certificate2Collection(); + xc.Import(certFileName, password, X509KeyStorageFlags.PersistKeySet); + + string[] X509Base64 = new string[xc.Count]; + + int j = xc.Count; + var xce = xc.GetEnumerator(); + for (int i = 0; i < xc.Count; i++) + { + xce.MoveNext(); + X509Base64[--j] = Convert.ToBase64String(xce.Current.GetRawCertData()); + } + x5c = X509Base64; + + certificate = new X509Certificate2(certFileName, password); + } + + string email = ""; + string subject = certificate.Subject; + var split = subject.Split(new Char[] { ',' }); + if (split[0] != "") + { + var split2 = split[0].Split(new Char[] { '=' }); + if (split2[0] == "E") + { + email = split2[1]; + } + } + Console.WriteLine("email: " + email); + + // + StringBuilder builder = new StringBuilder(); + builder.AppendLine("-----BEGIN CERTIFICATE-----"); + builder.AppendLine( + Convert.ToBase64String(certificate.RawData, Base64FormattingOptions.InsertLineBreaks)); + builder.AppendLine("-----END CERTIFICATE-----"); + + UiLambdaSet.MesssageBoxShow(uiLambda, builder.ToString(), "", "Client Certificate", MessageBoxButtons.OK); + + credential = new X509SigningCredentials(certificate); + // oz end + + var now = DateTime.UtcNow; + + var token = new JwtSecurityToken( + clientId, + audience, + new List() + { + new Claim(JwtClaimTypes.JwtId, Guid.NewGuid().ToString()), + new Claim(JwtClaimTypes.Subject, clientId), + new Claim(JwtClaimTypes.IssuedAt, now.ToEpochTime().ToString(), ClaimValueTypes.Integer64), + // OZ + new Claim(JwtClaimTypes.Email, email) + // new Claim("x5c", x5c) + }, + now, + now.AddMinutes(1), + credential) + ; + + token.Header.Add("x5c", x5c); + if (ssiURL != "") + { + //// Prover prover = new Prover("http://192.168.178.33:5001"); //AASX Package Explorer + Prover prover = new Prover(ssiURL); //AASX Package Explorer + + string invitation = prover.CreateInvitation(); + + token.Header.Add("ssiInvitation", invitation); + } + // oz + + var tokenHandler = new JwtSecurityTokenHandler(); + return tokenHandler.WriteToken(token); + } + } +} diff --git a/src/AasxOpenidClient/OpenIDClientInstance.cs b/src/AasxOpenidClient/OpenIDClientInstance.cs new file mode 100644 index 000000000..201222e88 --- /dev/null +++ b/src/AasxOpenidClient/OpenIDClientInstance.cs @@ -0,0 +1,609 @@ +using AnyUi; +using IdentityModel; +using IdentityModel.Client; +using Jose; +using Microsoft.IdentityModel.Tokens; +using Newtonsoft.Json.Linq; +using SSIExtension; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IdentityModel.Tokens.Jwt; +using System.IO; +using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Security.Claims; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Text.Json; +using System.Text.Json.Nodes; +using System.Threading.Tasks; + +/* +Copyright (c) 2020 see https://github.com/IdentityServer/IdentityServer4 + +We adapted the code marginally and removed the parts that we do not use. +*/ + +// ReSharper disable All .. as this is code from others (adapted from IdentityServer4). + +namespace AasxOpenIdClient +{ + /// + /// This class is the new version of the OpenIdClient, which is meant to hold the + /// credentials not globally, but for a specific context, such as the main application + /// or a specific repository. + /// + public class OpenIdClientInstance + { + static public bool AcceptAllCertifications( + object sender, System.Security.Cryptography.X509Certificates.X509Certificate certification, + System.Security.Cryptography.X509Certificates.X509Chain chain, + System.Net.Security.SslPolicyErrors sslPolicyErrors) + { + return true; + } + + public class UiLambdaSet + { + public delegate AnyUiMessageBoxResult ShowMessageDelegate( + string content, string text, string caption, AnyUiMessageBoxButton buttons = 0); + public ShowMessageDelegate MesssageBox; + + public static AnyUiMessageBoxResult MesssageBoxShow( + UiLambdaSet lambdaSet, + string content, string text, string caption, AnyUiMessageBoxButton buttons = 0) + { + if (lambdaSet?.MesssageBox != null) + return lambdaSet.MesssageBox(content, text, caption, buttons); + return AnyUiMessageBoxResult.Cancel; + } + } + + public string authServer = "https://localhost:50001"; + public string dataServer = "http://localhost:51310"; + public string certPfx = "Andreas_Orzelski_Chain.pfx"; + public string certPfxPW = "i40"; + public string outputDir = "."; + + public string token = ""; + public string ssiURL = ""; + public string keycloak = ""; + public string email = ""; + public async Task Run(string tag, string value, UiLambdaSet uiLambda = null) + { + ServicePointManager.ServerCertificateValidationCallback = + new System.Net.Security.RemoteCertificateValidationCallback(AcceptAllCertifications); + + // Initializes the variables to pass to the MessageBox.Show method. + string caption = "Connect with " + tag + ".dat"; + string message = ""; + + bool withOpenidFile = false; + if (value != "") + { + dataServer = value; + authServer = ""; + certPfx = ""; + certPfxPW = ""; + value = ""; + } + else + { + // read openx.dat + try + { + using (StreamReader sr = new StreamReader(tag + ".dat")) + { + authServer = sr.ReadLine(); + dataServer = sr.ReadLine(); + certPfx = sr.ReadLine(); + certPfxPW = sr.ReadLine(); + outputDir = sr.ReadLine(); + } + } + catch (Exception ex) + { + AdminShellNS.LogInternally.That.Error(ex, $"The file {tag}.dat can not be read."); + return; + } + withOpenidFile = true; + } + + message = + "authServer: " + authServer + "\n" + + "dataServer: " + dataServer + "\n" + + "certPfx: " + certPfx + "\n" + + "certPfxPW: " + certPfxPW + "\n" + + "outputDir: " + outputDir + "\n" + + "\nConinue?"; + + // Displays the MessageBox. + var result = UiLambdaSet.MesssageBoxShow(uiLambda, message, "", caption, AnyUiMessageBoxButton.YesNo); + if (result != AnyUiMessageBoxResult.Yes) + { + // Closes the parent form. + return; + } + + UiLambdaSet.MesssageBoxShow(uiLambda, "", "Access Aasx Server at " + dataServer, + "Data Server", AnyUiMessageBoxButton.OK); + + var handler = new HttpClientHandler(); + handler.DefaultProxyCredentials = CredentialCache.DefaultCredentials; + handler.AllowAutoRedirect = false; + var client = new HttpClient(handler) + { + BaseAddress = new Uri(dataServer) + }; + if (token != "") + client.SetBearerToken(token); + + string operation = ""; + string lastOperation = ""; + if (withOpenidFile) + { + operation = "authenticate"; + lastOperation = "/server/listaas/"; + } + else + { + operation = "/server/listaas/"; + } + + while (operation != "" && operation != "error") + { + UiLambdaSet.MesssageBoxShow(uiLambda, "", "operation: " + operation + value + "\ntoken: " + token, + "Operation", AnyUiMessageBoxButton.OK); + + switch (operation) + { + case "/server/listaas/": + case "/server/getaasx2/": + try + { + HttpResponseMessage response2 = null; + switch (operation) + { + case "/server/listaas/": + response2 = await client.GetAsync(operation); + break; + case "/server/getaasx2/": + response2 = await client.GetAsync(operation + value); + break; + } + + if (response2.StatusCode == System.Net.HttpStatusCode.TemporaryRedirect) + { + string redirectUrl = response2.Headers.Location.ToString(); + string[] splitResult = redirectUrl.Split(new string[] { "?" }, + StringSplitOptions.RemoveEmptyEntries); + Console.WriteLine("Redirect to:" + splitResult[0]); + authServer = splitResult[0]; + UiLambdaSet.MesssageBoxShow( + uiLambda, authServer, "", "Redirect to", AnyUiMessageBoxButton.OK); + lastOperation = operation; + operation = "authenticate"; + continue; + } + if (!response2.IsSuccessStatusCode) + { + lastOperation = operation; + operation = "error"; + continue; + } + String urlContents = await response2.Content.ReadAsStringAsync(); + switch (operation) + { + case "/server/listaas/": + UiLambdaSet.MesssageBoxShow(uiLambda, + "", "SelectFromListFlyoutItem missing", "SelectFromListFlyoutItem missing", + AnyUiMessageBoxButton.OK); + return; + case "/server/getaasx2/": + try + { + var parsed3 = JObject.Parse(urlContents); + + string fileName = parsed3.SelectToken("fileName").Value(); + string fileData = parsed3.SelectToken("fileData").Value(); + + var enc = new System.Text.ASCIIEncoding(); + var fileString4 = Jose.JWT.Decode(fileData, enc.GetBytes(secretString), + JwsAlgorithm.HS256); + var parsed4 = JObject.Parse(fileString4); + + string binaryBase64_4 = parsed4.SelectToken("file").Value(); + Byte[] fileBytes4 = Convert.FromBase64String(binaryBase64_4); + + Console.WriteLine("Writing file: " + outputDir + "\\" + "download.aasx"); + File.WriteAllBytes(outputDir + "\\" + "download.aasx", fileBytes4); + } + catch (Exception ex) + { + AdminShellNS.LogInternally.That.Error(ex, $"Failed at operation: {operation}"); + lastOperation = operation; + operation = "error"; + } + operation = ""; + break; + } + } + catch (Exception ex) + { + AdminShellNS.LogInternally.That.Error(ex, $"Failed at operation: {operation}"); + lastOperation = operation; + operation = "error"; + } + break; + case "authenticate": + try + { + X509SigningCredentials x509Credential = null; + if (withOpenidFile) + { + x509Credential = new X509SigningCredentials(new X509Certificate2(certPfx, certPfxPW)); + } + + var response = await RequestTokenAsync(x509Credential, uiLambda); + token = response.AccessToken; + client.SetBearerToken(token); + + response.Show(); + UiLambdaSet.MesssageBoxShow(uiLambda, response.AccessToken, "", + "Access Token", AnyUiMessageBoxButton.OK); + + operation = lastOperation; + lastOperation = ""; + } + catch (Exception ex) + { + AdminShellNS.LogInternally.That.Error(ex, $"Failed at operation: {operation}"); + lastOperation = operation; + operation = "error"; + } + break; + case "error": + UiLambdaSet.MesssageBoxShow(uiLambda, "", $"Can not perform: {lastOperation}", + "Error", AnyUiMessageBoxButton.OK); + break; + } + } + } + + public async Task RequestTokenAsync( + SigningCredentials credential, + UiLambdaSet uiLambda = null) + { + var handler = new HttpClientHandler(); + handler.DefaultProxyCredentials = CredentialCache.DefaultCredentials; + var client = new HttpClient(handler); + + if (keycloak != "") + { + TokenResponse tr = null; + bool error = false; + + string BASE_URL = keycloak; + string client_id = "devicegrant"; // create a client in your keycloak instance + string DEVICE_GRANT_ENDPOINT = BASE_URL + "/auth/realms/test/protocol/openid-connect/auth/device"; + string TOKEN_ENDPOINT = BASE_URL + "/auth/realms/test/protocol/openid-connect/token"; + string USERINFO_ENDPOINT = BASE_URL + "/auth/realms/test/protocol/openid-connect/userinfo"; + string verification_uri_complete = ""; + string device_code = ""; + + HttpContent httpContent = new StringContent("client_id=" + client_id); + httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded"); + + var r = await client.PostAsync(DEVICE_GRANT_ENDPOINT, httpContent); + error = !r.IsSuccessStatusCode; + + if (!error) + { + var result = r.Content.ReadAsStringAsync().Result; + + try + { + var parsed = JObject.Parse(result); + + verification_uri_complete = parsed.SelectToken("verification_uri_complete").Value(); + device_code = parsed.SelectToken("device_code").Value(); + + Process.Start(verification_uri_complete); + } + catch (Exception) + { + + error = true; + } + } + if (!error) + { + string parameter = "grant_type=urn:ietf:params:oauth:grant-type:device_code&" + + "client_id=" + client_id + "&" + + "device_code=" + device_code; + string text = "Please login at " + verification_uri_complete + "\n" + parameter; + + UiLambdaSet.MesssageBoxShow(uiLambda, "Press OK to continue", text, + "Keycloak Authentication", AnyUiMessageBoxButton.OK); + + httpContent = new StringContent(parameter, Encoding.UTF8); + httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded"); + + r = await client.PostAsync(TOKEN_ENDPOINT, httpContent); + if (r.IsSuccessStatusCode) + { + var result = r.Content.ReadAsStringAsync().Result; + + try + { + var parsed = JObject.Parse(result); + + token = parsed.SelectToken("access_token").Value(); + UiLambdaSet.MesssageBoxShow(uiLambda, "Press OK to continue", token, + "Access Token", AnyUiMessageBoxButton.OK); + } + catch (Exception) + { + error = true; + } + } + } + if (error) + keycloak = ""; + return tr; + } + + var disco = client.GetDiscoveryDocumentAsync(authServer).Result; + if (disco.IsError) throw new Exception(disco.Error); + + UiLambdaSet.MesssageBoxShow(uiLambda, disco.Raw, "", "Discovery JSON", AnyUiMessageBoxButton.OK); + + List rootCertSubject = new List(); + var discoObject = JsonSerializer.Deserialize(disco.Raw); + var rootCertSubjects = JsonSerializer.Deserialize>(discoObject["rootCertSubjects"]); + if (rootCertSubjects != null) + { + foreach (var subject in rootCertSubjects) + { + rootCertSubject.Add(subject); + } + } + + var clientToken = CreateClientToken(credential, "client.jwt", + disco.TokenEndpoint, rootCertSubject, uiLambda); + + Console.ForegroundColor = ConsoleColor.Green; + Console.WriteLine("\nClientToken with x5c in header: \n"); + Console.ResetColor(); + Console.WriteLine(clientToken + "\n"); + + if (ssiURL == "") + UiLambdaSet.MesssageBoxShow(uiLambda, clientToken, "", "Client Token", AnyUiMessageBoxButton.OK); + + var response = client.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest + { + Address = disco.TokenEndpoint, + Scope = "resource1.scope1", + + ClientAssertion = + { + Type = OidcConstants.ClientAssertionTypes.JwtBearer, + Value = clientToken + } + }).Result; + + if (response.IsError) + { + throw new Exception(response.Error); + } + + UiLambdaSet.MesssageBoxShow(uiLambda, response.AccessToken, "", + "Access Token", AnyUiMessageBoxButton.OK); + + return response; + } + + public string secretString = "Industrie4.0-Asset-Administration-Shell"; + async Task CallServiceAsync(string token, string value) + { + var handler = new HttpClientHandler(); + handler.DefaultProxyCredentials = CredentialCache.DefaultCredentials; + var client = new HttpClient(handler) + { + BaseAddress = new Uri(dataServer) + }; + + client.SetBearerToken(token); + + try + { + var response = await client.GetStringAsync("/server/getaasx2/" + value); + + var parsed3 = JObject.Parse(response); + + string fileName = parsed3.SelectToken("fileName").Value(); + string fileData = parsed3.SelectToken("fileData").Value(); + + var enc = new System.Text.ASCIIEncoding(); + var fileString4 = Jose.JWT.Decode(fileData, enc.GetBytes(secretString), JwsAlgorithm.HS256); + var parsed4 = JObject.Parse(fileString4); + + string binaryBase64_4 = parsed4.SelectToken("file").Value(); + Byte[] fileBytes4 = Convert.FromBase64String(binaryBase64_4); + + Console.WriteLine("Writing file: " + outputDir + "\\" + "download.aasx"); + File.WriteAllBytes(outputDir + "\\" + "download.aasx", fileBytes4); + } + catch (Exception ex) + { + AdminShellNS.LogInternally.That.Error(ex, $"Can not get .AASX."); + return; + } + } + + private string CreateClientToken(SigningCredentials credential, string clientId, string audience, + List rootCertSubject, + UiLambdaSet uiLambda = null) + { + string[] x5c = null; + string certFileName = certPfx; + string password = certPfxPW; + X509Certificate2 certificate = null; + + if (credential == null) + { + AnyUiMessageBoxResult res = AnyUiMessageBoxResult.No; + + if (ssiURL == "") + res = UiLambdaSet.MesssageBoxShow(uiLambda, "", + "Select certificate chain from certificate store? \n" + + "(otherwise use file Andreas_Orzelski_Chain.pfx)", + "Select certificate chain", AnyUiMessageBoxButton.YesNo); + + if (res == AnyUiMessageBoxResult.No) + credential = new X509SigningCredentials(new X509Certificate2(certPfx, certPfxPW)); + } + + if (credential == null) + { + X509Store store = new X509Store("MY", StoreLocation.CurrentUser); + store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly); + + X509Certificate2Collection collection = (X509Certificate2Collection)store.Certificates; + X509Certificate2Collection fcollection = (X509Certificate2Collection)collection.Find( + X509FindType.FindByTimeValid, DateTime.Now, false); + + Boolean rootCertFound = false; + X509Certificate2Collection fcollection2 = new X509Certificate2Collection(); + foreach (X509Certificate2 fc in fcollection) + { + X509Chain fch = new X509Chain(); + fch.Build(fc); + foreach (X509ChainElement element in fch.ChainElements) + { + if (rootCertSubject.Contains(element.Certificate.Subject)) + { + rootCertFound = true; + fcollection2.Add(fc); + } + } + } + if (rootCertFound) + fcollection = fcollection2; + + X509Certificate2Collection scollection = X509Certificate2UI.SelectFromCollection(fcollection, + "Test Certificate Select", + "Select a certificate from the following list to get information on that certificate", + X509SelectionFlag.SingleSelection); + if (scollection.Count != 0) + { + certificate = scollection[0]; + X509Chain ch = new X509Chain(); + ch.Build(certificate); + + string[] X509Base64 = new string[ch.ChainElements.Count]; + + int j = 0; + foreach (X509ChainElement element in ch.ChainElements) + { + X509Base64[j++] = Convert.ToBase64String(element.Certificate.GetRawCertData()); + } + + x5c = X509Base64; + } + } + else + { + // use old fixed certificate chain + X509Certificate2Collection xc = new X509Certificate2Collection(); + xc.Import(certFileName, password, X509KeyStorageFlags.PersistKeySet); + + string[] X509Base64 = new string[xc.Count]; + + int j = xc.Count; + var xce = xc.GetEnumerator(); + for (int i = 0; i < xc.Count; i++) + { + xce.MoveNext(); + X509Base64[--j] = Convert.ToBase64String(xce.Current.GetRawCertData()); + } + x5c = X509Base64; + + certificate = new X509Certificate2(certFileName, password); + } + + string email = ""; + string subject = certificate.Subject; + var split = subject.Split(new Char[] { ',' }); + if (split[0] != "") + { + var split2 = split[0].Split(new Char[] { '=' }); + if (split2[0] == "E") + { + email = split2[1]; + } + } + Console.WriteLine("email: " + email); + + // + StringBuilder builder = new StringBuilder(); + builder.AppendLine("-----BEGIN CERTIFICATE-----"); + builder.AppendLine( + Convert.ToBase64String(certificate.RawData, Base64FormattingOptions.InsertLineBreaks)); + builder.AppendLine("-----END CERTIFICATE-----"); + + if (ssiURL == "") + UiLambdaSet.MesssageBoxShow(uiLambda, builder.ToString(), "", "Client Certificate", + AnyUiMessageBoxButton.OK); + + credential = new X509SigningCredentials(certificate); + // oz end + + var now = DateTime.UtcNow; + + var token = new JwtSecurityToken( + clientId, + audience, + new List() + { + new Claim(JwtClaimTypes.JwtId, Guid.NewGuid().ToString()), + new Claim(JwtClaimTypes.Subject, clientId), + new Claim(JwtClaimTypes.IssuedAt, now.ToEpochTime().ToString(), ClaimValueTypes.Integer64), + // OZ + new Claim(JwtClaimTypes.Email, email) + // new Claim("x5c", x5c) + }, + now, + now.AddMinutes(1), + credential) + ; + + token.Header.Add("x5c", x5c); + if (ssiURL != "") + { + //// Prover prover = new Prover("http://192.168.178.33:5001"); //AASX Package Explorer + Prover prover = new Prover(ssiURL); //AASX Package Explorer + + string invitation = prover.CreateInvitation(); + + token.Header.Add("ssiInvitation", invitation); + + UiLambdaSet.MesssageBoxShow(uiLambda, "ssiURL = " + ssiURL, "", "SSI Info", + AnyUiMessageBoxButton.OK); + UiLambdaSet.MesssageBoxShow(uiLambda, + "credentialInfo = " + prover.cred_json_asstring, "", "VC for Presentation", + AnyUiMessageBoxButton.OK); + } + + var tokenHandler = new JwtSecurityTokenHandler(); + return tokenHandler.WriteToken(token); + } + + private void Prover_CredentialPresented(object sender, string e) + { + throw new NotImplementedException(); + } + } +} diff --git a/src/AasxOpenidClient/Properties/AssemblyInfo.cs b/src/AasxOpenidClient/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..2ac45539d --- /dev/null +++ b/src/AasxOpenidClient/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// Allgemeine Informationen über eine Assembly werden über die folgenden +// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, +// die einer Assembly zugeordnet sind. +[assembly: AssemblyTitle("AasxOpenidClient")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("AasxOpenidClient")] +[assembly: AssemblyCopyright("Copyright © 2020")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly +// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von +// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen. +[assembly: ComVisible(false)] + +// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird +[assembly: Guid("7788ac2b-7f97-4755-b343-c4196fa90198")] + +// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: +// +// Hauptversion +// Nebenversion +// Buildnummer +// Revision +// +// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, +// indem Sie "*" wie unten gezeigt eingeben: +//// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/AasxOpenidClient/TokenResponseExtensions.cs b/src/AasxOpenidClient/TokenResponseExtensions.cs new file mode 100644 index 000000000..39bdbfe0e --- /dev/null +++ b/src/AasxOpenidClient/TokenResponseExtensions.cs @@ -0,0 +1,53 @@ +using System; +using System.Text; +using IdentityModel; +using IdentityModel.Client; +using Newtonsoft.Json.Linq; + +/* +Copyright (c) 2020 see https://github.com/IdentityServer/IdentityServer4 + +We adapted the code marginally and removed the parts that we do not use. +*/ + +namespace AasxOpenIdClient +{ + public static class TokenResponseExtensions + { + public static void Show(this TokenResponse response) + { + if (!response.IsError) + { + "Token response:".ConsoleGreen(); + Console.WriteLine(response.Json); + + if (response.AccessToken.Contains(".")) + { + "\nAccess Token (decoded):".ConsoleGreen(); + + var parts = response.AccessToken.Split('.'); + var header = parts[0]; + var claims = parts[1]; + + Console.WriteLine(JObject.Parse(Encoding.UTF8.GetString(Base64Url.Decode(header)))); + Console.WriteLine(JObject.Parse(Encoding.UTF8.GetString(Base64Url.Decode(claims)))); + } + } + else + { + if (response.ErrorType == ResponseErrorType.Http) + { + "HTTP error: ".ConsoleGreen(); + Console.WriteLine(response.Error); + "HTTP status code: ".ConsoleGreen(); + Console.WriteLine(response.HttpStatusCode); + } + else + { + "Protocol error response:".ConsoleGreen(); + Console.WriteLine(response.Raw); + } + } + } + } +} diff --git a/src/AasxOpenidClient/openid1.dat b/src/AasxOpenidClient/openid1.dat new file mode 100644 index 000000000..b055b5129 --- /dev/null +++ b/src/AasxOpenidClient/openid1.dat @@ -0,0 +1,5 @@ + +http://localhost:51310 +Andreas_Orzelski_Chain.pfx +i40 +. diff --git a/src/AasxOpenidClient/openid2.dat b/src/AasxOpenidClient/openid2.dat new file mode 100644 index 000000000..d1ec44fd7 --- /dev/null +++ b/src/AasxOpenidClient/openid2.dat @@ -0,0 +1,5 @@ +https://h2841345.stratoserver.net:50001 +https://h2841345.stratoserver.net:51311 +Andreas_Orzelski_Chain.pfx +i40 +. diff --git a/src/AasxOpenidClient/openid3.dat b/src/AasxOpenidClient/openid3.dat new file mode 100644 index 000000000..6be0f0613 --- /dev/null +++ b/src/AasxOpenidClient/openid3.dat @@ -0,0 +1,5 @@ +https://admin-shell-io.com:50001 +https://admin-shell-io.com:51311 +Andreas_Orzelski_Chain.pfx +i40 +. From a6e6936efe1991c0a9d693d0013724f67e0d423b Mon Sep 17 00:00:00 2001 From: martaf Date: Fri, 19 Apr 2024 13:57:59 +0200 Subject: [PATCH 16/16] Remaining source code removed --- .../V10/AdminShellV10.cs | 4653 ------ .../AasxCompatibilityModels/V20/AdminShell.cs | 8899 ---------- .../V20/AdminShellConverters.cs | 174 - .../V20/AdminShellUtil.cs | 636 - .../V20/AdminShellValidate.cs | 326 - .../AasxCsharpLibrary.csproj | 42 - .../AdminShellCollections.cs | 66 - src/AasxCsharpLib_bkp/AdminShellConverters.cs | 192 - src/AasxCsharpLib_bkp/AdminShellPackageEnv.cs | 1454 -- src/AasxCsharpLib_bkp/AdminShellUtil.cs | 705 - src/AasxCsharpLib_bkp/AdminShellValidate.cs | 327 - .../Display/EnumerationPlacmentBase.cs | 13 - .../EnumerationPlacmentOperationVariable.cs | 15 - .../Display/OperationVariableDirection.cs | 15 - .../Exceptions/NullValueException.cs | 16 - .../Extensions/AasElementSelfDescription.cs | 29 - .../Extensions/ComparerUtils.cs | 57 - .../ExtendAnnotatedRelationshipElement.cs | 124 - .../ExtendAssetAdministrationShell.cs | 242 - .../Extensions/ExtendAssetInformation.cs | 62 - .../Extensions/ExtendBlob.cs | 69 - .../Extensions/ExtendConceptDescription.cs | 299 - .../Extensions/ExtendDataElement.cs | 19 - .../ExtendDataSpecificationIEC61360.cs | 40 - .../ExtendEmbeddedDataSpecification.cs | 108 - .../Extensions/ExtendEntity.cs | 108 - .../Extensions/ExtendEnvironment.cs | 1052 -- .../Extensions/ExtendFile.cs | 68 - .../Extensions/ExtendHasDataSpecification.cs | 26 - .../ExtendIDataSpecificationContent.cs | 68 - .../Extensions/ExtendIIdentifiable.cs | 28 - .../Extensions/ExtendIReferable.cs | 600 - .../Extensions/ExtendISubmodelElement.cs | 1513 -- src/AasxCsharpLib_bkp/Extensions/ExtendKey.cs | 229 - .../Extensions/ExtendKeyList.cs | 183 - .../Extensions/ExtendKeyTypes.cs | 22 - .../Extensions/ExtendLangString.cs | 35 - .../Extensions/ExtendLangStringSet.cs | 165 - .../Extensions/ExtendModelKind.cs | 33 - .../Extensions/ExtendMultiLanguageProperty.cs | 127 - .../Extensions/ExtendObject.cs | 137 - .../Extensions/ExtendOperation.cs | 148 - .../Extensions/ExtendProperty.cs | 266 - .../Extensions/ExtendQualifier.cs | 192 - .../Extensions/ExtendRange.cs | 71 - .../Extensions/ExtendReference.cs | 263 - .../Extensions/ExtendReferenceElement.cs | 43 - .../Extensions/ExtendRelationshipElement.cs | 43 - .../Extensions/ExtendStream.cs | 22 - .../Extensions/ExtendStringification.cs | 15 - .../Extensions/ExtendSubmodel.cs | 455 - .../ExtendSubmodelElementCollection.cs | 194 - .../Extensions/ExtendSubmodelElementList.cs | 200 - .../Extensions/ExtensionsUtil.cs | 115 - .../Extensions/LocatedReference.cs | 22 - src/AasxCsharpLib_bkp/Extensions/MatchMode.cs | 15 - .../IAasxOnlineConnection.cs | 33 - src/AasxCsharpLib_bkp/LICENSE.txt | 1475 -- src/AasxCsharpLib_bkp/LogInternally.cs | 84 - .../Properties/AssemblyInfo.cs | 36 - .../Resources/schemaV201/AAS.xsd | 555 - .../Resources/schemaV201/AAS_ABAC.xsd | 171 - .../Resources/schemaV201/IEC61360.xsd | 156 - .../Resources/schemaV201/aas.json | 1148 -- .../AasxCsharpLibrary.Tests.csproj | 24 - .../DocTestAdminShellUtil.cs | 67 - src/AasxCsharpLibrary.Tests/LICENSE.txt | 1475 -- .../Properties/AssemblyInfo.cs | 36 - .../TemporaryDirectory.cs | 23 - .../TestAdminShellUtil.cs | 28 - .../TestAgainstAasCorePackage.cs | 85 - .../TestLoadSaveChain.cs | 189 - .../expectedOk/01_Festo.aasx.xml | 8384 ---------- .../expectedOk/02_Bosch.aasx.xml | 6811 -------- .../expectedOk/03_Bosch.aasx.xml | 13753 ---------------- .../expectedOk/04_Bosch.aasx.xml | 6691 -------- .../expectedOk/05_Bosch.aasx.xml | 6177 ------- .../expectedOk/06_Bosch.aasx.xml | 6640 -------- .../expectedOk/07_PhoenixContact.aasx.xml | 3507 ---- .../expectedOk/08_SchneiderElectric.aasx.xml | 4570 ----- .../expectedOk/09_SchneiderElectric.aasx.xml | 4570 ----- .../expectedOk/10_SchneiderElectric.aasx.xml | 4570 ----- .../expectedOk/11_SchneiderElectric.aasx.xml | 4570 ----- .../expectedOk/12_Pepperl+Fuchs.aasx.xml | 3973 ----- .../XmlValidation/expectedOk/13_DKE.aasx.xml | 4210 ----- .../expectedOk/14_Siemens.aasx.xml | 6015 ------- .../expectedOk/15_Siemens.aasx.xml | 5044 ------ .../expectedOk/16_Lenze.aasx.xml | 4017 ----- .../XmlValidation/expectedOk/17_ABB.aasx.xml | 4777 ------ .../18_Hitachi_HX_DigTyp40.aasx.xml | 6872 -------- .../TestValidateXml.cs | 56 - .../V10/AdminShellV10.cs | 4649 ------ .../AasxCompatibilityModels/V20/AdminShell.cs | 8895 ---------- .../V20/AdminShellConverters.cs | 170 - .../V20/AdminShellUtil.cs | 633 - .../V20/AdminShellValidate.cs | 320 - .../AasxCsharpLibrary.csproj | 43 - .../AdminShellCollections.cs | 92 - src/AasxCsharpLibrary/AdminShellConverters.cs | 327 - src/AasxCsharpLibrary/AdminShellPackageEnv.cs | 1695 -- src/AasxCsharpLibrary/AdminShellUtil.cs | 1129 -- src/AasxCsharpLibrary/AdminShellValidate.cs | 320 - .../Display/EnumerationPlacmentBase.cs | 15 - .../EnumerationPlacmentOperationVariable.cs | 16 - .../Display/OperationVariableDirection.cs | 17 - .../MetamodelVerificationException.cs | 26 - .../Exceptions/NullValueException.cs | 20 - .../Extensions/AasElementSelfDescription.cs | 30 - .../Extensions/ComparerUtils.cs | 69 - .../ExtendAnnotatedRelationshipElement.cs | 132 - .../ExtendAssetAdministrationShell.cs | 271 - .../Extensions/ExtendAssetInformation.cs | 65 - .../Extensions/ExtendBlob.cs | 75 - .../Extensions/ExtendCollection.cs | 17 - .../Extensions/ExtendConceptDescription.cs | 320 - .../Extensions/ExtendDataElement.cs | 20 - .../ExtendDataSpecificationIEC61360.cs | 50 - .../ExtendEmbeddedDataSpecification.cs | 118 - .../Extensions/ExtendEntity.cs | 117 - .../Extensions/ExtendEnvironment.cs | 1092 -- .../Extensions/ExtendFile.cs | 69 - .../Extensions/ExtendHasDataSpecification.cs | 25 - .../ExtendIAdministrativeInformation.cs | 25 - .../Extensions/ExtendIClass.cs | 41 - .../ExtendIDataSpecificationContent.cs | 77 - .../Extensions/ExtendIIdentifiable.cs | 33 - ...ExtendILangStringDefinitionTypeIec61360.cs | 66 - .../Extensions/ExtendILangStringNameType.cs | 30 - ...endILangStringPreferredNameTypeIec61360.cs | 71 - .../ExtendILangStringShortNameTypeIec61360.cs | 71 - .../Extensions/ExtendILangStringTextType.cs | 35 - .../Extensions/ExtendIReferable.cs | 624 - .../Extensions/ExtendISubmodelElement.cs | 1551 -- src/AasxCsharpLibrary/Extensions/ExtendKey.cs | 268 - .../Extensions/ExtendKeyList.cs | 194 - .../Extensions/ExtendKeyTypes.cs | 21 - .../Extensions/ExtendLangString.cs | 66 - .../Extensions/ExtendLangStringSet.cs | 199 - .../Extensions/ExtendModelKind.cs | 35 - .../Extensions/ExtendMultiLanguageProperty.cs | 140 - .../Extensions/ExtendObject.cs | 144 - .../Extensions/ExtendOperation.cs | 157 - .../Extensions/ExtendProperty.cs | 269 - .../Extensions/ExtendQualifier.cs | 195 - .../Extensions/ExtendRange.cs | 75 - .../Extensions/ExtendReference.cs | 309 - .../Extensions/ExtendReferenceElement.cs | 45 - .../Extensions/ExtendRelationshipElement.cs | 46 - .../Extensions/ExtendSpecificAssetId.cs | 48 - .../Extensions/ExtendStream.cs | 25 - .../Extensions/ExtendStringification.cs | 20 - .../Extensions/ExtendSubmodel.cs | 470 - .../ExtendSubmodelElementCollection.cs | 193 - .../Extensions/ExtendSubmodelElementList.cs | 206 - .../Extensions/ExtensionsUtil.cs | 120 - .../Extensions/LocatedReference.cs | 23 - src/AasxCsharpLibrary/Extensions/MatchMode.cs | 17 - .../IAasxOnlineConnection.cs | 26 - src/AasxCsharpLibrary/LICENSE.txt | 1475 -- src/AasxCsharpLibrary/LogInternally.cs | 83 - .../Properties/AssemblyInfo.cs | 35 - .../Resources/schemaV201/AAS.xsd | 555 - .../Resources/schemaV201/AAS_ABAC.xsd | 171 - .../Resources/schemaV201/IEC61360.xsd | 156 - .../Resources/schemaV201/aas.json | 1148 -- 165 files changed, 166227 deletions(-) delete mode 100644 src/AasxCsharpLib_bkp/AasxCompatibilityModels/V10/AdminShellV10.cs delete mode 100644 src/AasxCsharpLib_bkp/AasxCompatibilityModels/V20/AdminShell.cs delete mode 100644 src/AasxCsharpLib_bkp/AasxCompatibilityModels/V20/AdminShellConverters.cs delete mode 100644 src/AasxCsharpLib_bkp/AasxCompatibilityModels/V20/AdminShellUtil.cs delete mode 100644 src/AasxCsharpLib_bkp/AasxCompatibilityModels/V20/AdminShellValidate.cs delete mode 100644 src/AasxCsharpLib_bkp/AasxCsharpLibrary.csproj delete mode 100644 src/AasxCsharpLib_bkp/AdminShellCollections.cs delete mode 100644 src/AasxCsharpLib_bkp/AdminShellConverters.cs delete mode 100644 src/AasxCsharpLib_bkp/AdminShellPackageEnv.cs delete mode 100644 src/AasxCsharpLib_bkp/AdminShellUtil.cs delete mode 100644 src/AasxCsharpLib_bkp/AdminShellValidate.cs delete mode 100644 src/AasxCsharpLib_bkp/Display/EnumerationPlacmentBase.cs delete mode 100644 src/AasxCsharpLib_bkp/Display/EnumerationPlacmentOperationVariable.cs delete mode 100644 src/AasxCsharpLib_bkp/Display/OperationVariableDirection.cs delete mode 100644 src/AasxCsharpLib_bkp/Exceptions/NullValueException.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/AasElementSelfDescription.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/ComparerUtils.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendAnnotatedRelationshipElement.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendAssetAdministrationShell.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendAssetInformation.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendBlob.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendConceptDescription.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendDataElement.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendDataSpecificationIEC61360.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendEmbeddedDataSpecification.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendEntity.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendEnvironment.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendFile.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendHasDataSpecification.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendIDataSpecificationContent.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendIIdentifiable.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendIReferable.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendISubmodelElement.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendKey.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendKeyList.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendKeyTypes.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendLangString.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendLangStringSet.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendModelKind.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendMultiLanguageProperty.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendObject.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendOperation.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendProperty.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendQualifier.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendRange.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendReference.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendReferenceElement.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendRelationshipElement.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendStream.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendStringification.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendSubmodel.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendSubmodelElementCollection.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtendSubmodelElementList.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/ExtensionsUtil.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/LocatedReference.cs delete mode 100644 src/AasxCsharpLib_bkp/Extensions/MatchMode.cs delete mode 100644 src/AasxCsharpLib_bkp/IAasxOnlineConnection.cs delete mode 100644 src/AasxCsharpLib_bkp/LICENSE.txt delete mode 100644 src/AasxCsharpLib_bkp/LogInternally.cs delete mode 100644 src/AasxCsharpLib_bkp/Properties/AssemblyInfo.cs delete mode 100644 src/AasxCsharpLib_bkp/Resources/schemaV201/AAS.xsd delete mode 100644 src/AasxCsharpLib_bkp/Resources/schemaV201/AAS_ABAC.xsd delete mode 100644 src/AasxCsharpLib_bkp/Resources/schemaV201/IEC61360.xsd delete mode 100644 src/AasxCsharpLib_bkp/Resources/schemaV201/aas.json delete mode 100644 src/AasxCsharpLibrary.Tests/AasxCsharpLibrary.Tests.csproj delete mode 100644 src/AasxCsharpLibrary.Tests/DocTestAdminShellUtil.cs delete mode 100644 src/AasxCsharpLibrary.Tests/LICENSE.txt delete mode 100644 src/AasxCsharpLibrary.Tests/Properties/AssemblyInfo.cs delete mode 100644 src/AasxCsharpLibrary.Tests/TemporaryDirectory.cs delete mode 100644 src/AasxCsharpLibrary.Tests/TestAdminShellUtil.cs delete mode 100644 src/AasxCsharpLibrary.Tests/TestAgainstAasCorePackage.cs delete mode 100644 src/AasxCsharpLibrary.Tests/TestLoadSaveChain.cs delete mode 100644 src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/01_Festo.aasx.xml delete mode 100644 src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/02_Bosch.aasx.xml delete mode 100644 src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/03_Bosch.aasx.xml delete mode 100644 src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/04_Bosch.aasx.xml delete mode 100644 src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/05_Bosch.aasx.xml delete mode 100644 src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/06_Bosch.aasx.xml delete mode 100644 src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/07_PhoenixContact.aasx.xml delete mode 100644 src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/08_SchneiderElectric.aasx.xml delete mode 100644 src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/09_SchneiderElectric.aasx.xml delete mode 100644 src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/10_SchneiderElectric.aasx.xml delete mode 100644 src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/11_SchneiderElectric.aasx.xml delete mode 100644 src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/12_Pepperl+Fuchs.aasx.xml delete mode 100644 src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/13_DKE.aasx.xml delete mode 100644 src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/14_Siemens.aasx.xml delete mode 100644 src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/15_Siemens.aasx.xml delete mode 100644 src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/16_Lenze.aasx.xml delete mode 100644 src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/17_ABB.aasx.xml delete mode 100644 src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/18_Hitachi_HX_DigTyp40.aasx.xml delete mode 100644 src/AasxCsharpLibrary.Tests/TestValidateXml.cs delete mode 100644 src/AasxCsharpLibrary/AasxCompatibilityModels/V10/AdminShellV10.cs delete mode 100644 src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShell.cs delete mode 100644 src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellConverters.cs delete mode 100644 src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellUtil.cs delete mode 100644 src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellValidate.cs delete mode 100644 src/AasxCsharpLibrary/AasxCsharpLibrary.csproj delete mode 100644 src/AasxCsharpLibrary/AdminShellCollections.cs delete mode 100644 src/AasxCsharpLibrary/AdminShellConverters.cs delete mode 100644 src/AasxCsharpLibrary/AdminShellPackageEnv.cs delete mode 100644 src/AasxCsharpLibrary/AdminShellUtil.cs delete mode 100644 src/AasxCsharpLibrary/AdminShellValidate.cs delete mode 100644 src/AasxCsharpLibrary/Display/EnumerationPlacmentBase.cs delete mode 100644 src/AasxCsharpLibrary/Display/EnumerationPlacmentOperationVariable.cs delete mode 100644 src/AasxCsharpLibrary/Display/OperationVariableDirection.cs delete mode 100644 src/AasxCsharpLibrary/Exceptions/MetamodelVerificationException.cs delete mode 100644 src/AasxCsharpLibrary/Exceptions/NullValueException.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/AasElementSelfDescription.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ComparerUtils.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendAnnotatedRelationshipElement.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendAssetAdministrationShell.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendAssetInformation.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendBlob.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendCollection.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendConceptDescription.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendDataElement.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendDataSpecificationIEC61360.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendEmbeddedDataSpecification.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendEntity.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendEnvironment.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendFile.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendHasDataSpecification.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendIAdministrativeInformation.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendIClass.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendIDataSpecificationContent.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendIIdentifiable.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendILangStringDefinitionTypeIec61360.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendILangStringNameType.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendILangStringPreferredNameTypeIec61360.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendILangStringShortNameTypeIec61360.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendILangStringTextType.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendIReferable.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendISubmodelElement.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendKey.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendKeyList.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendKeyTypes.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendLangString.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendLangStringSet.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendModelKind.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendMultiLanguageProperty.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendObject.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendOperation.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendProperty.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendQualifier.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendRange.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendReference.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendReferenceElement.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendRelationshipElement.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendSpecificAssetId.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendStream.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendStringification.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendSubmodel.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendSubmodelElementCollection.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtendSubmodelElementList.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/ExtensionsUtil.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/LocatedReference.cs delete mode 100644 src/AasxCsharpLibrary/Extensions/MatchMode.cs delete mode 100644 src/AasxCsharpLibrary/IAasxOnlineConnection.cs delete mode 100644 src/AasxCsharpLibrary/LICENSE.txt delete mode 100644 src/AasxCsharpLibrary/LogInternally.cs delete mode 100644 src/AasxCsharpLibrary/Properties/AssemblyInfo.cs delete mode 100644 src/AasxCsharpLibrary/Resources/schemaV201/AAS.xsd delete mode 100644 src/AasxCsharpLibrary/Resources/schemaV201/AAS_ABAC.xsd delete mode 100644 src/AasxCsharpLibrary/Resources/schemaV201/IEC61360.xsd delete mode 100644 src/AasxCsharpLibrary/Resources/schemaV201/aas.json diff --git a/src/AasxCsharpLib_bkp/AasxCompatibilityModels/V10/AdminShellV10.cs b/src/AasxCsharpLib_bkp/AasxCompatibilityModels/V10/AdminShellV10.cs deleted file mode 100644 index 18999575b..000000000 --- a/src/AasxCsharpLib_bkp/AasxCompatibilityModels/V10/AdminShellV10.cs +++ /dev/null @@ -1,4653 +0,0 @@ -/* -Copyright (c) 2018-2021 Festo AG & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections; -using System.Collections.Generic; -using System.ComponentModel; -using System.IO; -using System.IO.Packaging; -using System.Runtime; -using System.Text; -using System.Text.RegularExpressions; -using System.Xml; -using System.Xml.Serialization; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; - -// ReSharper disable All .. as this is legacy code! - -#if !DoNotUseAasxCompatibilityModels - -namespace AasxCompatibilityModels -{ - #region Utils - // - // Utils - // - - public class AdminShellUtilV10 - { - public static string EvalToNonNullString(string fmt, object o, string elseString = "") - { - if (o == null) - return elseString; - return string.Format(fmt, o); - } - - public static string EvalToNonEmptyString(string fmt, string o, string elseString = "") - { - if (o == "") - return elseString; - return string.Format(fmt, o); - } - - public static string FilterFriendlyName(string src) - { - if (src == null) - return null; - return Regex.Replace(src, @"[^a-zA-Z0-9\-_]", "_"); - } - - public static bool HasWhitespace(string src) - { - if (src == null) - throw new ArgumentNullException(nameof(src)); - for (var i = 0; i < src.Length; i++) - foreach (var c in src) - if (char.IsWhiteSpace(c)) - return true; - return false; - } - - public static bool ComplyIdShort(string src) - { - if (src == null) - throw new ArgumentNullException(nameof(src)); - var res = true; - foreach (var c in src) - if (!Char.IsLetterOrDigit(c) && c != '_') - res = false; - if (src.Length > 0 && !Char.IsLetter(src[0])) - res = false; - return res; - } - - public static string ShortLocation(Exception ex) - { - if (ex == null || ex.StackTrace == null) - return ""; - string[] lines = ex.StackTrace.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None); - if (lines.Length < 1) - return ""; - // search for " in " - // as the most actual stacktrace might be a built-in function, this might not work and therefore - // go down in the stack - int currLine = 0; - while (true) - { - // nothing found at all - if (currLine >= lines.Length) - return ""; - // access current line - var p = lines[currLine].IndexOf(" in ", StringComparison.Ordinal); - if (p < 0) - { - // advance to next oldest line - currLine++; - continue; - } - // search last "\" or "/", to get only filename portion and position - p = lines[currLine].LastIndexOfAny(new[] { '\\', '/' }); - if (p < 0) - { - // advance to next oldest line - currLine++; - continue; - } - // return this - return lines[currLine].Substring(p); - } - } - - } - - #endregion - - - #region AdminShell_V1_0 - - /// - /// Version of Details of Administration Shell Part 1 V1.0 published Nov/Dec/Jan 2018/19 - /// - public class AdminShellV10 - { - - public class Identification - { - - // members - - [XmlAttribute] - public string idType = ""; - [XmlText] - public string id = ""; - - // constructors - - public Identification() { } - - public Identification(string idType, string id) - { - this.idType = idType; - this.id = id; - } - - public Identification(Identification src) - { - this.idType = src.idType; - this.id = src.id; - } - - // Creator with validation - - public static Identification CreateNew(string idType, string id) - { - if (idType == null || id == null) - return null; - var found = false; - foreach (var x in Key.IdentifierTypeNames) - found = found || idType.ToLower().Trim() == x.ToLower().Trim(); - if (!found) - return null; - return new Identification(idType, id); - } - - // further - - public bool IsEqual(Identification other) - { - return (this.idType.Trim().ToLower() == other.idType.Trim().ToLower() - && this.id.Trim().ToLower() == other.id.Trim().ToLower()); - } - - public override string ToString() - { - return $"[{this.idType}] {this.id}"; - } - } - - public class Administration - { - - // members - - public string version = ""; - public string revision = ""; - - // constructors - - public Administration() { } - - public Administration(Administration src) - { - this.version = src.version; - this.revision = src.revision; - } - - public Administration(string version, string revision) - { - this.version = version; - this.revision = revision; - } - - public override string ToString() - { - return $"R={this.version}, V={this.revision}"; - } - } - - public class Key - { - [XmlAttribute] - public string type = ""; - [XmlAttribute] - public bool local = false; - - [XmlAttribute] - [JsonIgnore] - public string idType = ""; - [XmlIgnore] - [JsonProperty(PropertyName = "idType")] - public string JsonIdType - { - get { return (idType == "idShort") ? "IdShort" : idType; } - set { if (value == "IdShort") idType = "idShort"; else idType = value; } - } - - [XmlText] - public string value = ""; - - [XmlIgnore] - [JsonProperty(PropertyName = "index")] - public int index = 0; - - public Key() - { - } - - public Key(Key src) - { - this.type = src.type; - this.local = src.local; - this.idType = src.idType; - this.value = src.value; - } - - public Key(string type, bool local, string idType, string value) - { - this.type = type; - this.local = local; - this.idType = idType; - this.value = value; - } - - public static Key CreateNew(string type, bool local, string idType, string value) - { - var k = new Key(); - k.type = type; - k.local = local; - k.idType = idType; - k.value = value; - return (k); - } - - public static Key GetFromRef(Reference r) - { - if (r == null || r.Count != 1) - return null; - return r[0]; - } - - public override string ToString() - { - var local = (this.local) ? "Local" : "not Local"; - return $"[{this.type}, {local}, {this.idType}, {this.value}]"; - } - - public static string KeyListToString(List keys) - { - if (keys == null || keys.Count < 1) - return ""; - // normally, exactly one key - if (keys.Count == 1) - return keys[0].ToString(); - // multiple! - var s = "[ "; - foreach (var k in keys) - { - if (s.Length > 0) - s += ", "; - s += k.ToString(); - } - return s + " ]"; - } - - public static string[] KeyElements = new string[] { - "GlobalReference", - "AccessPermissionRule", - "Asset", - "AssetAdministrationShell", - "ConceptDescription", - "Submodel", - "SubmodelRef", // not completely right, but used by Package Explorer - "Blob", - "ConceptDictionary", - "DataElement", - "File", - "Event", - "Operation", - "OperationVariable", - "Property", - "ReferenceElement", - "RelationshipElement", - "SubmodelElement", - "SubmodelElementCollection", - "View" }; - - public static string[] ReferableElements = new string[] { - "AccessPermissionRule", - "Asset", - "AssetAdministrationShell", - "ConceptDescription", - "Submodel", - "Blob", - "ConceptDictionary", - "DataElement", - "File", - "Event", - "Operation", - "OperationVariable", - "Property", - "ReferenceElement", - "RelationshipElement", - "SubmodelElement", - "SubmodelElementCollection", - "View" - }; - - public static string[] SubmodelElements = new string[] { - "DataElement", - "File", - "Event", - "Operation", - "Property", - "ReferenceElement", - "RelationshipElement", - "SubmodelElementCollection"}; - - public static string[] IdentifiableElements = new string[] { - "Asset", - "AssetAdministrationShell", - "ConceptDescription", - "Submodel" }; - - // use this in list to designate all of the above elements - public static string AllElements = "All"; - - // use this in list to designate the GlobalReference - public static string GlobalReference = "GlobalReference"; - public static string ConceptDescription = "ConceptDescription"; - public static string SubmodelRef = "SubmodelRef"; - public static string Submodel = "Submodel"; - public static string Asset = "Asset"; - public static string AAS = "AssetAdministrationShell"; - - public static string[] IdentifierTypeNames = new string[] { "IdShort", "Custom", "IRDI", "URI" }; - - public enum IdentifierType { IdShort = 0, Custom, IRDI, URI }; - - public static string GetIdentifierTypeName(IdentifierType t) - { - return IdentifierTypeNames[(int)t]; - } - - // some helpers - - public static bool IsInKeyElements(string ke) - { - var res = false; - foreach (var s in KeyElements) - if (s.Trim().ToLower() == ke.Trim().ToLower()) - res = true; - return res; - } - - } - - // the whole class shall not be serialized by having it private - public class KeyList - { - // members - - [XmlIgnore] // anyway, as it is privat - private List key = new List(); - - // getters / setters - - [XmlIgnore] - public List Keys { get { return key; } } - [XmlIgnore] - public bool IsEmpty { get { return key == null || key.Count < 1; } } - [XmlIgnore] - public int Count { get { if (key == null) return 0; return key.Count; } } - [XmlIgnore] - public Key this[int index] { get { return key[index]; } } - - // constructors / creators - - public void Add(Key k) - { - key.Add(k); - } - - public static KeyList CreateNew(Key k) - { - var kl = new KeyList(); - kl.Add(k); - return kl; - } - - public static KeyList CreateNew(string type, bool local, string idType, string value) - { - var kl = new KeyList(); - kl.Add(Key.CreateNew(type, local, idType, value)); - return kl; - } - - // other - - public void NumberIndices() - { - if (this.Keys == null) - return; - for (int i = 0; i < this.Keys.Count; i++) - this.Keys[i].index = i; - } - } - - [XmlType(TypeName = "reference")] - public class Reference - { - - // members - - [XmlIgnore] // anyway, as it is privat - [JsonIgnore] - private KeyList keys = new KeyList(); - - // getters / setters - - [XmlArray("keys")] - [XmlArrayItem("key")] - [JsonIgnore] - public List Keys { get { return keys?.Keys; } } - [XmlIgnore] - [JsonProperty(PropertyName = "keys")] - public List JsonKeys - { - get - { - keys?.NumberIndices(); - return keys.Keys; - } - } - - [XmlIgnore] - [JsonIgnore] - public bool IsEmpty { get { return keys == null || keys.Count < 1; } } - [XmlIgnore] - [JsonIgnore] - public int Count { get { if (keys == null) return 0; return keys.Count; } } - [XmlIgnore] - [JsonIgnore] - public Key this[int index] { get { return keys[index]; } } - - // constructors / creators - - public Reference() - { - } - - public Reference(Key k) - { - if (k != null) - keys.Keys.Add(k); - } - - public Reference(Reference src) - { - if (src != null) - foreach (var k in src.Keys) - keys.Add(new Key(k)); - } - - public Reference(SemanticId src) - { - if (src != null) - foreach (var k in src.Keys) - keys.Add(new Key(k)); - } - - public static Reference CreateNew(Key k) - { - if (k == null) - return null; - var r = new Reference(); - r.keys.Keys.Add(k); - return r; - } - - public static Reference CreateNew(List k) - { - if (k == null) - return null; - var r = new Reference(); - r.keys.Keys.AddRange(k); - return r; - } - - public static Reference CreateNew(string type, bool local, string idType, string value) - { - if (type == null || idType == null || value == null) - return null; - var r = new Reference(); - r.keys.Keys.Add(Key.CreateNew(type, local, idType, value)); - return r; - } - - public static Reference CreateIrdiReference(string irdi) - { - if (irdi == null) - return null; - var r = new Reference(); - r.keys.Keys.Add(new Key(Key.GlobalReference, false, "IRDI", irdi)); - return r; - } - - // further - - public bool IsExactlyOneKey(string type, bool local, string idType, string id) - { - if (keys == null || keys.Keys == null || keys.Count != 1) - return false; - var k = keys.Keys[0]; - return k.type == type && k.local == local && k.idType == idType && k.value == id; - } - - public bool MatchesTo(Identification other) - { - return (this.keys != null && this.keys.Count == 1 - && this.keys[0].idType.Trim().ToLower() == other.idType.Trim().ToLower() - && this.keys[0].value.Trim().ToLower() == other.id.Trim().ToLower()); - } - - public bool MatchesTo(Reference other) - { - if (this.keys == null || other == null || other.keys == null || other.Count != this.Count) - return false; - - var same = true; - for (int i = 0; i < this.Count; i++) - same = same - && this.keys[i].type.Trim().ToLower() == other.keys[i].type.Trim().ToLower() - && this.keys[i].local == other.keys[i].local - && this.keys[i].idType.Trim().ToLower() == other.keys[i].idType.Trim().ToLower() - && this.keys[i].value.Trim().ToLower() == other.keys[i].value.Trim().ToLower(); - - return same; - } - - public override string ToString() - { - var res = ""; - if (keys != null && keys.Keys != null) - foreach (var k in keys.Keys) - res += k.ToString() + ","; - return res.TrimEnd(','); - } - - public string ListOfValues(string delim) - { - string res = ""; - if (this.Keys != null) - foreach (var x in this.Keys) - { - if (x == null) - continue; - if (res != "") res += delim; - res += x.value; - } - return res; - } - - public virtual string GetElementName() - { - return "Reference"; - } - } - - [XmlType(TypeName = "derivedFrom")] - public class AssetAdministrationShellRef : Reference - { - // constructors - - public AssetAdministrationShellRef() : base() { } - - public AssetAdministrationShellRef(Key k) : base(k) { } - - public AssetAdministrationShellRef(Reference src) : base(src) { } - - // further methods - - public override string GetElementName() - { - return "AssetAdministrationShellRef"; - } - } - - [XmlType(TypeName = "assetRef")] - public class AssetRef : Reference - { - // constructors - - public AssetRef() : base() { } - - public AssetRef(AssetRef src) : base(src) { } - - // translation - - public static AssetRef CreateNew(Reference r) - { - return (AssetRef)new Reference(r); - } - - // further methods - - public override string GetElementName() - { - return "AssetRef"; - } - } - - [XmlType(TypeName = "submodelRef")] - public class SubmodelRef : Reference - { - // constructors - - public SubmodelRef() : base() { } - - public SubmodelRef(SubmodelRef src) : base(src) { } - - public static new SubmodelRef CreateNew(string type, bool local, string idType, string value) - { - var r = new SubmodelRef(); - r.Keys.Add(Key.CreateNew(type, local, idType, value)); - return r; - } - - public static SubmodelRef CreateNew(Reference src) - { - if (src == null || src.Keys == null) - return null; - var r = new SubmodelRef(); - r.Keys.AddRange(src.Keys); - return r; - } - - // further methods - - public override string GetElementName() - { - return "SubmodelRef"; - } - } - - [XmlType(TypeName = "conceptDescriptionRef")] - public class ConceptDescriptionRef : Reference - { - // constructors - - public ConceptDescriptionRef() : base() { } - - public ConceptDescriptionRef(ConceptDescriptionRef src) : base(src) { } - - // further methods - - public new static ConceptDescriptionRef CreateNew(string type, bool local, string idType, string value) - { - var r = new ConceptDescriptionRef(); - r.Keys.Add(Key.CreateNew(type, local, idType, value)); - return r; - } - - public override string GetElementName() - { - return "ConceptDescriptionRef"; - } - } - - [XmlType(TypeName = "dataSpecificationRef")] - public class DataSpecificationRef : Reference - { - // constructors - - public DataSpecificationRef() : base() { } - - public DataSpecificationRef(DataSpecificationRef src) : base(src) { } - - // further methods - - public static DataSpecificationRef CreateNew(Reference src) - { - if (src == null || src.Keys == null) - return null; - var res = new DataSpecificationRef(); - foreach (var k in src.Keys) - res.Keys.Add(new Key(k)); - return res; - } - - public override string GetElementName() - { - return "DataSpecificationRef"; - } - } - - [XmlType(TypeName = "conceptDescriptions")] - public class ConceptDescriptionRefs - { - [XmlElement(ElementName = "conceptDescriptionRef")] - public List conceptDescriptions = new List(); - - // constructors - - public ConceptDescriptionRefs() { } - - public ConceptDescriptionRefs(ConceptDescriptionRefs src) - { - if (src.conceptDescriptions != null) - foreach (var cdr in src.conceptDescriptions) - this.conceptDescriptions.Add(new ConceptDescriptionRef(cdr)); - } - } - - [XmlType(TypeName = "containedElementRef")] - public class ContainedElementRef : Reference - { - // constructors - - public ContainedElementRef() { } - public ContainedElementRef(ContainedElementRef src) : base(src) { } - - public static ContainedElementRef CreateNew(Reference src) - { - if (src == null || src.Keys == null) - return null; - var r = new ContainedElementRef(); - r.Keys.AddRange(src.Keys); - return r; - } - - // further methods - - public override string GetElementName() - { - return "ContainedElementRef"; - } - } - - [XmlType(TypeName = "hasDataSpecification")] - public class HasDataSpecification - { - [XmlElement(ElementName = "reference")] // make "reference" go away by magic?! - public List reference = new List(); - - public HasDataSpecification() { } - - public HasDataSpecification(HasDataSpecification src) - { - foreach (var r in src.reference) - reference.Add(new Reference(r)); - } - } - - [XmlType(TypeName = "ContainedElements")] - public class ContainedElements - { - - // members - - [XmlElement(ElementName = "containedElementRef")] // make "reference" go away by magic?! - public List reference = new List(); - - // getter / setter - - public bool IsEmpty { get { return reference == null || reference.Count < 1; } } - public int Count { get { if (reference == null) return 0; return reference.Count; } } - public ContainedElementRef this[int index] { get { return reference[index]; } } - - // Creators - - public ContainedElements() { } - - public ContainedElements(ContainedElements src) - { - if (src.reference != null) - foreach (var r in src.reference) - this.reference.Add(new ContainedElementRef(r)); - } - - public static ContainedElements CreateOrSetInner(ContainedElements outer, ContainedElementRef[] inner) - { - var res = outer; - if (res == null) - res = new ContainedElements(); - if (inner == null) - { - res.reference = null; - return res; - } - res.reference = new List(inner); - return res; - } - - } - - [XmlType(TypeName = "langString", Namespace = "http://www.admin-shell.io/1/0")] - public class LangStr - { - - // members - - [XmlAttribute(Namespace = "http://www.admin-shell.io/1/0")] - [JsonProperty(PropertyName = "language")] - public string lang = ""; - [XmlText] - [JsonProperty(PropertyName = "text")] - public string str = ""; - - // constructors - - public LangStr() { } - - public LangStr(LangStr src) - { - this.lang = src.lang; - this.str = src.str; - } - - public static LangStr CreateNew(string lang, string str) - { - var l = new LangStr(); - l.lang = lang; - l.str = str; - return (l); - } - - public static List CreateManyFromStringArray(string[] s) - { - var r = new List(); - var i = 0; - while ((i + 1) < s.Length) - { - r.Add(LangStr.CreateNew(s[i], s[i + 1])); - i += 2; - } - return r; - } - } - - public class Description - { - - // members - - [XmlElement(ElementName = "langString")] - public List langString = new List(); - - // constructors - - public Description() { } - - public Description(Description src) - { - if (src != null) - foreach (var ls in src.langString) - langString.Add(new LangStr(ls)); - } - } - - public class Kind - { - [XmlText] - public string kind = "Instance"; - - // getters / setters - - [XmlIgnore] - [JsonIgnore] - public bool IsInstance { get { return kind == null || kind.Trim().ToLower() == "instance"; } } - - [XmlIgnore] - [JsonIgnore] - public bool IsType { get { return kind != null && kind.Trim().ToLower() == "type"; } } - - // constructors / creators - - public Kind() { } - - public Kind(Kind src) - { - kind = src.kind; - } - - public Kind(string kind) - { - this.kind = kind; - } - - public static Kind CreateFrom(Kind k) - { - var res = new Kind(); - res.kind = k.kind; - return res; - } - - public static Kind CreateAsType() - { - var res = new Kind(); - res.kind = "Type"; - return res; - } - - public static Kind CreateAsInstance() - { - var res = new Kind(); - res.kind = "Instance"; - return res; - } - } - - public class SemanticId - { - - // members - - [XmlIgnore] - [JsonIgnore] - private KeyList keys = new KeyList(); - - // getters / setters - - [XmlArray("keys")] - [XmlArrayItem("key")] - [JsonIgnore] - public List Keys { get { return keys?.Keys; } } - [XmlIgnore] - [JsonProperty(PropertyName = "keys")] - public List JsonKeys - { - get - { - keys?.NumberIndices(); - return keys.Keys; - } - } - - [XmlIgnore] - [JsonIgnore] - public bool IsEmpty { get { return keys == null || keys.IsEmpty; } } - [XmlIgnore] - [JsonIgnore] - public int Count { get { if (keys == null) return 0; return keys.Count; } } - [XmlIgnore] - [JsonIgnore] - public Key this[int index] { get { return keys[index]; } } - - public override string ToString() - { - return Key.KeyListToString(keys.Keys); - } - - // constructors / creators - - public SemanticId() - { - } - - public SemanticId(SemanticId src) - { - if (src != null) - foreach (var k in src.Keys) - keys.Add(k); - } - - public static SemanticId CreateFromKey(Key key) - { - if (key == null) - return null; - var res = new SemanticId(); - res.Keys.Add(key); - return res; - } - - public static SemanticId CreateFromKeys(List keys) - { - if (keys == null) - return null; - var res = new SemanticId(); - res.Keys.AddRange(keys); - return res; - } - - // matching - - public bool Matches(string type, bool local, string idType, string value) - { - if (this.Count == 1 - && this.keys[0].type.ToLower().Trim() == type.ToLower().Trim() - && this.keys[0].local == local - && this.keys[0].idType.ToLower().Trim() == idType.ToLower().Trim() - && this.keys[0].value.ToLower().Trim() == value.ToLower().Trim()) - return true; - return false; - } - } - - public class Referable - { - - // members - - public string idShort = null; - public string category = null; - - [XmlElement(ElementName = "description")] - [JsonIgnore] - public Description description = null; - [XmlIgnore] - [JsonProperty(PropertyName = "descriptions")] - public List JsonDescription - { - get - { - if (description == null) - return null; - return description.langString; - } - set - { - if (description == null) - description = new Description(); - description.langString = value; - } - } - - [XmlIgnore] - [JsonIgnore] - public Referable parent = null; - - public static string[] ReferableCategoryNames = new string[] { "CONSTANT", "PARAMETER", "VARIABLE" }; - - // constructors - - public Referable() { } - - public Referable(Referable src) - { - this.idShort = src.idShort; - this.category = src.category; - if (src.description != null) - this.description = new Description(src.description); - } - - public void AddDescription(string lang, string str) - { - if (description == null) - description = new Description(); - description.langString.Add(LangStr.CreateNew(lang, str)); - } - - public virtual string GetElementName() - { - return "GlobalReference"; // not correct, but this method wasn't overridden correctly - } - - public string GetFriendlyName() - { - return AdminShellUtilV10.FilterFriendlyName(this.idShort); - } - - public void CollectReferencesByParent(List refs) - { - // check, if this is identifiable - if (this is Identifiable) - { - var idf = this as Identifiable; - var k = Key.CreateNew( - idf.GetElementName(), true, idf.identification.idType, idf.identification.id); - refs.Insert(0, k); - } - else - { - var k = Key.CreateNew(this.GetElementName(), true, "idShort", this.idShort); - refs.Insert(0, k); - // recurse upwards! - if (parent != null && parent is Referable) - (this.parent).CollectReferencesByParent(refs); - } - } - - public string CollectIdShortByParent() - { - // recurse first - var head = ""; - if (!(this is Identifiable) && this.parent != null && this.parent is Referable) - // can go up - head = this.parent.CollectIdShortByParent() + "/"; - // add own - var myid = ""; - if (this.idShort != null && this.idShort.Trim() != "") - myid = this.idShort.Trim(); - // together - return head + myid; - } - } - - public class Identifiable : Referable - { - - // members - - public Identification identification = new Identification(); - public Administration administration = null; - - // constructors - - public Identifiable() : base() { } - - public Identifiable(Identifiable src) - : base(src) - { - if (src.identification != null) - this.identification = new Identification(src.identification); - if (src.administration != null) - this.administration = new Administration(src.administration); - } - - public void SetIdentification(string idType, string id, string idShort = null) - { - identification.idType = idType; - identification.id = id; - if (idShort != null) - this.idShort = idShort; - } - - public void SetAdminstration(string version, string revision) - { - if (administration == null) - administration = new Administration(); - administration.version = version; - administration.revision = revision; - } - - public new string GetFriendlyName() - { - if (identification != null && identification.id != "") - return AdminShellUtilV10.FilterFriendlyName(this.identification.id); - return AdminShellUtilV10.FilterFriendlyName(this.idShort); - } - - } - - public class JsonModelTypeWrapper - { - public string name = ""; - - public JsonModelTypeWrapper(string name = "") { this.name = name; } - } - - public class AdministrationShell : Identifiable - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // from hasDataSpecification: - [XmlElement(ElementName = "hasDataSpecification")] - public HasDataSpecification hasDataSpecification = null; - - // from this very class - public AssetAdministrationShellRef derivedFrom = null; - - [JsonProperty(PropertyName = "asset")] - public AssetRef assetRef = new AssetRef(); - - [JsonProperty(PropertyName = "submodels")] - public List submodelRefs = new List(); - - [JsonIgnore] - public Views views = null; - [XmlIgnore] - [JsonProperty(PropertyName = "views")] - public View[] JsonViews - { - get { return views?.views.ToArray(); } - set { views = Views.CreateOrSetInnerViews(views, value); } - } - - [JsonProperty(PropertyName = "conceptDictionaries")] - public List conceptDictionaries = null; - - // constructurs - - public AdministrationShell() { } - - public AdministrationShell(AdministrationShell src) - : base(src) - { - if (src.hasDataSpecification != null) - this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - - if (src.derivedFrom != null) - this.derivedFrom = new AssetAdministrationShellRef(src.derivedFrom); - - if (src.assetRef != null) - this.assetRef = new AssetRef(src.assetRef); - - if (src.submodelRefs != null) - foreach (var smr in src.submodelRefs) - this.submodelRefs.Add(new SubmodelRef(smr)); - - if (src.views != null) - this.views = new Views(src.views); - - if (src.conceptDictionaries != null) - { - this.conceptDictionaries = new List(); - foreach (var cdd in src.conceptDictionaries) - this.conceptDictionaries.Add(new ConceptDictionary(cdd)); - } - } - - public static AdministrationShell CreateNew( - string idType, string id, string version = null, string revision = null) - { - var s = new AdministrationShell(); - s.identification.idType = idType; - s.identification.id = id; - if (version != null) - s.SetAdminstration(version, revision); - return (s); - } - - // add - - public void AddView(View v) - { - if (views == null) - views = new Views(); - views.views.Add(v); - } - - public void AddConceptDictionary(ConceptDictionary d) - { - if (conceptDictionaries == null) - conceptDictionaries = new List(); - conceptDictionaries.Add(d); - } - - public void AddDataSpecification(Key k) - { - if (hasDataSpecification == null) - hasDataSpecification = new HasDataSpecification(); - var r = new Reference(); - r.Keys.Add(k); - hasDataSpecification.reference.Add(r); - } - - public override string GetElementName() - { - return "AssetAdministrationShell"; - } - - public Tuple ToCaptionInfo() - { - var caption = AdminShellUtilV10.EvalToNonNullString("\"{0}\" ", idShort, "\"AAS\""); - if (administration != null) - caption += "V" + administration.version + "." + administration.revision; - - var info = ""; - if (identification != null) - info = $"[{identification.idType}, {identification.id}]"; - return Tuple.Create(caption, info); - } - - public override string ToString() - { - var ci = ToCaptionInfo(); - return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); - } - - public SubmodelRef FindSubmodelRef(Identification refid) - { - if (this.submodelRefs == null) - return null; - foreach (var r in this.submodelRefs) - if (r.MatchesTo(refid)) - return r; - return null; - } - - public bool HasSubmodelRef(SubmodelRef newref) - { - // check, if existing - if (this.submodelRefs == null) - return false; - var found = false; - foreach (var r in this.submodelRefs) - if (r.MatchesTo(newref)) - found = true; - - return found; - } - - public void AddSubmodelRef(SubmodelRef newref) - { - if (this.submodelRefs == null) - this.submodelRefs = new List(); - this.submodelRefs.Add(newref); - } - } - - public class Asset : Identifiable - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // from hasDataSpecification: - [XmlElement(ElementName = "hasDataSpecification")] - public HasDataSpecification hasDataSpecification = null; - // from HasKind - [XmlElement(ElementName = "kind")] - [JsonIgnore] - public Kind kind = new Kind(); - [XmlIgnore] - [JsonProperty(PropertyName = "kind")] - public string JsonKind - { - get - { - if (kind == null) - return null; - return kind.kind; - } - set - { - if (kind == null) - kind = new Kind(); - kind.kind = value; - } - } - // from this very class - [XmlElement(ElementName = "assetIdentificationModelRef")] - public SubmodelRef assetIdentificationModelRef = null; - - // constructors - - public Asset() { } - - public Asset(Asset src) - : base(src) - { - if (src.hasDataSpecification != null) - this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - if (src.kind != null) - this.kind = new Kind(src.kind); - if (src.assetIdentificationModelRef != null) - this.assetIdentificationModelRef = new SubmodelRef(src.assetIdentificationModelRef); - } - - // Getter & setters - - public AssetRef GetReference() - { - var r = new AssetRef(); - r.Keys.Add( - Key.CreateNew(this.GetElementName(), true, this.identification.idType, this.identification.id)); - return r; - } - - public override string GetElementName() - { - return "Asset"; - } - - public Tuple ToCaptionInfo() - { - var caption = AdminShellUtilV10.EvalToNonNullString("\"{0}\" ", idShort, ""); - if (administration != null) - caption += "V" + administration.version + "." + administration.revision; - - var info = ""; - if (identification != null) - info = $"[{identification.idType}, {identification.id}]"; - return Tuple.Create(caption, info); - } - - public override string ToString() - { - var ci = ToCaptionInfo(); - return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); - } - - } - - public class View : Referable - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // members - - // from hasSemanticId: - [XmlElement(ElementName = "semanticId")] - public SemanticId semanticId = null; - // from hasDataSpecification - [XmlElement(ElementName = "hasDataSpecification")] - public HasDataSpecification hasDataSpecification = null; - - // from this very class - [JsonIgnore] - public ContainedElements containedElements = null; - [XmlIgnore] - [JsonProperty(PropertyName = "containedElements")] - public ContainedElementRef[] JsonContainedElements - { - get { return containedElements?.reference.ToArray(); } - set { containedElements = ContainedElements.CreateOrSetInner(containedElements, value); } - } - - // getter / setter - - [XmlIgnore] - [JsonIgnore] - public bool IsEmpty { get { return containedElements == null || containedElements.Count < 1; } } - [XmlIgnore] - [JsonIgnore] - public int Count { get { if (containedElements == null) return 0; return containedElements.Count; } } - - public ContainedElementRef this[int index] - { - get - { - if ( -containedElements == null) return null; return containedElements[index]; - } - } - - // constructors / creators - - public View() { } - - public View(View src) - : base(src) - { - if (src.semanticId != null) - this.semanticId = new SemanticId(src.semanticId); - if (src.hasDataSpecification != null) - this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - if (src.containedElements != null) - this.containedElements = new ContainedElements(src.containedElements); - } - - public static View CreateNew(string idShort) - { - var v = new View(); - v.idShort = idShort; - return (v); - } - - public void AddDataSpecification(Key k) - { - if (hasDataSpecification == null) - hasDataSpecification = new HasDataSpecification(); - var r = new Reference(); - r.Keys.Add(k); - hasDataSpecification.reference.Add(r); - } - - public void AddContainedElement(Key k) - { - if (containedElements == null) - containedElements = new ContainedElements(); - var r = new ContainedElementRef(); - r.Keys.Add(k); - containedElements.reference.Add(r); - } - - public void AddContainedElement(List keys) - { - if (containedElements == null) - containedElements = new ContainedElements(); - var r = new ContainedElementRef(); - foreach (var k in keys) - r.Keys.Add(k); - containedElements.reference.Add(r); - } - - public void AddContainedElement(Reference r) - { - if (containedElements == null) - containedElements = new ContainedElements(); - containedElements.reference.Add(ContainedElementRef.CreateNew(r)); - } - - public void AddContainedElement(List rlist) - { - if (containedElements == null) - containedElements = new ContainedElements(); - foreach (var r in rlist) - containedElements.reference.Add(ContainedElementRef.CreateNew(r)); - } - - public override string GetElementName() - { - return "View"; - } - - public Tuple ToCaptionInfo() - { - var caption = AdminShellUtilV10.EvalToNonNullString("\"{0}\" ", idShort, ""); - var info = ""; - if (this.semanticId != null) - info = Key.KeyListToString(this.semanticId.Keys); - if (this.containedElements != null && this.containedElements.reference != null) - info = - (info + " ").Trim() + String.Format("({0} elements)", this.containedElements.reference.Count); - return Tuple.Create(caption, info); - } - - public override string ToString() - { - var ci = ToCaptionInfo(); - return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); - } - } - - public class Views - { - [XmlElement(ElementName = "view")] - [JsonIgnore] - public List views = new List(); - - // constructors - - public Views() { } - - public Views(Views src) - { - if (src != null && src.views != null) - foreach (var v in src.views) - this.views.Add(new View(v)); - } - - public static Views CreateOrSetInnerViews(Views outer, View[] inner) - { - var res = outer; - if (res == null) - res = new Views(); - if (inner == null) - { - res.views = null; - return res; - } - res.views = new List(inner); - return res; - } - } - - public class LangStringIEC61360 - { - - // members - - [XmlElement(ElementName = "langString", Namespace = "http://www.admin-shell.io/aas/1/0")] - public List langString = new List(); - - // getters / setters - - [XmlIgnore] - [JsonIgnore] - public bool IsEmpty { get { return langString == null || langString.Count < 1; } } - [XmlIgnore] - [JsonIgnore] - public int Count { get { if (langString == null) return 0; return langString.Count; } } - [XmlIgnore] - [JsonIgnore] - public LangStr this[int index] { get { return langString[index]; } } - - // constructors - - public LangStringIEC61360() { } - - public LangStringIEC61360(LangStringIEC61360 src) - { - if (src.langString != null) - foreach (var ls in src.langString) - this.langString.Add(new LangStr(ls)); - } - - // converter - - public static LangStringIEC61360 CreateFrom(List src) - { - var res = new LangStringIEC61360(); - if (src != null) - foreach (var ls in src) - res.langString.Add(new LangStr(ls)); - return res; - } - - } - - public class UnitId - { - - // members - - [XmlIgnore] - [JsonIgnore] - public KeyList keys = new KeyList(); - - // getter / setters - - [XmlArray("keys")] - [XmlArrayItem("key")] - [JsonIgnore] - public List Keys { get { return keys?.Keys; } } - [XmlIgnore] - [JsonProperty(PropertyName = "keys")] - public List JsonKeys - { - get - { - keys?.NumberIndices(); - return keys.Keys; - } - } - - [XmlIgnore] - [JsonIgnore] - public bool IsEmpty { get { return keys == null || keys.IsEmpty; } } - [XmlIgnore] - [JsonIgnore] - public int Count { get { if (keys == null) return 0; return keys.Count; } } - [XmlIgnore] - [JsonIgnore] - public Key this[int index] { get { return keys.Keys[index]; } } - - // constructors / creators - - public UnitId() { } - - public UnitId(UnitId src) - { - if (src.keys != null) - foreach (var k in src.Keys) - this.keys.Add(new Key(k)); - } - - public static UnitId CreateNew(string type, bool local, string idType, string value) - { - var u = new UnitId(); - u.keys.Keys.Add(Key.CreateNew(type, local, idType, value)); - return u; - } - - public static UnitId CreateNew(Reference src) - { - var res = new UnitId(); - if (src != null && src.Keys != null) - foreach (var k in src.Keys) - res.keys.Add(k); - return res; - } - } - - [XmlRoot(Namespace = "http://www.admin-shell.io/IEC61360/1/0")] - public class DataSpecificationIEC61360 - { - // static member - [XmlIgnore] - [JsonIgnore] - public static string[] DataTypeNames = { - "STRING", - "STRING_TRANSLATABLE", - "REAL_MEASURE", - "REAL_COUNT", - "REAL_CURRENCY", - "INTEGER_MEASURE", - "INTEGER_COUNT", - "INTEGER_CURRENCY", - "BOOLEAN", - "URL", - "RATIONAL", - "RATIONAL_MEASURE", - "TIME", - "TIMESTAMP", - "DATE" }; - - // members - public LangStringIEC61360 preferredName = new LangStringIEC61360(); - public string shortName = ""; - public string unit = ""; - public UnitId unitId = null; - public string valueFormat = null; - public List sourceOfDefinition = new List(); - public string symbol = null; - public string dataType = ""; - public LangStringIEC61360 definition = new LangStringIEC61360(); - - // getter / setters - - // constructors - - public DataSpecificationIEC61360() { } - - public DataSpecificationIEC61360(DataSpecificationIEC61360 src) - { - if (src.preferredName != null) - this.preferredName = new LangStringIEC61360(src.preferredName); - this.shortName = src.shortName; - this.unit = src.unit; - if (src.unitId != null) - this.unitId = new UnitId(src.unitId); - this.valueFormat = src.valueFormat; - if (src.sourceOfDefinition != null) - foreach (var sod in src.sourceOfDefinition) - this.sourceOfDefinition.Add(sod); - this.symbol = src.symbol; - this.dataType = src.dataType; - if (src.definition != null) - this.definition = new LangStringIEC61360(src.definition); - } - - public static DataSpecificationIEC61360 CreateNew( - string[] preferredName = null, - string shortName = "", - string unit = "", - UnitId unitId = null, - string valueFormat = null, - string[] sourceOfDefinition = null, - string symbol = null, - string dataType = "", - string[] definition = null - ) - { - var d = new DataSpecificationIEC61360(); - if (preferredName != null) - d.preferredName.langString = LangStr.CreateManyFromStringArray(preferredName); - d.shortName = shortName; - d.unit = unit; - d.unitId = unitId; - d.valueFormat = valueFormat; - if (sourceOfDefinition != null) - d.sourceOfDefinition = LangStr.CreateManyFromStringArray(sourceOfDefinition); - d.symbol = symbol; - d.dataType = dataType; - if (definition != null) - d.definition.langString = LangStr.CreateManyFromStringArray(definition); - return (d); - } - } - - public class DataSpecificationISO99999 - { - } - - public class DataSpecificationContent - { - - // members - - public DataSpecificationIEC61360 dataSpecificationIEC61360 = new DataSpecificationIEC61360(); - public DataSpecificationISO99999 dataSpecificationISO99999 = null; - - // constructors - - public DataSpecificationContent() { } - - public DataSpecificationContent(DataSpecificationContent src) - { - if (src.dataSpecificationIEC61360 != null) - this.dataSpecificationIEC61360 = new DataSpecificationIEC61360(src.dataSpecificationIEC61360); - } - } - - public class EmbeddedDataSpecification - { - // members - - public DataSpecificationRef hasDataSpecification = new DataSpecificationRef(); - public DataSpecificationContent dataSpecificationContent = new DataSpecificationContent(); - - // constructors - - public EmbeddedDataSpecification() { } - - public EmbeddedDataSpecification(EmbeddedDataSpecification src) - { - if (src.hasDataSpecification != null) - this.hasDataSpecification = new DataSpecificationRef(src.hasDataSpecification); - if (src.dataSpecificationContent != null) - this.dataSpecificationContent = new DataSpecificationContent(src.dataSpecificationContent); - } - } - - public class ConceptDescription : Identifiable, System.IDisposable - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // members - - // do this in order to be IDisposable, that is: suitable for (using) - void System.IDisposable.Dispose() { } - public void GetData() { } - // from HasDataSpecification - // TODO (Michael Hoffmeister, 1970-01-01): in V1.0, shall be a list of embeddedDataSpecification - [XmlElement(ElementName = "embeddedDataSpecification")] - [JsonIgnore] - public EmbeddedDataSpecification embeddedDataSpecification = new EmbeddedDataSpecification(); - [XmlIgnore] - [JsonProperty(PropertyName = "embeddedDataSpecifications")] - public EmbeddedDataSpecification[] JsonEmbeddedDataSpecifications - { - get - { - if (embeddedDataSpecification == null) - return null; - return new EmbeddedDataSpecification[] { embeddedDataSpecification }; - } - set - { - if (value == null) - embeddedDataSpecification = null; - else - embeddedDataSpecification = value[0]; - } - } - - // this class - [XmlIgnore] - private List isCaseOf = null; - - // getter / setter - - [XmlElement(ElementName = "isCaseOf")] - [JsonProperty(PropertyName = "isCaseOf")] - public List IsCaseOf - { - get { return isCaseOf; } - set { isCaseOf = value; } - } - - // constructors / creators - - public ConceptDescription() : base() { } - - public ConceptDescription(ConceptDescription src) - : base(src) - { - if (src.embeddedDataSpecification != null) - this.embeddedDataSpecification = new EmbeddedDataSpecification(src.embeddedDataSpecification); - if (src.isCaseOf != null) - foreach (var ico in src.isCaseOf) - { - if (this.isCaseOf == null) - this.isCaseOf = new List(); - this.isCaseOf.Add(new Reference(ico)); - } - } - - public static ConceptDescription CreateNew( - string idType, string id, string version = null, string revision = null) - { - var cd = new ConceptDescription(); - cd.identification.idType = idType; - cd.identification.id = id; - if (version != null) - { - if (cd.administration == null) - cd.administration = new Administration(); - cd.administration.version = version; - cd.administration.revision = revision; - } - return (cd); - } - - public ConceptDescriptionRef GetReference() - { - var r = new ConceptDescriptionRef(); - r.Keys.Add( - Key.CreateNew(this.GetElementName(), true, this.identification.idType, this.identification.id)); - return r; - } - - public Key GetGlobalDataSpecRef() - { - if (embeddedDataSpecification.hasDataSpecification.Count != 1) - return null; - return (embeddedDataSpecification.hasDataSpecification[0]); - } - - public void SetIEC61360Spec( - string[] preferredNames = null, - string shortName = "", - string unit = "", - UnitId unitId = null, - string valueFormat = null, - string[] sourceOfDefinition = null, - string symbol = null, - string dataType = "", - string[] definition = null - ) - { - this.embeddedDataSpecification = new EmbeddedDataSpecification(); - this.embeddedDataSpecification.hasDataSpecification.Keys.Add( - Key.CreateNew("GlobalReference", false, "URI", - "www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360")); - this.embeddedDataSpecification.dataSpecificationContent.dataSpecificationIEC61360 = - AdminShellV10.DataSpecificationIEC61360.CreateNew( - preferredNames, shortName, unit, unitId, valueFormat, sourceOfDefinition, symbol, dataType, - definition); - this.AddIsCaseOf( - Reference.CreateNew(new Key( - "ConceptDescription", false, this.identification.idType, this.identification.id))); - } - - public DataSpecificationIEC61360 GetIEC61360() - { - if (embeddedDataSpecification != null && - embeddedDataSpecification.dataSpecificationContent != null && - embeddedDataSpecification.dataSpecificationContent.dataSpecificationIEC61360 != null) - return embeddedDataSpecification.dataSpecificationContent.dataSpecificationIEC61360; - return null; - } - - public string GetShortName() - { - if (embeddedDataSpecification != null && - embeddedDataSpecification.dataSpecificationContent != null && - embeddedDataSpecification.dataSpecificationContent.dataSpecificationIEC61360 != null) - return embeddedDataSpecification.dataSpecificationContent.dataSpecificationIEC61360.shortName; - return ""; - } - - public override string GetElementName() - { - return "ConceptDescription"; - } - - public Tuple ToCaptionInfo() - { - var caption = ""; - if (this.idShort != null && this.idShort.Trim() != "") - caption = $"\"{this.idShort.Trim()}\""; - if (this.identification != null) - caption = (caption + " " + this.identification).Trim(); - - var info = ""; - if (embeddedDataSpecification != null && - embeddedDataSpecification.dataSpecificationContent != null && - embeddedDataSpecification.dataSpecificationContent.dataSpecificationIEC61360 != null) - info += embeddedDataSpecification.dataSpecificationContent.dataSpecificationIEC61360.shortName; - - return Tuple.Create(caption, info); - } - - public override string ToString() - { - var ci = ToCaptionInfo(); - return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); - } - - public void AddIsCaseOf(Reference ico) - { - if (isCaseOf == null) - isCaseOf = new List(); - isCaseOf.Add(ico); - } - - public static IDisposable CreateNew() - { - throw new NotImplementedException(); - } - } - - public class ConceptDictionary : Referable - { - [XmlElement(ElementName = "conceptDescriptions")] - public ConceptDescriptionRefs conceptDescriptionsRefs = null; - - // constructors - - public ConceptDictionary() { } - - public ConceptDictionary(ConceptDictionary src) - { - if (src.conceptDescriptionsRefs != null) - this.conceptDescriptionsRefs = new ConceptDescriptionRefs(src.conceptDescriptionsRefs); - } - - public static ConceptDictionary CreateNew(string idShort = null) - { - var d = new ConceptDictionary(); - if (idShort != null) - d.idShort = idShort; - return (d); - } - - // add - - public void AddReference(Reference r) - { - var cdr = (ConceptDescriptionRef)(ConceptDescriptionRef.CreateNew(r.Keys)); - if (conceptDescriptionsRefs == null) - conceptDescriptionsRefs = new ConceptDescriptionRefs(); - conceptDescriptionsRefs.conceptDescriptions.Add(cdr); - } - - public override string GetElementName() - { - return "ConceptDictionary"; - } - } - - [XmlRoot(ElementName = "aasenv", Namespace = "http://www.admin-shell.io/aas/1/0")] - public class AdministrationShellEnv - { - [XmlAttribute(Namespace = System.Xml.Schema.XmlSchema.InstanceNamespace)] - public string schemaLocation = - "http://www.admin-shell.io/aas/1/0 AAS.xsd http://www.admin-shell.io/IEC61360/1/0 IEC61360.xsd"; - - /// [XmlElement(ElementName="assetAdministrationShells")] - [XmlIgnore] // will be ignored, anyway - private List administrationShells = new List(); - [XmlIgnore] // will be ignored, anyway - private List assets = new List(); - [XmlIgnore] // will be ignored, anyway - private List submodels = new List(); - [XmlIgnore] // will be ignored, anyway - private List conceptDescriptions = new List(); - - // getter / setters - - [XmlArray("assetAdministrationShells")] - [XmlArrayItem("assetAdministrationShell")] - [JsonProperty(PropertyName = "assetAdministrationShells")] - public List AdministrationShells - { - get { return administrationShells; } - set { administrationShells = value; } - } - - [XmlArray("assets")] - [XmlArrayItem("asset")] - [JsonProperty(PropertyName = "assets")] - public List Assets - { - get { return assets; } - set { assets = value; } - } - - [XmlArray("submodels")] - [XmlArrayItem("submodel")] - [JsonProperty(PropertyName = "submodels")] - public List Submodels - { - get { return submodels; } - set { submodels = value; } - } - - [XmlArray("conceptDescriptions")] - [XmlArrayItem("conceptDescription")] - [JsonProperty(PropertyName = "conceptDescriptions")] - public List ConceptDescriptions - { - get { return conceptDescriptions; } - set { conceptDescriptions = value; } - } - - // finders - - public AdministrationShell FindAAS(Identification id) - { - if (id == null) - return null; - foreach (var aas in this.AdministrationShells) - if (aas.identification != null && aas.identification.IsEqual(id)) - return aas; - return null; - } - - public AdministrationShell FindAAS(string idShort) - { - if (idShort == null) - return null; - foreach (var aas in this.AdministrationShells) - if (aas.idShort != null && aas.idShort.Trim().ToLower() == idShort.Trim().ToLower()) - return aas; - return null; - } - - public AdministrationShell FindAASwithSubmodel(Identification smid) - { - if (smid == null) - return null; - foreach (var aas in this.AdministrationShells) - if (aas.submodelRefs != null) - foreach (var smref in aas.submodelRefs) - if (smref.MatchesTo(smid)) - return aas; - return null; - } - - public Asset FindAsset(Identification id) - { - if (id == null) - return null; - foreach (var asset in this.Assets) - if (asset.identification != null && asset.identification.IsEqual(id)) - return asset; - return null; - } - - public Asset FindAsset(AssetRef aref) - { - // trivial - if (aref == null) - return null; - // can only refs with 1 key - if (aref.Count != 1) - return null; - // and we're picky - var key = aref[0]; - if (!key.local || key.type.ToLower().Trim() != "asset") - return null; - // brute force - foreach (var a in assets) - if (a.identification.idType.ToLower().Trim() == key.idType.ToLower().Trim() - && a.identification.id.ToLower().Trim() == key.value.ToLower().Trim()) - return a; - // uups - return null; - } - - public Submodel FindSubmodel(Identification id) - { - if (id == null) - return null; - foreach (var sm in this.Submodels) - if (sm.identification != null && sm.identification.IsEqual(id)) - return sm; - return null; - } - - public Submodel FindSubmodel(SubmodelRef smref) - { - // trivial - if (smref == null) - return null; - // can only refs with 1 key - if (smref.Count != 1) - return null; - // and we're picky - var key = smref.Keys[0]; - if (!key.local || key.type.ToLower().Trim() != "submodel") - return null; - // brute force - foreach (var sm in this.Submodels) - if (sm.identification.idType.ToLower().Trim() == key.idType.ToLower().Trim() - && sm.identification.id.ToLower().Trim() == key.value.ToLower().Trim()) - return sm; - // uups - return null; - } - - public Referable FindReferableByReference(Reference rf, int keyIndex = 0) - { - // first index needs to exist .. - if (rf == null || keyIndex >= rf.Count) - return null; - - // which type? - var firstType = rf[keyIndex].type.Trim().ToLower(); - var firstIdentification = new Identification(rf[keyIndex].idType, rf[keyIndex].value); - - if (firstType == Key.AAS.Trim().ToLower()) - return this.FindAAS(firstIdentification); - - if (firstType == Key.Asset.Trim().ToLower()) - return this.FindAsset(firstIdentification); - - if (firstType == Key.ConceptDescription.Trim().ToLower()) - return this.FindConceptDescription(firstIdentification); - - if (firstType == Key.Submodel.Trim().ToLower()) - { - // ok, search Submodel - var sm = this.FindSubmodel(new Identification(rf[keyIndex].idType, rf[keyIndex].value)); - if (sm == null) - return null; - - // at our end? - if (keyIndex >= rf.Count - 1) - return sm; - - // go inside - return SubmodelElementWrapper.FindReferableByReference(sm.submodelElements, rf, keyIndex + 1); - } - - // nothing in this Environment - return null; - } - - - public ConceptDescription FindConceptDescription(ConceptDescriptionRef cdr) - { - if (cdr == null) - return null; - return FindConceptDescription(cdr.Keys); - } - - public ConceptDescription FindConceptDescription(Identification id) - { - var cdr = ConceptDescriptionRef.CreateNew("Conceptdescription", true, id.idType, id.id); - return FindConceptDescription(cdr); - } - - public ConceptDescription FindConceptDescription(List keys) - { - // trivial - if (keys == null) - return null; - // can only refs with 1 key - if (keys.Count != 1) - return null; - // and we're picky - var key = keys[0]; - if (!key.local || key.type.ToLower().Trim() != "conceptdescription") - return null; - // brute force - foreach (var cd in conceptDescriptions) - if (cd.identification.idType.ToLower().Trim() == key.idType.ToLower().Trim() - && cd.identification.id.ToLower().Trim() == key.value.ToLower().Trim()) - return cd; - // uups - return null; - } - - public ConceptDescription FindConceptDescription(Key key) - { - if (key == null) - return null; - var l = new List(); - l.Add(key); - return (FindConceptDescription(l)); - } - - // creators - - private void CopyConceptDescriptionsFrom( - AdministrationShellEnv srcEnv, SubmodelElement src, bool shallowCopy = false) - { - // access - if (srcEnv == null || src == null || src.semanticId == null) - return; - // check for this SubmodelElement in Source - var cdSrc = srcEnv.FindConceptDescription(src.semanticId.Keys); - if (cdSrc == null) - return; - // check for this SubmodelElement in Destnation (this!) - var cdDest = this.FindConceptDescription(src.semanticId.Keys); - if (cdDest != null) - return; - // copy new - this.ConceptDescriptions.Add(new ConceptDescription(cdSrc)); - // recurse? - if (!shallowCopy && src is SubmodelElementCollection) - foreach (var m in (src as SubmodelElementCollection).value) - CopyConceptDescriptionsFrom(srcEnv, m.submodelElement, shallowCopy); - - } - - public SubmodelElementWrapper CopySubmodelElementAndCD( - AdministrationShellEnv srcEnv, SubmodelElement srcElem, bool copyCD = false, bool shallowCopy = false) - { - // access - if (srcEnv == null || srcElem == null) - return null; - - // 1st result pretty easy (calling function will add this to the appropriate Submodel) - var res = new SubmodelElementWrapper(srcElem); - - // copy the CDs.. - if (copyCD) - CopyConceptDescriptionsFrom(srcEnv, srcElem, shallowCopy); - - // give back - return res; - } - - public SubmodelRef CopySubmodelRefAndCD( - AdministrationShellEnv srcEnv, SubmodelRef srcSubRef, bool copySubmodel = false, bool copyCD = false, - bool shallowCopy = false) - { - // access - if (srcEnv == null || srcSubRef == null) - return null; - - // need to have the source Submodel - var srcSub = srcEnv.FindSubmodel(srcSubRef); - if (srcSub == null) - return null; - - // 1st result pretty easy (calling function will add this to the appropriate AAS) - var dstSubRef = new SubmodelRef(srcSubRef); - - // get the destination and shall src != dst - var dstSub = this.FindSubmodel(dstSubRef); - if (srcSub == dstSub) - return null; - - // maybe we need the Submodel in our environment, as well - if (dstSub == null && copySubmodel) - { - dstSub = new Submodel(srcSub, shallowCopy); - this.Submodels.Add(dstSub); - } - else - { - // there is already an submodel, just add members - if (!shallowCopy && srcSub.submodelElements != null) - { - if (dstSub.submodelElements == null) - dstSub.submodelElements = new List(); - foreach (var smw in srcSub.submodelElements) - dstSub.submodelElements.Add(new SubmodelElementWrapper(smw.submodelElement, shallowCopy)); - } - } - - // copy the CDs.. - if (copyCD && srcSub.submodelElements != null) - foreach (var smw in srcSub.submodelElements) - CopyConceptDescriptionsFrom(srcEnv, smw.submodelElement, shallowCopy); - - // give back - return dstSubRef; - } - - // serializations - - public void SerializeXmlToStream(StreamWriter s) - { - var serializer = new XmlSerializer(typeof(AdminShellV10.AdministrationShellEnv)); - var nss = new XmlSerializerNamespaces(); - nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace); - nss.Add("aas", "http://www.admin-shell.io/aas/1/0"); - nss.Add("IEC61360", "http://www.admin-shell.io/IEC61360/1/0"); - serializer.Serialize(s, this, nss); - } - - public JsonWriter SerialiazeJsonToStream(StreamWriter sw, bool leaveJsonWriterOpen = false) - { - sw.AutoFlush = true; - - JsonSerializer serializer = new JsonSerializer(); - serializer.NullValueHandling = NullValueHandling.Ignore; - serializer.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; - serializer.Formatting = Newtonsoft.Json.Formatting.Indented; - - JsonWriter writer = new JsonTextWriter(sw); - serializer.Serialize(writer, this); - if (leaveJsonWriterOpen) - return writer; - writer.Close(); - return null; - } - - public AdministrationShellEnv DeserializeFromXmlStream(TextReader reader) - { - XmlSerializer serializer = new XmlSerializer( - typeof(AdminShellV10.AdministrationShellEnv), "http://www.admin-shell.io/aas/1/0"); - var res = serializer.Deserialize(reader) as AdminShellV10.AdministrationShellEnv; - return res; - } - - public AdministrationShellEnv DeserializeFromJsonStream(TextReader reader) - { - JsonSerializer serializer = new JsonSerializer(); - serializer.Converters.Add(new AdminShellV10.JsonAasxConverter("modelType", "name")); - var res = (AdministrationShellEnv)serializer.Deserialize(reader, typeof(AdministrationShellEnv)); - return res; - } - - // special functions - - private static void CreateFromExistingEnvRecurseForCDs( - AdministrationShellEnv src, List wrappers, - ref List filterForCD) - { - if (wrappers == null || filterForCD == null) - return; - - foreach (var w in wrappers) - { - // include in filter .. - if (w.submodelElement.semanticId != null) - { - var cd = src.FindConceptDescription(w.submodelElement.semanticId.Keys); - if (cd != null) - filterForCD.Add(cd); - } - - // recurse? - if (w.submodelElement is SubmodelElementCollection) - CreateFromExistingEnvRecurseForCDs( - src, (w.submodelElement as SubmodelElementCollection).value, ref filterForCD); - - if (w.submodelElement is Operation) - for (int i = 0; i < 2; i++) - { - var w2s = Operation.GetWrappers((w.submodelElement as Operation)[i]); - CreateFromExistingEnvRecurseForCDs(src, w2s, ref filterForCD); - } - - } - } - - public static AdministrationShellEnv CreateFromExistingEnv(AdministrationShellEnv src, - List filterForAas = null, - List filterForAsset = null, - List filterForSubmodel = null, - List filterForCD = null) - { - // prepare defaults - if (filterForAas == null) - filterForAas = new List(); - if (filterForAsset == null) - filterForAsset = new List(); - if (filterForSubmodel == null) - filterForSubmodel = new List(); - if (filterForCD == null) - filterForCD = new List(); - - // make new - var res = new AdministrationShellEnv(); - - // take over AAS - foreach (var aas in src.administrationShells) - if (filterForAas.Contains(aas)) - { - // take over - res.administrationShells.Add(new AdministrationShell(aas)); - - // consequences - if (aas.assetRef != null) - { - var asset = src.FindAsset(aas.assetRef); - if (asset != null) - filterForAsset.Add(asset); - } - - if (aas.submodelRefs != null) - foreach (var smr in aas.submodelRefs) - { - var sm = src.FindSubmodel(smr); - if (sm != null) - filterForSubmodel.Add(sm); - } - - if (aas.conceptDictionaries != null) - foreach (var cdd in aas.conceptDictionaries) - if (cdd.conceptDescriptionsRefs != null && - cdd.conceptDescriptionsRefs.conceptDescriptions != null) - foreach (var cdr in cdd.conceptDescriptionsRefs.conceptDescriptions) - { - var cd = src.FindConceptDescription(cdr); - if (cd != null) - filterForCD.Add(cd); - } - } - - // take over Assets - foreach (var asset in src.assets) - if (filterForAsset.Contains(asset)) - { - // take over - res.assets.Add(new Asset(asset)); - } - - // take over Submodels - foreach (var sm in src.Submodels) - if (filterForSubmodel.Contains(sm)) - { - // take over - res.submodels.Add(new Submodel(sm)); - - // recursion in order to find used CDs - CreateFromExistingEnvRecurseForCDs(src, sm.submodelElements, ref filterForCD); - } - - // ConceptDescriptions - foreach (var cd in src.ConceptDescriptions) - if (filterForCD.Contains(cd)) - { - // take over - res.conceptDescriptions.Add(new ConceptDescription(cd)); - } - - // ok - return res; - } - } - - // - // Submodel + Submodel elements - // - - public interface IGetReference - { - Reference GetReference(); - } - - public class Qualifier - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // member - - // from hasSemantics: - [XmlElement(ElementName = "semanticId")] - // TODO (Michael Hoffmeister, 1970-01-01): Qualifiers not working! - // 190410: test-wise enable them again, everyhing works fine .. - public SemanticId semanticId = null; - - // this class - public string qualifierType = null; - public string qualifierValue = null; - public Reference qualifierValueId = null; - - // constructors - - public Qualifier() { } - - public Qualifier(Qualifier src) - { - if (src.semanticId != null) - this.semanticId = new SemanticId(src.semanticId); - this.qualifierType = src.qualifierType; - this.qualifierValue = src.qualifierValue; - if (src.qualifierValueId != null) - this.qualifierValueId = new Reference(src.qualifierValueId); - } - - public string GetElementName() - { - return "Qualifier"; - } - } - - public class SubmodelElement : Referable, System.IDisposable, IGetReference - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // members - - // do this in order to be IDisposable, that is: suitable for (using) - void System.IDisposable.Dispose() { } - public void GetData() { } - // from hasDataSpecification: - [XmlElement(ElementName = "hasDataSpecification")] - public HasDataSpecification hasDataSpecification = null; - // from hasSemantics: - [XmlElement(ElementName = "semanticId")] - public SemanticId semanticId = null; - // from hasKind: - [XmlElement(ElementName = "kind")] - [JsonIgnore] - public Kind kind = null; - [XmlIgnore] - [JsonProperty(PropertyName = "kind")] - public string JsonKind - { - get - { - if (kind == null) - return null; - return kind.kind; - } - set - { - if (kind == null) - kind = new Kind(); - kind.kind = value; - } - } - // from Qualifiable: - [XmlArray("qualifier")] - [XmlArrayItem("qualifier")] - [JsonProperty(PropertyName = "constraints")] - public List qualifiers = null; - - // getter / setter - - // constructors / creators - - public SubmodelElement() - : base() { } - - public SubmodelElement(SubmodelElement src) - : base(src) - { - if (src.hasDataSpecification != null) - hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - if (src.semanticId != null) - semanticId = new SemanticId(src.semanticId); - if (src.kind != null) - kind = new Kind(src.kind); - if (src.qualifiers != null) - { - if (qualifiers == null) - qualifiers = new List(); - foreach (var q in src.qualifiers) - qualifiers.Add(new Qualifier(q)); - } - } - - public void CreateNewLogic(string idShort = null, string category = null, Key semanticIdKey = null) - { - if (idShort != null) - this.idShort = idShort; - if (category != null) - this.category = category; - if (semanticIdKey != null) - { - if (this.semanticId == null) - this.semanticId = new SemanticId(); - this.semanticId.Keys.Add(semanticIdKey); - } - } - - public void AddQualifier( - string qualifierType = null, string qualifierValue = null, KeyList semanticKeys = null, - Reference qualifierValueId = null) - { - if (this.qualifiers == null) - this.qualifiers = new List(); - var q = new Qualifier(); - q.qualifierType = qualifierType; - q.qualifierValue = qualifierValue; - q.qualifierValueId = qualifierValueId; - if (semanticKeys != null) - q.semanticId = SemanticId.CreateFromKeys(semanticKeys.Keys); - this.qualifiers.Add(q); - } - - public Qualifier HasQualifierOfType(string qualifierType) - { - if (this.qualifiers == null || qualifierType == null) - return null; - foreach (var q in this.qualifiers) - if (q.qualifierType.Trim().ToLower() == qualifierType.Trim().ToLower()) - return q; - return null; - } - - public override string GetElementName() - { - return "SubmodelElement"; - } - - public Reference GetReference() - { - Reference r = new Reference(); - // this is the tail of our referencing chain .. - r.Keys.Add(Key.CreateNew(GetElementName(), true, "idShort", this.idShort)); - // try to climb up .. - var current = this.parent; - while (current != null) - { - if (current is Identifiable) - { - // add big information set - r.Keys.Insert(0, Key.CreateNew( - current.GetElementName(), - true, - (current as Identifiable).identification.idType, - (current as Identifiable).identification.id)); - } - else - { - // reference via idShort - r.Keys.Insert(0, Key.CreateNew( - current.GetElementName(), - true, - "idShort", this.idShort)); - } - current = current.parent; - } - return r; - } - - public Tuple ToCaptionInfo() - { - var caption = AdminShellUtilV10.EvalToNonNullString("\"{0}\" ", idShort, ""); - var info = ""; - if (semanticId != null) - info = AdminShellUtilV10.EvalToNonEmptyString("\u21e8 {0}", semanticId.ToString(), ""); - return Tuple.Create(caption, info); - } - - public override string ToString() - { - var ci = ToCaptionInfo(); - return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); - } - - - } - - [XmlType(TypeName = "submodelElement")] - public class SubmodelElementWrapper - { - - // members - - [XmlElement(ElementName = "property", Type = typeof(Property))] - [XmlElement(ElementName = "file", Type = typeof(File))] - [XmlElement(ElementName = "blob", Type = typeof(Blob))] - [XmlElement(ElementName = "referenceElement", Type = typeof(ReferenceElement))] - [XmlElement(ElementName = "relationshipElement", Type = typeof(RelationshipElement))] - [XmlElement(ElementName = "submodelElementCollection", Type = typeof(SubmodelElementCollection))] - [XmlElement(ElementName = "operation", Type = typeof(Operation))] - public SubmodelElement submodelElement; - - // element names - public static string[] AdequateElementNames = { - "SubmodelElementCollection", "Property", "File", "Blob", "ReferenceElement", - "RelationshipElement", "Operation", "OperationVariable" }; - - // constructors - - public SubmodelElementWrapper() { } - - // for cloning - public SubmodelElementWrapper(SubmodelElement src, bool shallowCopy = false) - { - if (src is Property) - this.submodelElement = new Property(src as Property); - if (src is File) - this.submodelElement = new File(src as File); - if (src is Blob) - this.submodelElement = new Blob(src as Blob); - if (src is ReferenceElement) - this.submodelElement = new ReferenceElement(src as ReferenceElement); - if (src is RelationshipElement) - this.submodelElement = new RelationshipElement(src as RelationshipElement); - if (src is SubmodelElementCollection) - this.submodelElement = new SubmodelElementCollection( - src as SubmodelElementCollection, shallowCopy: shallowCopy); - if (src is Operation) - this.submodelElement = new Operation(src as Operation); - } - - /// - /// Introduced for JSON serialization, can create SubModelElements based on a string name - /// - /// string name (standard PascalCased) - /// SubmodelElement - public static SubmodelElement CreateAdequateType(string elementName) - { - if (elementName == "Property") - return new Property(); - if (elementName == "File") - return new File(); - if (elementName == "Blob") - return new Blob(); - if (elementName == "ReferenceElement") - return new ReferenceElement(); - if (elementName == "RelationshipElement") - return new RelationshipElement(); - if (elementName == "SubmodelElementCollection") - return new SubmodelElementCollection(); - if (elementName == "Operation") - return new Operation(); - if (elementName == "OperationVariable") - return new OperationVariable(); - return null; - } - - /// - /// Can create SubmodelElements based on a numerical index - /// - /// Index 0..7 (6+7 are Operation..!) - /// SubmodelElement - public static SubmodelElement CreateAdequateType(int index) - { - AdminShellV10.SubmodelElement sme = null; - switch (index) - { - case 0: - sme = new AdminShellV10.Property(); - break; - case 1: - sme = new AdminShellV10.File(); - break; - case 2: - sme = new AdminShellV10.Blob(); - break; - case 3: - sme = new AdminShellV10.ReferenceElement(); - break; - case 4: - sme = new AdminShellV10.SubmodelElementCollection(); - break; - case 5: - sme = new AdminShellV10.RelationshipElement(); - break; - case 6: - sme = new AdminShellV10.Operation(); - break; - case 7: - sme = new AdminShellV10.OperationVariable(); - break; - } - return sme; - } - - public string GetFourDigitCode() - { - if (submodelElement == null) - return ("Null"); - if (submodelElement is AdminShellV10.Property) return ("Prop"); - if (submodelElement is AdminShellV10.File) return ("File"); - if (submodelElement is AdminShellV10.Blob) return ("Blob"); - if (submodelElement is AdminShellV10.ReferenceElement) return ("Ref"); - if (submodelElement is AdminShellV10.RelationshipElement) return ("Rel"); - if (submodelElement is AdminShellV10.SubmodelElementCollection) return ("Coll"); - if (submodelElement is AdminShellV10.Operation) return ("Opr"); - return ("Elem"); - } - - public static List ListOfWrappersToListOfElems(List wrappers) - { - var res = new List(); - if (wrappers == null) - return res; - foreach (var w in wrappers) - if (w.submodelElement != null) - res.Add(w.submodelElement); - return res; - } - - public static SubmodelElementWrapper CreateFor(SubmodelElement sme) - { - var res = new SubmodelElementWrapper(); - res.submodelElement = sme; - return res; - } - - public static Referable FindReferableByReference( - List wrappers, Reference rf, int keyIndex) - { - // first index needs to exist .. - if (wrappers == null || rf == null || keyIndex >= rf.Count) - return null; - - // as SubmodelElements are not Identifiables, the actual key shall be IdSHort - if (rf[keyIndex].idType.Trim().ToLower() != - Key.GetIdentifierTypeName(Key.IdentifierType.IdShort).Trim().ToLower()) - return null; - - // over all wrappers - if (wrappers != null) - foreach (var smw in wrappers) - if (smw.submodelElement != null && - smw.submodelElement.idShort.Trim().ToLower() == rf[keyIndex].value.Trim().ToLower()) - { - // match on this level. Did we find a leaf element? - if ((keyIndex + 1) >= rf.Count) - return smw.submodelElement; - - // ok, not a leaf, must be a recursion - // int SMEC - if (smw.submodelElement is SubmodelElementCollection) - return FindReferableByReference( - (smw.submodelElement as SubmodelElementCollection).value, rf, keyIndex + 1); - - // TODO (Michael Hoffmeister, 1970-01-01): Operation - - // else: - return null; - } - - // no? - return null; - } - } - - public class Submodel : Identifiable, System.IDisposable, IGetReference - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // members - - // do this in order to be IDisposable, that is: suitable for (using) - void System.IDisposable.Dispose() { } - public void GetData() { } - // from hasDataSpecification: - [XmlElement(ElementName = "hasDataSpecification")] - public HasDataSpecification hasDataSpecification = null; - // from hasSemanticId: - [XmlElement(ElementName = "semanticId")] - public SemanticId semanticId = new SemanticId(); - // from Kindable - [XmlElement(ElementName = "kind")] - [JsonIgnore] - public Kind kind = new Kind(); - [XmlIgnore] - [JsonProperty(PropertyName = "kind")] - public string JsonKind - { - get - { - if (kind == null) - return null; - return kind.kind; - } - set - { - if (kind == null) - kind = new Kind(); - kind.kind = value; - } - } - // from Qualifiable: - [XmlArray("qualifier")] - [XmlArrayItem("qualifier")] - public List qualifiers = null; - - // from this very class - [JsonIgnore] - public List submodelElements = null; - [XmlIgnore] - [JsonProperty(PropertyName = "submodelElements")] - public SubmodelElement[] JsonSubmodelElements - { - get - { - var res = new List(); - if (submodelElements != null) - foreach (var smew in submodelElements) - res.Add(smew.submodelElement); - return res.ToArray(); - } - set - { - if (value != null) - { - this.submodelElements = new List(); - foreach (var x in value) - { - var smew = new SubmodelElementWrapper(); - smew.submodelElement = x; - this.submodelElements.Add(smew); - } - } - } - } - - // getter / setter - - // constructors / creators - - public Submodel() : base() { } - - public Submodel(Submodel src, bool shallowCopy = false) - : base(src) - { - if (src.hasDataSpecification != null) - this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - if (src.semanticId != null) - this.semanticId = new SemanticId(src.semanticId); - if (src.kind != null) - this.kind = new Kind(src.kind); - if (!shallowCopy && src.submodelElements != null) - { - if (this.submodelElements == null) - this.submodelElements = new List(); - foreach (var smw in src.submodelElements) - this.submodelElements.Add(new SubmodelElementWrapper(smw.submodelElement, shallowCopy)); - } - } - - public static Submodel CreateNew(string idType, string id, string version = null, string revision = null) - { - var s = new Submodel(); - s.identification.idType = idType; - s.identification.id = id; - if (version != null) - { - if (s.administration == null) - s.administration = new Administration(); - s.administration.version = version; - s.administration.revision = revision; - } - return (s); - } - - public override string GetElementName() - { - return "Submodel"; - } - - public Reference GetReference() - { - SubmodelRef l = new SubmodelRef(); - l.Keys.Add( - Key.CreateNew(this.GetElementName(), true, this.identification.idType, this.identification.id)); - return l; - } - - public void Add(SubmodelElement se) - { - if (submodelElements == null) - submodelElements = new List(); - var sew = new SubmodelElementWrapper(); - se.parent = this; // track parent here! - sew.submodelElement = se; - submodelElements.Add(sew); - } - - public void AddDataSpecification(Key k) - { - if (hasDataSpecification == null) - hasDataSpecification = new HasDataSpecification(); - var r = new Reference(); - r.Keys.Add(k); - hasDataSpecification.reference.Add(r); - } - - public SubmodelElementWrapper FindSubmodelElementWrapper(string idShort) - { - if (this.submodelElements == null) - return null; - foreach (var smw in this.submodelElements) - if (smw.submodelElement != null) - if (smw.submodelElement.idShort.Trim().ToLower() == idShort.Trim().ToLower()) - return smw; - return null; - } - - public Tuple ToCaptionInfo() - { - var caption = AdminShellUtilV10.EvalToNonNullString("\"{0}\" ", idShort, ""); - if (administration != null) - caption += "V" + administration.version + "." + administration.revision; - var info = ""; - if (identification != null) - info = $"[{identification.idType}, {identification.id}]"; - return Tuple.Create(caption, info); - } - - public override string ToString() - { - var ci = ToCaptionInfo(); - return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); - } - - // Recursing - - private void RecurseOnSubmodelElementsRecurse( - List wrappers, object state, List parents, - Action, SubmodelElement> lambda) - { - // trivial - if (wrappers == null || parents == null || lambda == null) - return; - - // over all elements - foreach (var smw in wrappers) - { - var current = smw.submodelElement; - if (current == null) - continue; - - // call lambda for this element - lambda(state, parents, current); - - // add to parents - parents.Add(current); - - // dive into? - if (current is SubmodelElementCollection) - { - var smc = current as SubmodelElementCollection; - RecurseOnSubmodelElementsRecurse(smc.value, state, parents, lambda); - } - - if (current is Operation) - { - var op = current as Operation; - for (int i = 0; i < 2; i++) - RecurseOnSubmodelElementsRecurse(Operation.GetWrappers(op[i]), state, parents, lambda); - } - - // remove from parents - parents.RemoveAt(parents.Count - 1); - } - } - - public void RecurseOnSubmodelElements( - object state, Action, SubmodelElement> lambda) - { - RecurseOnSubmodelElementsRecurse(this.submodelElements, state, new List(), lambda); - } - - // Parents stuff - - private static void SetParentsForSME(Referable parent, SubmodelElement se) - { - se.parent = parent; - var smc = se as SubmodelElementCollection; - if (smc != null) - foreach (var sme in smc.value) - SetParentsForSME(se, sme.submodelElement); - } - - public void SetAllParents() - { - if (this.submodelElements != null) - foreach (var sme in this.submodelElements) - SetParentsForSME(this, sme.submodelElement); - } - - } - - // - // Derived from SubmodelElements - // - - public class DataElement : SubmodelElement - { - - public DataElement() { } - - public DataElement(DataElement src) - : base(src) - { } - - public override string GetElementName() - { - return "DataElement"; - } - } - - public class JsonValueTypeCast - { - - public class JsonDataObjectType - { - [JsonProperty(PropertyName = "name")] - public string name = ""; - } - - [JsonProperty(PropertyName = "dataObjectType")] - public JsonDataObjectType dataObjectType = new JsonDataObjectType(); - - public JsonValueTypeCast(string name) - { - this.dataObjectType.name = name; - } - } - - public class Property : DataElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - - [JsonIgnore] - public string valueType = ""; - [XmlIgnore] - [JsonProperty(PropertyName = "valueType")] - public JsonValueTypeCast JsonValueType - { - get { return new JsonValueTypeCast(this.valueType); } - set { this.valueType = value?.dataObjectType?.name; } - } - - - public string value = ""; - public Reference valueId = null; - - // constructors - - public Property() { } - - public Property(Property src) - : base(src) - { - this.valueType = src.valueType; - this.value = src.value; - if (src.valueId != null) - src.valueId = new Reference(src.valueId); - } - - public static Property CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new Property(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - public void Set(string valueType = "", string value = "") - { - this.valueType = valueType; - this.value = value; - } - - public void Set(string type, bool local, string idType, string value) - { - this.valueId = Reference.CreateNew(Key.CreateNew(type, local, idType, value)); - } - - public override string GetElementName() - { - return "Property"; - } - } - - public class Blob : DataElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - - public string mimeType = ""; - public string value = ""; - - // constructors - - public Blob() { } - - public Blob(Blob src) - : base(src) - { - this.mimeType = src.mimeType; - this.value = src.value; - } - - public static Blob CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new Blob(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - public void Set(string mimeType = "", string value = "") - { - this.mimeType = mimeType; - this.value = value; - } - - public override string GetElementName() - { - return "Blob"; - } - - } - - public class File : DataElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - - public string mimeType = ""; - public string value = ""; - - // constructors - - public File() { } - - public File(File src) - : base(src) - { - this.mimeType = src.mimeType; - this.value = src.value; - } - - public static File CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new File(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - public void Set(string mimeType = "", string value = "") - { - this.mimeType = mimeType; - this.value = value; - } - - public override string GetElementName() - { - return "File"; - } - - public static string[] GetPopularMimeTypes() - { - return - new string[] { - System.Net.Mime.MediaTypeNames.Text.Plain, - System.Net.Mime.MediaTypeNames.Text.Xml, - System.Net.Mime.MediaTypeNames.Text.Html, - "application/json", - "application/rdf+xml", - System.Net.Mime.MediaTypeNames.Application.Pdf, - System.Net.Mime.MediaTypeNames.Image.Jpeg, - "image/png", - System.Net.Mime.MediaTypeNames.Image.Gif, - "application/iges", - "application/step" - }; - } - } - - public class ReferenceElement : DataElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - - public Reference value = new Reference(); - - // constructors - - public ReferenceElement() { } - - public ReferenceElement(ReferenceElement src) - : base(src) - { - if (src.value != null) - this.value = new Reference(src.value); - } - - public static ReferenceElement CreateNew( - string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new ReferenceElement(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - public void Set(Reference value = null) - { - this.value = value; - } - - public override string GetElementName() - { - return "ReferenceElement"; - } - - } - - public class RelationshipElement : DataElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - - public Reference first = new Reference(); - public Reference second = new Reference(); - - // constructors - - public RelationshipElement() { } - - public RelationshipElement(RelationshipElement src) - : base(src) - { - if (src.first != null) - this.first = new Reference(src.first); - if (src.second != null) - this.second = new Reference(src.second); - } - - public static RelationshipElement CreateNew( - string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new RelationshipElement(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - public void Set(Reference first = null, Reference second = null) - { - this.first = first; - this.second = second; - } - - public override string GetElementName() - { - return "RelationshipElement"; - } - } - - public class SubmodelElementCollection : SubmodelElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - [JsonIgnore] - public List value = new List(); - - [XmlIgnore] - [JsonProperty(PropertyName = "value")] - public SubmodelElement[] JsonValue - { - get - { - var res = new List(); - if (value != null) - foreach (var smew in value) - res.Add(smew.submodelElement); - return res.ToArray(); - } - set - { - if (value != null) - { - this.value = new List(); - foreach (var x in value) - { - var smew = new SubmodelElementWrapper(); - smew.submodelElement = x; - this.value.Add(smew); - } - } - } - } - - // further members - public bool ordered = false; - public bool allowDuplicates = false; - - // constructors - - public SubmodelElementCollection() { } - - public SubmodelElementCollection(SubmodelElementCollection src, bool shallowCopy = false) - : base(src) - { - this.ordered = src.ordered; - this.allowDuplicates = src.allowDuplicates; - if (!shallowCopy) - foreach (var smw in src.value) - value.Add(new SubmodelElementWrapper(smw.submodelElement)); - } - - public static SubmodelElementCollection CreateNew( - string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new SubmodelElementCollection(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - public void Set(bool allowDuplicates = false, bool ordered = false) - { - this.allowDuplicates = allowDuplicates; - this.ordered = ordered; - } - - public void Add(SubmodelElement se) - { - if (value == null) - value = new List(); - var sew = new SubmodelElementWrapper(); - se.parent = this; // track parent here! - sew.submodelElement = se; - value.Add(sew); - } - - public SubmodelElementWrapper FindSubmodelElementWrapper(string idShort) - { - if (this.value == null) - return null; - foreach (var smw in this.value) - if (smw.submodelElement != null) - if (smw.submodelElement.idShort.Trim().ToLower() == idShort.Trim().ToLower()) - return smw; - return null; - } - - public override string GetElementName() - { - return "SubmodelElementCollection"; - } - } - - public class OperationVariable : SubmodelElement - { - public enum Direction { In, Out }; - - // Note: for OperationVariable, the values of the SubmodelElement itself ARE NOT TO BE USED! - // only the SME attributes of "value" are counting - - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - public SubmodelElementWrapper value = null; - - // constructors - - public OperationVariable() - { - this.kind = new Kind("Type"); - } - - public OperationVariable(OperationVariable src, bool shallowCopy = false) - : base(src) - { - this.value = new SubmodelElementWrapper(src.value.submodelElement, shallowCopy); - } - - public OperationVariable(SubmodelElement elem) - : base() - { - this.value = new SubmodelElementWrapper(elem); - } - - public override string GetElementName() - { - return "OperationVariable"; - } - } - - public class Operation : SubmodelElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - [JsonIgnore] - [XmlElement(ElementName = "in")] - public List valueIn = new List(); - - [JsonIgnore] - [XmlElement(ElementName = "out")] - public List valueOut = new List(); - - [XmlIgnore] - // MICHA 190504: enabled JSON operation variables! - [JsonProperty(PropertyName = "in")] - public OperationVariable[] JsonValueIn - { - get { return valueIn?.ToArray(); } - set { valueIn = (value != null) ? new List(value) : null; } - } - - [XmlIgnore] - [JsonProperty(PropertyName = "out")] - // MICHA 190504: enabled JSON operation variables! - public OperationVariable[] JsonValueOut - { - get { return valueOut?.ToArray(); } - set { valueOut = (value != null) ? new List(value) : null; } - } - - public List this[OperationVariable.Direction dir] - { - get - { - return (dir == OperationVariable.Direction.In) ? valueIn : valueOut; - } - set - { - if (dir == OperationVariable.Direction.In) - valueIn = value; - else - valueOut = value; - } - } - - public List this[int dir] - { - get - { - return (dir == 0) ? valueIn : valueOut; - } - set - { - if (dir == 0) - valueIn = value; - else - valueOut = value; - } - } - - public static List GetWrappers(List ovl) - { - var res = new List(); - foreach (var ov in ovl) - if (ov.value != null) - res.Add(ov.value); - return res; - } - - // constructors - - public Operation() { } - - public Operation(Operation src) - : base(src) - { - for (int i = 0; i < 2; i++) - if (src[i] != null) - { - if (this[i] == null) - this[i] = new List(); - foreach (var ov in src[i]) - this[i].Add(ov); - } - } - - - public override string GetElementName() - { - return "Operation"; - } - } - - // - // Handling of packages - // - - /// - /// This converter is used for reading JSON files; it claims to be responsible for - /// "SubmodelElements" (the base class) - /// and decides, which sub-class of the base class shall be populated. - /// The decision, shich special sub-class to create is done in a factory - /// AdminShell.SubmodelElementWrapper.CreateAdequateType(), - /// in order to have all sub-class specific decisions in one place (SubmodelElementWrapper) - /// Remark: There is a NuGet package JsonSubTypes, which could have done the job, except the fact of having - /// "modelType" being a class property with a contained property "name". - /// - public class JsonAasxConverter : JsonConverter - { - private string UpperClassProperty = "modelType"; - private string LowerClassProperty = "name"; - - public JsonAasxConverter() : base() - { - } - - public JsonAasxConverter(string UpperClassProperty, string LowerClassProperty) : base() - { - this.UpperClassProperty = UpperClassProperty; - this.LowerClassProperty = LowerClassProperty; - } - - public override bool CanConvert(Type objectType) - { - if (typeof(AdminShellV10.SubmodelElement).IsAssignableFrom(objectType)) - return true; - return false; - } - - public override bool CanWrite - { - get { return false; } - } - - public override object ReadJson(JsonReader reader, - Type objectType, - object existingValue, - JsonSerializer serializer) - { - // Load JObject from stream - JObject jObject = JObject.Load(reader); - - // Create target object based on JObject - object target = new AdminShellV10.SubmodelElement(); - - if (jObject.ContainsKey(UpperClassProperty)) - { - var j2 = jObject[UpperClassProperty]; - foreach (var c in j2.Children()) - { - var cprop = c as Newtonsoft.Json.Linq.JProperty; - if (cprop == null) - continue; - if (cprop.Name == LowerClassProperty && - cprop.Value != null && - cprop.Value.Type.ToString() == "String") - { - var cpval = cprop.Value.ToObject(); - if (cpval == null) - continue; - var o = AdminShellV10.SubmodelElementWrapper.CreateAdequateType(cpval); - if (o != null) - target = o; - } - } - } - - // Populate the object properties - serializer.Populate(jObject.CreateReader(), target); - - return target; - } - - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) - { - throw new NotImplementedException(); - } - } - - /// - /// This class lets an outer functionality keep track on the supplementary files, which are in or - /// are pending to be added or deleted to an Package. - /// - public class PackageSupplementaryFile : Referable - { - public enum LocationType { InPackage, AddPending, DeletePending } - - public enum SpecialHandlingType { None, EmbedAsThumbnail } - - public Uri uri = null; - public string sourcePath = null; - public LocationType location = LocationType.InPackage; - public SpecialHandlingType specialHandling = SpecialHandlingType.None; - - public PackageSupplementaryFile( - Uri uri, string sourcePath = null, LocationType location = LocationType.InPackage, - SpecialHandlingType specialHandling = SpecialHandlingType.None) - { - this.uri = uri; - this.sourcePath = sourcePath; - this.location = location; - this.specialHandling = specialHandling; - } - - // class derives from Referable in order to provide GetElementName - public override string GetElementName() - { - return "File"; - } - - } - - /// - /// This class encapsulates an AdminShellEnvironment and supplementary files into an AASX Package. - /// Specifically has the capability to load, update and store .XML, .JSON and .AASX packages. - /// - public class PackageEnv - { - private string fn = "New Package"; - private AdministrationShellEnv aasenv = new AdministrationShellEnv(); - private Package openPackage = null; - private List pendingFilesToAdd = new List(); - private List pendingFilesToDelete = new List(); - - public PackageEnv() - { - } - - public PackageEnv(AdministrationShellEnv env) - { - if (env != null) - this.aasenv = env; - } - - public PackageEnv(string fn) - { - Load(fn); - } - - public bool IsOpen - { - get - { - return openPackage != null; - } - } - - public string Filename - { - get - { - return fn; - } - } - - public AdminShellV10.AdministrationShellEnv AasEnv - { - get - { - return aasenv; - } - } - - public bool Load(string fn) - { - this.fn = fn; - if (this.openPackage != null) - this.openPackage.Close(); - this.openPackage = null; - - if (fn.ToLower().EndsWith(".xml")) - { - // load only XML - try - { - // TODO (Michael Hoffmeister, 1970-01-01): use aasenv serialzers here! - XmlSerializer serializer = new XmlSerializer( - typeof(AdminShellV10.AdministrationShellEnv), "http://www.admin-shell.io/aas/1/0"); - TextReader reader = new StreamReader(fn); - this.aasenv = serializer.Deserialize(reader) as AdminShellV10.AdministrationShellEnv; - if (this.aasenv == null) - throw (new Exception("Type error for XML file!")); - reader.Close(); - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While reading AAS {0} at {1} gave: {2}", fn, - AdminShellUtilV10.ShortLocation(ex), ex.Message))); - } - return true; - } - - if (fn.ToLower().EndsWith(".json")) - { - // load only JSON - try - { - using (StreamReader file = System.IO.File.OpenText(fn)) - { - // TODO (Michael Hoffmeister, 1970-01-01): use aasenv serialzers here! - JsonSerializer serializer = new JsonSerializer(); - serializer.Converters.Add(new AdminShellV10.JsonAasxConverter("modelType", "name")); - this.aasenv = (AdministrationShellEnv)serializer.Deserialize( - file, typeof(AdministrationShellEnv)); - } - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While reading AAS {0} at {1} gave: {2}", - fn, AdminShellUtilV10.ShortLocation(ex), ex.Message))); - } - return true; - } - - if (fn.ToLower().EndsWith(".aasx")) - { - // load package AASX - try - { - var package = Package.Open(fn, FileMode.Open); - - // get the origin from the package - PackagePart originPart = null; - var xs = package.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aasx-origin"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/") - { - originPart = package.GetPart(x.TargetUri); - break; - } - if (originPart == null) - throw (new Exception(string.Format("Unable to find AASX origin. Aborting!"))); - - // get the specs from the package - PackagePart specPart = null; - xs = originPart.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aas-spec"); - foreach (var x in xs) - { - specPart = package.GetPart(x.TargetUri); - break; - } - if (specPart == null) - throw (new Exception(string.Format("Unable to find AASX spec(s). Aborting!"))); - - // open spec part to read - try - { - if (specPart.Uri.ToString().ToLower().Trim().EndsWith("json")) - { - using (var s = specPart.GetStream(FileMode.Open)) - { - using (StreamReader file = new StreamReader(s)) - { - JsonSerializer serializer = new JsonSerializer(); - serializer.Converters.Add( - new AdminShellV10.JsonAasxConverter("modelType", "name")); - this.aasenv = (AdministrationShellEnv)serializer.Deserialize( - file, typeof(AdministrationShellEnv)); - } - } - } - else - { - using (var s = specPart.GetStream(FileMode.Open)) - { - // own catch loop to be more specific - XmlSerializer serializer = new XmlSerializer( - typeof(AdminShellV10.AdministrationShellEnv), - "http://www.admin-shell.io/aas/1/0"); - this.aasenv = serializer.Deserialize(s) as AdminShellV10.AdministrationShellEnv; - this.openPackage = package; - if (this.aasenv == null) - throw (new Exception("Type error for XML file!")); - s.Close(); - } - } - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While reading AAS {0} spec at {1} gave: {2}", - fn, AdminShellUtilV10.ShortLocation(ex), ex.Message))); - } - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While reading AASX {0} at {1} gave: {2}", fn, - AdminShellUtilV10.ShortLocation(ex), ex.Message))); - } - return true; - } - - // Don't know to handle - throw (new Exception(string.Format($"Not able to handle {fn}."))); - } - - public bool LoadFromAasEnvString(string content) - { - try - { - using (var file = new StringReader(content)) - { - // TODO (Michael Hoffmeister, 1970-01-01): use aasenv serialzers here! - JsonSerializer serializer = new JsonSerializer(); - serializer.Converters.Add(new AdminShellV10.JsonAasxConverter("modelType", "name")); - this.aasenv = (AdministrationShellEnv)serializer.Deserialize( - file, typeof(AdministrationShellEnv)); - } - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While reading AASENV string {0} gave: {1}", - AdminShellUtilV10.ShortLocation(ex), ex.Message))); - } - return true; - } - - public enum PreferredFormat { None, Xml, Json }; - - public bool SaveAs(string fn, bool writeFreshly = false, PreferredFormat prefFmt = PreferredFormat.None) - { - - if (fn.ToLower().EndsWith(".xml")) - { - // save only XML - this.fn = fn; - try - { - using (var s = new StreamWriter(this.fn)) - { - // TODO (Michael Hoffmeister, 1970-01-01): use aasenv serialzers here! - var serializer = new XmlSerializer(typeof(AdminShellV10.AdministrationShellEnv)); - var nss = new XmlSerializerNamespaces(); - nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace); - nss.Add("aas", "http://www.admin-shell.io/aas/1/0"); - nss.Add("IEC61360", "http://www.admin-shell.io/IEC61360/1/0"); - serializer.Serialize(s, this.aasenv, nss); - } - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While writing AAS {0} at {1} gave: {2}", - fn, AdminShellUtilV10.ShortLocation(ex), ex.Message))); - } - return true; - } - - if (fn.ToLower().EndsWith(".json")) - { - // save only JSON - // this funcitonality is a initial test - this.fn = fn; - try - { - using (var sw = new StreamWriter(fn)) - { - // TODO (Michael Hoffmeister, 1970-01-01): use aasenv serialzers here! - - sw.AutoFlush = true; - - JsonSerializer serializer = new JsonSerializer(); - serializer.NullValueHandling = NullValueHandling.Ignore; - serializer.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; - serializer.Formatting = Newtonsoft.Json.Formatting.Indented; - using (JsonWriter writer = new JsonTextWriter(sw)) - { - serializer.Serialize(writer, this.aasenv); - } - } - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While writing AAS {0} at {1} gave: {2}", - fn, AdminShellUtilV10.ShortLocation(ex), ex.Message))); - } - return true; - } - - if (fn.ToLower().EndsWith(".aasx")) - { - // save package AASX - try - { - // we want existing contents to be preserved, but no possiblity to change file name - // therefore: copy file to new name, re-open! - // fn could be changed, therefore close "old" package first - if (this.openPackage != null) - { - try - { - this.openPackage.Close(); - if (!writeFreshly) - System.IO.File.Copy(this.fn, fn); - } - catch { } - this.openPackage = null; - } - - // approach is to utilize the existing package, if possible. If not, create from scratch - var package = Package.Open(fn, (writeFreshly) ? FileMode.Create : FileMode.OpenOrCreate); - this.fn = fn; - - // get the origin from the package - PackagePart originPart = null; - var xs = package.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aasx-origin"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/") - { - originPart = package.GetPart(x.TargetUri); - break; - } - if (originPart == null) - { - // create, as not existing - originPart = package.CreatePart( - new Uri( - "/aasx/aasx-origin", UriKind.RelativeOrAbsolute), - System.Net.Mime.MediaTypeNames.Text.Plain, CompressionOption.Maximum); - using (var s = originPart.GetStream(FileMode.Create)) - { - var bytes = System.Text.Encoding.ASCII.GetBytes("Intentionally empty."); - s.Write(bytes, 0, bytes.Length); - } - package.CreateRelationship( - originPart.Uri, TargetMode.Internal, - "http://www.admin-shell.io/aasx/relationships/aasx-origin"); - } - - // get the specs from the package - PackagePart specPart = null; - PackageRelationship specRel = null; - xs = originPart.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aas-spec"); - foreach (var x in xs) - { - specRel = x; - specPart = package.GetPart(x.TargetUri); - break; - } - - // check, if we have to change the spec part - if (specPart != null && specRel != null) - { - var name = System.IO.Path.GetFileNameWithoutExtension( - specPart.Uri.ToString()).ToLower().Trim(); - var ext = System.IO.Path.GetExtension(specPart.Uri.ToString()).ToLower().Trim(); - if ((ext == ".json" && prefFmt == PreferredFormat.Xml) - || (ext == ".xml" && prefFmt == PreferredFormat.Json) - || (name.StartsWith("aasenv-with-no-id"))) - { - // try kill specpart - try - { - originPart.DeleteRelationship(specRel.Id); - package.DeletePart(specPart.Uri); - } - catch { } - finally { specPart = null; specRel = null; } - } - } - - if (specPart == null) - { - // create, as not existing - var frn = "aasenv-with-no-id"; - if (this.aasenv.AdministrationShells.Count > 0) - frn = this.aasenv.AdministrationShells[0].GetFriendlyName() ?? frn; - var aas_spec_fn = "/aasx/#/#.aas"; - if (prefFmt == PreferredFormat.Json) - aas_spec_fn += ".json"; - else - aas_spec_fn += ".xml"; - aas_spec_fn = aas_spec_fn.Replace("#", "" + frn); - specPart = package.CreatePart( - new Uri( - aas_spec_fn, UriKind.RelativeOrAbsolute), System.Net.Mime.MediaTypeNames.Text.Xml, - CompressionOption.Maximum); - originPart.CreateRelationship( - specPart.Uri, TargetMode.Internal, - "http://www.admin-shell.io/aasx/relationships/aas-spec"); - } - - // now, specPart shall be != null! - if (specPart.Uri.ToString().ToLower().Trim().EndsWith("json")) - { - using (var s = specPart.GetStream(FileMode.Create)) - { - JsonSerializer serializer = new JsonSerializer(); - serializer.NullValueHandling = NullValueHandling.Ignore; - serializer.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; - serializer.Formatting = Newtonsoft.Json.Formatting.Indented; - using (var sw = new StreamWriter(s)) - { - using (JsonWriter writer = new JsonTextWriter(sw)) - { - serializer.Serialize(writer, this.aasenv); - } - } - } - } - else - { - using (var s = specPart.GetStream(FileMode.Create)) - { - var serializer = new XmlSerializer(typeof(AdminShellV10.AdministrationShellEnv)); - var nss = new XmlSerializerNamespaces(); - nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace); - nss.Add("aas", "http://www.admin-shell.io/aas/1/0"); - nss.Add("IEC61360", "http://www.admin-shell.io/IEC61360/1/0"); - serializer.Serialize(s, this.aasenv, nss); - } - } - - // there might be pending files to be deleted (first delete, then add, in case of identical - // files in both categories) - foreach (var psfDel in pendingFilesToDelete) - { - // try find an existing part for that file .. - var found = false; - - // normal files - xs = specPart.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aas-suppl"); - foreach (var x in xs) - if (x.TargetUri == psfDel.uri) - { - // try to delete - specPart.DeleteRelationship(x.Id); - package.DeletePart(psfDel.uri); - found = true; - break; - } - - // thumbnails - xs = package.GetRelationshipsByType( - "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); - foreach (var x in xs) - if (x.TargetUri == psfDel.uri) - { - // try to delete - package.DeleteRelationship(x.Id); - package.DeletePart(psfDel.uri); - found = true; - break; - } - - if (!found) - throw (new Exception( - $"Not able to delete pending file {psfDel.uri} in saving package {fn}")); - } - - // after this, there are no more pending for delete files - pendingFilesToDelete.Clear(); - - // write pending supplementary files - foreach (var psfAdd in pendingFilesToAdd) - { - // make sure .. - if (psfAdd.sourcePath == null || - psfAdd.location != PackageSupplementaryFile.LocationType.AddPending) - continue; - - // normal file? - if (psfAdd.specialHandling == PackageSupplementaryFile.SpecialHandlingType.None) - { - - // try find an existing part for that file .. - PackagePart filePart = null; - xs = specPart.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aas-suppl"); - foreach (var x in xs) - if (x.TargetUri == psfAdd.uri) - { - filePart = package.GetPart(x.TargetUri); - break; - } - - if (filePart == null) - { - // create new part and link - filePart = package.CreatePart( - psfAdd.uri, AdminShellV10.PackageEnv.GuessMimeType(psfAdd.sourcePath), - CompressionOption.Maximum); - specPart.CreateRelationship( - filePart.Uri, TargetMode.Internal, - "http://www.admin-shell.io/aasx/relationships/aas-suppl"); - } - - // now should be able to write - using (var s = filePart.GetStream(FileMode.Create)) - { - var bytes = System.IO.File.ReadAllBytes(psfAdd.sourcePath); - s.Write(bytes, 0, bytes.Length); - } - } - - // thumbnail file? - if (psfAdd.specialHandling == - PackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail) - { - // try find an existing part for that file .. - PackagePart filePart = null; - xs = package.GetRelationshipsByType( - "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/" && x.TargetUri == psfAdd.uri) - { - filePart = package.GetPart(x.TargetUri); - break; - } - - if (filePart == null) - { - // create new part and link - filePart = package.CreatePart( - psfAdd.uri, AdminShellV10.PackageEnv.GuessMimeType(psfAdd.sourcePath), - CompressionOption.Maximum); - package.CreateRelationship( - filePart.Uri, TargetMode.Internal, - "http://schemas.openxmlformats.org/package/2006/" + - "relationships/metadata/thumbnail"); - } - - // now should be able to write - using (var s = filePart.GetStream(FileMode.Create)) - { - var bytes = System.IO.File.ReadAllBytes(psfAdd.sourcePath); - s.Write(bytes, 0, bytes.Length); - } - } - } - - // after this, there are no more pending for add files - pendingFilesToAdd.Clear(); - - // flush, but leave open - package.Flush(); - this.openPackage = package; - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While write AASX {0} at {1} gave: {2}", - fn, AdminShellUtilV10.ShortLocation(ex), ex.Message))); - } - return true; - } - - // Don't know to handle - throw (new Exception(string.Format($"Not able to handle {fn}."))); - } - - private int BackupIndex = 0; - - public void BackupInDir(string backupDir, int maxFiles) - { - // access - if (backupDir == null || maxFiles < 1) - return; - - // we do it not caring on any errors - try - { - // get index in form - if (BackupIndex == 0) - { - // do not always start at 0!! - var rnd = new Random(); - BackupIndex = rnd.Next(maxFiles); - } - var ndx = BackupIndex % maxFiles; - BackupIndex += 1; - - // build a filename - var fn = Path.Combine(backupDir, $"backup{ndx:000}.xml"); - - // raw save - using (var s = new StreamWriter(fn)) - { - var serializer = new XmlSerializer(typeof(AdminShellV10.AdministrationShellEnv)); - var nss = new XmlSerializerNamespaces(); - nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace); - nss.Add("aas", "http://www.admin-shell.io/aas/1/0"); - nss.Add("IEC61360", "http://www.admin-shell.io/IEC61360/1/0"); - serializer.Serialize(s, this.aasenv, nss); - } - } - catch { } - } - - public Stream GetLocalStreamFromPackage(string uriString) - { - // access - if (this.openPackage == null) - throw (new Exception(string.Format($"AASX Package {this.fn} not opened. Aborting!"))); - var part = this.openPackage.GetPart(new Uri(uriString, UriKind.RelativeOrAbsolute)); - if (part == null) - throw (new Exception( - string.Format( - $"Cannot access URI {uriString} in {this.fn} not opened. Aborting!"))); - return part.GetStream(FileMode.Open); - } - - public long GetStreamSizeFromPackage(string uriString) - { - long res = 0; - try - { - if (this.openPackage == null) - return 0; - var part = this.openPackage.GetPart(new Uri(uriString, UriKind.RelativeOrAbsolute)); - if (part == null) - return 0; - using (var s = part.GetStream(FileMode.Open)) - { - res = s.Length; - } - } - catch { return 0; } - return res; - } - - public Stream GetLocalThumbnailStream(ref Uri thumbUri) - { - // access - if (this.openPackage == null) - throw (new Exception(string.Format($"AASX Package {this.fn} not opened. Aborting!"))); - // get the thumbnail over the relationship - PackagePart thumbPart = null; - var xs = this.openPackage.GetRelationshipsByType( - "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/") - { - thumbPart = this.openPackage.GetPart(x.TargetUri); - thumbUri = x.TargetUri; - break; - } - if (thumbPart == null) - throw (new Exception(string.Format("Unable to find AASX thumbnail. Aborting!"))); - return thumbPart.GetStream(FileMode.Open); - } - - public Stream GetLocalThumbnailStream() - { - Uri dummy = null; - return GetLocalThumbnailStream(ref dummy); - } - - public List GetListOfSupplementaryFiles() - { - // new result - var result = new List(); - - // access - if (this.openPackage != null) - { - - // get the thumbnail(s) from the package - var xs = this.openPackage.GetRelationshipsByType( - "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/") - { - result.Add(new PackageSupplementaryFile( - x.TargetUri, - location: PackageSupplementaryFile.LocationType.InPackage, - specialHandling: PackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail)); - } - - // get the origin from the package - PackagePart originPart = null; - xs = this.openPackage.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aasx-origin"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/") - { - originPart = this.openPackage.GetPart(x.TargetUri); - break; - } - - if (originPart != null) - { - // get the specs from the origin - PackagePart specPart = null; - xs = originPart.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aas-spec"); - foreach (var x in xs) - { - specPart = this.openPackage.GetPart(x.TargetUri); - break; - } - - if (specPart != null) - { - // get the supplementaries from the package, derived from spec - xs = specPart.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aas-suppl"); - foreach (var x in xs) - { - result.Add( - new PackageSupplementaryFile( - x.TargetUri, location: PackageSupplementaryFile.LocationType.InPackage)); - } - } - } - } - - // add or modify the files to delete - foreach (var psfDel in pendingFilesToDelete) - { - // already in - var found = result.Find(x => { return x.uri == psfDel.uri; }); - if (found != null) - found.location = PackageSupplementaryFile.LocationType.DeletePending; - else - { - psfDel.location = PackageSupplementaryFile.LocationType.DeletePending; - result.Add(psfDel); - } - } - - // add the files to store as well - foreach (var psfAdd in pendingFilesToAdd) - { - // already in (should not happen ?!) - var found = result.Find(x => { return x.uri == psfAdd.uri; }); - if (found != null) - found.location = PackageSupplementaryFile.LocationType.AddPending; - else - { - psfAdd.location = PackageSupplementaryFile.LocationType.AddPending; - result.Add(psfAdd); - } - } - - // done - return result; - } - - public static string GuessMimeType(string fn) - { - var file_ext = System.IO.Path.GetExtension(fn).ToLower().Trim(); - var content_type = System.Net.Mime.MediaTypeNames.Text.Plain; - if (file_ext == ".pdf") content_type = System.Net.Mime.MediaTypeNames.Application.Pdf; - if (file_ext == ".xml") content_type = System.Net.Mime.MediaTypeNames.Text.Xml; - if (file_ext == ".txt") content_type = System.Net.Mime.MediaTypeNames.Text.Plain; - if (file_ext == ".igs") content_type = "application/iges"; - if (file_ext == ".iges") content_type = "application/iges"; - if (file_ext == ".stp") content_type = "application/step"; - if (file_ext == ".step") content_type = "application/step"; - if (file_ext == ".jpg") content_type = System.Net.Mime.MediaTypeNames.Image.Jpeg; - if (file_ext == ".jpeg") content_type = System.Net.Mime.MediaTypeNames.Image.Jpeg; - if (file_ext == ".png") content_type = "image/png"; - if (file_ext == ".gif") content_type = System.Net.Mime.MediaTypeNames.Image.Gif; - return content_type; - } - - public void AddSupplementaryFileToStore( - string sourcePath, string targetDir, string targetFn, bool embedAsThumb) - { - // beautify parameters - sourcePath = sourcePath.Trim(); - targetDir = targetDir.Trim(); - if (!targetDir.EndsWith("/")) - targetDir += "/"; - targetDir = targetDir.Replace(@"\", "/"); - targetFn = targetFn.Trim(); - if (sourcePath == "" || targetDir == "" || targetFn == "") - throw (new Exception(string.Format("Trying add supplementary file with empty name or path!"))); - - var file_fn = "" + targetDir.Trim() + targetFn.Trim(); - - // add record - pendingFilesToAdd.Add( - new PackageSupplementaryFile( - new Uri(file_fn, UriKind.RelativeOrAbsolute), - sourcePath, - location: PackageSupplementaryFile.LocationType.AddPending, - specialHandling: ( - embedAsThumb - ? PackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail - : PackageSupplementaryFile.SpecialHandlingType.None) - )); - } - - public void DeleteSupplementaryFile(PackageSupplementaryFile psf) - { - if (psf == null) - throw (new Exception(string.Format("No supplementary file given!"))); - - if (psf.location == PackageSupplementaryFile.LocationType.AddPending) - { - // is still pending in add list -> remove - pendingFilesToAdd.RemoveAll((x) => { return x.uri == psf.uri; }); - } - - if (psf.location == PackageSupplementaryFile.LocationType.InPackage) - { - // add to pending delete list - pendingFilesToDelete.Add(psf); - } - } - - public void Close() - { - if (this.openPackage != null) - this.openPackage.Close(); - this.openPackage = null; - this.fn = ""; - this.aasenv = null; - } - } - - } - - #endregion -} - -#endif diff --git a/src/AasxCsharpLib_bkp/AasxCompatibilityModels/V20/AdminShell.cs b/src/AasxCsharpLib_bkp/AasxCompatibilityModels/V20/AdminShell.cs deleted file mode 100644 index 5aa491279..000000000 --- a/src/AasxCsharpLib_bkp/AasxCompatibilityModels/V20/AdminShell.cs +++ /dev/null @@ -1,8899 +0,0 @@ -/* -Copyright (c) 2018-2021 Festo AG & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections; -using System.Collections.Generic; -using System.ComponentModel; -using System.Globalization; -using System.IO; -using System.IO.Packaging; -using System.Linq; -using System.Reflection; -using System.Runtime; -using System.Text; -using System.Text.RegularExpressions; -using System.Xml; -using System.Xml.Serialization; -using AdminShell_V20; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; - -//namespace AdminShellNS -//namespace AdminShell_V20 -namespace AasxCompatibilityModels -{ - /// - /// This empty class derives always from the current version of the Administration Shell class hierarchy. - /// - public class AdminShell : AdminShellV20 { } - - #region AdminShell_V2_0 - - /// - /// Version of Details of Administration Shell Part 1 V1.0 published Nov/Dec/Jan 2018/19 - /// - public class AdminShellV20 - { - public class Identification - { - - // members - - [XmlAttribute] - [CountForHash] - public string idType = ""; - - [XmlText] - [CountForHash] - public string id = ""; - - // some constants - - public static string IRDI = "IRDI"; - public static string IRI = "IRI"; - public static string IdShort = "IdShort"; - - // constructors - - public Identification() { } - - public Identification(Identification src) - { - this.idType = src.idType; - this.id = src.id; - } - -#if !DoNotUseAasxCompatibilityModels - public Identification(AasxCompatibilityModels.AdminShellV10.Identification src) - { - this.idType = src.idType; - if (this.idType.Trim().ToLower() == "uri") - this.idType = Identification.IRI; - this.id = src.id; - } -#endif - - public Identification(string idType, string id) - { - this.idType = idType; - this.id = id; - } - - public Identification(Key key) - { - this.idType = key.idType; - this.id = key.value; - } - - // Creator with validation - - public static Identification CreateNew(string idType, string id) - { - if (idType == null || id == null) - return null; - var found = false; - foreach (var x in Key.IdentifierTypeNames) - found = found || idType.ToLower().Trim() == x.ToLower().Trim(); - if (!found) - return null; - return new Identification(idType, id); - } - - // further - - public bool IsEqual(Identification other) - { - return (this.idType.Trim().ToLower() == other.idType.Trim().ToLower() - && this.id.Trim().ToLower() == other.id.Trim().ToLower()); - } - - public bool IsIRI() - { - return idType?.Trim().ToUpper() == "URI" - || idType?.Trim().ToUpper() == IRI; - } - - public bool IsIRDI() - { - return idType?.Trim().ToUpper() == IRDI; - } - - public override string ToString() - { - return $"[{this.idType}] {this.id}"; - } - } - - public class Administration - { - - // members - - [MetaModelName("Administration.version")] - [TextSearchable] - [CountForHash] - public string version = ""; - - [MetaModelName("Administration.revision")] - [TextSearchable] - [CountForHash] - public string revision = ""; - - // constructors - - public Administration() { } - - public Administration(Administration src) - { - this.version = src.version; - this.revision = src.revision; - } - -#if !DoNotUseAasxCompatibilityModels - public Administration(AasxCompatibilityModels.AdminShellV10.Administration src) - { - this.version = src.version; - this.revision = src.revision; - } -#endif - - public Administration(string version, string revision) - { - this.version = version; - this.revision = revision; - } - - public override string ToString() - { - return $"R={this.version}, V={this.revision}"; - } - } - - public class Key - { - // Constants - - public enum MatchMode { Strict, Relaxed, Identification }; - - // Members - - [MetaModelName("Key.type")] - [TextSearchable] - [XmlAttribute] - [CountForHash] - public string type = ""; - - [XmlAttribute] - [CountForHash] - public bool local = false; - - [MetaModelName("Key.idType")] - [TextSearchable] - [XmlAttribute] - [JsonIgnore] - [CountForHash] - public string idType = ""; - - [XmlIgnore] - [JsonProperty(PropertyName = "idType")] - public string JsonIdType - { - // adapt idShort <-> IdShort - get => (idType == "idShort") ? "IdShort" : idType; - set => idType = (value == "idShort") ? "IdShort" : value; - } - - [MetaModelName("Key.value")] - [TextSearchable] - [XmlText] - [CountForHash] - public string value = ""; - - [XmlIgnore] - [JsonProperty(PropertyName = "index")] - [CountForHash] - public int index = 0; - - public Key() - { - } - - public Key(Key src) - { - this.type = src.type; - this.local = src.local; - this.idType = src.idType; - this.value = src.value; - } - -#if !DoNotUseAasxCompatibilityModels - public Key(AasxCompatibilityModels.AdminShellV10.Key src) - { - this.type = src.type; - this.local = src.local; - this.idType = src.idType; - if (this.idType.Trim().ToLower() == "uri") - this.idType = Identification.IRI; - if (this.idType.Trim().ToLower() == "idshort") - this.idType = Identification.IdShort; - this.value = src.value; - } -#endif - - public Key(string type, bool local, string idType, string value) - { - this.type = type; - this.local = local; - this.idType = idType; - this.value = value; - } - - public static Key CreateNew(string type, bool local, string idType, string value) - { - var k = new Key() - { - type = type, - local = local, - idType = idType, - value = value - }; - return (k); - } - - public static Key GetFromRef(Reference r) - { - if (r == null || r.Count != 1) - return null; - return r[0]; - } - - public Identification ToId() - { - return new Identification(this); - } - - public string ToString(int format = 0) - { - if (format == 1) - { - return String.Format( - "({0})({1})[{2}]{3}", this.type, this.local ? "local" : "no-local", this.idType, this.value); - } - if (format == 2) - { - return String.Format("[{0}]{1}", this.idType, this.value); - } - - // (old) default - var tlc = (this.local) ? "Local" : "not Local"; - return $"[{this.type}, {tlc}, {this.idType}, {this.value}]"; - } - - public static Key Parse(string cell, string typeIfNotSet = null, - bool allowFmtAll = false, bool allowFmt0 = false, - bool allowFmt1 = false, bool allowFmt2 = false) - { - // access and defaults? - if (cell == null || cell.Trim().Length < 1) - return null; - if (typeIfNotSet == null) - typeIfNotSet = Key.GlobalReference; - - // format == 1 - if (allowFmtAll || allowFmt1) - { - var m = Regex.Match(cell, @"\((\w+)\)\((\S+)\)\[(\w+)\]( ?)(.*)$"); - if (m.Success) - { - return new AdminShell.Key( - m.Groups[1].ToString(), m.Groups[2].ToString() == "local", - m.Groups[3].ToString(), m.Groups[5].ToString()); - } - } - - // format == 2 - if (allowFmtAll || allowFmt2) - { - var m = Regex.Match(cell, @"\[(\w+)\]( ?)(.*)$"); - if (m.Success) - { - return new AdminShell.Key( - typeIfNotSet, true, - m.Groups[1].ToString(), m.Groups[3].ToString()); - } - } - - // format == 0 - if (allowFmtAll || allowFmt0) - { - var m = Regex.Match(cell, @"\[(\w+),( ?)([^,]+),( ?)\[(\w+)\],( ?)(.*)\]"); - if (m.Success) - { - return new AdminShell.Key( - m.Groups[1].ToString(), !m.Groups[3].ToString().Contains("not"), - m.Groups[5].ToString(), m.Groups[7].ToString()); - } - } - - // no - return null; - } - - public static string KeyListToString(List keys) - { - if (keys == null || keys.Count < 1) - return ""; - // normally, exactly one key - if (keys.Count == 1) - return keys[0].ToString(); - // multiple! - var s = "[ "; - foreach (var k in keys) - { - if (s.Length > 0) - s += ", "; - s += k.ToString(); - } - return s + " ]"; - } - - public static string[] KeyElements = new string[] { - "GlobalReference", - "FragmentReference", - "AccessPermissionRule", - "Asset", - "AssetAdministrationShell", - "ConceptDescription", - "Submodel", - "SubmodelRef", // not completely right, but used by Package Explorer - "Blob", - "ConceptDictionary", - "DataElement", - "File", - "Operation", - "OperationVariable", - "BasicEvent", - "Entity", - "Property", - "MultiLanguageProperty", - "Range", - "ReferenceElement", - "RelationshipElement", - "AnnotatedRelationshipElement", - "Capability", - "SubmodelElement", - "SubmodelElementCollection", - "View" }; - - public static string[] ReferableElements = new string[] { - "AccessPermissionRule", - "Asset", - "AssetAdministrationShell", - "ConceptDescription", - "Submodel", - "Blob", - "ConceptDictionary", - "DataElement", - "File", - "Operation", - "OperationVariable", - "Entity", - "BasicEvent", - "Property", - "MultiLanguageProperty", - "Range", - "ReferenceElement", - "RelationshipElement", - "AnnotatedRelationshipElement", - "Capability", - "SubmodelElement", - "SubmodelElementCollection", - "View" }; - - public static string[] SubmodelElements = new string[] { - "DataElement", - "File", - "Event", - "Operation", - "Property", - "MultiLanguageProperty", - "Range", - "ReferenceElement", - "RelationshipElement", - "AnnotatedRelationshipElement", - "Capability", - "BasicEvent", - "Entity", - "SubmodelElementCollection"}; - - public static string[] IdentifiableElements = new string[] { - "Asset", - "AssetAdministrationShell", - "ConceptDescription", - "Submodel" }; - - // use this in list to designate all of the above elements - public static string AllElements = "All"; - - // use this in list to designate the GlobalReference - // Resharper disable MemberHidesStaticFromOuterClass - public static string GlobalReference = "GlobalReference"; - public static string FragmentReference = "FragmentReference"; - public static string ConceptDescription = "ConceptDescription"; - public static string SubmodelRef = "SubmodelRef"; - public static string Submodel = "Submodel"; - public static string SubmodelElement = "SubmodelElement"; - public static string Asset = "Asset"; - public static string AAS = "AssetAdministrationShell"; - public static string Entity = "Entity"; - public static string View = "View"; - // Resharper enable MemberHidesStaticFromOuterClass - - public static string[] IdentifierTypeNames = new string[] { - Identification.IdShort, "FragmentId", "Custom", Identification.IRDI, Identification.IRI }; - - public enum IdentifierType { IdShort = 0, FragmentId, Custom, IRDI, IRI }; - - public static string GetIdentifierTypeName(IdentifierType t) - { - return IdentifierTypeNames[(int)t]; - } - - public static string IdShort = "IdShort"; - public static string FragmentId = "FragmentId"; - public static string Custom = "Custom"; - - // some helpers - - public static bool IsInKeyElements(string ke) - { - var res = false; - foreach (var s in KeyElements) - if (s.Trim().ToLower() == ke.Trim().ToLower()) - res = true; - return res; - } - - public bool IsIdType(string[] value) - { - if (value == null || idType == null || idType.Trim() == "") - return false; - return value.Contains(idType.Trim()); - } - - public bool IsIdType(string value) - { - if (value == null || idType == null || idType.Trim() == "") - return false; - return value.Trim().Equals(idType.Trim()); - } - - public bool IsType(string value) - { - if (value == null || type == null || type.Trim() == "") - return false; - return value.Trim().ToLower().Equals(type.Trim().ToLower()); - } - - public bool IsAbsolute() - { - return IsType(Key.GlobalReference) - || IsType(Key.AAS) - || IsType(Key.Asset) - || IsType(Key.Submodel); - } - - public bool Matches( - string type, bool local, string idType, string id, MatchMode matchMode = MatchMode.Strict) - { - if (matchMode == MatchMode.Strict) - return this.type == type && this.local == local && this.idType == idType && this.value == id; - - if (matchMode == MatchMode.Relaxed) - return (this.type == type || this.type == Key.GlobalReference || type == Key.GlobalReference) - && this.idType == idType && this.value == id; - - if (matchMode == MatchMode.Identification) - return this.idType == idType && this.value == id; - - return false; - } - - public bool Matches(Identification id) - { - if (id == null) - return false; - return this.Matches(Key.GlobalReference, false, id.idType, id.id, MatchMode.Identification); - } - - public bool Matches(Key key, MatchMode matchMode = MatchMode.Strict) - { - if (key == null) - return false; - return this.Matches(key.type, key.local, key.idType, key.value, matchMode); - } - - // validation - - public static AasValidationAction Validate(AasValidationRecordList results, Key k, Referable container) - { - // access - if (results == null || container == null) - return AasValidationAction.No; - - var res = AasValidationAction.No; - - // check - if (k == null) - { - // violation case - results.Add(new AasValidationRecord( - AasValidationSeverity.SpecViolation, container, - "Key: is null", - () => - { - res = AasValidationAction.ToBeDeleted; - })); - } - else - { - // check IdType - var idf = AdminShellUtilV20.CheckIfInConstantStringArray(IdentifierTypeNames, k.idType); - if (idf == AdminShellUtilV20.ConstantFoundEnum.No) - // violation case - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, container, - "Key: idType is not in allowed enumeration values", - () => - { - k.idType = Custom; - })); - if (idf == AdminShellUtilV20.ConstantFoundEnum.AnyCase) - // violation case - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, container, - "Key: idType in wrong casing", - () => - { - k.idType = AdminShellUtilV20.CorrectCasingForConstantStringArray( - IdentifierTypeNames, k.idType); - })); - - // check type - var tf = AdminShellUtilV20.CheckIfInConstantStringArray(KeyElements, k.type); - if (tf == AdminShellUtilV20.ConstantFoundEnum.No) - // violation case - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, container, - "Key: type is not in allowed enumeration values", - () => - { - k.type = GlobalReference; - })); - if (tf == AdminShellUtilV20.ConstantFoundEnum.AnyCase) - // violation case - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, container, - "Key: type in wrong casing", - () => - { - k.idType = AdminShellUtilV20.CorrectCasingForConstantStringArray( - KeyElements, k.type); - })); - } - - // may give result "to be deleted" - return res; - } - } - - public class KeyList : List - { - // getters / setters - - [XmlIgnore] - public bool IsEmpty { get { return this.Count < 1; } } - - // constructors / creators - - public KeyList() { } - - public KeyList(KeyList src) - { - if (src != null) - foreach (var k in src) - this.Add(new Key(k)); - } - - public static KeyList CreateNew(Key k) - { - var kl = new KeyList { k }; - return kl; - } - - public static KeyList CreateNew(string type, bool local, string idType, string value) - { - var kl = new KeyList() { - Key.CreateNew(type, local, idType, value) - }; - return kl; - } - - public static KeyList CreateNew(string type, bool local, string idType, string[] valueItems) - { - // access - if (valueItems == null) - return null; - - // prepare - var kl = new AdminShell.KeyList(); - foreach (var x in valueItems) - kl.Add(new AdminShell.Key(type, local, idType, "" + x)); - return kl; - } - - // matches - - public bool Matches(KeyList other, Key.MatchMode matchMode = Key.MatchMode.Strict) - { - if (other == null || other.Count != this.Count) - return false; - - var same = true; - for (int i = 0; i < this.Count; i++) - same = same && this[i].Matches(other[i], matchMode); - - return same; - } - - // other - - public void NumberIndices() - { - for (int i = 0; i < this.Count; i++) - this[i].index = i; - } - - public string ToString(int format = 0, string delimiter = ",") - { - var res = string.Join(delimiter, this.Select((k) => k.ToString(format))); - return res; - } - - public static KeyList Parse(string input) - { - // access - if (input == null) - return null; - - // split - var parts = input.Split(',', ';'); - var kl = new KeyList(); - - foreach (var p in parts) - { - var k = Key.Parse(p); - if (k != null) - kl.Add(k); - } - - return kl; - } - - public string MostSignificantInfo() - { - if (this.Count < 1) - return "-"; - var i = this.Count - 1; - var res = this[i].value; - if (this[i].IsIdType(new[] { Key.FragmentId }) && i > 0) - res += this[i - 1].value; - return res; - } - - // validation - - public static void Validate(AasValidationRecordList results, KeyList kl, - Referable container) - { - // access - if (results == null || kl == null || container == null) - return; - - // iterate thru - var idx = 0; - while (idx < kl.Count) - { - var act = Key.Validate(results, kl[idx], container); - if (act == AasValidationAction.ToBeDeleted) - { - kl.RemoveAt(idx); - continue; - } - idx++; - } - } - - public bool StartsWith(KeyList head, bool emptyIsTrue = false, - Key.MatchMode matchMode = Key.MatchMode.Strict) - { - // access - if (head == null) - return false; - if (head.Count == 0) - return emptyIsTrue; - - // simply test element-wise - for (int i = 0; i < head.Count; i++) - { - // does head have more elements than this list? - if (i >= this.Count) - return false; - - if (!head[i].Matches(this[i], matchMode)) - return false; - } - - // ok! - return true; - } - - // arithmetics - - public static KeyList operator +(KeyList a, Key b) - { - var res = new KeyList(a); - if (b != null) - res.Add(b); - return res; - } - - public static KeyList operator +(KeyList a, KeyList b) - { - var res = new KeyList(a); - if (b != null) - res.AddRange(b); - return res; - } - - public KeyList SubList(int startPos, int count = int.MaxValue) - { - var res = new KeyList(); - if (startPos >= this.Count) - return res; - int nr = 0; - for (int i = startPos; i < this.Count && nr < count; i++) - { - nr++; - res.Add(this[i]); - } - return res; - } - - public KeyList ReplaceLastKey(KeyList newKeys) - { - var res = new KeyList(this); - if (res.Count < 1 || newKeys == null || newKeys.Count < 1) - return res; - - res.Remove(res.Last()); - res = res + newKeys; - - return res; - } - - // other - - /// - /// Take only idShort, ignore all other key-types and create a '/'-separated list - /// - /// Empty string or list of idShorts - public string BuildIdShortPath(int startPos = 0, int count = int.MaxValue) - { - if (startPos >= this.Count) - return ""; - int nr = 0; - var res = ""; - for (int i = startPos; i < this.Count && nr < count; i++) - { - nr++; - if (this[i].idType.Trim().ToLower() == Key.IdShort.Trim().ToLower()) - { - if (res != "") - res += "/"; - res += this[i].value; - } - } - return res; - } - } - - public class AasElementSelfDescription - { - public string ElementName = ""; - public string ElementAbbreviation = ""; - public SubmodelElementWrapper.AdequateElementEnum ElementEnum = - SubmodelElementWrapper.AdequateElementEnum.Unknown; - - public AasElementSelfDescription() { } - - public AasElementSelfDescription( - string ElementName, string ElementAbbreviation, - SubmodelElementWrapper.AdequateElementEnum elementEnum - = SubmodelElementWrapper.AdequateElementEnum.Unknown) - { - this.ElementName = ElementName; - this.ElementAbbreviation = ElementAbbreviation; - this.ElementEnum = elementEnum; - } - } - - /// - /// Extends understanding of Referable to further elements, which can be related to - /// - public interface IAasElement - { - AasElementSelfDescription GetSelfDescription(); - string GetElementName(); - } - - [XmlType(TypeName = "reference")] - public class Reference : IAasElement - { - - // members - - [XmlIgnore] // anyway, as it is private - [JsonIgnore] - private KeyList keys = new KeyList(); - - // getters / setters - - [XmlArray("keys")] - [XmlArrayItem("key")] - [JsonIgnore] - public KeyList Keys { get { return keys; } } - [XmlIgnore] - [JsonProperty(PropertyName = "keys")] - public KeyList JsonKeys - { - get - { - keys?.NumberIndices(); - return keys; - } - } - - [XmlIgnore] - [JsonIgnore] - public bool IsEmpty { get { return keys == null || keys.Count < 1; } } - [XmlIgnore] - [JsonIgnore] - public int Count { get { if (keys == null) return 0; return keys.Count; } } - [XmlIgnore] - [JsonIgnore] - public Key this[int index] { get { return keys[index]; } } - - [XmlIgnore] - [JsonIgnore] - public Key First { get { return this.Count < 1 ? null : this.keys[0]; } } - - [XmlIgnore] - [JsonIgnore] - public Key Last { get { return this.Count < 1 ? null : this.keys[this.keys.Count - 1]; } } - - // constructors / creators - - public Reference() - { - } - - public Reference(Key k) - { - if (k != null) - keys.Add(k); - } - - public Reference(Reference src) - { - if (src != null) - foreach (var k in src.Keys) - keys.Add(new Key(k)); - } - -#if !DoNotUseAasxCompatibilityModels - public Reference(AasxCompatibilityModels.AdminShellV10.Reference src) - { - if (src != null) - foreach (var k in src.Keys) - keys.Add(new Key(k)); - } -#endif - - public Reference(SemanticId src) - { - if (src != null) - foreach (var k in src.Keys) - keys.Add(new Key(k)); - } - -#if !DoNotUseAasxCompatibilityModels - public Reference(AasxCompatibilityModels.AdminShellV10.SemanticId src) - { - if (src != null) - foreach (var k in src.Keys) - keys.Add(new Key(k)); - } -#endif - public static Reference CreateNew(Key k) - { - if (k == null) - return null; - var r = new Reference(); - r.keys.Add(k); - return r; - } - - public static Reference CreateNew(List k) - { - if (k == null) - return null; - var r = new Reference(); - r.keys.AddRange(k); - return r; - } - - public static Reference CreateNew(string type, bool local, string idType, string value) - { - if (type == null || idType == null || value == null) - return null; - var r = new Reference(); - r.keys.Add(Key.CreateNew(type, local, idType, value)); - return r; - } - - public static Reference CreateIrdiReference(string irdi) - { - if (irdi == null) - return null; - var r = new Reference(); - r.keys.Add(new Key(Key.GlobalReference, false, Identification.IRDI, irdi)); - return r; - } - - // additions - - public static Reference operator +(Reference a, Key b) - { - var res = new Reference(a); - res.Keys?.Add(b); - return res; - } - - public static Reference operator +(Reference a, Reference b) - { - var res = new Reference(a); - res.Keys?.AddRange(b?.Keys); - return res; - } - - // further - - public Key GetAsExactlyOneKey() - { - if (keys == null || keys.Count != 1) - return null; - var k = keys[0]; - return new Key(k.type, k.local, k.idType, k.value); - } - - public bool MatchesExactlyOneKey( - string type, bool local, string idType, string id, Key.MatchMode matchMode = Key.MatchMode.Strict) - { - if (keys == null || keys.Count != 1) - return false; - var k = keys[0]; - return k.Matches(type, local, idType, id, matchMode); - } - - public bool MatchesExactlyOneKey(Key key, Key.MatchMode matchMode = Key.MatchMode.Strict) - { - if (key == null) - return false; - return this.MatchesExactlyOneKey(key.type, key.local, key.idType, key.value, matchMode); - } - - public bool Matches( - string type, bool local, string idType, string id, Key.MatchMode matchMode = Key.MatchMode.Strict) - { - if (this.Count == 1) - { - var k = keys[0]; - return k.Matches(type, local, idType, id, matchMode); - } - return false; - } - - public bool Matches(Key key, Key.MatchMode matchMode = Key.MatchMode.Strict) - { - if (this.Count == 1) - { - var k = keys[0]; - return k.Matches(key, matchMode); - } - return false; - } - - public bool Matches(Identification other) - { - if (other == null) - return false; - if (this.Count == 1) - { - var k = keys[0]; - return k.Matches(Key.GlobalReference, false, other.idType, other.id, Key.MatchMode.Identification); - } - return false; - } - - public bool Matches(Reference other, Key.MatchMode matchMode = Key.MatchMode.Strict) - { - if (this.keys == null || other == null || other.keys == null || other.Count != this.Count) - return false; - - var same = true; - for (int i = 0; i < this.Count; i++) - same = same && this.keys[i].Matches(other.keys[i], matchMode); - - return same; - } - - public bool Matches(SemanticId other, Key.MatchMode matchMode = Key.MatchMode.Strict) - { - return Matches(new Reference(other), matchMode); - } - - public bool Matches(ConceptDescription cd, Key.MatchMode matchMode = Key.MatchMode.Strict) - { - return Matches(cd?.GetReference(), matchMode); - } - - public string ToString(int format = 0, string delimiter = ",") - { - return keys?.ToString(format, delimiter); - } - - public static Reference Parse(string input) - { - return CreateNew(KeyList.Parse(input)); - } - - public string ListOfValues(string delim) - { - string res = ""; - if (this.Keys != null) - foreach (var x in this.Keys) - { - if (x == null) - continue; - if (res != "") res += delim; - res += x.value; - } - return res; - } - - // self description - - public virtual AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("Reference", "Rfc"); - } - - public virtual string GetElementName() - { - return this.GetSelfDescription()?.ElementName; - } - } - - [XmlType(TypeName = "derivedFrom")] - public class AssetAdministrationShellRef : Reference - { - // constructors - - public AssetAdministrationShellRef() : base() { } - - public AssetAdministrationShellRef(Key k) : base(k) { } - - public AssetAdministrationShellRef(Reference src) : base(src) { } - -#if !DoNotUseAasxCompatibilityModels - public AssetAdministrationShellRef(AasxCompatibilityModels.AdminShellV10.Reference src) : base(src) { } -#endif - - // further methods - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("AssetAdministrationShellRef", "AasRef"); - } - } - - [XmlType(TypeName = "assetRef")] - public class AssetRef : Reference - { - // constructors - - public AssetRef() : base() { } - - public AssetRef(AssetRef src) : base(src) { } - -#if !DoNotUseAasxCompatibilityModels - public AssetRef(AasxCompatibilityModels.AdminShellV10.AssetRef src) : base(src) { } -#endif - - public AssetRef(Reference r) - : base(r) - { - } - - // further methods - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("AssetRef", "AssetRef"); - } - } - - [XmlType(TypeName = "submodelRef")] - public class SubmodelRef : Reference - { - // constructors - - public SubmodelRef() : base() { } - - public SubmodelRef(SubmodelRef src) : base(src) { } - - public SubmodelRef(Reference src) : base(src) { } - -#if !DoNotUseAasxCompatibilityModels - public SubmodelRef(AasxCompatibilityModels.AdminShellV10.SubmodelRef src) : base(src) { } -#endif - - public new static SubmodelRef CreateNew(string type, bool local, string idType, string value) - { - var r = new SubmodelRef(); - r.Keys.Add(Key.CreateNew(type, local, idType, value)); - return r; - } - - public static SubmodelRef CreateNew(Reference src) - { - if (src == null || src.Keys == null) - return null; - var r = new SubmodelRef(); - r.Keys.AddRange(src.Keys); - return r; - } - - // further methods - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("SubmodelRef", "SMRef"); - } - } - - [XmlType(TypeName = "conceptDescriptionRef")] - public class ConceptDescriptionRef : Reference - { - // constructors - - public ConceptDescriptionRef() : base() { } - - public ConceptDescriptionRef(ConceptDescriptionRef src) : base(src) { } - -#if !DoNotUseAasxCompatibilityModels - public ConceptDescriptionRef( - AasxCompatibilityModels.AdminShellV10.ConceptDescriptionRef src) : base(src) { } -#endif - - // further methods - - public new static ConceptDescriptionRef CreateNew(string type, bool local, string idType, string value) - { - var r = new ConceptDescriptionRef(); - r.Keys.Add(Key.CreateNew(type, local, idType, value)); - return r; - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("ConceptDescriptionRef", "CDRef"); - } - - } - - [XmlType(TypeName = "dataSpecificationRef")] - public class DataSpecificationRef : Reference - { - // constructors - - public DataSpecificationRef() : base() { } - - public DataSpecificationRef(DataSpecificationRef src) : base(src) { } - - public DataSpecificationRef(Reference src) : base(src) { } - -#if !DoNotUseAasxCompatibilityModels - public DataSpecificationRef(AasxCompatibilityModels.AdminShellV10.DataSpecificationRef src) : base(src) { } - - public DataSpecificationRef(AasxCompatibilityModels.AdminShellV10.Reference src) : base(src) { } -#endif - - // further methods - - public static DataSpecificationRef CreateNew(Reference src) - { - if (src == null || src.Keys == null) - return null; - var res = new DataSpecificationRef(); - foreach (var k in src.Keys) - res.Keys.Add(new Key(k)); - return res; - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("DataSpecificationRef", "DSRef"); - } - - } - - [XmlType(TypeName = "conceptDescriptions")] - public class ConceptDescriptionRefs - { - [XmlElement(ElementName = "conceptDescriptionRef")] - public List conceptDescriptions = new List(); - - // constructors - - public ConceptDescriptionRefs() { } - - public ConceptDescriptionRefs(ConceptDescriptionRefs src) - { - if (src.conceptDescriptions != null) - foreach (var cdr in src.conceptDescriptions) - this.conceptDescriptions.Add(new ConceptDescriptionRef(cdr)); - } - -#if !DoNotUseAasxCompatibilityModels - public ConceptDescriptionRefs(AasxCompatibilityModels.AdminShellV10.ConceptDescriptionRefs src) - { - if (src.conceptDescriptions != null) - foreach (var cdr in src.conceptDescriptions) - this.conceptDescriptions.Add(new ConceptDescriptionRef(cdr)); - } -#endif - } - - [XmlType(TypeName = "containedElementRef")] - public class ContainedElementRef : Reference - { - // constructors - - public ContainedElementRef() { } - - public ContainedElementRef(ContainedElementRef src) : base(src) { } - -#if !DoNotUseAasxCompatibilityModels - public ContainedElementRef(AasxCompatibilityModels.AdminShellV10.ContainedElementRef src) : base(src) { } -#endif - - public static ContainedElementRef CreateNew(Reference src) - { - if (src == null || src.Keys == null) - return null; - var r = new ContainedElementRef(); - r.Keys.AddRange(src.Keys); - return r; - } - - // further methods - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("ContainedElementRef", "CERef"); - } - - } - -#if __not_valid_anymore - [XmlType(TypeName = "hasDataSpecification")] - public class HasDataSpecification - { - [XmlElement(ElementName = "reference")] // make "reference" go away by magic?! - public List reference = new List(); - - public HasDataSpecification() { } - - public HasDataSpecification(HasDataSpecification src) - { - foreach (var r in src.reference) - reference.Add(new Reference(r)); - } - -#if !DoNotUseAasxCompatibilityModels - public HasDataSpecification(AasxCompatibilityModels.AdminShellV10.HasDataSpecification src) - { - foreach (var r in src.reference) - reference.Add(new Reference(r)); - } -#endif - } -#else - // Note: In versions prior to V2.0.1, the SDK has "HasDataSpecification" containing only a Reference. - // Iv 2.0.1, theoretically each entity with HasDataSpecification could also conatin a - // EmbeddedDataSpecification. - - [XmlType(TypeName = "hasDataSpecification")] - public class HasDataSpecification : List - { - public HasDataSpecification() { } - - public HasDataSpecification(HasDataSpecification src) - { - foreach (var r in src) - this.Add(new EmbeddedDataSpecification(r)); - } - - public HasDataSpecification(IEnumerable src) - { - foreach (var r in src) - this.Add(new EmbeddedDataSpecification(r)); - } - -#if !DoNotUseAasxCompatibilityModels - public HasDataSpecification(AasxCompatibilityModels.AdminShellV10.HasDataSpecification src) - { - foreach (var r in src.reference) - this.Add(new EmbeddedDataSpecification(r)); - } -#endif - - // make some explicit and easy to use getter, setters - - [XmlIgnore] - [JsonIgnore] - public EmbeddedDataSpecification IEC61360 - { - get - { - foreach (var eds in this) - if (eds?.dataSpecificationContent?.dataSpecificationIEC61360 != null - || eds?.dataSpecification?.MatchesExactlyOneKey( - DataSpecificationIEC61360.GetKey(), Key.MatchMode.Identification) == true) - return eds; - return null; - } - set - { - // search existing first? - var eds = this.IEC61360; - if (eds != null) - { - // replace this - /* TODO (MIHO, 2020-08-30): this does not prevent the corner case, that we could have - * multiple dataSpecificationIEC61360 in this list, which would be an error */ - this.Remove(eds); - this.Add(value); - return; - } - - // no? .. add! - this.Add(value); - } - } - - [XmlIgnore] - [JsonIgnore] - public DataSpecificationIEC61360 IEC61360Content - { - get - { - return this.IEC61360?.dataSpecificationContent?.dataSpecificationIEC61360; - } - set - { - // search existing first? - var eds = this.IEC61360; - if (eds != null) - { - // replace this - eds.dataSpecificationContent.dataSpecificationIEC61360 = value; - return; - } - // no? .. add! - var edsnew = new EmbeddedDataSpecification(); - edsnew.dataSpecificationContent.dataSpecificationIEC61360 = value; - this.Add(edsnew); - } - } - - } -#endif - - [XmlType(TypeName = "ContainedElements")] - public class ContainedElements - { - - // members - - [XmlElement(ElementName = "containedElementRef")] // make "reference" go away by magic?! - public List reference = new List(); - - // getter / setter - - public bool IsEmpty { get { return reference == null || reference.Count < 1; } } - public int Count { get { if (reference == null) return 0; return reference.Count; } } - public ContainedElementRef this[int index] { get { return reference[index]; } } - - // Creators - - public ContainedElements() { } - - public ContainedElements(ContainedElements src) - { - if (src.reference != null) - foreach (var r in src.reference) - this.reference.Add(new ContainedElementRef(r)); - } - -#if !DoNotUseAasxCompatibilityModels - public ContainedElements(AasxCompatibilityModels.AdminShellV10.ContainedElements src) - { - if (src.reference != null) - foreach (var r in src.reference) - this.reference.Add(new ContainedElementRef(r)); - } -#endif - - public static ContainedElements CreateOrSetInner(ContainedElements outer, ContainedElementRef[] inner) - { - var res = outer; - if (res == null) - res = new ContainedElements(); - if (inner == null) - { - res.reference = null; - return res; - } - res.reference = new List(inner); - return res; - } - - } - - [XmlType(TypeName = "langString", Namespace = "http://www.admin-shell.io/2/0")] - public class LangStr - { - // constants - public static string LANG_DEFAULT = "en"; - - // members - - [MetaModelName("LangStr.lang")] - [TextSearchable] - [XmlAttribute(Namespace = "http://www.admin-shell.io/2/0")] - [JsonProperty(PropertyName = "language")] - [CountForHash] - public string lang = ""; - - [MetaModelName("LangStr.str")] - [TextSearchable] - [XmlText] - [JsonProperty(PropertyName = "text")] - [CountForHash] - public string str = ""; - - // constructors - - public LangStr() { } - - public LangStr(LangStr src) - { - this.lang = src.lang; - this.str = src.str; - } - -#if !DoNotUseAasxCompatibilityModels - public LangStr(AasxCompatibilityModels.AdminShellV10.LangStr src) - { - this.lang = src.lang; - this.str = src.str; - } -#endif - - public LangStr(string lang, string str) - { - this.lang = lang; - this.str = str; - } - - public static ListOfLangStr CreateManyFromStringArray(string[] s) - { - var r = new ListOfLangStr(); - var i = 0; - while ((i + 1) < s.Length) - { - r.Add(new LangStr(s[i], s[i + 1])); - i += 2; - } - return r; - } - - public override string ToString() - { - return $"{str}@{lang}"; - } - } - - public class ListOfLangStr : List - { - public ListOfLangStr() { } - - public ListOfLangStr(LangStr ls) - { - if (ls != null) - this.Add(ls); - } - - public ListOfLangStr(ListOfLangStr src) - { - if (src != null) - foreach (var ls in src) - this.Add(ls); - } - - public string this[string lang] - { - get - { - return GetDefaultStr(lang); - } - set - { - foreach (var ls in this) - if (ls.lang.Trim().ToLower() == lang?.Trim().ToLower()) - { - ls.str = value; - return; - } - this.Add(new LangStr(lang, value)); - } - } - - public string GetDefaultStr(string defaultLang = null) - { - // start - if (defaultLang == null) - defaultLang = LangStr.LANG_DEFAULT; - defaultLang = defaultLang.Trim().ToLower(); - string res = null; - - // search - foreach (var ls in this) - if (ls.lang.Trim().ToLower() == defaultLang) - res = ls.str; - if (res == null && this.Count > 0) - res = this[0].str; - - // found? - return res; - } - - public string GetExactStrForLang(string lang) - { - // start - if (lang == null) - return null; - string res = null; - - // exact search - foreach (var ls in this) - if (ls.lang.Trim().ToLower() == lang) - res = ls.str; - - // found? - return res; - } - - public bool ContainsLang(string lang) - { - return GetExactStrForLang(lang) != null; - } - - public bool AllLangSameString() - { - if (this.Count < 2) - return true; - - for (int i = 1; i < this.Count; i++) - if (this[0]?.str != null && this[0]?.str?.Trim() != this[i]?.str?.Trim()) - return false; - - return true; - } - - public override string ToString() - { - return string.Join(", ", this.Select((ls) => ls.ToString())); - } - - public static ListOfLangStr Parse(string cell) - { - // access - if (cell == null) - return null; - - // iterative approach - var res = new ListOfLangStr(); - while (true) - { - // trivial case and finite end - if (!cell.Contains("@")) - { - if (cell.Trim() != "") - res.Add(new LangStr(LangStr.LANG_DEFAULT, cell)); - break; - } - - // OK, pick the next couple - var m = Regex.Match(cell, @"(.*?)@(\w+)", RegexOptions.Singleline); - if (!m.Success) - { - // take emergency exit? - res.Add(new LangStr("??", cell)); - break; - } - - // use the match and shorten cell .. - res.Add(new LangStr(m.Groups[2].ToString(), m.Groups[1].ToString().Trim())); - cell = cell.Substring(m.Index + m.Length); - } - - return res; - } - } - - public class Description - { - - // members - - [XmlElement(ElementName = "langString")] - public ListOfLangStr langString = new ListOfLangStr(); - - // constructors - - public Description() { } - - public Description(Description src) - { - if (src != null && src.langString != null) - foreach (var ls in src.langString) - langString.Add(new LangStr(ls)); - } - - public Description(LangStringSet src) - { - if (src != null && src.langString != null) - foreach (var ls in src.langString) - langString.Add(new LangStr(ls)); - } - -#if !DoNotUseAasxCompatibilityModels - public Description(AasxCompatibilityModels.AdminShellV10.Description src) - { - if (src != null) - foreach (var ls in src.langString) - langString.Add(new LangStr(ls)); - } -#endif - - // single string representation - public string GetDefaultStr(string defaultLang = null) - { - return this.langString?.GetDefaultStr(defaultLang); - } - - } - - public class AssetKind - { - // constants - public static string Type = "Type"; - public static string Instance = "Instance"; - - [MetaModelName("AssetKind.kind")] - [TextSearchable] - [XmlText] - [CountForHash] - public string kind = "Instance"; - - // getters / setters - - [XmlIgnore] - [JsonIgnore] - public bool IsInstance { get { return kind == null || kind.Trim().ToLower() == "instance"; } } - - [XmlIgnore] - [JsonIgnore] - public bool IsType { get { return kind != null && kind.Trim().ToLower() == "type"; } } - - // constructors / creators - - public AssetKind() { } - - public AssetKind(AssetKind src) - { - kind = src.kind; - } - -#if !DoNotUseAasxCompatibilityModels - public AssetKind(AasxCompatibilityModels.AdminShellV10.Kind src) - { - kind = src.kind; - } -#endif - - public AssetKind(string kind) - { - this.kind = kind; - } - - public static AssetKind CreateAsType() - { - var res = new AssetKind() { kind = AssetKind.Type }; - return res; - } - - public static AssetKind CreateAsInstance() - { - var res = new AssetKind() { kind = AssetKind.Instance }; - return res; - } - } - - public class ModelingKind - { - // constants - public static string Template = "Template"; - public static string Instance = "Instance"; - - [MetaModelName("ModelingKind.kind")] - [TextSearchable] - [XmlText] - [CountForHash] - public string kind = Instance; - - // getters / setters - - [XmlIgnore] - [JsonIgnore] - public bool IsInstance { get { return kind == null || kind.Trim().ToLower() == Instance.ToLower(); } } - - [XmlIgnore] - [JsonIgnore] - public bool IsTemplate { get { return kind != null && kind.Trim().ToLower() == Template.ToLower(); } } - - // constructors / creators - - public ModelingKind() { } - - public ModelingKind(ModelingKind src) - { - kind = src.kind; - } - -#if !DoNotUseAasxCompatibilityModels - public ModelingKind(AasxCompatibilityModels.AdminShellV10.Kind src) - { - kind = src.kind; - } -#endif - - public ModelingKind(string kind) - { - this.kind = kind; - } - - public static ModelingKind CreateAsTemplate() - { - var res = new ModelingKind() { kind = Template }; - return res; - } - - public static ModelingKind CreateAsInstance() - { - var res = new ModelingKind() { kind = Instance }; - return res; - } - - // validation - - public static void Validate(AasValidationRecordList results, ModelingKind mk, Referable container) - { - // access - if (results == null || container == null) - return; - - // check - if (mk == null || mk.kind == null) - { - // warning - results.Add(new AasValidationRecord( - AasValidationSeverity.Warning, container, - "ModelingKind: is null", - () => - { - })); - } - else - { - var k = mk.kind.Trim(); - var kl = k.ToLower(); - if (kl != Template.ToLower() && kl != Instance.ToLower()) - { - // violation case - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, container, - $"ModelingKind: enumeration value neither {Template} nor {Instance}", - () => - { - mk.kind = Instance; - })); - } - else if (k != Template && k != Instance) - { - // warning - results.Add(new AasValidationRecord( - AasValidationSeverity.Warning, container, - "ModelingKind: enumeration value in wrong casing", - () => - { - if (kl == Template.ToLower()) - mk.kind = Template; - else - mk.kind = Instance; - })); - } - } - } - } - - public class SemanticId : Reference - { - - // constructors / creators - - public SemanticId() - : base() - { - } - - public SemanticId(SemanticId src) - : base(src) - { - } - - public SemanticId(Reference src) : base(src) { } - -#if !DoNotUseAasxCompatibilityModels - public SemanticId(AasxCompatibilityModels.AdminShellV10.SemanticId src) - : base(src) - { - } -#endif - public SemanticId(Key key) : base(key) { } - - public static SemanticId CreateFromKey(Key key) - { - if (key == null) - return null; - var res = new SemanticId(); - res.Keys.Add(key); - return res; - } - - public static SemanticId CreateFromKeys(List keys) - { - if (keys == null) - return null; - var res = new SemanticId(); - res.Keys.AddRange(keys); - return res; - } - - public new static SemanticId Parse(string input) - { - return (SemanticId)CreateNew(KeyList.Parse(input)); - } - } - - /// - /// This class allows to describe further data (in derived classes) when enumerating Children. - /// - public class EnumerationPlacmentBase - { - } - - public interface IEnumerateChildren - { - IEnumerable EnumerateChildren(); - EnumerationPlacmentBase GetChildrenPlacement(SubmodelElement child); - object AddChild(SubmodelElementWrapper smw, EnumerationPlacmentBase placement = null); - } - - public interface IValidateEntity - { - void Validate(AasValidationRecordList results); - } - - /// - /// This attribute indicates, that it should e.g. serialized in JSON. - /// - [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = true)] - public class CountForHash : System.Attribute - { - } - - /// - /// This attribute indicates, that evaluation shall not count following field or not dive into references. - /// - [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = true)] - public class SkipForHash : System.Attribute - { - } - - /// - /// This attribute indicates, that the field / property is searchable - /// - [System.AttributeUsage(System.AttributeTargets.Field | System.AttributeTargets.Property, AllowMultiple = true)] - public class MetaModelName : System.Attribute - { - public string name; - public MetaModelName(string name) - { - this.name = name; - } - } - - /// - /// This attribute indicates, that the field / property shall be skipped for reflection - /// in order to avoid cycles - /// - [System.AttributeUsage(System.AttributeTargets.Field | System.AttributeTargets.Property, AllowMultiple = true)] - public class SkipForReflection : System.Attribute - { - } - - /// - /// This attribute indicates, that the field / property shall be skipped for searching, because it is not - /// directly displayed in Package Explorer - /// - [System.AttributeUsage(System.AttributeTargets.Field | System.AttributeTargets.Property, AllowMultiple = true)] - public class SkipForSearch : System.Attribute - { - } - - /// - /// This attribute indicates, that the field / property is searchable - /// - [System.AttributeUsage(System.AttributeTargets.Field | System.AttributeTargets.Property, AllowMultiple = true)] - public class TextSearchable : System.Attribute - { - } - - /// - /// Result of FindReferable in Environment - /// - public class ReferableRootInfo - { - public AdministrationShell AAS = null; - public Asset Asset = null; - public Submodel Submodel = null; - - public int NrOfRootKeys = 0; - - public bool IsValid - { - get - { - return NrOfRootKeys > 0 && (AAS != null || Submodel != null || Asset != null); - } - } - } - - /// - /// Marks an object, preferaby a payload item, which might be featured by the diary collection - /// - public interface IAasDiaryEntry - { - } - - public class DiaryDataDef - { - public enum TimeStampKind { Create, Update } - - [XmlIgnore] - [JsonIgnore] - private DateTime[] _timeStamp = new DateTime[2]; - - [XmlIgnore] - [JsonIgnore] - public DateTime[] TimeStamp { get { return _timeStamp; } } - - /// - /// List of entries, timewise one after each other (entries are timestamped). - /// Note: Default is Entries = null, as handling of many many AAS elements does not - /// create additional overhead of creating empty lists. An empty list shall be avoided. - /// - public List Entries = null; - - public static void AddAndSetTimestamps(Referable element, IAasDiaryEntry de, bool isCreate = false) - { - // trivial - if (element == null || de == null || element.DiaryData == null) - return; - - // add entry - if (element.DiaryData.Entries == null) - element.DiaryData.Entries = new List(); - element.DiaryData.Entries.Add(de); - - // figure out which timestamp - var tsk = TimeStampKind.Update; - if (isCreate) - { - tsk = TimeStampKind.Create; - } - - // set this timestamp (and for the parents, as well) - IDiaryData el = element; - while (el?.DiaryData != null) - { - // itself - el.DiaryData.TimeStamp[(int)tsk] = DateTime.UtcNow; - - // go up - el = (el as Referable)?.parent as IDiaryData; - } - } - } - - public interface IDiaryData - { - DiaryDataDef DiaryData { get; } - } - - public class ListOfReferable : List - { - // conversion to other list - - public KeyList ToKeyList() - { - var res = new KeyList(); - foreach (var rf in this) - res.Add(rf.ToKey()); - return res; - } - - public Reference GetReference() - { - return Reference.CreateNew(ToKeyList()); - } - } - - public interface IRecurseOnReferables - { - void RecurseOnReferables( - object state, Func lambda, - bool includeThis = false); - } - - public class Referable : IValidateEntity, IAasElement, IDiaryData, IGetReference, IRecurseOnReferables - { - // diary - - [XmlIgnore] - [JsonIgnore] - [SkipForHash] - [SkipForReflection] - private DiaryDataDef _diaryData = new DiaryDataDef(); - - [XmlIgnore] - [JsonIgnore] - [SkipForReflection] - public DiaryDataDef DiaryData { get { return _diaryData; } } - - // members - - [MetaModelName("Referable.IdShort")] - [TextSearchable] - [CountForHash] - public string idShort = ""; - - [MetaModelName("Referable.category")] - [TextSearchable] - [CountForHash] - public string category = null; - - [XmlElement(ElementName = "description")] - [JsonIgnore] - [CountForHash] - public Description description = null; - - [XmlIgnore] - [JsonProperty(PropertyName = "descriptions")] - public ListOfLangStr JsonDescription - { - get - { - return description?.langString; - } - set - { - if (value == null) - { - description = null; - return; - } - - if (description == null) - description = new Description(); - description.langString = value; - } - } - - [XmlIgnore] - [JsonIgnore] - [SkipForHash] // important to skip, as recursion elsewise will go in cycles! - [SkipForReflection] // important to skip, as recursion elsewise will go in cycles! - public IAasElement parent = null; - - public static string CONSTANT = "CONSTANT"; - public static string Category_PARAMETER = "PARAMETER"; - public static string VARIABLE = "VARIABLE"; - - public static string[] ReferableCategoryNames = new string[] { CONSTANT, Category_PARAMETER, VARIABLE }; - - // constructors - - public Referable() { } - - public Referable(string idShort) - { - this.idShort = idShort; - } - - public Referable(Referable src) - { - if (src == null) - return; - this.idShort = src.idShort; - this.category = src.category; - if (src.description != null) - this.description = new Description(src.description); - } - -#if !DoNotUseAasxCompatibilityModels - public Referable(AasxCompatibilityModels.AdminShellV10.Referable src) - { - if (src == null) - return; - this.idShort = src.idShort; - if (this.idShort == null) - // change in V2.0 -> mandatory - this.idShort = ""; - this.category = src.category; - if (src.description != null) - this.description = new Description(src.description); - } -#endif - - /// - /// Introduced for JSON serialization, can create Referables based on a string name - /// - /// string name (standard PascalCased) - public static Referable CreateAdequateType(string elementName) - { - if (elementName == Key.AAS) - return new AdministrationShell(); - if (elementName == Key.Asset) - return new Asset(); - if (elementName == Key.ConceptDescription) - return new ConceptDescription(); - if (elementName == Key.Submodel) - return new Submodel(); - if (elementName == Key.View) - return new View(); - return SubmodelElementWrapper.CreateAdequateType(elementName); - } - - public void AddDescription(string lang, string str) - { - if (description == null) - description = new Description(); - description.langString.Add(new LangStr(lang, str)); - } - - public virtual AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("Referable", "Ref"); - } - - public virtual string GetElementName() - { - return this.GetSelfDescription()?.ElementName; - } - - public string GetFriendlyName() - { - return AdminShellUtilV20.FilterFriendlyName(this.idShort); - } - - public virtual Reference GetReference(bool includeParents = true) - { - return new Reference( - new AdminShell.Key( - this.GetElementName(), false, Key.IdShort, "" + this.idShort)); - } - - public void CollectReferencesByParent(List refs) - { - // access - if (refs == null) - return; - - // check, if this is identifiable - if (this is Identifiable) - { - var idf = this as Identifiable; - if (idf != null) - { - var k = Key.CreateNew( - idf.GetElementName(), true, idf.identification?.idType, idf.identification?.id); - refs.Insert(0, k); - } - } - else - { - var k = Key.CreateNew(this.GetElementName(), true, "IdShort", this.idShort); - refs.Insert(0, k); - // recurse upwards! - if (this.parent is Referable prf) - prf.CollectReferencesByParent(refs); - } - } - - public string CollectIdShortByParent() - { - // recurse first - var head = ""; - if (!(this is Identifiable) && this.parent is Referable prf) - // can go up - head = prf.CollectIdShortByParent() + "/"; - // add own - var myid = ""; - if (this.idShort != null && this.idShort.Trim() != "") - myid = this.idShort.Trim(); - // together - return head + myid; - } - - // string functions - - public string ToIdShortString() - { - if (this.idShort == null || this.idShort.Trim().Length < 1) - return (""); - return this.idShort.Trim(); - } - - public override string ToString() - { - return "" + this.idShort; - } - - public virtual Key ToKey() - { - return new Key(GetElementName(), true, Key.IdShort, idShort); - } - - // hash functionality - - public class ObjectFieldInfo - { - public object o; - public FieldInfo fi; - public ObjectFieldInfo() { } - public ObjectFieldInfo(object o, FieldInfo fi) - { - this.o = o; - this.fi = fi; - } - } - - public List RecursivelyFindFields(object o, Type countAttribute, Type skipAttribute) - { - // access - var res = new List(); - if (o == null || countAttribute == null) - return res; - - // find fields for this object - var t = o.GetType(); - var l = t.GetFields(BindingFlags.Instance | BindingFlags.Public); - foreach (var f in l) - { - // Skip this field?? - if (skipAttribute != null && f.GetCustomAttribute(skipAttribute) != null) - continue; - - // add directly? - if (f.GetCustomAttribute(countAttribute) != null) - res.Add(new ObjectFieldInfo(o, f)); - - // object - if (f.FieldType.IsClass) - { - var oo = f.GetValue(o); - var r = RecursivelyFindFields(oo, countAttribute, skipAttribute); - res.AddRange(r); - } - - // try cast in IList to check further - var elems = f.GetValue(o) as IList; - if (elems != null) - foreach (var e in elems) - { - var r = RecursivelyFindFields(e, countAttribute, skipAttribute); - res.AddRange(r); - } - - } - // OK - return res; - } - - public byte[] ComputeByteArray() - { - // use memory stream for effcient behaviour - var mems = new MemoryStream(); - - // TEST - var xxx = RecursivelyFindFields(this, typeof(CountForHash), typeof(SkipForHash)); - - foreach (var ofi in xxx) - { - var a = ofi.fi.GetCustomAttribute(); - if (a != null) - { - // found an accountable field, get bytes - var o = ofi.fi.GetValue(ofi.o); - byte[] bs = null; - - // optimize for probabilities - - if (o is string) - bs = System.Text.Encoding.UTF8.GetBytes((string)o); - else if (o is char[]) - bs = System.Text.Encoding.UTF8.GetBytes((char[])o); - else if (o is double) - bs = BitConverter.GetBytes((double)o); - else if (o is float) - bs = BitConverter.GetBytes((float)o); - else if (o is char) - bs = BitConverter.GetBytes((char)o); - else if (o is byte) - bs = BitConverter.GetBytes((byte)o); - else if (o is int) - bs = BitConverter.GetBytes((int)o); - else if (o is long) - bs = BitConverter.GetBytes((long)o); - else if (o is short) - bs = BitConverter.GetBytes((short)o); - else if (o is uint) - bs = BitConverter.GetBytes((uint)o); - else if (o is ulong) - bs = BitConverter.GetBytes((ulong)o); - else if (o is ushort) - bs = BitConverter.GetBytes((ushort)o); - - if (bs != null) - mems.Write(bs, 0, bs.Length); - } - } - - return mems.ToArray(); - } - - private static System.Security.Cryptography.SHA256 HashProvider = - System.Security.Cryptography.SHA256.Create(); - - public string ComputeHashcode() - { - var dataBytes = this.ComputeByteArray(); - var hashBytes = Referable.HashProvider.ComputeHash(dataBytes); - - StringBuilder sb = new StringBuilder(); - foreach (var hb in hashBytes) - sb.Append(hb.ToString("X2")); - return sb.ToString(); - } - - // sorting - - public class ComparerIdShort : IComparer - { - public int Compare(Referable a, Referable b) - { - return String.Compare(a?.idShort, b?.idShort, - CultureInfo.InvariantCulture, CompareOptions.IgnoreCase); - } - } - - public class ComparerIndexed : IComparer - { - public int NullIndex = int.MaxValue; - public Dictionary Index = new Dictionary(); - - public int Compare(Referable a, Referable b) - { - var ca = Index.ContainsKey(a); - var cb = Index.ContainsKey(b); - - if (!ca && !cb) - return 0; - // make CDs without usage to appear at end of list - if (!ca) - return +1; - if (!cb) - return -1; - - var ia = Index[a]; - var ib = Index[b]; - - if (ia == ib) - return 0; - if (ia < ib) - return -1; - return +1; - } - } - - // validation - - public virtual void Validate(AasValidationRecordList results) - { - // access - if (results == null) - return; - - // check - if (this.idShort == null || this.idShort.Trim() == "") - results.Add(new AasValidationRecord( - AasValidationSeverity.SpecViolation, this, - "Referable: missing idShort", - () => - { - this.idShort = "TO_FIX"; - })); - - if (this.description != null && (this.description.langString == null - || this.description.langString.Count < 1)) - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, this, - "Referable: existing description with missing langString", - () => - { - this.description = null; - })); - } - - // hierarchy & recursion (by derived elements) - - public virtual void RecurseOnReferables( - object state, Func lambda, - bool includeThis = false) - { - if (includeThis) - lambda(state, null, this); - } - - public Identifiable FindParentFirstIdentifiable() - { - Referable curr = this; - while (curr != null) - { - if (curr is Identifiable curri) - return curri; - curr = curr.parent as Referable; - } - return null; - } - } - - public class Identifiable : Referable, IGetReference - { - - // members - - public Identification identification = new Identification(); - public Administration administration = null; - - // constructors - - public Identifiable() : base() { } - - public Identifiable(string idShort) : base(idShort) { } - - public Identifiable(Identifiable src) - : base(src) - { - if (src == null) - return; - if (src.identification != null) - this.identification = new Identification(src.identification); - if (src.administration != null) - this.administration = new Administration(src.administration); - } - -#if !DoNotUseAasxCompatibilityModels - public Identifiable(AasxCompatibilityModels.AdminShellV10.Identifiable src) - : base(src) - { - if (src.identification != null) - this.identification = new Identification(src.identification); - if (src.administration != null) - this.administration = new Administration(src.administration); - } -#endif - - public void SetIdentification(string idType, string id, string idShort = null) - { - identification.idType = idType; - identification.id = id; - if (idShort != null) - this.idShort = idShort; - } - - public void SetAdminstration(string version, string revision) - { - if (administration == null) - administration = new Administration(); - administration.version = version; - administration.revision = revision; - } - - public new string GetFriendlyName() - { - if (identification != null && identification.id != "") - return AdminShellUtilV20.FilterFriendlyName(this.identification.id); - return AdminShellUtilV20.FilterFriendlyName(this.idShort); - } - - public override string ToString() - { - return ("" + identification?.ToString() + " " + administration?.ToString()).Trim(); - } - - public override Key ToKey() - { - return new Key(GetElementName(), true, "" + identification?.idType, "" + identification?.id); - } - - // self description - - public override Reference GetReference(bool includeParents = true) - { - var r = new Reference(); - r.Keys.Add( - Key.CreateNew( - this.GetElementName(), true, this.identification.idType, this.identification.id)); - return r; - } - - // sorting - - public class ComparerIdentification : IComparer - { - public int Compare(Identifiable a, Identifiable b) - { - if (a?.identification == null && b?.identification == null) - return 0; - if (a?.identification == null) - return +1; - if (b?.identification == null) - return -1; - - var vc = String.Compare(a.identification.idType, b.identification.idType, - CultureInfo.InvariantCulture, CompareOptions.IgnoreCase); - if (vc != 0) - return vc; - - return String.Compare(a.identification.id, b.identification.id, - CultureInfo.InvariantCulture, CompareOptions.IgnoreCase | CompareOptions.IgnoreNonSpace); - } - } - - } - - public class JsonModelTypeWrapper - { - public string name = ""; - - public JsonModelTypeWrapper(string name = "") { this.name = name; } - } - - public interface IFindAllReferences - { - IEnumerable FindAllReferences(); - } - - public interface IGetSemanticId - { - SemanticId GetSemanticId(); - } - - public class AdministrationShell : Identifiable, IFindAllReferences - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // from hasDataSpecification: - [XmlElement(ElementName = "hasDataSpecification")] - public HasDataSpecification hasDataSpecification = null; - - // from this very class - public AssetAdministrationShellRef derivedFrom = null; - - [JsonProperty(PropertyName = "asset")] - public AssetRef assetRef = new AssetRef(); - - [JsonProperty(PropertyName = "submodels")] - [SkipForSearch] - public List submodelRefs = new List(); - - [JsonIgnore] - public Views views = null; - [XmlIgnore] - [JsonProperty(PropertyName = "views")] - public View[] JsonViews - { - get { return views?.views.ToArray(); } - set { views = Views.CreateOrSetInnerViews(views, value); } - } - - [JsonProperty(PropertyName = "conceptDictionaries")] - public List conceptDictionaries = null; - - // constructors - - public AdministrationShell() { } - - public AdministrationShell(string idShort) : base(idShort) { } - - public AdministrationShell(AdministrationShell src) - : base(src) - { - if (src != null) - { - if (src.hasDataSpecification != null) - this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - - if (src.derivedFrom != null) - this.derivedFrom = new AssetAdministrationShellRef(src.derivedFrom); - - if (src.assetRef != null) - this.assetRef = new AssetRef(src.assetRef); - - if (src.submodelRefs != null) - foreach (var smr in src.submodelRefs) - this.submodelRefs.Add(new SubmodelRef(smr)); - - if (src.views != null) - this.views = new Views(src.views); - - if (src.conceptDictionaries != null) - { - this.conceptDictionaries = new List(); - foreach (var cdd in src.conceptDictionaries) - this.conceptDictionaries.Add(new ConceptDictionary(cdd)); - } - } - } - -#if !DoNotUseAasxCompatibilityModels - public AdministrationShell(AasxCompatibilityModels.AdminShellV10.AdministrationShell src) - : base(src) - { - if (src.hasDataSpecification != null) - this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - - if (src.derivedFrom != null) - this.derivedFrom = new AssetAdministrationShellRef(src.derivedFrom); - - if (src.assetRef != null) - this.assetRef = new AssetRef(src.assetRef); - - if (src.submodelRefs != null) - foreach (var smr in src.submodelRefs) - this.submodelRefs.Add(new SubmodelRef(smr)); - - if (src.views != null) - this.views = new Views(src.views); - - if (src.conceptDictionaries != null) - { - this.conceptDictionaries = new List(); - foreach (var cdd in src.conceptDictionaries) - this.conceptDictionaries.Add(new ConceptDictionary(cdd)); - } - } -#endif - - public static AdministrationShell CreateNew( - string idShort, string idType, string id, string version = null, string revision = null) - { - var s = new AdministrationShell(); - s.idShort = idShort; - if (version != null) - s.SetAdminstration(version, revision); - s.identification.idType = idType; - s.identification.id = id; - return (s); - } - - // add - - public void AddView(View v) - { - if (views == null) - views = new Views(); - views.views.Add(v); - } - - public void AddConceptDictionary(ConceptDictionary d) - { - if (conceptDictionaries == null) - conceptDictionaries = new List(); - conceptDictionaries.Add(d); - } - - public void AddDataSpecification(Key k) - { - if (hasDataSpecification == null) - hasDataSpecification = new HasDataSpecification(); - var r = new Reference(); - r.Keys.Add(k); - hasDataSpecification.Add(new EmbeddedDataSpecification(r)); - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("AssetAdministrationShell", "AAS"); - } - - public Tuple ToCaptionInfo() - { - var caption = AdminShellUtilV20.EvalToNonNullString("\"{0}\" ", idShort, "\"AAS\""); - if (administration != null) - caption += "V" + administration.version + "." + administration.revision; - - var info = ""; - if (identification != null) - info = $"[{identification.idType}, {identification.id}]"; - return Tuple.Create(caption, info); - } - - public override string ToString() - { - var ci = ToCaptionInfo(); - return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); - } - - public SubmodelRef FindSubmodelRef(Identification refid) - { - if (this.submodelRefs == null) - return null; - foreach (var r in this.submodelRefs) - if (r.Matches(refid)) - return r; - return null; - } - - public bool HasSubmodelRef(SubmodelRef newref) - { - // check, if existing - if (this.submodelRefs == null) - return false; - var found = false; - foreach (var r in this.submodelRefs) - if (r.Matches(newref)) - found = true; - - return found; - } - - public void AddSubmodelRef(SubmodelRef newref) - { - if (this.submodelRefs == null) - this.submodelRefs = new List(); - this.submodelRefs.Add(newref); - } - - public IEnumerable FindAllReferences() - { - // Asset - if (this.assetRef != null) - yield return new LocatedReference(this, this.assetRef); - - // Submodel references - if (this.submodelRefs != null) - foreach (var r in this.submodelRefs) - yield return new LocatedReference(this, r); - - // Views - if (this.views?.views != null) - foreach (var vw in this.views.views) - if (vw?.containedElements?.reference != null) - foreach (var r in vw.containedElements.reference) - yield return new LocatedReference(this, r); - } - } - - public class ListOfAdministrationShells : List, IAasElement - { - // self decscription - - public AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("AssetAdministrationShells", "AASs"); - } - - public string GetElementName() - { - return this.GetSelfDescription()?.ElementName; - } - } - - public class Asset : Identifiable - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // from hasDataSpecification: - [XmlElement(ElementName = "hasDataSpecification")] - public HasDataSpecification hasDataSpecification = null; - - // from this very class - [XmlElement(ElementName = "assetIdentificationModelRef")] - public SubmodelRef assetIdentificationModelRef = null; - - [XmlElement(ElementName = "billOfMaterialRef")] - public SubmodelRef billOfMaterialRef = null; - - // from HasKind - [XmlElement(ElementName = "kind")] - [JsonIgnore] - public AssetKind kind = new AssetKind(); - [XmlIgnore] - [JsonProperty(PropertyName = "kind")] - public string JsonKind - { - get - { - if (kind == null) - return null; - return kind.kind; - } - set - { - if (kind == null) - kind = new AssetKind(); - kind.kind = value; - } - } - - // constructors - - public Asset() { } - - public Asset(string idShort) : base(idShort) { } - - public Asset(Asset src) - : base(src) - { - if (src != null) - { - if (src.hasDataSpecification != null) - this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - if (src.kind != null) - this.kind = new AssetKind(src.kind); - if (src.assetIdentificationModelRef != null) - this.assetIdentificationModelRef = new SubmodelRef(src.assetIdentificationModelRef); - } - } - -#if !DoNotUseAasxCompatibilityModels - public Asset(AasxCompatibilityModels.AdminShellV10.Asset src) - : base(src) - { - if (src != null) - { - if (src.hasDataSpecification != null) - this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - if (src.kind != null) - this.kind = new AssetKind(src.kind); - if (src.assetIdentificationModelRef != null) - this.assetIdentificationModelRef = new SubmodelRef(src.assetIdentificationModelRef); - } - } -#endif - - // Getter & setters - - public AssetRef GetAssetReference() - { - var r = new AssetRef(); - r.Keys.Add( - Key.CreateNew( - this.GetElementName(), true, this.identification.idType, this.identification.id)); - return r; - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("Asset", "Asset"); - } - - public Tuple ToCaptionInfo() - { - var caption = AdminShellUtilV20.EvalToNonNullString("\"{0}\" ", idShort, ""); - if (administration != null) - caption += "V" + administration.version + "." + administration.revision; - - var info = ""; - if (identification != null) - info = $"[{identification.idType}, {identification.id}]"; - return Tuple.Create(caption, info); - } - - public override string ToString() - { - var ci = ToCaptionInfo(); - return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); - } - - public IEnumerable FindAllReferences() - { - if (this.assetIdentificationModelRef != null) - yield return this.assetIdentificationModelRef; - if (this.billOfMaterialRef != null) - yield return this.billOfMaterialRef; - } - } - - public class ListOfAssets : List, IAasElement - { - // self decscription - - public AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("Assets", "Assets"); - } - - public string GetElementName() - { - return this.GetSelfDescription()?.ElementName; - } - - } - - public class View : Referable - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // members - - // from hasSemanticId: - [XmlElement(ElementName = "semanticId")] - public SemanticId semanticId = null; - - // from hasDataSpecification - [XmlElement(ElementName = "hasDataSpecification")] - public HasDataSpecification hasDataSpecification = null; - - // from this very class - [JsonIgnore] - [SkipForSearch] - public ContainedElements containedElements = null; - [XmlIgnore] - [SkipForSearch] - [JsonProperty(PropertyName = "containedElements")] - public ContainedElementRef[] JsonContainedElements - { - get { return containedElements?.reference.ToArray(); } - set { containedElements = ContainedElements.CreateOrSetInner(containedElements, value); } - } - - // getter / setter - - [XmlIgnore] - [JsonIgnore] - public bool IsEmpty { get { return containedElements == null || containedElements.Count < 1; } } - [XmlIgnore] - [JsonIgnore] - public int Count { get { if (containedElements == null) return 0; return containedElements.Count; } } - - public ContainedElementRef this[int index] - { - get { if (containedElements == null) return null; return containedElements[index]; } - } - - // constructors / creators - - public View() { } - - public View(View src) - : base(src) - { - if (src.semanticId != null) - this.semanticId = new SemanticId(src.semanticId); - if (src.hasDataSpecification != null) - this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - if (src.containedElements != null) - this.containedElements = new ContainedElements(src.containedElements); - } - -#if !DoNotUseAasxCompatibilityModels - public View(AasxCompatibilityModels.AdminShellV10.View src) - : base(src) - { - if (src.semanticId != null) - this.semanticId = new SemanticId(src.semanticId); - if (src.hasDataSpecification != null) - this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - if (src.containedElements != null) - this.containedElements = new ContainedElements(src.containedElements); - } -#endif - - public static View CreateNew(string idShort) - { - var v = new View() { idShort = idShort }; - return (v); - } - - public void AddDataSpecification(Key k) - { - if (hasDataSpecification == null) - hasDataSpecification = new HasDataSpecification(); - var r = new Reference(); - r.Keys.Add(k); - hasDataSpecification.Add(new EmbeddedDataSpecification(r)); - } - - public void AddContainedElement(Key k) - { - if (containedElements == null) - containedElements = new ContainedElements(); - var r = new ContainedElementRef(); - r.Keys.Add(k); - containedElements.reference.Add(r); - } - - public void AddContainedElement(List keys) - { - if (containedElements == null) - containedElements = new ContainedElements(); - var r = new ContainedElementRef(); - foreach (var k in keys) - r.Keys.Add(k); - containedElements.reference.Add(r); - } - - public void AddContainedElement(Reference r) - { - if (containedElements == null) - containedElements = new ContainedElements(); - containedElements.reference.Add(ContainedElementRef.CreateNew(r)); - } - - public void AddContainedElement(List rlist) - { - if (containedElements == null) - containedElements = new ContainedElements(); - foreach (var r in rlist) - containedElements.reference.Add(ContainedElementRef.CreateNew(r)); - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("View", "View"); - } - - public Tuple ToCaptionInfo() - { - var caption = AdminShellUtilV20.EvalToNonNullString("\"{0}\" ", idShort, ""); - var info = ""; - if (this.semanticId != null) - info = Key.KeyListToString(this.semanticId.Keys); - if (this.containedElements != null && this.containedElements.reference != null) - info = (info + " ").Trim() + - String.Format("({0} elements)", this.containedElements.reference.Count); - return Tuple.Create(caption, info); - } - - public override string ToString() - { - var ci = ToCaptionInfo(); - return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); - } - - // validation - - public override void Validate(AasValidationRecordList results) - { - // access - if (results == null) - return; - - // check - base.Validate(results); - KeyList.Validate(results, semanticId?.Keys, this); - } - } - - public class Views - { - [XmlElement(ElementName = "view")] - [JsonIgnore] - public List views = new List(); - - // constructors - - public Views() { } - - public Views(Views src) - { - if (src != null && src.views != null) - foreach (var v in src.views) - this.views.Add(new View(v)); - } - -#if !DoNotUseAasxCompatibilityModels - public Views(AasxCompatibilityModels.AdminShellV10.Views src) - { - if (src != null && src.views != null) - foreach (var v in src.views) - this.views.Add(new View(v)); - } -#endif - - public static Views CreateOrSetInnerViews(Views outer, View[] inner) - { - var res = outer; - if (res == null) - res = new Views(); - if (inner == null) - { - res.views = null; - return res; - } - res.views = new List(inner); - return res; - } - } - - /// - /// Multiple lang string for the AAS namespace - /// - public class LangStringSet - { - - // members - - [XmlElement(ElementName = "langString", Namespace = "http://www.admin-shell.io/aas/2/0")] - public ListOfLangStr langString = new ListOfLangStr(); - - // getters / setters - - [XmlIgnore] - [JsonIgnore] - public bool IsEmpty { get { return langString == null || langString.Count < 1; } } - [XmlIgnore] - [JsonIgnore] - public int Count { get { if (langString == null) return 0; return langString.Count; } } - [XmlIgnore] - [JsonIgnore] - public LangStr this[int index] { get { return langString[index]; } } - - // constructors - - public LangStringSet() { } - - public LangStringSet(LangStringSet src) - { - if (src.langString != null) - foreach (var ls in src.langString) - this.langString.Add(new LangStr(ls)); - } - - public LangStringSet(ListOfLangStr src) - { - if (src != null) - foreach (var ls in src) - this.langString.Add(new LangStr(ls)); - } - -#if !DoNotUseAasxCompatibilityModels - // not available in V1.0 -#endif - public LangStringSet(string lang, string str) - { - if (str == null || str.Trim() == "") - return; - this.langString.Add(new LangStr(lang, str)); - } - - // converter - - public static LangStringSet CreateFrom(List src) - { - var res = new LangStringSet(); - if (src != null) - foreach (var ls in src) - res.langString.Add(new LangStr(ls)); - return res; - } - - // add - - public LangStr Add(LangStr ls) - { - this.langString.Add(ls); - return ls; - } - - public LangStr Add(string lang, string str) - { - var ls = new LangStr(lang, str); - this.langString.Add(ls); - return ls; - } - - // single string representation - public string GetDefaultStr(string defaultLang = null) - { - return this.langString?.GetDefaultStr(defaultLang); - } - } - - /// - /// Multiple lang string for the IEC61360 namespace - /// - public class LangStringSetIEC61360 : ListOfLangStr - { - - // getters / setters - - [XmlIgnore] - [JsonIgnore] - public bool IsEmpty { get { return this.Count < 1; } } - - // constructors - - public LangStringSetIEC61360() { } - - public LangStringSetIEC61360(ListOfLangStr lol) : base(lol) { } - - public LangStringSetIEC61360(LangStringSetIEC61360 src) - { - foreach (var ls in src) - this.Add(new LangStr(ls)); - } - -#if !DoNotUseAasxCompatibilityModels - public LangStringSetIEC61360(AasxCompatibilityModels.AdminShellV10.LangStringIEC61360 src) - { - if (src.langString != null) - foreach (var ls in src.langString) - this.Add(new LangStr(ls)); - } -#endif - public LangStringSetIEC61360(string lang, string str) - { - if (str == null || str.Trim() == "") - return; - this.Add(new LangStr(lang, str)); - } - - // converter - - public static LangStringSetIEC61360 CreateFrom(List src) - { - var res = new LangStringSetIEC61360(); - if (src != null) - foreach (var ls in src) - res.Add(new LangStr(ls)); - return res; - } - - } - - public class UnitId - { - - // members - - [XmlIgnore] - [JsonIgnore] - public KeyList keys = new KeyList(); - - // getter / setters - - [XmlArray("keys")] - [XmlArrayItem("key")] - [JsonIgnore] - public KeyList Keys { get { return keys; } } - [XmlIgnore] - [JsonProperty(PropertyName = "keys")] - public KeyList JsonKeys - { - get - { - keys?.NumberIndices(); - return keys; - } - } - - [XmlIgnore] - [JsonIgnore] - public bool IsEmpty { get { return keys == null || keys.IsEmpty; } } - [XmlIgnore] - [JsonIgnore] - public int Count { get { if (keys == null) return 0; return keys.Count; } } - [XmlIgnore] - [JsonIgnore] - public Key this[int index] { get { return keys[index]; } } - - // constructors / creators - - public UnitId() { } - - public UnitId(UnitId src) - { - if (src.keys != null) - foreach (var k in src.Keys) - this.keys.Add(new Key(k)); - } - -#if !DoNotUseAasxCompatibilityModels - public UnitId(AasxCompatibilityModels.AdminShellV10.UnitId src) - { - if (src.keys != null) - foreach (var k in src.Keys) - this.keys.Add(new Key(k)); - } -#endif - - public static UnitId CreateNew(string type, bool local, string idType, string value) - { - var u = new UnitId(); - u.keys.Add(Key.CreateNew(type, local, idType, value)); - return u; - } - - public static UnitId CreateNew(Reference src) - { - if (src == null) - return null; - var res = new UnitId(); - if (src.Keys != null) - foreach (var k in src.Keys) - res.keys.Add(k); - return res; - } - } - - [XmlRoot(Namespace = "http://www.admin-shell.io/IEC61360/2/0")] - public class DataSpecificationIEC61360 - { - // static member - [XmlIgnore] - [JsonIgnore] - public static string[] DataTypeNames = { - "STRING", - "STRING_TRANSLATABLE", - "REAL_MEASURE", - "REAL_COUNT", - "REAL_CURRENCY", - "INTEGER_MEASURE", - "INTEGER_COUNT", - "INTEGER_CURRENCY", - "BOOLEAN", - "URL", - "RATIONAL", - "RATIONAL_MEASURE", - "TIME", - "TIMESTAMP", - "DATE" }; - - // members - // TODO (MIHO, 2020-08-27): According to spec, cardinality is [1..1][1..n] - // these cardinalities are NOT MAINTAINED in ANY WAY by the system - public LangStringSetIEC61360 preferredName = new LangStringSetIEC61360(); - - // TODO (MIHO, 2020-08-27): According to spec, cardinality is [0..1][1..n] - // these cardinalities are NOT MAINTAINED in ANY WAY by the system - public LangStringSetIEC61360 shortName = null; - - [MetaModelName("DataSpecificationIEC61360.unit")] - [TextSearchable] - [CountForHash] - public string unit = ""; - - public UnitId unitId = null; - - [MetaModelName("DataSpecificationIEC61360.valueFormat")] - [TextSearchable] - [CountForHash] - public string valueFormat = null; - - [MetaModelName("DataSpecificationIEC61360.sourceOfDefinition")] - [TextSearchable] - [CountForHash] - public string sourceOfDefinition = null; - - [MetaModelName("DataSpecificationIEC61360.symbol")] - [TextSearchable] - [CountForHash] - public string symbol = null; - - [MetaModelName("DataSpecificationIEC61360.dataType")] - [TextSearchable] - [CountForHash] - public string dataType = ""; - - // TODO (MIHO, 2020-08-27): According to spec, cardinality is [0..1][1..n] - // these cardinalities are NOT MAINTAINED in ANY WAY by the system - public LangStringSetIEC61360 definition = null; - - // getter / setters - - // constructors - - public DataSpecificationIEC61360() { } - - public DataSpecificationIEC61360(DataSpecificationIEC61360 src) - { - if (src.preferredName != null) - this.preferredName = new LangStringSetIEC61360(src.preferredName); - this.shortName = src.shortName; - this.unit = src.unit; - if (src.unitId != null) - this.unitId = new UnitId(src.unitId); - this.valueFormat = src.valueFormat; - this.sourceOfDefinition = src.sourceOfDefinition; - this.symbol = src.symbol; - this.dataType = src.dataType; - if (src.definition != null) - this.definition = new LangStringSetIEC61360(src.definition); - } - -#if !DoNotUseAasxCompatibilityModels - public DataSpecificationIEC61360(AasxCompatibilityModels.AdminShellV10.DataSpecificationIEC61360 src) - { - if (src.preferredName != null) - this.preferredName = new LangStringSetIEC61360(src.preferredName); - this.shortName = new LangStringSetIEC61360("EN?", src.shortName); - this.unit = src.unit; - if (src.unitId != null) - this.unitId = new UnitId(src.unitId); - this.valueFormat = src.valueFormat; - if (src.sourceOfDefinition != null && src.sourceOfDefinition.Count > 0) - this.sourceOfDefinition = src.sourceOfDefinition[0].str; - this.symbol = src.symbol; - this.dataType = src.dataType; - if (src.definition != null) - this.definition = new LangStringSetIEC61360(src.definition); - } -#endif - - public static DataSpecificationIEC61360 CreateNew( - string[] preferredName = null, - string shortName = "", - string unit = "", - UnitId unitId = null, - string valueFormat = null, - string sourceOfDefinition = null, - string symbol = null, - string dataType = "", - string[] definition = null - ) - { - var d = new DataSpecificationIEC61360(); - if (preferredName != null) - { - d.preferredName = new LangStringSetIEC61360(LangStr.CreateManyFromStringArray(preferredName)); - } - d.shortName = new LangStringSetIEC61360("EN?", shortName); - d.unit = unit; - d.unitId = unitId; - d.valueFormat = valueFormat; - d.sourceOfDefinition = sourceOfDefinition; - d.symbol = symbol; - d.dataType = dataType; - if (definition != null) - { - if (d.definition == null) - d.definition = new LangStringSetIEC61360(); - d.definition = new LangStringSetIEC61360(LangStr.CreateManyFromStringArray(definition)); - } - return (d); - } - - // "constants" - - public static Key GetKey() - { - return Key.CreateNew( - "GlobalReference", false, "IRI", - "http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/2/0"); - } - - // validation - - public void Validate(AasValidationRecordList results, ConceptDescription cd) - { - // access - if (results == null || cd == null) - return; - - // check IEC61360 spec - if (this.preferredName == null || this.preferredName.Count < 1) - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, cd, - "ConceptDescription: missing preferredName", - () => - { - this.preferredName = new AdminShell.LangStringSetIEC61360("EN?", - AdminShellUtilV20.EvalToNonEmptyString("{0}", cd.idShort, "UNKNOWN")); - })); - - if (this.shortName != null && this.shortName.Count < 1) - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, cd, - "ConceptDescription: existing shortName with missing langString", - () => - { - this.shortName = null; - })); - - if (this.definition != null && this.definition.Count < 1) - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, cd, - "ConceptDescription: existing definition with missing langString", - () => - { - this.definition = null; - })); - - // check data type - string foundDataType = null; - if (this.dataType != null) - foreach (var dtn in DataTypeNames) - if (this.dataType.Trim() == dtn.Trim()) - foundDataType = this.dataType; - if (foundDataType == null) - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, cd, - "ConceptDescription: dataType does not match allowed enumeration values", - () => - { - this.dataType = "STRING"; - })); - } - } - - // ReSharper disable ClassNeverInstantiated.Global .. class is important to show potential for ISO! - - public class DataSpecificationISO99999 - { - } - - // ReSharper enable ClassNeverInstantiated.Global - - public class DataSpecificationContent - { - - // members - - public DataSpecificationIEC61360 dataSpecificationIEC61360 = null; - public DataSpecificationISO99999 dataSpecificationISO99999 = null; - - // constructors - - public DataSpecificationContent() { } - - public DataSpecificationContent(DataSpecificationContent src) - { - if (src.dataSpecificationIEC61360 != null) - this.dataSpecificationIEC61360 = new DataSpecificationIEC61360(src.dataSpecificationIEC61360); - } - -#if !DoNotUseAasxCompatibilityModels - public DataSpecificationContent(AasxCompatibilityModels.AdminShellV10.DataSpecificationContent src) - { - if (src.dataSpecificationIEC61360 != null) - this.dataSpecificationIEC61360 = new DataSpecificationIEC61360(src.dataSpecificationIEC61360); - } -#endif - } - - public class EmbeddedDataSpecification - { - // members - - [JsonIgnore] - public DataSpecificationContent dataSpecificationContent = null; - - [XmlIgnore] - [JsonProperty("dataSpecificationContent")] - public DataSpecificationIEC61360 JsonWrongDataSpec61360 - { - get { return dataSpecificationContent?.dataSpecificationIEC61360; } - set - { - if (dataSpecificationContent == null) - dataSpecificationContent = new DataSpecificationContent(); - dataSpecificationContent.dataSpecificationIEC61360 = value; - } - } - - public DataSpecificationRef dataSpecification = null; - - // constructors - - public EmbeddedDataSpecification() { } - - public EmbeddedDataSpecification( - DataSpecificationRef dataSpecification, - DataSpecificationContent dataSpecificationContent) - { - this.dataSpecification = dataSpecification; - this.dataSpecificationContent = dataSpecificationContent; - } - - public EmbeddedDataSpecification(EmbeddedDataSpecification src) - { - if (src.dataSpecification != null) - this.dataSpecification = new DataSpecificationRef(src.dataSpecification); - if (src.dataSpecificationContent != null) - this.dataSpecificationContent = new DataSpecificationContent(src.dataSpecificationContent); - } - - public EmbeddedDataSpecification(Reference src) - { - if (src != null) - this.dataSpecification = new DataSpecificationRef(src); - } - -#if !DoNotUseAasxCompatibilityModels - public EmbeddedDataSpecification(AasxCompatibilityModels.AdminShellV10.EmbeddedDataSpecification src) - { - if (src.hasDataSpecification != null) - this.dataSpecification = new DataSpecificationRef(src.hasDataSpecification); - if (src.dataSpecificationContent != null) - this.dataSpecificationContent = new DataSpecificationContent(src.dataSpecificationContent); - } - - public EmbeddedDataSpecification(AasxCompatibilityModels.AdminShellV10.Reference src) - { - if (src != null) - this.dataSpecification = new DataSpecificationRef(src); - } -#endif - - public static EmbeddedDataSpecification CreateIEC61360WithContent() - { - var eds = new EmbeddedDataSpecification(new DataSpecificationRef(), new DataSpecificationContent()); - - eds.dataSpecification.Keys.Add(DataSpecificationIEC61360.GetKey()); - - eds.dataSpecificationContent.dataSpecificationIEC61360 = - AdminShell.DataSpecificationIEC61360.CreateNew(); - - return eds; - } - - public DataSpecificationIEC61360 GetIEC61360() - { - return this.dataSpecificationContent?.dataSpecificationIEC61360; - } - } - - public class ConceptDescription : Identifiable, System.IDisposable - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // members - - // do this in order to be IDisposable, that is: suitable for (using) - void System.IDisposable.Dispose() { } - public void GetData() { } - // from HasDataSpecification - -#if __not_anymore - - [XmlElement(ElementName = "embeddedDataSpecification")] - [JsonIgnore] - public EmbeddedDataSpecification embeddedDataSpecification = new EmbeddedDataSpecification(); -#else - // According to Spec V2.0.1, a ConceptDescription might feature alos multiple data specifications - /* TODO (MIHO, 2020-08-30): align wording of the member ("embeddedDataSpecification") with the - * wording of the other entities ("hasDataSpecification") */ - [XmlElement(ElementName = "embeddedDataSpecification")] - [JsonIgnore] - public HasDataSpecification embeddedDataSpecification = null; -#endif - - [XmlIgnore] - [JsonProperty(PropertyName = "embeddedDataSpecifications")] - public EmbeddedDataSpecification[] JsonEmbeddedDataSpecifications - { - get - { - return this.embeddedDataSpecification?.ToArray(); - } - set - { - embeddedDataSpecification = new HasDataSpecification(value); - } - } - - // old - - // this class - [XmlIgnore] - private List isCaseOf = null; - - // getter / setter - - [XmlElement(ElementName = "isCaseOf")] - [JsonProperty(PropertyName = "isCaseOf")] - public List IsCaseOf - { - get { return isCaseOf; } - set { isCaseOf = value; } - } - - // constructors / creators - - public ConceptDescription() : base() { } - - public ConceptDescription(ConceptDescription src) - : base(src) - { - if (src.embeddedDataSpecification != null) - this.embeddedDataSpecification = new HasDataSpecification(src.embeddedDataSpecification); - if (src.isCaseOf != null) - foreach (var ico in src.isCaseOf) - { - if (this.isCaseOf == null) - this.isCaseOf = new List(); - this.isCaseOf.Add(new Reference(ico)); - } - } - -#if !DoNotUseAasxCompatibilityModels - public ConceptDescription(AasxCompatibilityModels.AdminShellV10.ConceptDescription src) - : base(src) - { - if (src.embeddedDataSpecification != null) - { - this.embeddedDataSpecification = new HasDataSpecification(); - this.embeddedDataSpecification.Add(new EmbeddedDataSpecification(src.embeddedDataSpecification)); - } - if (src.IsCaseOf != null) - foreach (var ico in src.IsCaseOf) - { - if (this.isCaseOf == null) - this.isCaseOf = new List(); - this.isCaseOf.Add(new Reference(ico)); - } - } -#endif - - public static ConceptDescription CreateNew( - string idShort, string idType, string id, string version = null, string revision = null) - { - var cd = new ConceptDescription(); - cd.idShort = idShort; - cd.identification.idType = idType; - cd.identification.id = id; - if (version != null) - { - if (cd.administration == null) - cd.administration = new Administration(); - cd.administration.version = version; - cd.administration.revision = revision; - } - return (cd); - } - - public Key GetSingleKey() - { - return Key.CreateNew(this.GetElementName(), true, this.identification.idType, this.identification.id); - } - - public ConceptDescriptionRef GetCdReference() - { - var r = new ConceptDescriptionRef(); - r.Keys.Add( - Key.CreateNew( - this.GetElementName(), true, this.identification.idType, this.identification.id)); - return r; - } - - public void SetIEC61360Spec( - string[] preferredNames = null, - string shortName = "", - string unit = "", - UnitId unitId = null, - string valueFormat = null, - string sourceOfDefinition = null, - string symbol = null, - string dataType = "", - string[] definition = null - ) - { - var eds = new EmbeddedDataSpecification(new DataSpecificationRef(), new DataSpecificationContent()); - eds.dataSpecification.Keys.Add( - DataSpecificationIEC61360.GetKey()); - eds.dataSpecificationContent.dataSpecificationIEC61360 = - AdminShell.DataSpecificationIEC61360.CreateNew( - preferredNames, shortName, unit, unitId, valueFormat, sourceOfDefinition, symbol, - dataType, definition); - - this.embeddedDataSpecification = new HasDataSpecification(); - this.embeddedDataSpecification.Add(eds); - - this.AddIsCaseOf( - Reference.CreateNew( - new Key("ConceptDescription", false, this.identification.idType, this.identification.id))); - } - - public DataSpecificationIEC61360 GetIEC61360() - { - return this.embeddedDataSpecification?.IEC61360Content; - } - - // as experimental approach, forward the IEC getter/sett of hasDataSpec directly - - [XmlIgnore] - [JsonIgnore] - public EmbeddedDataSpecification IEC61360DataSpec - { - get - { - return this.embeddedDataSpecification?.IEC61360; - } - set - { - // add embeddedDataSpecification first? - if (this.embeddedDataSpecification == null) - this.embeddedDataSpecification = new HasDataSpecification(); - this.embeddedDataSpecification.IEC61360 = value; - } - } - - [XmlIgnore] - [JsonIgnore] - public DataSpecificationIEC61360 IEC61360Content - { - get - { - return this.embeddedDataSpecification?.IEC61360Content; - } - set - { - // add embeddedDataSpecification first? - if (this.embeddedDataSpecification == null) - this.embeddedDataSpecification = new HasDataSpecification(); - - // check, if e IEC61360 can be found - var eds = this.embeddedDataSpecification.IEC61360; - - // if already there, update - if (eds != null) - { - eds.dataSpecificationContent = new DataSpecificationContent(); - eds.dataSpecificationContent.dataSpecificationIEC61360 = value; - return; - } - - // no: add a full record - eds = EmbeddedDataSpecification.CreateIEC61360WithContent(); - eds.dataSpecificationContent.dataSpecificationIEC61360 = value; - this.embeddedDataSpecification.Add(eds); - } - } - - public DataSpecificationIEC61360 CreateDataSpecWithContentIec61360() - { - var eds = AdminShell.EmbeddedDataSpecification.CreateIEC61360WithContent(); - if (this.embeddedDataSpecification == null) - this.embeddedDataSpecification = new HasDataSpecification(); - this.embeddedDataSpecification.Add(eds); - return eds.dataSpecificationContent?.dataSpecificationIEC61360; - } - - public string GetDefaultPreferredName(string defaultLang = null) - { - return "" + - GetIEC61360()? - .preferredName?.GetDefaultStr(defaultLang); - } - - public string GetDefaultShortName(string defaultLang = null) - { - return "" + - GetIEC61360()? - .shortName?.GetDefaultStr(defaultLang); - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("ConceptDescription", "CD"); - } - - public Tuple ToCaptionInfo() - { - var caption = ""; - if (this.idShort != null && this.idShort.Trim() != "") - caption = $"\"{this.idShort.Trim()}\""; - if (this.identification != null) - caption = (caption + " " + this.identification).Trim(); - - var info = "" + GetDefaultShortName(); - - return Tuple.Create(caption, info); - } - - public override string ToString() - { - var ci = ToCaptionInfo(); - return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); - } - - public void AddIsCaseOf(Reference ico) - { - if (isCaseOf == null) - isCaseOf = new List(); - isCaseOf.Add(ico); - } - - public static IDisposable CreateNew() - { - throw new NotImplementedException(); - } - - // validation - - public override void Validate(AasValidationRecordList results) - { - // access - if (results == null) - return; - - // check CD itself - base.Validate(results); - - // check IEC61360 spec - var eds61360 = this.IEC61360DataSpec; - if (eds61360 != null) - { - // check data spec - if (eds61360.dataSpecification == null || - !(eds61360.dataSpecification.MatchesExactlyOneKey(DataSpecificationIEC61360.GetKey()))) - results.Add(new AasValidationRecord( - AasValidationSeverity.SpecViolation, this, - "HasDataSpecification: data specification content set to IEC61360, but no " + - "data specification reference set!", - () => - { - eds61360.dataSpecification = new DataSpecificationRef( - new Reference( - DataSpecificationIEC61360.GetKey())); - })); - - // validate content - if (eds61360.dataSpecificationContent?.dataSpecificationIEC61360 == null) - { - results.Add(new AasValidationRecord( - AasValidationSeverity.SpecViolation, this, - "HasDataSpecification: data specification reference set to IEC61360, but no " + - "data specification content set!", - () => - { - eds61360.dataSpecificationContent = new DataSpecificationContent(); - eds61360.dataSpecificationContent.dataSpecificationIEC61360 = - new DataSpecificationIEC61360(); - })); - } - else - { - // validate - eds61360.dataSpecificationContent.dataSpecificationIEC61360.Validate(results, this); - } - } - } - - // more find - - public IEnumerable FindAllReferences() - { - yield break; - } - } - - public class ListOfConceptDescriptions : List, IAasElement - { - // finding - - public ConceptDescription Find(ConceptDescriptionRef cdr) - { - if (cdr == null) - return null; - return Find(cdr.Keys); - } - - public ConceptDescription Find(Identification id) - { - var cdr = ConceptDescriptionRef.CreateNew("Conceptdescription", true, id.idType, id.id); - return Find(cdr); - } - - public ConceptDescription Find(List keys) - { - // trivial - if (keys == null) - return null; - // can only refs with 1 key - if (keys.Count != 1) - return null; - // and we're picky - var key = keys[0]; - if (!key.local || key.type.ToLower().Trim() != "conceptdescription") - return null; - // brute force - foreach (var cd in this) - if (cd.identification.idType.ToLower().Trim() == key.idType.ToLower().Trim() - && cd.identification.id.ToLower().Trim() == key.value.ToLower().Trim()) - return cd; - // uups - return null; - } - - // item management - - public ConceptDescription AddIfNew(ConceptDescription cd) - { - if (cd == null) - return null; - - var exist = this.Find(cd.identification); - if (exist != null) - return exist; - - this.Add(cd); - return cd; - } - - // self decscription - - public AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("ConceptDescriptions", "CDS"); - } - - public string GetElementName() - { - return this.GetSelfDescription()?.ElementName; - } - - // sorting - - - } - - public class ConceptDictionary : Referable - { - [XmlElement(ElementName = "conceptDescriptions")] - public ConceptDescriptionRefs conceptDescriptionsRefs = null; - - // constructors - - public ConceptDictionary() { } - - public ConceptDictionary(ConceptDictionary src) - { - if (src.conceptDescriptionsRefs != null) - this.conceptDescriptionsRefs = new ConceptDescriptionRefs(src.conceptDescriptionsRefs); - } - -#if !DoNotUseAasxCompatibilityModels - public ConceptDictionary(AasxCompatibilityModels.AdminShellV10.ConceptDictionary src) - { - if (src.conceptDescriptionsRefs != null) - this.conceptDescriptionsRefs = new ConceptDescriptionRefs(src.conceptDescriptionsRefs); - } -#endif - - public static ConceptDictionary CreateNew(string idShort = null) - { - var d = new ConceptDictionary(); - if (idShort != null) - d.idShort = idShort; - return (d); - } - - // add - - public void AddReference(Reference r) - { - var cdr = (ConceptDescriptionRef)(ConceptDescriptionRef.CreateNew(r.Keys)); - if (conceptDescriptionsRefs == null) - conceptDescriptionsRefs = new ConceptDescriptionRefs(); - conceptDescriptionsRefs.conceptDescriptions.Add(cdr); - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("ConceptDictionary", "CDic"); - } - } - - /// - /// Use by FindAllReference to provide a enumeration of referenced with location - /// info, where they are contained - /// - public class LocatedReference - { - public Identifiable Identifiable; - public Reference Reference; - - public LocatedReference() { } - public LocatedReference(Identifiable identifiable, Reference reference) - { - Identifiable = identifiable; - Reference = reference; - } - } - - [XmlRoot(ElementName = "aasenv", Namespace = "http://www.admin-shell.io/aas/2/0")] - public class AdministrationShellEnv : IFindAllReferences, IAasElement, IDiaryData, IRecurseOnReferables - { - - // diary (as e.g. deleted AASes need to be listed somewhere) - - [XmlIgnore] - [JsonIgnore] - [SkipForHash] - [SkipForReflection] - private DiaryDataDef _diaryData = new DiaryDataDef(); - - [XmlIgnore] - [JsonIgnore] - [SkipForReflection] - public DiaryDataDef DiaryData { get { return _diaryData; } } - - // members - - [XmlAttribute(Namespace = System.Xml.Schema.XmlSchema.InstanceNamespace)] - [JsonIgnore] - public string schemaLocation = - "http://www.admin-shell.io/aas/2/0 AAS.xsd http://www.admin-shell.io/IEC61360/2/0 IEC61360.xsd"; - - [XmlIgnore] // will be ignored, anyway - private ListOfAdministrationShells administrationShells = new ListOfAdministrationShells(); - [XmlIgnore] // will be ignored, anyway - private ListOfAssets assets = new ListOfAssets(); - [XmlIgnore] // will be ignored, anyway - private ListOfSubmodels submodels = new ListOfSubmodels(); - [XmlIgnore] // will be ignored, anyway - private ListOfConceptDescriptions conceptDescriptions = new ListOfConceptDescriptions(); - - // getter / setters - - [XmlArray("assetAdministrationShells")] - [XmlArrayItem("assetAdministrationShell")] - [JsonProperty(PropertyName = "assetAdministrationShells")] - public ListOfAdministrationShells AdministrationShells - { - get { return administrationShells; } - set { administrationShells = value; } - } - - [XmlArray("assets")] - [XmlArrayItem("asset")] - [JsonProperty(PropertyName = "assets")] - public ListOfAssets Assets - { - get { return assets; } - set { assets = value; } - } - - [XmlArray("submodels")] - [XmlArrayItem("submodel")] - [JsonProperty(PropertyName = "submodels")] - public ListOfSubmodels Submodels - { - get { return submodels; } - set { submodels = value; } - } - - [XmlArray("conceptDescriptions")] - [XmlArrayItem("conceptDescription")] - [JsonProperty(PropertyName = "conceptDescriptions")] - public ListOfConceptDescriptions ConceptDescriptions - { - get { return conceptDescriptions; } - set { conceptDescriptions = value; } - } - - // constructors - - public AdministrationShellEnv() { } - -#if !DoNotUseAasxCompatibilityModels - public AdministrationShellEnv(AasxCompatibilityModels.AdminShellV10.AdministrationShellEnv src) - { - if (src.AdministrationShells != null) - foreach (var aas in src.AdministrationShells) - this.administrationShells.Add(new AdministrationShell(aas)); - - if (src.Assets != null) - foreach (var asset in src.Assets) - this.assets.Add(new Asset(asset)); - - if (src.Submodels != null) - foreach (var sm in src.Submodels) - this.submodels.Add(new Submodel(sm)); - - if (src.ConceptDescriptions != null) - foreach (var cd in src.ConceptDescriptions) - this.conceptDescriptions.Add(new ConceptDescription(cd)); - } -#endif - - // to String - - public override string ToString() - { - var res = "AAS-ENV"; - if (AdministrationShells != null) - res += $" {AdministrationShells.Count} AAS"; - if (Assets != null) - res += $" {Assets.Count} Assets"; - if (Submodels != null) - res += $" {Submodels.Count} Submodels"; - if (ConceptDescriptions != null) - res += $" {ConceptDescriptions.Count} CDs"; - return res; - } - - // self decscription - - public AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("AdministrationShellEnv", "Env"); - } - - public string GetElementName() - { - return this.GetSelfDescription()?.ElementName; - } - - // finders - - public AdministrationShell FindAAS(Identification id) - { - if (id == null) - return null; - foreach (var aas in this.AdministrationShells) - if (aas.identification != null && aas.identification.IsEqual(id)) - return aas; - return null; - } - - public AdministrationShell FindAAS(string idShort) - { - if (idShort == null) - return null; - foreach (var aas in this.AdministrationShells) - if (aas.idShort != null && aas.idShort.Trim().ToLower() == idShort.Trim().ToLower()) - return aas; - return null; - } - - public AdministrationShell FindAASwithSubmodel(Identification smid) - { - if (smid == null) - return null; - foreach (var aas in this.AdministrationShells) - if (aas.submodelRefs != null) - foreach (var smref in aas.submodelRefs) - if (smref.Matches(smid)) - return aas; - return null; - } - - public IEnumerable FindAllAAS( - Predicate p = null) - { - if (this.administrationShells == null) - yield break; - foreach (var x in this.administrationShells) - if (p == null || p(x)) - yield return x; - } - - public IEnumerable FindAllSubmodelGroupedByAAS( - Func p = null) - { - if (this.administrationShells == null || this.submodels == null) - yield break; - foreach (var aas in this.administrationShells) - { - if (aas?.submodelRefs == null) - continue; - foreach (var smref in aas.submodelRefs) - { - var sm = this.FindSubmodel(smref); - if (sm != null && (p == null || p(aas, sm))) - yield return sm; - } - } - } - - public Asset FindAsset(Identification id) - { - if (id == null) - return null; - foreach (var asset in this.Assets) - if (asset.identification != null && asset.identification.IsEqual(id)) - return asset; - return null; - } - - public Asset FindAsset(AssetRef aref) - { - // trivial - if (aref == null) - return null; - // can only refs with 1 key - if (aref.Count != 1) - return null; - // and we're picky - var key = aref[0]; - if (!key.local || key.type.ToLower().Trim() != "asset") - return null; - // brute force - foreach (var a in assets) - if (a.identification.idType.ToLower().Trim() == key.idType.ToLower().Trim() - && a.identification.id.ToLower().Trim() == key.value.ToLower().Trim()) - return a; - // uups - return null; - } - - public Submodel FindSubmodel(Identification id) - { - if (id == null) - return null; - foreach (var sm in this.Submodels) - if (sm.identification != null && sm.identification.IsEqual(id)) - return sm; - return null; - } - - public Submodel FindSubmodel(SubmodelRef smref) - { - // trivial - if (smref == null) - return null; - // can only refs with 1 key - if (smref.Count != 1) - return null; - // and we're picky - var key = smref.Keys[0]; - if (!key.local || key.type.ToLower().Trim() != "submodel") - return null; - // brute force - foreach (var sm in this.Submodels) - if (sm.identification.idType.ToLower().Trim() == key.idType.ToLower().Trim() - && sm.identification.id.ToLower().Trim() == key.value.ToLower().Trim()) - return sm; - // uups - return null; - } - - public Submodel FindFirstSubmodelBySemanticId(Key semId) - { - // access - if (semId == null) - return null; - - // brute force - foreach (var sm in this.Submodels) - if (true == sm.semanticId?.MatchesExactlyOneKey(semId)) - return sm; - - return null; - } - - public IEnumerable FindAllSubmodelBySemanticId( - Key semId, Key.MatchMode matchMode = Key.MatchMode.Strict) - { - // access - if (semId == null) - yield break; - - // brute force - foreach (var sm in this.Submodels) - if (true == sm.semanticId?.MatchesExactlyOneKey(semId, matchMode)) - yield return sm; - } - - public IEnumerable FindAllReferable(Predicate p) - { - if (p == null) - yield break; - - foreach (var r in this.FindAllReferable()) - if (r != null && p(r)) - yield return r; - } - - public IEnumerable FindAllReferable(bool onlyIdentifiables = false) - { - if (this.AdministrationShells != null) - foreach (var aas in this.AdministrationShells) - if (aas != null) - { - // AAS itself - yield return aas; - - if (!onlyIdentifiables) - { - // Views - if (aas.views?.views != null) - foreach (var view in aas.views.views) - yield return view; - } - } - - if (this.Assets != null) - foreach (var asset in this.Assets) - if (asset != null) - yield return asset; - - if (this.Submodels != null) - foreach (var sm in this.Submodels) - if (sm != null) - { - yield return sm; - - if (!onlyIdentifiables) - { - // TODO (MIHO, 2020-08-26): not very elegant, yet. Avoid temporary collection - var allsme = new ListOfSubmodelElement(); - sm.RecurseOnSubmodelElements(null, (state, parents, sme) => - { - allsme.Add(sme); return true; - }); - foreach (var sme in allsme) - yield return sme; - } - } - - if (this.ConceptDescriptions != null) - foreach (var cd in this.ConceptDescriptions) - if (cd != null) - yield return cd; - } - - // - // Reference handling - // - - public Referable FindReferableByReference(Reference rf, int keyIndex = 0, bool exactMatch = false) - { - return FindReferableByReference(rf?.Keys); - } - - public Referable FindReferableByReference(KeyList kl, int keyIndex = 0, bool exactMatch = false, - ReferableRootInfo rootInfo = null) - { - // first index needs to exist .. - if (kl == null || keyIndex >= kl.Count) - return null; - - // which type? - var firstType = kl[keyIndex].type.Trim().ToLower(); - var firstIdentification = new Identification(kl[keyIndex].idType, kl[keyIndex].value); - AdministrationShell aasToFollow = null; - - if (firstType == Key.AAS.Trim().ToLower()) - { - // search aas - var aas = this.FindAAS(firstIdentification); - - // not found or already at end with our search? - if (aas == null || keyIndex >= kl.Count - 1) - return aas; - - // side info? - if (rootInfo != null) - { - rootInfo.AAS = aas; - rootInfo.NrOfRootKeys = 1 + keyIndex; - } - - // follow up - aasToFollow = aas; - } - - if (firstType == Key.Asset.Trim().ToLower()) - { - // search asset - var asset = this.FindAsset(firstIdentification); - - // not found or already at end with our search? - if (asset == null || keyIndex >= kl.Count - 1) - return exactMatch ? null : asset; - - // try find aas for it - var aas = this.FindAllAAS((a) => - { - return a?.assetRef?.Matches(asset.identification) == true; - }).FirstOrDefault(); - if (aas == null) - return exactMatch ? null : asset; - - // side info? - if (rootInfo != null) - { - rootInfo.Asset = asset; - rootInfo.NrOfRootKeys = 1 + keyIndex; - } - - // follow up - aasToFollow = aas; - } - - // try - if (aasToFollow != null) - { - // search different entities - if (kl[keyIndex + 1].type.Trim().ToLower() == Key.Submodel.ToLower() - || kl[keyIndex + 1].type.Trim().ToLower() == Key.SubmodelRef.ToLower()) - { - // ok, search SubmodelRef - var smref = aasToFollow.FindSubmodelRef(kl[keyIndex + 1].ToId()); - if (smref == null) - return exactMatch ? null : aasToFollow; - - // validate matching submodel - var sm = this.FindSubmodel(smref); - if (sm == null) - return exactMatch ? null : aasToFollow; - - // side info - // side info? - if (rootInfo != null) - { - rootInfo.Submodel = sm; - rootInfo.NrOfRootKeys = 2 + keyIndex; - } - - // at our end? - if (keyIndex >= kl.Count - 2) - return sm; - - // go inside - return SubmodelElementWrapper.FindReferableByReference(sm.submodelElements, kl, keyIndex + 2); - } - } - - if (firstType == Key.ConceptDescription.Trim().ToLower()) - return this.FindConceptDescription(firstIdentification); - - if (firstType == Key.Submodel.Trim().ToLower()) - { - // ok, search Submodel - var sm = this.FindSubmodel(new Identification(kl[keyIndex].idType, kl[keyIndex].value)); - if (sm == null) - return null; - - // notice in side info - if (rootInfo != null) - { - rootInfo.Submodel = sm; - rootInfo.NrOfRootKeys = 1 + keyIndex; - - // add even more info - if (rootInfo.AAS == null) - { - foreach (var aas2 in this.AdministrationShells) - { - var smref2 = aas2.FindSubmodelRef(sm.identification); - if (smref2 != null) - { - rootInfo.AAS = aas2; - break; - } - } - } - } - - // at our end? - if (keyIndex >= kl.Count - 1) - return sm; - - // go inside - return SubmodelElementWrapper.FindReferableByReference(sm.submodelElements, kl, keyIndex + 1); - } - - // nothing in this Environment - return null; - } - - // - // Handling of CDs - // - - public ConceptDescription FindConceptDescription(ConceptDescriptionRef cdr) - { - if (cdr == null) - return null; - return FindConceptDescription(cdr.Keys); - } - - public ConceptDescription FindConceptDescription(SemanticId semId) - { - if (semId == null) - return null; - return FindConceptDescription(semId.Keys); - } - - public ConceptDescription FindConceptDescription(Reference rf) - { - if (rf == null) - return null; - return FindConceptDescription(rf.Keys); - } - - public ConceptDescription FindConceptDescription(Identification id) - { - var cdr = ConceptDescriptionRef.CreateNew("Conceptdescription", true, id.idType, id.id); - return FindConceptDescription(cdr); - } - - public ConceptDescription FindConceptDescription(List keys) - { - // trivial - if (keys == null) - return null; - // can only refs with 1 key - if (keys.Count != 1) - return null; - // and we're picky - var key = keys[0]; - if (!key.local || key.type.ToLower().Trim() != "conceptdescription") - return null; - // brute force - foreach (var cd in conceptDescriptions) - if (cd.identification.idType.ToLower().Trim() == key.idType.ToLower().Trim() - && cd.identification.id.ToLower().Trim() == key.value.ToLower().Trim()) - return cd; - // uups - return null; - } - - public IEnumerable FindAllSubmodelElements( - Predicate match = null, AdministrationShell onlyForAAS = null) where T : SubmodelElement - { - // more or less two different schemes - if (onlyForAAS != null) - { - if (onlyForAAS.submodelRefs == null) - yield break; - foreach (var smr in onlyForAAS.submodelRefs) - { - var sm = this.FindSubmodel(smr); - if (sm?.submodelElements != null) - foreach (var x in sm.submodelElements.FindDeep(match)) - yield return x; - } - } - else - { - if (this.Submodels != null) - foreach (var sm in this.Submodels) - if (sm?.submodelElements != null) - foreach (var x in sm.submodelElements.FindDeep(match)) - yield return x; - } - } - - public ConceptDescription FindConceptDescription(Key key) - { - if (key == null) - return null; - var l = new List { key }; - return (FindConceptDescription(l)); - } - - public IEnumerable FindAllReferences() - { - if (this.AdministrationShells != null) - foreach (var aas in this.AdministrationShells) - if (aas != null) - foreach (var r in aas.FindAllReferences()) - yield return r; - - if (this.Assets != null) - foreach (var asset in this.Assets) - if (asset != null) - foreach (var r in asset.FindAllReferences()) - yield return new LocatedReference(asset, r); - - if (this.Submodels != null) - foreach (var sm in this.Submodels) - if (sm != null) - foreach (var r in sm.FindAllReferences()) - yield return r; - - if (this.ConceptDescriptions != null) - foreach (var cd in this.ConceptDescriptions) - if (cd != null) - foreach (var r in cd.FindAllReferences()) - yield return new LocatedReference(cd, r); - } - - // creators - - private void CopyConceptDescriptionsFrom( - AdministrationShellEnv srcEnv, SubmodelElement src, bool shallowCopy = false) - { - // access - if (srcEnv == null || src == null || src.semanticId == null) - return; - // check for this SubmodelElement in Source - var cdSrc = srcEnv.FindConceptDescription(src.semanticId.Keys); - if (cdSrc == null) - return; - // check for this SubmodelElement in Destnation (this!) - var cdDest = this.FindConceptDescription(src.semanticId.Keys); - if (cdDest != null) - return; - // copy new - this.ConceptDescriptions.Add(new ConceptDescription(cdSrc)); - // recurse? - if (!shallowCopy && src is SubmodelElementCollection) - foreach (var m in (src as SubmodelElementCollection).value) - CopyConceptDescriptionsFrom(srcEnv, m.submodelElement, shallowCopy: false); - - } - - public SubmodelElementWrapper CopySubmodelElementAndCD( - AdministrationShellEnv srcEnv, SubmodelElement srcElem, bool copyCD = false, bool shallowCopy = false) - { - // access - if (srcEnv == null || srcElem == null) - return null; - - // 1st result pretty easy (calling function will add this to the appropriate Submodel) - var res = new SubmodelElementWrapper(srcElem); - - // copy the CDs.. - if (copyCD) - CopyConceptDescriptionsFrom(srcEnv, srcElem, shallowCopy); - - // give back - return res; - } - - public SubmodelRef CopySubmodelRefAndCD( - AdministrationShellEnv srcEnv, SubmodelRef srcSubRef, bool copySubmodel = false, bool copyCD = false, - bool shallowCopy = false) - { - // access - if (srcEnv == null || srcSubRef == null) - return null; - - // need to have the source Submodel - var srcSub = srcEnv.FindSubmodel(srcSubRef); - if (srcSub == null) - return null; - - // 1st result pretty easy (calling function will add this to the appropriate AAS) - var dstSubRef = new SubmodelRef(srcSubRef); - - // get the destination and shall src != dst - var dstSub = this.FindSubmodel(dstSubRef); - if (srcSub == dstSub) - return null; - - // maybe we need the Submodel in our environment, as well - if (dstSub == null && copySubmodel) - { - dstSub = new Submodel(srcSub, shallowCopy); - this.Submodels.Add(dstSub); - } - else - if (dstSub != null) - { - // there is already an submodel, just add members - if (!shallowCopy && srcSub.submodelElements != null) - { - if (dstSub.submodelElements == null) - dstSub.submodelElements = new SubmodelElementWrapperCollection(); - foreach (var smw in srcSub.submodelElements) - dstSub.submodelElements.Add( - new SubmodelElementWrapper( - smw.submodelElement, shallowCopy: false)); - } - } - - // copy the CDs.. - if (copyCD && srcSub.submodelElements != null) - foreach (var smw in srcSub.submodelElements) - CopyConceptDescriptionsFrom(srcEnv, smw.submodelElement, shallowCopy); - - // give back - return dstSubRef; - } - - /// - /// Tries renaming an Identifiable, specifically: the identification of an Identifiable and - /// all references to it. - /// Currently supported: ConceptDescriptions - /// Returns a list of Referables, which were changed or null in case of error - /// - public List RenameIdentifiable(Identification oldId, Identification newId) - where T : Identifiable - { - // access - if (oldId == null || newId == null || oldId.IsEqual(newId)) - return null; - - var res = new List(); - - if (typeof(T) == typeof(ConceptDescription)) - { - // check, if exist or not exist - var cdOld = FindConceptDescription(oldId); - if (cdOld == null || FindConceptDescription(newId) != null) - return null; - - // rename old cd - cdOld.identification = newId; - res.Add(cdOld); - - // search all SMEs referring to this CD - foreach (var sme in this.FindAllSubmodelElements(match: (s) => - { - return (s != null && s.semanticId != null && s.semanticId.Matches(oldId)); - })) - { - sme.semanticId[0].idType = newId.idType; - sme.semanticId[0].value = newId.id; - res.Add(sme); - } - - // seems fine - return res; - } - - if (typeof(T) == typeof(Submodel)) - { - // check, if exist or not exist - var smOld = FindSubmodel(oldId); - if (smOld == null || FindSubmodel(newId) != null) - return null; - - // recurse all possible Referenes in the aas env - foreach (var lr in this.FindAllReferences()) - { - var r = lr?.Reference; - if (r != null) - for (int i = 0; i < r.Count; i++) - if (r[i].Matches(Key.Submodel, false, oldId.idType, oldId.id, Key.MatchMode.Relaxed)) - { - // directly replace - r[i].idType = newId.idType; - r[i].value = newId.id; - if (res.Contains(lr.Identifiable)) - res.Add(lr.Identifiable); - } - } - - // rename old Submodel - smOld.identification = newId; - - // seems fine - return res; - } - - if (typeof(T) == typeof(Asset)) - { - // check, if exist or not exist - var assetOld = FindAsset(oldId); - if (assetOld == null || FindAsset(newId) != null) - return null; - - // recurse all possible Referenes in the aas env - foreach (var lr in this.FindAllReferences()) - { - var r = lr?.Reference; - if (r != null) - for (int i = 0; i < r.Count; i++) - if (r[i].Matches(Key.Asset, false, oldId.idType, oldId.id, Key.MatchMode.Relaxed)) - { - // directly replace - r[i].idType = newId.idType; - r[i].value = newId.id; - if (res.Contains(lr.Identifiable)) - res.Add(lr.Identifiable); - } - } - - // rename old Submodel - assetOld.identification = newId; - - // seems fine - return res; - } - - // no result is false, as well - return null; - } - - // serializations - - public void SerializeXmlToStream(StreamWriter s) - { - var serializer = new XmlSerializer(typeof(AdminShell.AdministrationShellEnv)); - var nss = new XmlSerializerNamespaces(); - nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace); - nss.Add("aas", "http://www.admin-shell.io/aas/2/0"); - nss.Add("IEC61360", "http://www.admin-shell.io/IEC61360/2/0"); - serializer.Serialize(s, this, nss); - } - - public JsonWriter SerialiazeJsonToStream(StreamWriter sw, bool leaveJsonWriterOpen = false) - { - sw.AutoFlush = true; - - JsonSerializer serializer = new JsonSerializer() - { - NullValueHandling = NullValueHandling.Ignore, - ReferenceLoopHandling = ReferenceLoopHandling.Serialize, - Formatting = Newtonsoft.Json.Formatting.Indented - }; - - JsonWriter writer = new JsonTextWriter(sw); - serializer.Serialize(writer, this); - if (leaveJsonWriterOpen) - return writer; - writer.Close(); - return null; - } - - public AdministrationShellEnv DeserializeFromXmlStream(TextReader reader) - { - XmlSerializer serializer = new XmlSerializer( - typeof(AdminShell.AdministrationShellEnv), "http://www.admin-shell.io/aas/2/0"); - var res = serializer.Deserialize(reader) as AdminShell.AdministrationShellEnv; - return res; - } - - public AdministrationShellEnv DeserializeFromJsonStream(TextReader reader) - { - JsonSerializer serializer = new JsonSerializer(); - serializer.Converters.Add(new AdminShellConverters.JsonAasxConverter("modelType", "name")); - var res = (AdministrationShellEnv)serializer.Deserialize(reader, typeof(AdministrationShellEnv)); - return res; - } - - // special functions - - private static void CreateFromExistingEnvRecurseForCDs( - AdministrationShellEnv src, List wrappers, - ref List filterForCD) - { - if (wrappers == null || filterForCD == null) - return; - - foreach (var w in wrappers) - { - // access - if (w == null) - continue; - - // include in filter .. - if (w.submodelElement.semanticId != null) - { - var cd = src.FindConceptDescription(w.submodelElement.semanticId.Keys); - if (cd != null) - filterForCD.Add(cd); - } - - // recurse? - if (w.submodelElement is SubmodelElementCollection smec) - CreateFromExistingEnvRecurseForCDs(src, smec.value, ref filterForCD); - - if (w.submodelElement is Operation op) - for (int i = 0; i < 2; i++) - { - var w2s = Operation.GetWrappers(op[i]); - CreateFromExistingEnvRecurseForCDs(src, w2s, ref filterForCD); - } - - if (w.submodelElement is Entity smee) - CreateFromExistingEnvRecurseForCDs(src, smee.statements, ref filterForCD); - - if (w.submodelElement is AnnotatedRelationshipElement smea) - CreateFromExistingEnvRecurseForCDs(src, smea.annotations, ref filterForCD); - } - } - - public static AdministrationShellEnv CreateFromExistingEnv(AdministrationShellEnv src, - List filterForAas = null, - List filterForAsset = null, - ListOfSubmodels filterForSubmodel = null, - List filterForCD = null) - { - // prepare defaults - if (filterForAas == null) - filterForAas = new List(); - if (filterForAsset == null) - filterForAsset = new List(); - if (filterForSubmodel == null) - filterForSubmodel = new ListOfSubmodels(); - if (filterForCD == null) - filterForCD = new List(); - - // make new - var res = new AdministrationShellEnv(); - - // take over AAS - foreach (var aas in src.administrationShells) - if (filterForAas.Contains(aas)) - { - // take over - res.administrationShells.Add(new AdministrationShell(aas)); - - // consequences - if (aas.assetRef != null) - { - var asset = src.FindAsset(aas.assetRef); - if (asset != null) - filterForAsset.Add(asset); - } - - if (aas.submodelRefs != null) - foreach (var smr in aas.submodelRefs) - { - var sm = src.FindSubmodel(smr); - if (sm != null) - filterForSubmodel.Add(sm); - } - - if (aas.conceptDictionaries != null) - foreach (var cdd in aas.conceptDictionaries) - if (cdd.conceptDescriptionsRefs != null && - cdd.conceptDescriptionsRefs.conceptDescriptions != null) - foreach (var cdr in cdd.conceptDescriptionsRefs.conceptDescriptions) - { - var cd = src.FindConceptDescription(cdr); - if (cd != null) - filterForCD.Add(cd); - } - } - - // take over Assets - foreach (var asset in src.assets) - if (filterForAsset.Contains(asset)) - { - // take over - res.assets.Add(new Asset(asset)); - } - - // take over Submodels - foreach (var sm in src.Submodels) - if (filterForSubmodel.Contains(sm)) - { - // take over - res.submodels.Add(new Submodel(sm)); - - // recursion in order to find used CDs - CreateFromExistingEnvRecurseForCDs(src, sm.submodelElements, ref filterForCD); - } - - // ConceptDescriptions - foreach (var cd in src.ConceptDescriptions) - if (filterForCD.Contains(cd)) - { - // take over - res.conceptDescriptions.Add(new ConceptDescription(cd)); - } - - // ok - return res; - } - - // Sorting - - public Referable.ComparerIndexed CreateIndexedComparerCdsForSmUsage() - { - var cmp = new Referable.ComparerIndexed(); - int nr = 0; - foreach (var sm in FindAllSubmodelGroupedByAAS()) - foreach (var sme in sm.FindDeep()) - { - if (sme.semanticId == null) - continue; - var cd = this.FindConceptDescription(sme.semanticId); - if (cd == null) - continue; - if (cmp.Index.ContainsKey(cd)) - continue; - cmp.Index[cd] = nr++; - } - return cmp; - } - - // Validation - - public AasValidationRecordList ValidateAll() - { - // collect results - var results = new AasValidationRecordList(); - - // all entities - foreach (var rf in this.FindAllReferable()) - rf.Validate(results); - - // give back - return results; - } - - public int AutoFix(IEnumerable records) - { - // access - if (records == null) - return -1; - - // collect Referables (expensive safety measure) - var allowedReferables = this.FindAllReferable().ToList(); - - // go thru records - int res = 0; - foreach (var rec in records) - { - // access - if (rec == null || rec.Fix == null || rec.Source == null) - continue; - - // minimal safety measure - if (!allowedReferables.Contains(rec.Source)) - continue; - - // apply fix - res++; - try - { - rec.Fix.Invoke(); - } - catch - { - res--; - } - } - - // return number of applied fixes - return res; - } - - public void RecurseOnReferables( - object state, Func lambda, bool includeThis = false) - { - // includeThis does not make sense, as no Referable - // just use the others - foreach (var idf in this.FindAllReferable(onlyIdentifiables: true)) - idf?.RecurseOnReferables(state, lambda, includeThis); - } - } - - // - // Submodel + Submodel elements - // - - public interface IGetReference - { - Reference GetReference(bool includeParents = true); - } - - public interface IGetQualifiers - { - QualifierCollection GetQualifiers(); - } - - public class Qualifier : IAasElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // member - // from hasSemantics: - [XmlElement(ElementName = "semanticId")] - public SemanticId semanticId = null; - - // this class - // TODO (Michael Hoffmeister, 2020-08-01): check, if Json has Qualifiers or not - - [MetaModelName("Qualifier.type")] - [TextSearchable] - [CountForHash] - public string type = ""; - - [MetaModelName("Qualifier.valueType")] - [TextSearchable] - [CountForHash] - public string valueType = ""; - - [CountForHash] - public Reference valueId = null; - - [MetaModelName("Qualifier.value")] - [TextSearchable] - [CountForHash] - public string value = null; - - // dead-csharp off - // Remark: due to publication of v2.0.1, the order of elements has changed!!! - // from hasSemantics: - // [XmlElement(ElementName = "semanticId")] - // [JsonIgnore] - // public SemanticId semanticId = null; - // dead-csharp on - - // constructors - - public Qualifier() { } - - public Qualifier(Qualifier src) - { - if (src.semanticId != null) - this.semanticId = new SemanticId(src.semanticId); - this.type = src.type; - this.value = src.value; - if (src.valueId != null) - this.valueId = new Reference(src.valueId); - } - - public Qualifier(string type, string value) - { - this.type = type; - this.value = value; - } - -#if !DoNotUseAasxCompatibilityModels - public Qualifier(AasxCompatibilityModels.AdminShellV10.Qualifier src) - { - if (src.semanticId != null) - this.semanticId = new SemanticId(src.semanticId); - this.type = src.qualifierType; - this.value = src.qualifierValue; - if (src.qualifierValueId != null) - this.valueId = new Reference(src.qualifierValueId); - } -#endif - - public AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("Qualifier", "Qfr"); - } - - public string GetElementName() - { - return this.GetSelfDescription()?.ElementName; - } - - // ReSharper disable MethodOverloadWithOptionalParameter .. this seems to work, anyhow - // ReSharper disable RedundantArgumentDefaultValue - public string ToString(int format = 0, string delimiter = ",") - { - var res = "" + type; - if (res == "") - res += "" + semanticId?.ToString(format, delimiter); - - if (value != null) - res += " = " + value; - else if (valueId != null) - res += " = " + valueId?.ToString(format, delimiter); - - return res; - } - - public override string ToString() - { - return this.ToString(0); - } - // ReSharper enable MethodOverloadWithOptionalParameter - // ReSharper enable RedundantArgumentDefaultValue - - public static Qualifier Parse(string input) - { - var m = Regex.Match(input, @"\s*([^,]*)(,[^=]+){0,1}\s*=\s*([^,]*)(,.+){0,1}\s*"); - if (!m.Success) - return null; - - return new Qualifier() - { - type = m.Groups[1].ToString().Trim(), - semanticId = SemanticId.Parse(m.Groups[1].ToString().Trim()), - value = m.Groups[3].ToString().Trim(), - valueId = Reference.Parse(m.Groups[1].ToString().Trim()) - }; - } - } - - /// - /// This class holds some convenience functions for Qualifiers - /// - public class QualifierCollection : List - { - public QualifierCollection() - { - - } - -#if !DoNotUseAasxCompatibilityModels - public QualifierCollection( - List src, bool shallowCopy = false) - - { - if (src != null && src.Count != 0) - { - foreach (var q in src) - { - this.Add(new Qualifier(q)); - } - } - } -#endif - - /// - /// Add qualifier. If null, do nothing - /// - public new void Add(Qualifier q) - { - if (q == null) - return; - base.Add(q); - } - - public Qualifier FindType(string type) - { - if (type == null) - return null; - foreach (var q in this) - if (q != null && q.type != null && q.type.Trim() == type.Trim()) - return q; - return null; - } - - public Qualifier FindSemanticId(SemanticId semId) - { - if (semId == null) - return null; - foreach (var q in this) - if (q != null && q.semanticId != null && q.semanticId.Matches(semId)) - return q; - return null; - } - - // ReSharper disable MethodOverloadWithOptionalParameter .. this seems to work, anyhow - // ReSharper disable RedundantArgumentDefaultValue - public string ToString(int format = 0, string delimiter = ";", string referencesDelimiter = ",") - { - var res = ""; - foreach (var q in this) - { - if (res != "") - res += delimiter; - res += q.ToString(format, referencesDelimiter); - } - return res; - } - - public override string ToString() - { - return this.ToString(0); - } - // ReSharper enable MethodOverloadWithOptionalParameter - // ReSharper enable RedundantArgumentDefaultValue - - // for convenience methods of Submodel, SubmodelElement - - public static void AddQualifier( - ref QualifierCollection qualifiers, - Qualifier q) - { - if (q == null) - return; - if (qualifiers == null) - qualifiers = new QualifierCollection(); - qualifiers.Add(q); - } - - public static void AddQualifier( - ref QualifierCollection qualifiers, - string qualifierType = null, string qualifierValue = null, KeyList semanticKeys = null, - Reference qualifierValueId = null) - { - if (qualifiers == null) - qualifiers = new QualifierCollection(); - var q = new Qualifier() - { - type = qualifierType, - value = qualifierValue, - valueId = qualifierValueId, - }; - if (semanticKeys != null) - q.semanticId = SemanticId.CreateFromKeys(semanticKeys); - qualifiers.Add(q); - } - - public static Qualifier HasQualifierOfType( - QualifierCollection qualifiers, - string qualifierType) - { - if (qualifiers == null || qualifierType == null) - return null; - foreach (var q in qualifiers) - if (q.type.Trim().ToLower() == qualifierType.Trim().ToLower()) - return q; - return null; - } - - public IEnumerable FindAllQualifierType(string qualifierType) - { - if (qualifierType == null) - yield break; - foreach (var q in this) - if (q.type.Trim().ToLower() == qualifierType.Trim().ToLower()) - yield return q; - } - } - - public class ListOfSubmodelElement : List - { - // conversion to other list - - public KeyList ToKeyList() - { - var res = new KeyList(); - foreach (var sme in this) - res.Add(sme.ToKey()); - return res; - } - - public Reference GetReference() - { - return Reference.CreateNew(ToKeyList()); - } - } - - public class SubmodelElement : Referable, System.IDisposable, IGetReference, IGetSemanticId, IGetQualifiers - { - // constants - public static Type[] PROP_MLP = new Type[] { - typeof(AdminShell.MultiLanguageProperty), typeof(AdminShell.Property) }; - - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // members - - // do this in order to be IDisposable, that is: suitable for (using) - void System.IDisposable.Dispose() { } - public void GetData() { } - - // from HasKind - [XmlElement(ElementName = "kind")] - [JsonIgnore] - public ModelingKind kind = new ModelingKind(); - [XmlIgnore] - [JsonProperty(PropertyName = "kind")] - public string JsonKind - { - get - { - if (kind == null) - return null; - return kind.kind; - } - set - { - if (kind == null) - kind = new ModelingKind(); - kind.kind = value; - } - } - - // from hasSemanticId: - [XmlElement(ElementName = "semanticId")] - public SemanticId semanticId = new SemanticId(); - public SemanticId GetSemanticId() { return semanticId; } - - // from Qualifiable: - [XmlArray("qualifier")] - [XmlArrayItem("qualifier")] - [JsonProperty(PropertyName = "constraints")] - public QualifierCollection qualifiers = null; - public QualifierCollection GetQualifiers() => qualifiers; - - // from hasDataSpecification: - [XmlElement(ElementName = "embeddedDataSpecification")] - public HasDataSpecification hasDataSpecification = null; - - // getter / setter - - // constructors / creators - - public SubmodelElement() - : base() { } - - public SubmodelElement(SubmodelElement src) - : base(src) - { - if (src == null) - return; - if (src.hasDataSpecification != null) - hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - if (src.semanticId != null) - semanticId = new SemanticId(src.semanticId); - if (src.kind != null) - kind = new ModelingKind(src.kind); - if (src.qualifiers != null) - { - if (qualifiers == null) - qualifiers = new QualifierCollection(); - foreach (var q in src.qualifiers) - qualifiers.Add(new Qualifier(q)); - } - } - -#if !DoNotUseAasxCompatibilityModels - public SubmodelElement(AasxCompatibilityModels.AdminShellV10.SubmodelElement src) - : base(src) - { - if (src.hasDataSpecification != null) - hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - if (src.semanticId != null) - semanticId = new SemanticId(src.semanticId); - if (src.kind != null) - kind = new ModelingKind(src.kind); - if (src.qualifiers != null) - { - if (qualifiers == null) - qualifiers = new QualifierCollection(src.qualifiers); - foreach (var q in src.qualifiers) - qualifiers.Add(new Qualifier(q)); - } - } -#endif - - public static T CreateNew(string idShort = null, string category = null, Reference semanticId = null) - where T : SubmodelElement, new() - { - var res = new T(); - if (idShort != null) - res.idShort = idShort; - if (category != null) - res.category = category; - if (semanticId != null) - res.semanticId = new SemanticId(semanticId); - return res; - } - - public void CreateNewLogic(string idShort = null, string category = null, Key semanticIdKey = null) - { - if (idShort != null) - this.idShort = idShort; - if (category != null) - this.category = category; - if (semanticIdKey != null) - { - if (this.semanticId == null) - this.semanticId = new SemanticId(); - this.semanticId.Keys.Add(semanticIdKey); - } - } - - public void AddQualifier( - Qualifier q) - { - QualifierCollection.AddQualifier( - ref this.qualifiers, q); - } - - public void AddQualifier( - string qualifierType = null, string qualifierValue = null, KeyList semanticKeys = null, - Reference qualifierValueId = null) - { - QualifierCollection.AddQualifier( - ref this.qualifiers, qualifierType, qualifierValue, semanticKeys, qualifierValueId); - } - - public Qualifier HasQualifierOfType(string qualifierType) - { - return QualifierCollection.HasQualifierOfType(this.qualifiers, qualifierType); - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("SubmodelElement", "SME"); - } - - public override Reference GetReference(bool includeParents = true) - { - Reference r = new Reference(); - // this is the tail of our referencing chain .. - r.Keys.Add(Key.CreateNew(GetElementName(), true, "IdShort", this.idShort)); - // try to climb up .. - var current = this.parent; - while (includeParents && current != null) - { - if (current is Identifiable cid) - { - // add big information set - r.Keys.Insert(0, Key.CreateNew( - current.GetElementName(), - true, - cid.identification.idType, - cid.identification.id)); - } - else - if (current is Referable crf) - { - // reference via idShort - r.Keys.Insert(0, Key.CreateNew( - current.GetElementName(), - true, - "IdShort", crf.idShort)); - } - - if (current is Referable crf2) - current = crf2.parent; - else - current = null; - } - return r; - } - - public IEnumerable FindAllParents( - Predicate p, - bool includeThis = false, bool includeSubmodel = false, - bool passOverMiss = false) - { - // call for this? - if (includeThis) - { - if (p == null || p.Invoke(this)) - yield return this; - else - if (!passOverMiss) - yield break; - } - - // daisy chain all parents .. - if (this.parent != null) - { - if (this.parent is SubmodelElement psme) - { - foreach (var q in psme.FindAllParents(p, includeThis: true, - passOverMiss: passOverMiss)) - yield return q; - } - else if (includeSubmodel && this.parent is Submodel psm) - { - if (p == null || p.Invoke(psm)) - yield return this; - } - } - } - - public IEnumerable FindAllParentsWithSemanticId( - SemanticId semId, - bool includeThis = false, bool includeSubmodel = false, bool passOverMiss = false) - { - return (FindAllParents( - (rf) => (true == (rf as IGetSemanticId)?.GetSemanticId()?.Matches(semId, - matchMode: Key.MatchMode.Relaxed)), - includeThis: includeThis, includeSubmodel: includeSubmodel, passOverMiss: passOverMiss)); - } - - public Tuple ToCaptionInfo() - { - var caption = AdminShellUtilV20.EvalToNonNullString("\"{0}\" ", idShort, ""); - var info = ""; - // TODO (MIHO, 2021-07-08): obvious error .. info should receive semanticId .. but would change - // display presentation .. therefore to be checked again - if (semanticId != null) - AdminShellUtilV20.EvalToNonEmptyString("\u21e8 {0}", semanticId.ToString(), ""); - return Tuple.Create(caption, info); - } - - public override string ToString() - { - var ci = ToCaptionInfo(); - return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); - } - - public virtual string ValueAsText(string defaultLang = null) - { - return ""; - } - - public virtual double? ValueAsDouble() - { - return null; - } - - public virtual void ValueFromText(string text, string defaultLang = null) - { - } - - // validation - - public override void Validate(AasValidationRecordList results) - { - // access - if (results == null) - return; - - // check - base.Validate(results); - ModelingKind.Validate(results, kind, this); - KeyList.Validate(results, semanticId?.Keys, this); - } - } - - [XmlType(TypeName = "submodelElement")] - public class SubmodelElementWrapper - { - - // members - - [XmlElement(ElementName = "property", Type = typeof(Property))] - [XmlElement(ElementName = "multiLanguageProperty", Type = typeof(MultiLanguageProperty))] - [XmlElement(ElementName = "range", Type = typeof(Range))] - [XmlElement(ElementName = "file", Type = typeof(File))] - [XmlElement(ElementName = "blob", Type = typeof(Blob))] - [XmlElement(ElementName = "referenceElement", Type = typeof(ReferenceElement))] - [XmlElement(ElementName = "relationshipElement", Type = typeof(RelationshipElement))] - [XmlElement(ElementName = "annotatedRelationshipElement", Type = typeof(AnnotatedRelationshipElement))] - [XmlElement(ElementName = "capability", Type = typeof(Capability))] - [XmlElement(ElementName = "submodelElementCollection", Type = typeof(SubmodelElementCollection))] - [XmlElement(ElementName = "operation", Type = typeof(Operation))] - [XmlElement(ElementName = "basicEvent", Type = typeof(BasicEvent))] - [XmlElement(ElementName = "entity", Type = typeof(Entity))] - public SubmodelElement submodelElement; - - // element names - public enum AdequateElementEnum - { - Unknown = 0, SubmodelElementCollection, Property, MultiLanguageProperty, Range, File, Blob, - ReferenceElement, RelationshipElement, AnnotatedRelationshipElement, Capability, Operation, - BasicEvent, Entity - } - - public static AdequateElementEnum[] AdequateElementsDataElement = - { - AdequateElementEnum.SubmodelElementCollection, AdequateElementEnum.RelationshipElement, - AdequateElementEnum.AnnotatedRelationshipElement, AdequateElementEnum.Capability, - AdequateElementEnum.Operation, AdequateElementEnum.BasicEvent, AdequateElementEnum.Entity - }; - - public static string[] AdequateElementNames = { "Unknown", "SubmodelElementCollection", "Property", - "MultiLanguageProperty", "Range", "File", "Blob", "ReferenceElement", "RelationshipElement", - "AnnotatedRelationshipElement", "Capability", "Operation", "BasicEvent", "Entity" }; - - public static string[] AdequateElementShortName = { null, "SMC", null, - "MLP", null, null, null, "Ref", "Rel", - "ARel", null, null, "Event", "Entity" }; - - // constructors - - public SubmodelElementWrapper() { } - - // cloning - - public SubmodelElementWrapper(SubmodelElement src, bool shallowCopy = false) - { - /* TODO (MIHO, 2021-08-12): consider using: - Activator.CreateInstance(pl.GetType(), new object[] { pl }) */ - - if (src is SubmodelElementCollection) - this.submodelElement = new SubmodelElementCollection( - src as SubmodelElementCollection, shallowCopy: shallowCopy); - if (src is Property) - this.submodelElement = new Property(src as Property); - if (src is MultiLanguageProperty) - this.submodelElement = new MultiLanguageProperty(src as MultiLanguageProperty); - if (src is Range) - this.submodelElement = new Range(src as Range); - if (src is File) - this.submodelElement = new File(src as File); - if (src is Blob) - this.submodelElement = new Blob(src as Blob); - if (src is ReferenceElement) - this.submodelElement = new ReferenceElement(src as ReferenceElement); - if (src is RelationshipElement) - this.submodelElement = new RelationshipElement(src as RelationshipElement); - if (src is AnnotatedRelationshipElement) - this.submodelElement = new AnnotatedRelationshipElement(src as AnnotatedRelationshipElement); - if (src is Capability) - this.submodelElement = new Capability(src as Capability); - if (src is Operation) - this.submodelElement = new Operation(src as Operation); - if (src is BasicEvent) - this.submodelElement = new BasicEvent(src as BasicEvent); - if (src is Entity) - this.submodelElement = new Entity(src as Entity); - } - -#if !DoNotUseAasxCompatibilityModels - public SubmodelElementWrapper( - AasxCompatibilityModels.AdminShellV10.SubmodelElement src, bool shallowCopy = false) - { - if (src is AasxCompatibilityModels.AdminShellV10.SubmodelElementCollection) - this.submodelElement = new SubmodelElementCollection( - src as AasxCompatibilityModels.AdminShellV10.SubmodelElementCollection, - shallowCopy: shallowCopy); - if (src is AasxCompatibilityModels.AdminShellV10.Property) - this.submodelElement = new Property(src as AasxCompatibilityModels.AdminShellV10.Property); - if (src is AasxCompatibilityModels.AdminShellV10.File) - this.submodelElement = new File(src as AasxCompatibilityModels.AdminShellV10.File); - if (src is AasxCompatibilityModels.AdminShellV10.Blob) - this.submodelElement = new Blob(src as AasxCompatibilityModels.AdminShellV10.Blob); - if (src is AasxCompatibilityModels.AdminShellV10.ReferenceElement) - this.submodelElement = new ReferenceElement( - src as AasxCompatibilityModels.AdminShellV10.ReferenceElement); - if (src is AasxCompatibilityModels.AdminShellV10.RelationshipElement) - this.submodelElement = new RelationshipElement( - src as AasxCompatibilityModels.AdminShellV10.RelationshipElement); - if (src is AasxCompatibilityModels.AdminShellV10.Operation) - this.submodelElement = new Operation(src as AasxCompatibilityModels.AdminShellV10.Operation); - } -#endif - - public static string GetAdequateName(AdequateElementEnum ae) - { - return AdequateElementNames[(int)ae]; - } - - /// - /// Deprecated. See below. - /// - public static AdequateElementEnum GetAdequateEnum(string adequateName) - { - if (adequateName == null) - return AdequateElementEnum.Unknown; - - foreach (var en in (AdequateElementEnum[])Enum.GetValues(typeof(AdequateElementEnum))) - if (Enum.GetName(typeof(AdequateElementEnum), en)?.Trim().ToLower() == - adequateName.Trim().ToLower()) - return en; - - return AdequateElementEnum.Unknown; - } - - /// - /// This version uses the element name array and allows using ShortName - /// - public static AdequateElementEnum GetAdequateEnum2(string adequateName, bool useShortName = false) - { - if (adequateName == null) - return AdequateElementEnum.Unknown; - - foreach (var en in (AdequateElementEnum[])Enum.GetValues(typeof(AdequateElementEnum))) - if (((int)en < AdequateElementNames.Length - && AdequateElementNames[(int)en].Trim().ToLower() == adequateName.Trim().ToLower()) - || (useShortName - && (int)en < AdequateElementShortName.Length - && AdequateElementShortName[(int)en] != null - && AdequateElementShortName[(int)en].Trim().ToLower() == adequateName.Trim().ToLower())) - return en; - - return AdequateElementEnum.Unknown; - } - - public static IEnumerable GetAdequateEnums( - AdequateElementEnum[] excludeValues = null, AdequateElementEnum[] includeValues = null) - { - if (includeValues != null) - { - foreach (var en in includeValues) - yield return en; - } - else - { - foreach (var en in (AdequateElementEnum[])Enum.GetValues(typeof(AdequateElementEnum))) - { - if (en == AdequateElementEnum.Unknown) - continue; - if (excludeValues != null && excludeValues.Contains(en)) - continue; - yield return en; - } - } - } - - /// - /// Introduced for JSON serialization, can create SubModelElements based on a string name - /// - public static SubmodelElement CreateAdequateType(AdequateElementEnum ae, SubmodelElement src = null) - { - if (ae == AdequateElementEnum.Property) - return new Property(src); - if (ae == AdequateElementEnum.MultiLanguageProperty) - return new MultiLanguageProperty(src); - if (ae == AdequateElementEnum.Range) - return new Range(src); - if (ae == AdequateElementEnum.File) - return new File(src); - if (ae == AdequateElementEnum.Blob) - return new Blob(src); - if (ae == AdequateElementEnum.ReferenceElement) - return new ReferenceElement(src); - if (ae == AdequateElementEnum.RelationshipElement) - return new RelationshipElement(src); - if (ae == AdequateElementEnum.AnnotatedRelationshipElement) - return new AnnotatedRelationshipElement(src); - if (ae == AdequateElementEnum.Capability) - return new Capability(src); - if (ae == AdequateElementEnum.SubmodelElementCollection) - return new SubmodelElementCollection(src); - if (ae == AdequateElementEnum.Operation) - return new Operation(src); - if (ae == AdequateElementEnum.BasicEvent) - return new BasicEvent(src); - if (ae == AdequateElementEnum.Entity) - return new Entity(src); - return null; - } - - /// - /// Introduced for JSON serialization, can create SubModelElements based on a string name - /// - /// string name (standard PascalCased) - public static SubmodelElement CreateAdequateType(string elementName) - { - return CreateAdequateType(GetAdequateEnum(elementName)); - } - - /// - /// Can create SubmodelElements based on a given type information - /// - /// Type of the SME to be created - /// SubmodelElement or null - public static SubmodelElement CreateAdequateType(Type t) - { - if (t == null || !t.IsSubclassOf(typeof(AdminShell.SubmodelElement))) - return null; - var sme = Activator.CreateInstance(t) as SubmodelElement; - return sme; - } - - public string GetElementAbbreviation() - { - if (submodelElement == null) - return ("Null"); - var dsc = submodelElement.GetSelfDescription(); - if (dsc?.ElementAbbreviation == null) - return ("Null"); - return dsc.ElementAbbreviation; - } - - public static string GetElementNameByAdequateType(SubmodelElement sme) - { - // access - var sd = sme.GetSelfDescription(); - if (sd == null || sd.ElementEnum == AdequateElementEnum.Unknown) - return null; - var en = sd.ElementEnum; - - // get the names - string res = null; - if ((int)en < AdequateElementNames.Length) - res = AdequateElementNames[(int)en].Trim(); - if ((int)en < AdequateElementShortName.Length && AdequateElementShortName[(int)en] != null) - res = AdequateElementShortName[(int)en].Trim(); - return res; - } - - public static ListOfSubmodelElement ListOfWrappersToListOfElems(List wrappers) - { - var res = new ListOfSubmodelElement(); - if (wrappers == null) - return res; - foreach (var w in wrappers) - if (w.submodelElement != null) - res.Add(w.submodelElement); - return res; - } - - public static SubmodelElementWrapper CreateFor(SubmodelElement sme) - { - var res = new SubmodelElementWrapper() { submodelElement = sme }; - return res; - } - - public static Referable FindReferableByReference( - List wrappers, Reference rf, int keyIndex) - { - return FindReferableByReference(wrappers, rf?.Keys, keyIndex); - } - - public static Referable FindReferableByReference( - List wrappers, KeyList rf, int keyIndex) - { - // first index needs to exist .. - if (wrappers == null || rf == null || keyIndex >= rf.Count) - return null; - - // as SubmodelElements are not Identifiables, the actual key shall be IdShort - if (rf[keyIndex].idType.Trim().ToLower() != Key.GetIdentifierTypeName( - Key.IdentifierType.IdShort).Trim().ToLower()) - return null; - - // over all wrappers - foreach (var smw in wrappers) - if (smw.submodelElement != null && - smw.submodelElement.idShort.Trim().ToLower() == rf[keyIndex].value.Trim().ToLower()) - { - // match on this level. Did we find a leaf element? - if ((keyIndex + 1) >= rf.Count) - return smw.submodelElement; - - // dive into SMC? - if (smw.submodelElement is SubmodelElementCollection smc) - { - var found = FindReferableByReference(smc.value, rf, keyIndex + 1); - if (found != null) - return found; - } - - // dive into Entity statements? - if (smw.submodelElement is Entity ent) - { - var found = FindReferableByReference(ent.statements, rf, keyIndex + 1); - if (found != null) - return found; - } - - // else: - return null; - } - - // no? - return null; - } - - // typecasting wrapper into specific type - public T GetAs() where T : SubmodelElement - { - var x = (this.submodelElement) as T; - return x; - } - - } - - public class SubmodelElementWrapperCollection : BaseSubmodelElementWrapperCollection - { - public SubmodelElementWrapperCollection() : base() { } - - public SubmodelElementWrapperCollection(SubmodelElementWrapper smw) : base(smw) { } - - public SubmodelElementWrapperCollection(SubmodelElement sme) : base(sme) { } - - public SubmodelElementWrapperCollection(SubmodelElementWrapperCollection other) : base(other) { } - } - - public class DataElementWrapperCollection : BaseSubmodelElementWrapperCollection - { - public DataElementWrapperCollection() : base() { } - - public DataElementWrapperCollection(SubmodelElementWrapperCollection other) - : base(other) - { - } - - public DataElementWrapperCollection(DataElementWrapperCollection other) - : base() - { - foreach (var wo in other) - this.Add(wo); - } - } - - /// - /// Provides some more functionalities for searching specific elements, e.g. in a SMEC - /// - // OZ - // Resharper disable UnusedTypeParameter - public class BaseSubmodelElementWrapperCollection : List - where ELEMT : SubmodelElement - { - // Resharper enable UnusedTypeParameter - - // member: Parent - // will be held correctly by the containing class - public Referable Parent = null; - - // constructors - - public BaseSubmodelElementWrapperCollection() : base() { } - - public BaseSubmodelElementWrapperCollection(SubmodelElementWrapperCollection other) - : base() - { - if (other == null) - return; - - foreach (var smw in other) - this.Add(new SubmodelElementWrapper(smw.submodelElement)); - } - - public BaseSubmodelElementWrapperCollection(SubmodelElementWrapper smw) - : base() - { - if (smw != null) - this.Add(smw); - } - - public BaseSubmodelElementWrapperCollection(SubmodelElement sme) - : base() - { - if (sme != null) - this.Add(new SubmodelElementWrapper(sme)); - } - - // better find functions - - public IEnumerable FindDeep(Predicate match = null) where T : SubmodelElement - { - foreach (var smw in this) - { - var current = smw.submodelElement; - if (current == null) - continue; - - // call lambda for this element - if (current is T) - if (match == null || match.Invoke(current as T)) - yield return current as T; - - // dive into? - // TODO (MIHO, 2020-07-31): would be nice to use IEnumerateChildren for this .. - if (current is SubmodelElementCollection smc && smc.value != null) - foreach (var x in smc.value.FindDeep(match)) - yield return x; - - if (current is AnnotatedRelationshipElement are && are.annotations != null) - foreach (var x in are.annotations.FindDeep(match)) - yield return x; - - if (current is Entity ent && ent.statements != null) - foreach (var x in ent.statements.FindDeep(match)) - yield return x; - - if (current is Operation op) - for (int i = 0; i < 2; i++) - if (Operation.GetWrappers(op[i]) != null) - foreach (var x in Operation.GetWrappers(op[i]).FindDeep(match)) - yield return x; - } - } - - public IEnumerable FindAllIdShort(string idShort) - { - foreach (var smw in this) - if (smw.submodelElement != null) - if (smw.submodelElement.idShort.Trim().ToLower() == idShort.Trim().ToLower()) - yield return smw; - } - - public IEnumerable FindAllIdShortAs(string idShort) where T : SubmodelElement - { - foreach (var smw in this) - if (smw.submodelElement != null && smw.submodelElement is T) - if (smw.submodelElement.idShort.Trim().ToLower() == idShort.Trim().ToLower()) - yield return smw.submodelElement as T; - } - - public SubmodelElementWrapper FindFirstIdShort(string idShort) - { - return FindAllIdShort(idShort)?.FirstOrDefault(); - } - - public T FindFirstIdShortAs(string idShort) where T : SubmodelElement - { - return FindAllIdShortAs(idShort)?.FirstOrDefault(); - } - - public IEnumerable FindAllSemanticId( - Key semId, Type[] allowedTypes = null, Key.MatchMode matchMode = Key.MatchMode.Strict) - { - foreach (var smw in this) - if (smw.submodelElement != null && smw.submodelElement.semanticId != null) - { - if (smw.submodelElement == null) - continue; - - if (allowedTypes != null) - { - var smwt = smw.submodelElement.GetType(); - if (!allowedTypes.Contains(smwt)) - continue; - } - - if (smw.submodelElement.semanticId.MatchesExactlyOneKey(semId, matchMode)) - yield return smw; - } - } - - public IEnumerable FindAllSemanticIdAs(Key semId, Key.MatchMode matchMode = Key.MatchMode.Strict) - where T : SubmodelElement - { - foreach (var smw in this) - if (smw.submodelElement != null && smw.submodelElement is T - && smw.submodelElement.semanticId != null) - if (smw.submodelElement.semanticId.MatchesExactlyOneKey(semId, matchMode)) - yield return smw.submodelElement as T; - } - - public IEnumerable FindAllSemanticIdAs(Reference semId, - Key.MatchMode matchMode = Key.MatchMode.Strict) - where T : SubmodelElement - { - foreach (var smw in this) - if (smw.submodelElement != null && smw.submodelElement is T - && smw.submodelElement.semanticId != null) - if (smw.submodelElement.semanticId.Matches(semId, matchMode)) - yield return smw.submodelElement as T; - } - - public IEnumerable FindAllSemanticIdAs(ConceptDescription cd, - Key.MatchMode matchMode = Key.MatchMode.Strict) - where T : SubmodelElement - { - foreach (var x in FindAllSemanticIdAs(cd.GetReference(), matchMode)) - yield return x; - } - - public SubmodelElementWrapper FindFirstSemanticId( - Key semId, Type[] allowedTypes = null, Key.MatchMode matchMode = Key.MatchMode.Strict) - { - return FindAllSemanticId(semId, allowedTypes, matchMode)?.FirstOrDefault(); - } - - public SubmodelElementWrapper FindFirstAnySemanticId( - Key[] semId, Type[] allowedTypes = null, Key.MatchMode matchMode = Key.MatchMode.Strict) - { - if (semId == null) - return null; - foreach (var si in semId) - { - var found = FindAllSemanticId(si, allowedTypes, matchMode)? - .FirstOrDefault(); - if (found != null) - return found; - } - return null; - } - - public T FindFirstSemanticIdAs(Key semId, Key.MatchMode matchMode = Key.MatchMode.Strict) - where T : SubmodelElement - { - return FindAllSemanticIdAs(semId, matchMode)?.FirstOrDefault(); - } - - public T FindFirstAnySemanticIdAs(Key[] semId, Key.MatchMode matchMode = Key.MatchMode.Strict) - where T : SubmodelElement - { - if (semId == null) - return null; - foreach (var si in semId) - { - var found = FindAllSemanticIdAs(si, matchMode)?.FirstOrDefault(); - if (found != null) - return found; - } - return null; - } - - public T FindFirstSemanticIdAs(Reference semId, Key.MatchMode matchMode = Key.MatchMode.Strict) - where T : SubmodelElement - { - return FindAllSemanticIdAs(semId, matchMode)?.FirstOrDefault(); - } - - /* TODO (MIHO, 2021-10-18): there are overlaps of this new function with - * this old function: FindFirstAnySemanticId(Key[] semId .. - * clarify/ refactor */ - public IEnumerable FindAllSemanticId( - Key[] allowedSemId, Key.MatchMode matchMode = Key.MatchMode.Strict, - bool invertAllowed = false) - where T : SubmodelElement - { - if (allowedSemId == null || allowedSemId.Length < 1) - yield break; - - foreach (var smw in this) - { - if (smw.submodelElement == null || !(smw.submodelElement is T)) - continue; - - if (smw.submodelElement.semanticId == null || smw.submodelElement.semanticId.Count < 1) - { - if (invertAllowed) - yield return smw.submodelElement as T; - continue; - } - - var found = false; - foreach (var semId in allowedSemId) - if (smw.submodelElement.semanticId.MatchesExactlyOneKey(semId, matchMode)) - { - found = true; - break; - } - - if (invertAllowed) - found = !found; - - if (found) - yield return smw.submodelElement as T; - } - } - - public T FindFirstAnySemanticId( - Key[] allowedSemId, Key.MatchMode matchMode = Key.MatchMode.Strict, - bool invertAllowed = false) - where T : SubmodelElement - { - return FindAllSemanticId(allowedSemId, matchMode, invertAllowed)?.FirstOrDefault(); - } - - // recursion - - /// - /// Recurses on all Submodel elements of a Submodel or SME, which allows children. - /// The state object will be passed to the lambda function in order to provide - /// stateful approaches. Also a list of parents will be provided to - /// the lambda. This list of parents can be initialized or simply set to null - /// in order to be created automatically. - /// - /// State object to be provided to lambda. Could be null. - /// List of already existing parents to be provided to lambda. - /// Could be null. - /// The lambda function as (state, parents, SME) - /// The lambda shall return TRUE in order to deep into recursion. - /// - public void RecurseOnReferables( - object state, ListOfReferable parents, - Func lambda) - { - // trivial - if (lambda == null) - return; - if (parents == null) - parents = new ListOfReferable(); - - // over all elements - foreach (var smw in this) - { - var current = smw.submodelElement; - if (current == null) - continue; - - // call lambda for this element - // AND decide, if to recurse! - var goDeeper = lambda(state, parents, current); - - if (goDeeper) - { - // add to parents - parents.Add(current); - - // dive into? - if (current is SubmodelElementCollection smc) - smc.value?.RecurseOnReferables(state, parents, lambda); - - if (current is Entity ent) - ent.statements?.RecurseOnReferables(state, parents, lambda); - - if (current is Operation op) - for (int i = 0; i < 2; i++) - Operation.GetWrappers(op[i])?.RecurseOnReferables(state, parents, lambda); - - if (current is AnnotatedRelationshipElement arel) - arel.annotations?.RecurseOnReferables(state, parents, lambda); - - // remove from parents - parents.RemoveAt(parents.Count - 1); - } - } - } - - // idShort management - - /// - /// Checks, if given idShort is already existing in the collection of SubmodelElements. - /// Trims the string, but does not ignore upper/ lowercase. An empty idShort returns false. - /// - public bool CheckIdShortIsUnique(string idShort) - { - idShort = idShort?.Trim(); - if (idShort == null || idShort.Length < 1) - return false; - - var res = true; - foreach (var smw in this) - if (smw.submodelElement != null && smw.submodelElement.idShort != null && - smw.submodelElement.idShort == idShort) - { - res = false; - break; - } - - return res; - } - - /// - /// The string idShortTemplate shall contain Format.String partt such as {0}. - /// A int-Parameter is as long incremented, until the resulting idShort proves - /// to be unique in the collection of SubmodelElements or maxNum is reached. - /// Returns null in case of any error. - /// - public string IterateIdShortTemplateToBeUnique(string idShortTemplate, int maxNum) - { - if (idShortTemplate == null || maxNum < 1 || !idShortTemplate.Contains("{0")) - return null; - - int i = 1; - while (i < maxNum) - { - var ids = String.Format(idShortTemplate, i); - if (this.CheckIdShortIsUnique(ids)) - return ids; - i++; - } - - return null; - } - - // give more direct access to SMEs - - /// - /// Add sme by creating a SubmodelElementWrapper for it and adding to this collection. - /// - public void Add(SubmodelElement sme) - { - if (sme == null) - return; - sme.parent = this.Parent; - this.Add(SubmodelElementWrapper.CreateFor(sme)); - } - - /// - /// Add sme by creating a SubmodelElementWrapper for it and adding to this collection. - /// - public void Insert(int index, SubmodelElement sme) - { - if (sme == null || index < 0 || index >= this.Count) - return; - sme.parent = this.Parent; - this.Insert(index, SubmodelElementWrapper.CreateFor(sme)); - } - - /// - /// Finds the first (shall be only 1!) SubmodelElementWrapper with SubmodelElement sme. - /// - public SubmodelElementWrapper FindSubModelElement(SubmodelElement sme) - { - if (sme != null) - foreach (var smw in this) - if (smw?.submodelElement == sme) - return smw; - return null; - } - - /// - /// Removes the first (shall be only 1!) SubmodelElementWrapper with SubmodelElement sme. - /// - public void Remove(SubmodelElement sme) - { - if (sme == null) - return; - var found = FindSubModelElement(sme); - if (found != null) - this.Remove(found); - } - - // a little more business logic - - public T CreateSMEForCD(ConceptDescription cd, string category = null, string idShort = null, - string idxTemplate = null, int maxNum = 999, bool addSme = false, bool isTemplate = false) - where T : SubmodelElement, new() - { - // access - if (cd == null) - return null; - - // try to potentially figure out idShort - var ids = cd.idShort; - if ((ids == null || ids.Trim() == "") && cd.GetIEC61360() != null) - ids = cd.GetIEC61360().shortName? - .GetDefaultStr(); - if (idShort != null) - ids = idShort; - if (ids == null) - return null; - - // unique? - if (idxTemplate != null) - ids = this.IterateIdShortTemplateToBeUnique(idxTemplate, maxNum); - - // make a new instance - var sme = new T() - { - idShort = ids, - semanticId = new SemanticId(cd.GetCdReference()) - }; - if (category != null) - sme.category = category; - if (isTemplate) - sme.kind = ModelingKind.CreateAsTemplate(); - - // if its a SMC, make sure its accessible - if (sme is SubmodelElementCollection smc) - smc.value = new SubmodelElementWrapperCollection(); - - // instantanously add it? - if (addSme) - this.Add(sme); - - // give back - return sme; - } - - public T CreateSMEForIdShort(string idShort, string category = null, - string idxTemplate = null, int maxNum = 999, bool addSme = false) where T : SubmodelElement, new() - { - // access - if (idShort == null) - return null; - - // try to potentially figure out idShort - var ids = idShort; - - // unique? - if (idxTemplate != null) - ids = this.IterateIdShortTemplateToBeUnique(idxTemplate, maxNum); - - // make a new instance - var sme = new T() { idShort = ids }; - if (category != null) - sme.category = category; - - // instantanously add it? - if (addSme) - this.Add(sme); - - // give back - return sme; - } - - // for conversion - - public T AdaptiveConvertTo( - SubmodelElement anySrc, - ConceptDescription createDefault = null, - string idShort = null, bool addSme = false) where T : SubmodelElement, new() - { - if (typeof(T) == typeof(MultiLanguageProperty) - && anySrc is Property srcProp) - { - var res = this.CreateSMEForCD(createDefault, idShort: idShort, addSme: addSme); - if (res is MultiLanguageProperty mlp) - { - mlp.value = new LangStringSet("EN?", srcProp.value); - mlp.valueId = srcProp.valueId; - return res; - } - } - - if (typeof(T) == typeof(Property) - && anySrc is MultiLanguageProperty srcMlp) - { - var res = this.CreateSMEForCD(createDefault, idShort: idShort, addSme: addSme); - if (res is Property prp) - { - prp.value = "" + srcMlp.value?.GetDefaultStr(); - prp.valueId = srcMlp.valueId; - return res; - } - } - - return null; - } - - public T CopyOneSMEbyCopy(Key destSemanticId, - SubmodelElementWrapperCollection sourceSmc, Key[] sourceSemanticId, - ConceptDescription createDefault = null, Action setDefault = null, - Key.MatchMode matchMode = Key.MatchMode.Relaxed, - string idShort = null, bool addSme = false) where T : SubmodelElement, new() - { - // get source - var src = sourceSmc?.FindFirstAnySemanticIdAs(sourceSemanticId, matchMode); - - // may be make an adaptive conversion - if (src == null) - { - var anySrc = sourceSmc?.FindFirstAnySemanticId(sourceSemanticId, matchMode: matchMode); - src = AdaptiveConvertTo(anySrc?.submodelElement, createDefault, - idShort: idShort, addSme: false); - } - - // proceed - var aeSrc = SubmodelElementWrapper.GetAdequateEnum(src?.GetElementName()); - if (src == null || aeSrc == SubmodelElementWrapper.AdequateElementEnum.Unknown) - { - // create a default? - if (createDefault == null) - return null; - - // ok, default - var dflt = this.CreateSMEForCD(createDefault, idShort: idShort, addSme: addSme); - - // set default? - setDefault?.Invoke(dflt); - - // return - return dflt; - } - - // ok, create new one - var dst = SubmodelElementWrapper.CreateAdequateType(aeSrc, src) as T; - if (dst == null) - return null; - - // make same things sure - dst.idShort = src.idShort; - dst.category = src.category; - dst.semanticId = new SemanticId(destSemanticId); - - // instantanously add it? - if (addSme) - this.Add(dst); - - // give back - return dst; - } - - public T CopyOneSMEbyCopy(ConceptDescription destCD, - SubmodelElementWrapperCollection sourceSmc, ConceptDescription sourceCD, - bool createDefault = false, Action setDefault = null, - Key.MatchMode matchMode = Key.MatchMode.Relaxed, - string idShort = null, bool addSme = false) where T : SubmodelElement, new() - { - return this.CopyOneSMEbyCopy(destCD?.GetSingleKey(), sourceSmc, new[] { sourceCD?.GetSingleKey() }, - createDefault ? destCD : null, setDefault, matchMode, idShort, addSme); - } - - public T CopyOneSMEbyCopy(ConceptDescription destCD, - SubmodelElementWrapperCollection sourceSmc, Key[] sourceKeys, - bool createDefault = false, Action setDefault = null, - Key.MatchMode matchMode = Key.MatchMode.Relaxed, - string idShort = null, bool addSme = false) where T : SubmodelElement, new() - { - return this.CopyOneSMEbyCopy(destCD?.GetSingleKey(), sourceSmc, sourceKeys, - createDefault ? destCD : null, setDefault, matchMode, idShort, addSme); - } - - public void CopyManySMEbyCopy(Key destSemanticId, - SubmodelElementWrapperCollection sourceSmc, Key sourceSemanticId, - ConceptDescription createDefault = null, Action setDefault = null, - Key.MatchMode matchMode = Key.MatchMode.Relaxed) where T : SubmodelElement, new() - { - // bool find possible sources - bool foundSrc = false; - if (sourceSmc == null) - return; - foreach (var src in sourceSmc.FindAllSemanticIdAs(sourceSemanticId, matchMode)) - { - // type of found src? - var aeSrc = SubmodelElementWrapper.GetAdequateEnum(src?.GetElementName()); - - // ok? - if (src == null || aeSrc == SubmodelElementWrapper.AdequateElementEnum.Unknown) - continue; - foundSrc = true; - - // ok, create new one - var dst = SubmodelElementWrapper.CreateAdequateType(aeSrc, src) as T; - if (dst != null) - { - // make same things sure - dst.idShort = src.idShort; - dst.category = src.category; - dst.semanticId = new SemanticId(destSemanticId); - - // instantanously add it? - this.Add(dst); - } - } - - // default? - if (createDefault != null && !foundSrc) - { - // ok, default - var dflt = this.CreateSMEForCD(createDefault, addSme: true); - - // set default? - setDefault?.Invoke(dflt); - } - } - - public void CopyManySMEbyCopy(ConceptDescription destCD, - SubmodelElementWrapperCollection sourceSmc, ConceptDescription sourceCD, - bool createDefault = false, Action setDefault = null, - Key.MatchMode matchMode = Key.MatchMode.Relaxed) where T : SubmodelElement, new() - { - CopyManySMEbyCopy(destCD.GetSingleKey(), sourceSmc, sourceCD.GetSingleKey(), - createDefault ? destCD : null, setDefault, matchMode); - } - } - - public interface IManageSubmodelElements - { - void Add(SubmodelElement sme); - void Insert(int index, SubmodelElement sme); - void Remove(SubmodelElement sme); - } - - public class Submodel : Identifiable, IManageSubmodelElements, - System.IDisposable, IEnumerateChildren, IFindAllReferences, - IGetSemanticId, IGetQualifiers - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // members - - // do this in order to be IDisposable, that is: suitable for (using) - void System.IDisposable.Dispose() { } - public void GetData() { } - - // from HasKind - [XmlElement(ElementName = "kind")] - [JsonIgnore] - public ModelingKind kind = new ModelingKind(); - [XmlIgnore] - [JsonProperty(PropertyName = "kind")] - public string JsonKind - { - get - { - if (kind == null) - return null; - return kind.kind; - } - set - { - if (kind == null) - kind = new ModelingKind(); - kind.kind = value; - } - } - - // from hasSemanticId: - [XmlElement(ElementName = "semanticId")] - public SemanticId semanticId = new SemanticId(); - public SemanticId GetSemanticId() { return semanticId; } - - // from Qualifiable: - [XmlArray("qualifier")] - [XmlArrayItem("qualifier")] - public QualifierCollection qualifiers = null; - public QualifierCollection GetQualifiers() => qualifiers; - - // from hasDataSpecification: - [XmlElement(ElementName = "embeddedDataSpecification")] - public HasDataSpecification hasDataSpecification = null; - - // from this very class - [XmlIgnore] - [JsonIgnore] - private SubmodelElementWrapperCollection _submodelElements = null; - - [JsonIgnore] - public SubmodelElementWrapperCollection submodelElements - { - get { return _submodelElements; } - set { _submodelElements = value; _submodelElements.Parent = this; } - } - - [XmlIgnore] - [JsonProperty(PropertyName = "submodelElements")] - public SubmodelElement[] JsonSubmodelElements - { - get - { - var res = new ListOfSubmodelElement(); - if (submodelElements != null) - foreach (var smew in submodelElements) - res.Add(smew.submodelElement); - return res.ToArray(); - } - set - { - if (value != null) - { - this.submodelElements = new SubmodelElementWrapperCollection(); - foreach (var x in value) - { - var smew = new SubmodelElementWrapper() { submodelElement = x }; - this.submodelElements.Add(smew); - } - } - } - } - - // getter / setter - - // constructors / creators - - public Submodel() : base() { } - - public Submodel(Submodel src, bool shallowCopy = false) - : base(src) - { - if (src == null) - return; - if (src.hasDataSpecification != null) - this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - if (src.semanticId != null) - this.semanticId = new SemanticId(src.semanticId); - if (src.kind != null) - this.kind = new ModelingKind(src.kind); - if (!shallowCopy && src.submodelElements != null) - { - if (this.submodelElements == null) - this.submodelElements = new SubmodelElementWrapperCollection(); - foreach (var smw in src.submodelElements) - this.submodelElements.Add(new SubmodelElementWrapper(smw.submodelElement, shallowCopy: false)); - } - } - -#if !DoNotUseAasxCompatibilityModels - public Submodel(AasxCompatibilityModels.AdminShellV10.Submodel src, bool shallowCopy = false) - : base(src) - { - if (src.hasDataSpecification != null) - this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - if (src.semanticId != null) - this.semanticId = new SemanticId(src.semanticId); - if (src.kind != null) - this.kind = new ModelingKind(src.kind); - if (src.qualifiers != null) - this.qualifiers = new QualifierCollection(src.qualifiers); - if (!shallowCopy && src.submodelElements != null) - { - if (this.submodelElements == null) - this.submodelElements = new SubmodelElementWrapperCollection(); - foreach (var smw in src.submodelElements) - this.submodelElements.Add(new SubmodelElementWrapper(smw.submodelElement, shallowCopy: false)); - } - } -#endif - - public static Submodel CreateNew(string idType, string id, string version = null, string revision = null) - { - var s = new Submodel() { identification = new Identification(idType, id) }; - if (version != null) - { - if (s.administration == null) - s.administration = new Administration(); - s.administration.version = version; - s.administration.revision = revision; - } - return (s); - } - - [JsonIgnore] - [XmlIgnore] - public SubmodelElementWrapperCollection SmeForWrite - { - get - { - if (this.submodelElements == null) - this.submodelElements = new SubmodelElementWrapperCollection(); - return this.submodelElements; - } - } - - // from IEnumarateChildren - public IEnumerable EnumerateChildren() - { - if (this.submodelElements != null) - foreach (var smw in this.submodelElements) - yield return smw; - } - - public EnumerationPlacmentBase GetChildrenPlacement(SubmodelElement child) - { - return null; - } - - public object AddChild(SubmodelElementWrapper smw, EnumerationPlacmentBase placement = null) - { - if (smw == null) - return null; - if (this.submodelElements == null) - this.submodelElements = new SubmodelElementWrapperCollection(); - if (smw.submodelElement != null) - smw.submodelElement.parent = this; - this.submodelElements.Add(smw); - return smw; - } - - // from IManageSubmodelElements - public void Add(SubmodelElement sme) - { - if (submodelElements == null) - submodelElements = new SubmodelElementWrapperCollection(); - var sew = new SubmodelElementWrapper(); - sme.parent = this; // track parent here! - sew.submodelElement = sme; - submodelElements.Add(sew); - } - - public void Insert(int index, SubmodelElement sme) - { - if (submodelElements == null) - submodelElements = new SubmodelElementWrapperCollection(); - var sew = new SubmodelElementWrapper(); - sme.parent = this; // track parent here! - sew.submodelElement = sme; - if (index < 0 || index >= submodelElements.Count) - return; - submodelElements.Insert(index, sew); - } - - public void Remove(SubmodelElement sme) - { - if (submodelElements != null) - submodelElements.Remove(sme); - } - - // further - - public void AddQualifier( - string qualifierType = null, string qualifierValue = null, KeyList semanticKeys = null, - Reference qualifierValueId = null) - { - QualifierCollection.AddQualifier( - ref this.qualifiers, qualifierType, qualifierValue, semanticKeys, qualifierValueId); - } - - public Qualifier HasQualifierOfType(string qualifierType) - { - return QualifierCollection.HasQualifierOfType(this.qualifiers, qualifierType); - } - - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("Submodel", "SM"); - } - - public SubmodelRef GetSubmodelRef() - { - SubmodelRef l = new SubmodelRef(); - l.Keys.Add( - Key.CreateNew( - this.GetElementName(), true, this.identification.idType, this.identification.id)); - return l; - } - - /// - /// If instance, return semanticId as on key. - /// If template, return identification as key. - /// - /// - public Key GetSemanticKey() - { - if (true == this.kind?.IsTemplate) - return new Key(this.GetElementName(), true, this.identification?.idType, this.identification?.id); - else - return this.semanticId?.GetAsExactlyOneKey(); - } - - public void AddDataSpecification(Key k) - { - if (hasDataSpecification == null) - hasDataSpecification = new HasDataSpecification(); - var r = new Reference(); - r.Keys.Add(k); - hasDataSpecification.Add(new EmbeddedDataSpecification(r)); - } - - public SubmodelElementWrapper FindSubmodelElementWrapper(string idShort) - { - if (this.submodelElements == null) - return null; - foreach (var smw in this.submodelElements) - if (smw.submodelElement != null) - if (smw.submodelElement.idShort.Trim().ToLower() == idShort.Trim().ToLower()) - return smw; - return null; - } - - public IEnumerable FindDeep(Predicate match = null) where T : SubmodelElement - { - if (this.submodelElements == null) - yield break; - foreach (var x in this.submodelElements.FindDeep(match)) - yield return x; - } - - public Tuple ToCaptionInfo() - { - var caption = AdminShellUtilV20.EvalToNonNullString("\"{0}\" ", idShort, ""); - if (administration != null) - caption += "V" + administration.version + "." + administration.revision; - var info = ""; - if (identification != null) - info = $"[{identification.idType}, {identification.id}]"; - return Tuple.Create(caption, info); - } - - public override string ToString() - { - var ci = ToCaptionInfo(); - return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); - } - - // Recursing - - /// - /// Recurses on all Submodel elements of a Submodel or SME, which allows children. - /// The state object will be passed to the lambda function in order to provide - /// stateful approaches. - /// - /// State object to be provided to lambda. Could be null. - /// The lambda function as (state, parents, SME) - /// The lambda shall return TRUE in order to deep into recursion. - /// - public void RecurseOnSubmodelElements( - object state, Func lambda) - { - this.submodelElements?.RecurseOnReferables(state, null, (o, par, rf) => - { - if (rf is SubmodelElement sme) - return lambda(o, par, sme); - else - return true; - }); - } - - /// - /// Recurses on all Submodel elements of a Submodel or SME, which allows children. - /// The state object will be passed to the lambda function in order to provide - /// stateful approaches. Include this element, as well. - /// - /// State object to be provided to lambda. Could be null. - /// The lambda function as (state, parents, SME) - /// The lambda shall return TRUE in order to deep into recursion. - /// Include this element as well. parents will then - /// include this element as well! - public override void RecurseOnReferables( - object state, Func lambda, - bool includeThis = false) - { - var parents = new ListOfReferable(); - if (includeThis) - { - lambda(state, null, this); - parents.Add(this); - } - this.submodelElements?.RecurseOnReferables(state, parents, lambda); - } - - // Parents stuff - - public static void SetParentsForSME(Referable parent, SubmodelElement se) - { - if (se == null) - return; - - se.parent = parent; - - // via interface enumaration - if (se is IEnumerateChildren) - { - var childs = (se as IEnumerateChildren).EnumerateChildren(); - if (childs != null) - foreach (var c in childs) - SetParentsForSME(se, c.submodelElement); - } - } - - public void SetAllParents() - { - if (this.submodelElements != null) - foreach (var sme in this.submodelElements) - SetParentsForSME(this, sme.submodelElement); - } - - public T CreateSMEForCD(ConceptDescription cd, string category = null, string idShort = null, - string idxTemplate = null, int maxNum = 999, bool addSme = false) where T : SubmodelElement, new() - { - if (this.submodelElements == null) - this.submodelElements = new SubmodelElementWrapperCollection(); - return this.submodelElements.CreateSMEForCD(cd, category, idShort, idxTemplate, maxNum, addSme); - } - - public T CreateSMEForIdShort(string idShort, string category = null, - string idxTemplate = null, int maxNum = 999, bool addSme = false) where T : SubmodelElement, new() - { - if (this.submodelElements == null) - this.submodelElements = new SubmodelElementWrapperCollection(); - return this.submodelElements.CreateSMEForIdShort(idShort, category, idxTemplate, maxNum, addSme); - } - - // validation - - public override void Validate(AasValidationRecordList results) - { - // access - if (results == null) - return; - - // check - base.Validate(results); - ModelingKind.Validate(results, kind, this); - KeyList.Validate(results, semanticId?.Keys, this); - } - - // find - - public IEnumerable FindAllReferences() - { - // not nice: use temp list - var temp = new List(); - - // recurse - this.RecurseOnSubmodelElements(null, (state, parents, sme) => - { - if (sme is ReferenceElement re) - if (re.value != null) - temp.Add(re.value); - if (sme is RelationshipElement rl) - { - if (rl.first != null) - temp.Add(rl.first); - if (rl.second != null) - temp.Add(rl.second); - } - // recurse - return true; - }); - - // now, give back - foreach (var r in temp) - yield return new LocatedReference(this, r); - } - } - - public class ListOfSubmodels : List, IAasElement - { - // self decscription - - public AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("Submodels", "SMS"); - } - - public string GetElementName() - { - return this.GetSelfDescription()?.ElementName; - } - } - - // - // Derived from SubmodelElements - // - - public class DataElement : SubmodelElement - { - public static string ValueType_STRING = "string"; - public static string ValueType_DATE = "date"; - public static string ValueType_BOOLEAN = "boolean"; - - public static string[] ValueTypeItems = new string[] { - "anyType", "complexType", "anySimpleType", "anyAtomicType", "anyURI", "base64Binary", - "boolean", "date", "dateTime", - "dateTimeStamp", "decimal", "integer", "long", "int", "short", "byte", "nonNegativeInteger", - "positiveInteger", - "unsignedLong", "unsignedInt", "unsignedShort", "unsignedByte", "nonPositiveInteger", - "negativeInteger", "double", "duration", - "dayTimeDuration", "yearMonthDuration", "float", "hexBinary", "string", "langString", "time" }; - - public static string[] ValueTypes_Number = new[] { - "decimal", "integer", "long", "int", "short", "byte", "nonNegativeInteger", - "positiveInteger", - "unsignedLong", "unsignedInt", "unsignedShort", "unsignedByte", "nonPositiveInteger", - "negativeInteger", "double", "float" }; - - public DataElement() { } - - public DataElement(SubmodelElement src) : base(src) { } - - public DataElement(DataElement src) : base(src) { } - -#if !DoNotUseAasxCompatibilityModels - public DataElement(AasxCompatibilityModels.AdminShellV10.DataElement src) - : base(src) - { } -#endif - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("DataElement", "DE"); - } - } - - public class JsonValueTypeCast - { - - public class JsonDataObjectType - { - [JsonProperty(PropertyName = "name")] - public string name = ""; - } - - [JsonProperty(PropertyName = "dataObjectType")] - public JsonDataObjectType dataObjectType = new JsonDataObjectType(); - - public JsonValueTypeCast(string name) - { - this.dataObjectType.name = name; - } - } - - public class Property : DataElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - - [MetaModelName("Property.valueType")] - [TextSearchable] - [JsonIgnore] - public string valueType = ""; - [XmlIgnore] - [JsonProperty(PropertyName = "valueType")] - public JsonValueTypeCast JsonValueType - { - get { return new JsonValueTypeCast(this.valueType); } - set { this.valueType = value?.dataObjectType?.name; } - } - - - [MetaModelName("Property.value")] - [TextSearchable] - public string value = ""; - public Reference valueId = null; - - // constructors - - public Property() { } - - public Property(SubmodelElement src) - : base(src) - { - if (!(src is Property p)) - return; - this.valueType = p.valueType; - this.value = p.value; - if (p.valueId != null) - valueId = new Reference(p.valueId); - } - -#if !DoNotUseAasxCompatibilityModels - public Property(AasxCompatibilityModels.AdminShellV10.Property src) - : base(src) - { - if (src == null) - return; - - this.valueType = src.valueType; - this.value = src.value; - if (src.valueId != null) - this.valueId = new Reference(src.valueId); - } -#endif - - public static Property CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new Property(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - public Property Set(string valueType = "", string value = "") - { - this.valueType = valueType; - this.value = value; - return this; - } - - public Property Set(string type, bool local, string idType, string value) - { - this.valueId = Reference.CreateNew(Key.CreateNew(type, local, idType, value)); - return this; - } - - public Property Set(Qualifier q) - { - if (q != null) - this.AddQualifier(q); - return this; - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("Property", "Prop", - SubmodelElementWrapper.AdequateElementEnum.Property); - } - - public override string ValueAsText(string defaultLang = null) - { - return "" + value; - } - - public override void ValueFromText(string text, string defaultLang = null) - { - value = "" + text; - } - - public bool IsTrue() - { - if (this.valueType?.Trim().ToLower() == "boolean") - { - var v = "" + this.value?.Trim().ToLower(); - if (v == "true" || v == "1") - return true; - } - return false; - } - - public override double? ValueAsDouble() - { - // pointless - if (this.value == null || this.value.Trim() == "" || this.valueType == null) - return null; - - // type? - var vt = this.valueType.Trim().ToLower(); - if (!DataElement.ValueTypes_Number.Contains(vt)) - return null; - - // try convert - if (double.TryParse(this.value, NumberStyles.Any, CultureInfo.InvariantCulture, out double dbl)) - return dbl; - - // no - return null; - } - - } - - public class MultiLanguageProperty : DataElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - - public LangStringSet value = new LangStringSet(); - public Reference valueId = null; - - // constructors - - public MultiLanguageProperty() { } - - public MultiLanguageProperty(SubmodelElement src) - : base(src) - { - if (!(src is MultiLanguageProperty mlp)) - return; - - this.value = new LangStringSet(mlp.value); - if (mlp.valueId != null) - valueId = new Reference(mlp.valueId); - } - -#if !DoNotUseAasxCompatibilityModels - // not available in V1.0 -#endif - - public static MultiLanguageProperty CreateNew( - string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new MultiLanguageProperty(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("MultiLanguageProperty", "MLP", - SubmodelElementWrapper.AdequateElementEnum.MultiLanguageProperty); - } - - public MultiLanguageProperty Set(LangStringSet ls) - { - this.value = ls; - return this; - } - - public MultiLanguageProperty Set(ListOfLangStr ls) - { - this.value = new LangStringSet(ls); - return this; - } - - public MultiLanguageProperty Set(LangStr ls) - { - if (ls == null) - return this; - if (this.value?.langString == null) - this.value = new LangStringSet(); - this.value.langString[ls.lang] = ls.str; - return this; - } - - public MultiLanguageProperty Set(string lang, string str) - { - return this.Set(new LangStr(lang, str)); - } - - public override string ValueAsText(string defaultLang = null) - { - return "" + value?.GetDefaultStr(defaultLang); - } - - public override void ValueFromText(string text, string defaultLang = null) - { - Set(defaultLang, text); - } - - } - - public class Range : DataElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - - [MetaModelName("Range.valueType")] - [TextSearchable] - [JsonIgnore] - [CountForHash] - public string valueType = ""; - - [XmlIgnore] - [JsonProperty(PropertyName = "valueType")] - public JsonValueTypeCast JsonValueType - { - get { return new JsonValueTypeCast(this.valueType); } - set { this.valueType = value?.dataObjectType?.name; } - } - - [MetaModelName("Range.min")] - [TextSearchable] - [CountForHash] - public string min = ""; - - [MetaModelName("Range.max")] - [TextSearchable] - [CountForHash] - public string max = ""; - - // constructors - - public Range() { } - - public Range(SubmodelElement src) - : base(src) - { - if (!(src is Range rng)) - return; - - this.valueType = rng.valueType; - this.min = rng.min; - this.max = rng.max; - } - -#if !DoNotUseAasxCompatibilityModels - // not available in V1.0 -#endif - - public static Range CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new Range(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("Range", "Range", - SubmodelElementWrapper.AdequateElementEnum.Range); - } - - public override string ValueAsText(string defaultLang = null) - { - return "" + min + " .. " + max; - } - - } - - public class Blob : DataElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - - [MetaModelName("Blob.mimeType")] - [TextSearchable] - [CountForHash] - public string mimeType = ""; - - [MetaModelName("Blob.value")] - [TextSearchable] - [CountForHash] - public string value = ""; - - // constructors - - public Blob() { } - - public Blob(SubmodelElement src) - : base(src) - { - if (!(src is Blob blb)) - return; - - this.mimeType = blb.mimeType; - this.value = blb.value; - } - -#if !DoNotUseAasxCompatibilityModels - public Blob(AasxCompatibilityModels.AdminShellV10.Blob src) - : base(src) - { - if (src == null) - return; - - this.mimeType = src.mimeType; - this.value = src.value; - } -#endif - - public static Blob CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new Blob(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - public void Set(string mimeType = "", string value = "") - { - this.mimeType = mimeType; - this.value = value; - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("Blob", "Blob", - SubmodelElementWrapper.AdequateElementEnum.Blob); - } - - } - - public class File : DataElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - - [MetaModelName("File.mimeType")] - [TextSearchable] - [CountForHash] - public string mimeType = ""; - - [MetaModelName("File.value")] - [TextSearchable] - [CountForHash] - public string value = ""; - - // constructors - - public File() { } - - public File(SubmodelElement src) - : base(src) - { - if (!(src is File fil)) - return; - - this.mimeType = fil.mimeType; - this.value = fil.value; - } - -#if !DoNotUseAasxCompatibilityModels - public File(AasxCompatibilityModels.AdminShellV10.File src) - : base(src) - { - if (src == null) - return; - - this.mimeType = src.mimeType; - this.value = src.value; - } -#endif - - public static File CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new File(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - public void Set(string mimeType = "", string value = "") - { - this.mimeType = mimeType; - this.value = value; - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("File", "File", - SubmodelElementWrapper.AdequateElementEnum.File); - } - - public static string[] GetPopularMimeTypes() - { - return - new[] { - System.Net.Mime.MediaTypeNames.Text.Plain, - System.Net.Mime.MediaTypeNames.Text.Xml, - System.Net.Mime.MediaTypeNames.Text.Html, - "application/json", - "application/rdf+xml", - System.Net.Mime.MediaTypeNames.Application.Pdf, - System.Net.Mime.MediaTypeNames.Image.Jpeg, - "image/png", - System.Net.Mime.MediaTypeNames.Image.Gif, - "application/iges", - "application/step" - }; - } - - public override string ValueAsText(string defaultLang = null) - { - return "" + value; - } - } - - public class ReferenceElement : DataElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - - public Reference value = new Reference(); - - // constructors - - public ReferenceElement() { } - - public ReferenceElement(SubmodelElement src) - : base(src) - { - if (!(src is ReferenceElement re)) - return; - - if (re.value != null) - this.value = new Reference(re.value); - } - -#if !DoNotUseAasxCompatibilityModels - public ReferenceElement(AasxCompatibilityModels.AdminShellV10.ReferenceElement src) - : base(src) - { - if (src == null) - return; - - if (src.value != null) - this.value = new Reference(src.value); - } -#endif - - public static ReferenceElement CreateNew( - string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new ReferenceElement(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - public void Set(Reference value = null) - { - this.value = value; - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("ReferenceElement", "Ref", - SubmodelElementWrapper.AdequateElementEnum.ReferenceElement); - } - - } - - public class RelationshipElement : DataElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - - public Reference first = new Reference(); - public Reference second = new Reference(); - - // constructors - - public RelationshipElement() { } - - public RelationshipElement(SubmodelElement src) - : base(src) - { - if (!(src is RelationshipElement rel)) - return; - - if (rel.first != null) - this.first = new Reference(rel.first); - if (rel.second != null) - this.second = new Reference(rel.second); - } - -#if !DoNotUseAasxCompatibilityModels - public RelationshipElement(AasxCompatibilityModels.AdminShellV10.RelationshipElement src) - : base(src) - { - if (src == null) - return; - - if (src.first != null) - this.first = new Reference(src.first); - if (src.second != null) - this.second = new Reference(src.second); - } -#endif - - public static RelationshipElement CreateNew( - string idShort = null, string category = null, Key semanticIdKey = null, Reference first = null, - Reference second = null) - { - var x = new RelationshipElement(); - x.CreateNewLogic(idShort, category, semanticIdKey); - x.first = first; - x.second = second; - return (x); - } - - public void Set(Reference first = null, Reference second = null) - { - this.first = first; - this.second = second; - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("RelationshipElement", "Rel", - SubmodelElementWrapper.AdequateElementEnum.RelationshipElement); - } - } - - public class AnnotatedRelationshipElement : RelationshipElement, IManageSubmodelElements, IEnumerateChildren - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - - // from this very class - - [JsonIgnore] - [SkipForHash] // do NOT count children! - [XmlArray("annotations")] - [XmlArrayItem("dataElement")] - public DataElementWrapperCollection annotations = null; - - [XmlIgnore] - [JsonProperty(PropertyName = "annotations")] - public DataElement[] JsonAnotations - { - get - { - var res = new List(); - if (annotations != null) - foreach (var smew in annotations) - if (smew.submodelElement is DataElement de) - res.Add(de); - return res.ToArray(); - } - set - { - if (value != null) - { - this.annotations = new DataElementWrapperCollection(); - foreach (var x in value) - { - var smew = new SubmodelElementWrapper() { submodelElement = x }; - this.annotations.Add(smew); - } - } - } - } - - // constructors - - public AnnotatedRelationshipElement() { } - - public AnnotatedRelationshipElement(SubmodelElement src) - : base(src) - { - if (!(src is AnnotatedRelationshipElement arel)) - return; - if (arel.first != null) - this.first = new Reference(arel.first); - if (arel.second != null) - this.second = new Reference(arel.second); - if (arel.annotations != null) - this.annotations = new DataElementWrapperCollection(arel.annotations); - } - - public new static AnnotatedRelationshipElement CreateNew( - string idShort = null, string category = null, Key semanticIdKey = null, - Reference first = null, Reference second = null) - { - var x = new AnnotatedRelationshipElement(); - x.CreateNewLogic(idShort, category, semanticIdKey); - x.first = first; - x.second = second; - return (x); - } - - // enumerates its children - - public IEnumerable EnumerateChildren() - { - if (this.annotations != null) - foreach (var smw in this.annotations) - yield return smw; - } - - public EnumerationPlacmentBase GetChildrenPlacement(SubmodelElement child) - { - return null; - } - - public object AddChild(SubmodelElementWrapper smw, EnumerationPlacmentBase placement = null) - { - if (smw == null || !(smw.submodelElement is DataElement)) - return null; - if (this.annotations == null) - this.annotations = new DataElementWrapperCollection(); - if (smw.submodelElement != null) - smw.submodelElement.parent = this; - this.annotations.Add(smw); - return smw; - } - - // from IManageSubmodelElements - public void Add(SubmodelElement sme) - { - if (annotations == null) - annotations = new DataElementWrapperCollection(); - var sew = new SubmodelElementWrapper(); - sme.parent = this; // track parent here! - sew.submodelElement = sme; - annotations.Add(sew); - } - - public void Insert(int index, SubmodelElement sme) - { - if (annotations == null) - annotations = new DataElementWrapperCollection(); - var sew = new SubmodelElementWrapper(); - sme.parent = this; // track parent here! - if (index < 0 || index >= annotations.Count) - return; - annotations.Insert(index, sew); - } - - public void Remove(SubmodelElement sme) - { - if (annotations != null) - annotations.Remove(sme); - } - - // further - - public new void Set(Reference first = null, Reference second = null) - { - this.first = first; - this.second = second; - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("AnnotatedRelationshipElement", "RelA", - SubmodelElementWrapper.AdequateElementEnum.AnnotatedRelationshipElement); - } - - - } - - public class Capability : SubmodelElement - { - public Capability() { } - - public Capability(SubmodelElement src) - : base(src) - { } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("Capability", "Cap", - SubmodelElementWrapper.AdequateElementEnum.Capability); - } - } - - - public class SubmodelElementCollection : SubmodelElement, IManageSubmodelElements, IEnumerateChildren - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // values == SMEs - [XmlIgnore] - [JsonIgnore] - [SkipForHash] // do NOT count children! - private SubmodelElementWrapperCollection _value = null; - - [JsonIgnore] - public SubmodelElementWrapperCollection value - { - get { return _value; } - set { _value = value; _value.Parent = this; } - } - - [XmlIgnore] - [JsonProperty(PropertyName = "value")] - public SubmodelElement[] JsonValue - { - get - { - var res = new ListOfSubmodelElement(); - if (value != null) - foreach (var smew in value) - res.Add(smew.submodelElement); - return res.ToArray(); - } - set - { - if (value != null) - { - this.value = new SubmodelElementWrapperCollection(); - foreach (var x in value) - { - var smew = new SubmodelElementWrapper() { submodelElement = x }; - this.value.Add(smew); - } - } - } - } - - // constant members - public bool ordered = false; - public bool allowDuplicates = false; - - // enumartes its children - - public IEnumerable EnumerateChildren() - { - if (this.value != null) - foreach (var smw in this.value) - yield return smw; - } - - public EnumerationPlacmentBase GetChildrenPlacement(SubmodelElement child) - { - return null; - } - - public object AddChild(SubmodelElementWrapper smw, EnumerationPlacmentBase placement = null) - { - if (smw == null) - return null; - if (this.value == null) - this.value = new SubmodelElementWrapperCollection(); - if (smw.submodelElement != null) - smw.submodelElement.parent = this; - this.value.Add(smw); - return smw; - } - - // constructors - - public SubmodelElementCollection() { } - - public SubmodelElementCollection(SubmodelElement src, bool shallowCopy = false) - : base(src) - { - if (!(src is SubmodelElementCollection smc)) - return; - - this.ordered = smc.ordered; - this.allowDuplicates = smc.allowDuplicates; - this.value = new SubmodelElementWrapperCollection(); - if (!shallowCopy) - foreach (var smw in smc.value) - value.Add(new SubmodelElementWrapper(smw.submodelElement)); - } - -#if !DoNotUseAasxCompatibilityModels - public SubmodelElementCollection( - AasxCompatibilityModels.AdminShellV10.SubmodelElementCollection src, bool shallowCopy = false) - : base(src) - { - if (src == null) - return; - - this.ordered = src.ordered; - this.allowDuplicates = src.allowDuplicates; - this.value = new SubmodelElementWrapperCollection(); - if (!shallowCopy) - foreach (var smw in src.value) - value.Add(new SubmodelElementWrapper(smw.submodelElement)); - } -#endif - - public static SubmodelElementCollection CreateNew( - string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new SubmodelElementCollection(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - // from IManageSubmodelElements - public void Add(SubmodelElement sme) - { - if (value == null) - value = new SubmodelElementWrapperCollection(); - var sew = new SubmodelElementWrapper(); - sme.parent = this; // track parent here! - sew.submodelElement = sme; - value.Add(sew); - } - - public void Insert(int index, SubmodelElement sme) - { - if (value == null) - value = new SubmodelElementWrapperCollection(); - var sew = new SubmodelElementWrapper(); - sme.parent = this; // track parent here! - sew.submodelElement = sme; - if (index < 0 || index >= value.Count) - return; - value.Insert(index, sew); - } - - public void Remove(SubmodelElement sme) - { - if (value != null) - value.Remove(sme); - } - - // further - - public void Set(bool allowDuplicates = false, bool ordered = false) - { - this.allowDuplicates = allowDuplicates; - this.ordered = ordered; - } - - public SubmodelElementWrapper FindFirstIdShort(string idShort) - { - return this.value?.FindFirstIdShort(idShort); - } - - public T CreateSMEForCD(ConceptDescription cd, string category = null, string idShort = null, - string idxTemplate = null, int maxNum = 999, bool addSme = false) where T : SubmodelElement, new() - { - if (this.value == null) - this.value = new SubmodelElementWrapperCollection(); - return this.value.CreateSMEForCD(cd, category, idShort, idxTemplate, maxNum, addSme); - } - - public T CreateSMEForIdShort(string idShort, string category = null, - string idxTemplate = null, int maxNum = 999, bool addSme = false) where T : SubmodelElement, new() - { - if (this.value == null) - this.value = new SubmodelElementWrapperCollection(); - return this.value.CreateSMEForIdShort(idShort, category, idxTemplate, maxNum, addSme); - } - - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("SubmodelElementCollection", "SMC", - SubmodelElementWrapper.AdequateElementEnum.SubmodelElementCollection); - } - - // Recursing - - /// - /// Recurses on all Submodel elements of a Submodel or SME, which allows children. - /// The state object will be passed to the lambda function in order to provide - /// stateful approaches. - /// - /// State object to be provided to lambda. Could be null. - /// The lambda function as (state, parents, SME) - /// The lambda shall return TRUE in order to deep into recursion. - /// - public void RecurseOnSubmodelElements( - object state, Func lambda) - { - this.value?.RecurseOnReferables(state, null, (o, par, rf) => - { - if (rf is SubmodelElement sme) - return lambda(o, par, sme); - else - return true; - }); - } - - /// - /// Recurses on all Submodel elements of a Submodel or SME, which allows children. - /// The state object will be passed to the lambda function in order to provide - /// stateful approaches. Include this element, as well. - /// - /// State object to be provided to lambda. Could be null. - /// The lambda function as (state, parents, SME) - /// The lambda shall return TRUE in order to deep into recursion. - /// Include this element as well. parents will then - /// include this element as well! - public override void RecurseOnReferables( - object state, Func lambda, - bool includeThis = false) - { - var parents = new ListOfReferable(); - if (includeThis) - { - lambda(state, null, this); - parents.Add(this); - } - this.value?.RecurseOnReferables(state, parents, lambda); - } - } - - public class OperationVariable : IAasElement - { - public enum Direction { In, Out, InOut }; - - // Note: for OperationVariable, the values of the SubmodelElement itself ARE NOT TO BE USED! - // only the SME attributes of "value" are counting - - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // members - public SubmodelElementWrapper value = null; - - // constructors - - public OperationVariable() - { - } - - public OperationVariable(OperationVariable src, bool shallowCopy = false) - { - this.value = new SubmodelElementWrapper(src?.value?.submodelElement, shallowCopy); - } - -#if !DoNotUseAasxCompatibilityModels - public OperationVariable( - AasxCompatibilityModels.AdminShellV10.OperationVariable src, bool shallowCopy = false) - { - this.value = new SubmodelElementWrapper(src.value.submodelElement, shallowCopy); - } -#endif - - public OperationVariable(SubmodelElement elem) - : base() - { - this.value = new SubmodelElementWrapper(elem); - } - - public AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("OperationVariable", "OprVar"); - } - - public string GetElementName() - { - return this.GetSelfDescription()?.ElementName; - } - } - - public class Operation : SubmodelElement, IEnumerateChildren - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - [JsonIgnore] - [XmlElement(ElementName = "inputVariable")] - [SkipForHash] // do NOT count children! - public List inputVariable = new List(); - - [JsonIgnore] - [XmlElement(ElementName = "outputVariable")] - [SkipForHash] // do NOT count children! - public List outputVariable = new List(); - - [JsonIgnore] - [XmlElement(ElementName = "inoutputVariable")] - [SkipForHash] // do NOT count children! - public List inoutputVariable = new List(); - - [XmlIgnore] - // MICHA 190504: enabled JSON operation variables! - [JsonProperty(PropertyName = "inputVariable")] - public OperationVariable[] JsonInputVariable - { - get { return inputVariable?.ToArray(); } - set { inputVariable = (value != null) ? new List(value) : null; } - } - - [XmlIgnore] - [JsonProperty(PropertyName = "outputVariable")] - // MICHA 190504: enabled JSON operation variables! - public OperationVariable[] JsonOutputVariable - { - get { return outputVariable?.ToArray(); } - set { outputVariable = (value != null) ? new List(value) : null; } - } - - [XmlIgnore] - [JsonProperty(PropertyName = "inoutputVariable")] - // MICHA 190504: enabled JSON operation variables! - public OperationVariable[] JsonInOutputVariable - { - get { return inoutputVariable?.ToArray(); } - set { inoutputVariable = (value != null) ? new List(value) : null; } - } - - public List this[OperationVariable.Direction dir] - { - get - { - if (dir == OperationVariable.Direction.In) - return inputVariable; - else - if (dir == OperationVariable.Direction.Out) - return outputVariable; - else - return inoutputVariable; - } - set - { - if (dir == OperationVariable.Direction.In) - inputVariable = value; - else - if (dir == OperationVariable.Direction.Out) - outputVariable = value; - else - inoutputVariable = value; - } - } - - public List this[int dir] - { - get - { - if (dir == 0) - return inputVariable; - else - if (dir == 1) - return outputVariable; - else - return inoutputVariable; - } - set - { - if (dir == 0) - inputVariable = value; - else - if (dir == 1) - outputVariable = value; - else - inoutputVariable = value; - } - } - - public static SubmodelElementWrapperCollection GetWrappers(List ovl) - { - var res = new SubmodelElementWrapperCollection(); - foreach (var ov in ovl) - if (ov.value != null) - res.Add(ov.value); - return res; - } - - // enumartes its children - public IEnumerable EnumerateChildren() - { - if (this.inputVariable != null) - foreach (var smw in this.inputVariable) - yield return smw?.value; - - if (this.outputVariable != null) - foreach (var smw in this.outputVariable) - yield return smw?.value; - - if (this.inoutputVariable != null) - foreach (var smw in this.inoutputVariable) - yield return smw?.value; - } - - public class EnumerationPlacmentOperationVariable : EnumerationPlacmentBase - { - public OperationVariable.Direction Direction; - public OperationVariable OperationVariable; - } - - public EnumerationPlacmentBase GetChildrenPlacement(SubmodelElement child) - { - // trivial - if (child == null) - return null; - - // search - OperationVariable.Direction? dir = null; - OperationVariable opvar = null; - if (this.inputVariable != null) - foreach (var ov in this.inputVariable) - if (ov?.value?.submodelElement == child) - { - dir = OperationVariable.Direction.In; - opvar = ov; - } - - if (this.outputVariable != null) - foreach (var ov in this.outputVariable) - if (ov?.value?.submodelElement == child) - { - dir = OperationVariable.Direction.Out; - opvar = ov; - } - - if (this.inoutputVariable != null) - foreach (var ov in this.inoutputVariable) - if (ov?.value?.submodelElement == child) - { - dir = OperationVariable.Direction.InOut; - opvar = ov; - } - - // found - if (!dir.HasValue) - return null; - return new EnumerationPlacmentOperationVariable() - { - Direction = dir.Value, - OperationVariable = opvar - }; - } - - public object AddChild(SubmodelElementWrapper smw, EnumerationPlacmentBase placement = null) - { - // not enough information to select list of children? - var pl = placement as EnumerationPlacmentOperationVariable; - if (smw == null || pl == null) - return null; - - // ok, use information - var ov = new OperationVariable(); - ov.value = smw; - - if (smw.submodelElement != null) - smw.submodelElement.parent = this; - - if (pl.Direction == OperationVariable.Direction.In) - { - if (inputVariable == null) - inputVariable = new List(); - inputVariable.Add(ov); - } - - if (pl.Direction == OperationVariable.Direction.Out) - { - if (outputVariable == null) - outputVariable = new List(); - outputVariable.Add(ov); - } - - if (pl.Direction == OperationVariable.Direction.InOut) - { - if (inoutputVariable == null) - inoutputVariable = new List(); - inoutputVariable.Add(ov); - } - - return ov; - } - - // constructors - - public Operation() { } - - public Operation(SubmodelElement src) - : base(src) - { - if (!(src is Operation op)) - return; - - for (int i = 0; i < 2; i++) - if (op[i] != null) - { - if (this[i] == null) - this[i] = new List(); - foreach (var ov in op[i]) - this[i].Add(new OperationVariable(ov)); - } - } - -#if !DoNotUseAasxCompatibilityModels - public Operation(AasxCompatibilityModels.AdminShellV10.Operation src) - : base(src) - { - for (int i = 0; i < 2; i++) - if (src[i] != null) - { - if (this[i] == null) - this[i] = new List(); - foreach (var ov in src[i]) - this[i].Add(new OperationVariable(ov)); - } - } -#endif - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("Operation", "Opr", - SubmodelElementWrapper.AdequateElementEnum.Operation); - } - } - - public class Entity : SubmodelElement, IManageSubmodelElements, IEnumerateChildren - { - public enum EntityTypeEnum { CoManagedEntity = 0, SelfManagedEntity = 1, Undef = 3 } - public static string[] EntityTypeNames = new string[] { "CoManagedEntity", "SelfManagedEntity" }; - - // for JSON only - - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // from this very class - [XmlIgnore] - [JsonIgnore] - [SkipForHash] // do NOT count children! - private SubmodelElementWrapperCollection _statements = null; - - [JsonIgnore] - public SubmodelElementWrapperCollection statements - { - get { return _statements; } - set { _statements = value; _statements.Parent = this; } - } - - [XmlIgnore] - [JsonProperty(PropertyName = "statements")] - public SubmodelElement[] JsonStatements - { - get - { - var res = new ListOfSubmodelElement(); - if (statements != null) - foreach (var smew in statements) - res.Add(smew.submodelElement); - return res.ToArray(); - } - set - { - if (value != null) - { - this.statements = new SubmodelElementWrapperCollection(); - foreach (var x in value) - { - var smew = new SubmodelElementWrapper() { submodelElement = x }; - this.statements.Add(smew); - } - } - } - } - - // further members - - [CountForHash] - public string entityType = ""; - - [JsonProperty(PropertyName = "asset")] - public AssetRef assetRef = null; - - // enumerates its children - - public IEnumerable EnumerateChildren() - { - if (this.statements != null) - foreach (var smw in this.statements) - yield return smw; - } - - public EnumerationPlacmentBase GetChildrenPlacement(SubmodelElement child) - { - return null; - } - - public object AddChild(SubmodelElementWrapper smw, EnumerationPlacmentBase placement = null) - { - if (smw == null) - return null; - if (this.statements == null) - this.statements = new SubmodelElementWrapperCollection(); - if (smw.submodelElement != null) - smw.submodelElement.parent = this; - this.statements.Add(smw); - return smw; - } - - // constructors - - public Entity() { } - - public Entity(SubmodelElement src) - : base(src) - { - if (!(src is Entity ent)) - return; - - if (ent.statements != null) - { - this.statements = new SubmodelElementWrapperCollection(); - foreach (var smw in ent.statements) - this.statements.Add(new SubmodelElementWrapper(smw.submodelElement)); - } - this.entityType = ent.entityType; - if (ent.assetRef != null) - this.assetRef = new AssetRef(ent.assetRef); - } - - public Entity(EntityTypeEnum entityType, string idShort = null, AssetRef assetRef = null, - string category = null, Key semanticIdKey = null) - { - CreateNewLogic(idShort, null, semanticIdKey); - - this.entityType = EntityTypeNames[(int)entityType]; - this.assetRef = assetRef; - } - -#if !DoNotUseAasxCompatibilityModels - // not available in V1.0 -#endif - - public static Entity CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new Entity(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - // from IManageSubmodelElements - public void Add(SubmodelElement sme) - { - if (statements == null) - statements = new SubmodelElementWrapperCollection(); - var sew = new SubmodelElementWrapper(); - sme.parent = this; // track parent here! - sew.submodelElement = sme; - statements.Add(sew); - } - - public void Insert(int index, SubmodelElement sme) - { - if (statements == null) - statements = new SubmodelElementWrapperCollection(); - var sew = new SubmodelElementWrapper(); - sme.parent = this; // track parent here! - sew.submodelElement = sme; - if (index < 0 || index >= statements.Count) - return; - statements.Insert(index, sew); - } - - public void Remove(SubmodelElement sme) - { - if (statements != null) - statements.Remove(sme); - } - - // management of elememts - - public SubmodelElementWrapper FindSubmodelElementWrapper(string idShort) - { - if (this.statements == null) - return null; - foreach (var smw in this.statements) - if (smw.submodelElement != null) - if (smw.submodelElement.idShort.Trim().ToLower() == idShort.Trim().ToLower()) - return smw; - return null; - } - - public T CreateSMEForCD(ConceptDescription cd, string category = null, string idShort = null, - string idxTemplate = null, int maxNum = 999, bool addSme = false) where T : SubmodelElement, new() - { - if (this.statements == null) - this.statements = new SubmodelElementWrapperCollection(); - return this.statements.CreateSMEForCD(cd, category, idShort, idxTemplate, maxNum, addSme); - } - - public T CreateSMEForIdShort(string idShort, string category = null, - string idxTemplate = null, int maxNum = 999, bool addSme = false) where T : SubmodelElement, new() - { - if (this.statements == null) - this.statements = new SubmodelElementWrapperCollection(); - return this.statements.CreateSMEForIdShort(idShort, category, idxTemplate, maxNum, addSme); - } - - // entity type - - public EntityTypeEnum GetEntityType() - { - EntityTypeEnum res = EntityTypeEnum.Undef; - if (this.entityType != null && this.entityType.Trim().ToLower() == EntityTypeNames[0].ToLower()) - res = EntityTypeEnum.CoManagedEntity; - if (this.entityType != null && this.entityType.Trim().ToLower() == EntityTypeNames[1].ToLower()) - res = EntityTypeEnum.SelfManagedEntity; - return res; - } - - // name - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("Entity", "Ent", - SubmodelElementWrapper.AdequateElementEnum.Entity); - } - } - - public class BasicEvent : SubmodelElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // from this very class - public Reference observed = new Reference(); - - // constructors - - public BasicEvent() { } - - public BasicEvent(SubmodelElement src) - : base(src) - { - if (!(src is BasicEvent be)) - return; - - if (be.observed != null) - this.observed = new Reference(be.observed); - } - -#if !DoNotUseAasxCompatibilityModels - // not available in V1.0 -#endif - - public static BasicEvent CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new BasicEvent(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("BasicEvent", "Evt", - SubmodelElementWrapper.AdequateElementEnum.BasicEvent); - } - } - - // - // Handling of packages - // - } - - #endregion -} - diff --git a/src/AasxCsharpLib_bkp/AasxCompatibilityModels/V20/AdminShellConverters.cs b/src/AasxCsharpLib_bkp/AasxCompatibilityModels/V20/AdminShellConverters.cs deleted file mode 100644 index 63dd76d92..000000000 --- a/src/AasxCsharpLib_bkp/AasxCompatibilityModels/V20/AdminShellConverters.cs +++ /dev/null @@ -1,174 +0,0 @@ -/* -Copyright (c) 2018-2021 Festo AG & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Threading.Tasks; -using AasxCompatibilityModels; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using Newtonsoft.Json.Serialization; - -//namespace AdminShellNS -namespace AdminShell_V20 -{ - public static class AdminShellConverters - { - /// - /// This converter is used for reading JSON files; it claims to be responsible for - /// "Referable" (the base class) - /// and decides, which sub-class of the base class shall be populated. - /// If the object is SubmodelElement, the decision, shich special sub-class to create is done in a factory - /// AdminShell.SubmodelElementWrapper.CreateAdequateType(), - /// in order to have all sub-class specific decisions in one place (SubmodelElementWrapper) - /// Remark: There is a NuGet package JsonSubTypes, which could have done the job, except the fact of having - /// "modelType" being a class property with a contained property "name". - /// - public class JsonAasxConverter : JsonConverter - { - private string UpperClassProperty = "modelType"; - private string LowerClassProperty = "name"; - - public JsonAasxConverter() : base() - { - } - - public JsonAasxConverter(string UpperClassProperty, string LowerClassProperty) : base() - { - this.UpperClassProperty = UpperClassProperty; - this.LowerClassProperty = LowerClassProperty; - } - - public override bool CanConvert(Type objectType) - { - // Info MIHO 21 APR 2020: changed this from SubmodelElement to Referable - if (typeof(AdminShell.Referable).IsAssignableFrom(objectType)) - return true; - return false; - } - - public override bool CanWrite - { - get { return false; } - } - - public override object ReadJson(JsonReader reader, - Type objectType, - object existingValue, - JsonSerializer serializer) - { - // Load JObject from stream - JObject jObject = JObject.Load(reader); - - // Create target object based on JObject - object target = new AdminShell.Referable(); - - if (jObject.ContainsKey(UpperClassProperty)) - { - var j2 = jObject[UpperClassProperty]; - if (j2 != null) - foreach (var c in j2.Children()) - { - var cprop = c as Newtonsoft.Json.Linq.JProperty; - if (cprop == null) - continue; - if (cprop.Name == LowerClassProperty && cprop.Value.Type.ToString() == "String") - { - var cpval = cprop.Value.ToObject(); - if (cpval == null) - continue; - // Info MIHO 21 APR 2020: use Referable.CreateAdequateType instead of SMW... - var o = AdminShell.Referable.CreateAdequateType(cpval); - if (o != null) - target = o; - } - } - } - - // Populate the object properties - serializer.Populate(jObject.CreateReader(), target); - - return target; - } - - /// - /// Introduced for JSON serialization, can create Referables based on a string name - /// - /// string name (standard PascalCased) - - - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) - { - throw new NotImplementedException(); - } - } - - /// - /// This converter / contract resolver for Json.NET adaptively filters different levels of depth - /// of nested AASX structures. - /// - public class AdaptiveFilterContractResolver : DefaultContractResolver - { - public bool AasHasViews = true; - public bool BlobHasValue = true; - public bool SubmodelHasElements = true; - public bool SmcHasValue = true; - public bool OpHasVariables = true; - - public AdaptiveFilterContractResolver() { } - - public AdaptiveFilterContractResolver(bool deep = true, bool complete = true) - { - if (!deep) - { - this.SubmodelHasElements = false; - this.SmcHasValue = false; - this.OpHasVariables = false; - } - if (!complete) - { - this.AasHasViews = false; - this.BlobHasValue = false; - } - - } - - protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) - { - JsonProperty property = base.CreateProperty(member, memberSerialization); - - if (!BlobHasValue && property.DeclaringType == typeof(AdminShell.Blob) && - property.PropertyName == "value") - property.ShouldSerialize = instance => { return false; }; - - if (!SubmodelHasElements && property.DeclaringType == typeof(AdminShell.Submodel) && - property.PropertyName == "submodelElements") - property.ShouldSerialize = instance => { return false; }; - - if (!SmcHasValue && property.DeclaringType == typeof(AdminShell.SubmodelElementCollection) && - property.PropertyName == "value") - property.ShouldSerialize = instance => { return false; }; - - if (!OpHasVariables && property.DeclaringType == typeof(AdminShell.Operation) && - (property.PropertyName == "in" || property.PropertyName == "out")) - property.ShouldSerialize = instance => { return false; }; - - if (!AasHasViews && property.DeclaringType == typeof(AdminShell.AdministrationShell) && - property.PropertyName == "views") - property.ShouldSerialize = instance => { return false; }; - - return property; - } - } - - } -} diff --git a/src/AasxCsharpLib_bkp/AasxCompatibilityModels/V20/AdminShellUtil.cs b/src/AasxCsharpLib_bkp/AasxCompatibilityModels/V20/AdminShellUtil.cs deleted file mode 100644 index 81b80b9c5..000000000 --- a/src/AasxCsharpLib_bkp/AasxCompatibilityModels/V20/AdminShellUtil.cs +++ /dev/null @@ -1,636 +0,0 @@ -/* -Copyright (c) 2018-2021 Festo AG & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using AasxCompatibilityModels; -using System; -using System.Collections; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading.Tasks; - -//namespace AdminShellNS -namespace AdminShell_V20 -{ - public static class AdminShellUtilV20 - { - public static string EvalToNonNullString(string fmt, object o, string elseString = "") - { - if (o == null) - return elseString; - return string.Format(fmt, o); - } - - public static string EvalToNonEmptyString(string fmt, string o, string elseString = "") - { - if (o == null || o == "") - return elseString; - return string.Format(fmt, o); - } - - /// Creates a filter-friendly name from the source. - /// - /// Assert.AreEqual("", AdminShellUtil.FilterFriendlyName("")); - /// Assert.AreEqual("someName", AdminShellUtil.FilterFriendlyName("someName")); - /// Assert.AreEqual("some__name", AdminShellUtil.FilterFriendlyName("some!;name")); - /// - public static string FilterFriendlyName(string src) - { - if (src == null) - return null; - return Regex.Replace(src, @"[^a-zA-Z0-9\-_]", "_"); - } - - /// - /// Assert.IsFalse(AdminShellUtil.HasWhitespace("")); - /// Assert.IsTrue(AdminShellUtil.HasWhitespace(" ")); - /// Assert.IsTrue(AdminShellUtil.HasWhitespace("aa bb")); - /// Assert.IsTrue(AdminShellUtil.HasWhitespace(" aabb")); - /// Assert.IsTrue(AdminShellUtil.HasWhitespace("aabb ")); - /// Assert.IsFalse(AdminShellUtil.HasWhitespace("aabb")); - /// - public static bool HasWhitespace(string src) - { - if (src == null) - throw new ArgumentNullException(nameof(src)); - foreach (var s in src) - if (char.IsWhiteSpace(s)) - return true; - return false; - } - - /// Assert.IsTrue(AdminShellUtil.ComplyIdShort("")); - public static bool ComplyIdShort(string src) - { - if (src == null) - throw new ArgumentNullException(nameof(src)); - var res = true; - foreach (var s in src) - if (!Char.IsLetterOrDigit(s) && s != '_') - res = false; - if (src.Length > 0 && !Char.IsLetter(src[0])) - res = false; - return res; - } - - public static string ByteSizeHumanReadable(long len) - { - // see: https://stackoverflow.com/questions/281640/ - // how-do-i-get-a-human-readable-file-size-in-bytes-abbreviation-using-net - string[] sizes = { "B", "KB", "MB", "GB", "TB" }; - int order = 0; - while (len >= 1024 && order < sizes.Length - 1) - { - order++; - len = len / 1024; - } - // Adjust the format string to your preferences. For example "{0:0.#}{1}" would - // show a single decimal place, and no space. - string res = String.Format("{0:0.##} {1}", len, sizes[order]); - return res; - } - - public static string ExtractPascalCasingLetters(string src) - { - // access - src = src?.Trim(); - if (src == null || src.Length < 1) - return null; - - // walk through - var res = ""; - var arm = true; - foreach (var c in src) - { - // take? - if (arm && Char.IsUpper(c)) - res += c; - // state for next iteration - arm = !Char.IsUpper(c); - } - - // result - return res; - } - - public static int CountHeadingSpaces(string line) - { - if (line == null) - return 0; - int j; - for (j = 0; j < line.Length; j++) - if (!Char.IsWhiteSpace(line[j])) - break; - return j; - } - - /// - /// Used to re-reformat a C# here string, which is multiline string introduced by @" ... "; - /// - public static string[] CleanHereStringToArray(string here) - { - if (here == null) - return null; - - // convert all weird breaks to pure new lines - here = here.Replace("\r\n", "\n"); - here = here.Replace("\n\r", "\n"); - - // convert all tabs to spaces - here = here.Replace("\t", " "); - - // split these - var lines = new List(here.Split('\n')); - if (lines.Count < 1) - return lines.ToArray(); - - // the first line could be special - string firstLine = null; - if (lines[0].Trim() != "") - { - firstLine = lines[0].Trim(); - lines.RemoveAt(0); - } - - // detect an constant amount of heading spaces - var headSpaces = int.MaxValue; - foreach (var line in lines) - if (line.Trim() != "") - headSpaces = Math.Min(headSpaces, CountHeadingSpaces(line)); - - // multi line trim possible? - if (headSpaces != int.MaxValue && headSpaces > 0) - for (int i = 0; i < lines.Count; i++) - if (lines[i].Length > headSpaces) - lines[i] = lines[i].Substring(headSpaces); - - // re-compose again - if (firstLine != null) - lines.Insert(0, firstLine); - - // return - return lines.ToArray(); - } - - /// - /// Used to re-reformat a C# here string, which is multiline string introduced by @" ... "; - /// - public static string CleanHereStringWithNewlines(string here, string nl = null) - { - if (nl == null) - nl = Environment.NewLine; - var lines = CleanHereStringToArray(here); - if (lines == null) - return null; - return String.Join(nl, lines); - } - - public static string ShortLocation(Exception ex) - { - if (ex == null || ex.StackTrace == null) - return ""; - string[] lines = ex.StackTrace.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None); - if (lines.Length < 1) - return ""; - // search for " in " - // as the most actual stacktrace might be a built-in function, this might not work and therefore - // go down in the stack - int currLine = 0; - while (true) - { - // nothing found at all - if (currLine >= lines.Length) - return ""; - // access current line - /* TODO (MIHO, 2020-11-12): replace with Regex for multi language. Ideally have Exception messages - always as English. */ - var p = lines[currLine].IndexOf(" in ", StringComparison.Ordinal); - if (p < 0) - p = lines[currLine].IndexOf(" bei ", StringComparison.Ordinal); - if (p < 0) - { - // advance to next oldest line - currLine++; - continue; - } - // search last "\" or "/", to get only filename portion and position - p = lines[currLine].LastIndexOfAny(new[] { '\\', '/' }); - if (p < 0) - { - // advance to next oldest line - currLine++; - continue; - } - // return this - return lines[currLine].Substring(p); - } - } - - public enum ConstantFoundEnum { No, AnyCase, ExactCase } - - public static ConstantFoundEnum CheckIfInConstantStringArray(string[] arr, string str) - { - if (arr == null || str == null) - return ConstantFoundEnum.No; - - bool anyCaseFound = false; - bool exactCaseFound = false; - foreach (var a in arr) - { - anyCaseFound = anyCaseFound || str.ToLower() == a.ToLower(); - exactCaseFound = exactCaseFound || str == a; - } - if (exactCaseFound) - return ConstantFoundEnum.ExactCase; - if (anyCaseFound) - return ConstantFoundEnum.AnyCase; - return ConstantFoundEnum.No; - } - - public static string CorrectCasingForConstantStringArray(string[] arr, string str) - { - if (arr == null || str == null) - return str; - - foreach (var a in arr) - if (str.ToLower() == a.ToLower()) - return a; - - return str; - } - - // - // - // - // - // - - public static void PrintSearchableProperties(object obj, int indent) - { - if (obj == null) return; - string indentString = new string(' ', indent); - Type objType = obj.GetType(); - PropertyInfo[] properties = objType.GetProperties(); - foreach (PropertyInfo property in properties) - { - object propValue = property.GetValue(obj, null); - var elems = propValue as IList; - if (elems != null) - { - foreach (var item in elems) - { - PrintSearchableProperties(item, indent + 3); - } - } - else - { - // This will not cut-off System.Collections because of the first check - if (property.PropertyType.Assembly == objType.Assembly) - { - Console.WriteLine("{0}{1}:", indentString, property.Name); - - PrintSearchableProperties(propValue, indent + 2); - } - else - { - Console.WriteLine("{0}{1}: {2}", indentString, property.Name, propValue); - } - } - } - } - - public class SearchOptions - { - public Assembly[] allowedAssemblies = null; - public int maxDepth = int.MaxValue; - public bool findFirst = false; - public int skipFirstResults = 0; - public string findText = null; - public bool isIgnoreCase = false; - public bool isRegex = false; - } - - public class SearchResultItem : IEquatable - { - public SearchOptions searchOptions; - public string qualifiedNameHead; - public string metaModelName; - public object businessObject; - public string foundText; - public object foundObject; - public object containingObject; - public int foundHash; - - public bool Equals(SearchResultItem other) - { - if (other == null) - return false; - - return this.qualifiedNameHead == other.qualifiedNameHead && - this.metaModelName == other.metaModelName && - this.businessObject == other.businessObject && - this.containingObject == other.containingObject && - this.foundText == other.foundText && - this.foundHash == other.foundHash; - } - } - - public class SearchResults - { - public int foundIndex = 0; - public List foundResults = new List(); - - public void Clear() - { - foundIndex = -1; - foundResults.Clear(); - } - } - - public static void CheckSearchable( - SearchResults results, SearchOptions options, string qualifiedNameHead, object businessObject, - MemberInfo mi, object memberValue, object containingObject, Func getMemberHash) - { - // try get a speaking name - var metaModelName = ""; - var x1 = mi.GetCustomAttribute(); - if (x1 != null && x1.name != null) - metaModelName = x1.name; - - // check if this object is searchable - var x2 = mi.GetCustomAttribute(); - if (x2 != null) - { - // what to check? - string foundText = "" + memberValue?.ToString(); - - // find options - var found = true; - if (options.findText != null) - found = foundText.IndexOf( - options.findText, options.isIgnoreCase ? StringComparison.CurrentCultureIgnoreCase : 0) >= 0; - - // add? - if (found) - { - var sri = new SearchResultItem(); - sri.searchOptions = options; - sri.qualifiedNameHead = qualifiedNameHead; - sri.metaModelName = metaModelName; - sri.businessObject = businessObject; - sri.foundText = foundText; - sri.foundObject = memberValue; - sri.containingObject = containingObject; - if (getMemberHash != null) - sri.foundHash = getMemberHash(); - - // avoid duplicates - if (!results.foundResults.Contains(sri)) - results.foundResults.Add(sri); - } - } - } - - public static void EnumerateSearchable( - SearchResults results, object obj, string qualifiedNameHead, int depth, SearchOptions options, - object businessObject = null) - { - // access - if (results == null || obj == null || options == null) - return; - Type objType = obj.GetType(); - - // depth - if (depth > options.maxDepth) - return; - - // try to get element name of an AAS entity - string elName = null; - if (obj is AdminShell.Referable) - { - elName = (obj as AdminShell.Referable).GetElementName(); - businessObject = obj; - } - - // enrich qualified name, accordingly - var qualifiedName = qualifiedNameHead; - if (elName != null) - qualifiedName = qualifiedName + (qualifiedName.Length > 0 ? "." : "") + elName; - - // do NOT dive into objects, which are not in the reight assembly - if (options.allowedAssemblies == null || !options.allowedAssemblies.Contains(objType.Assembly)) - return; - - // do not dive into enums - if (objType.IsEnum) - return; - - // look at fields, first - var fields = objType.GetFields(); - foreach (var fi in fields) - { - // is the object marked to be skipped? - var x3 = fi.GetCustomAttribute(); - if (x3 != null) - continue; - - var x4 = fi.GetCustomAttribute(); - if (x4 != null) - continue; - - // get value(s) - var fieldValue = fi.GetValue(obj); - if (fieldValue == null) - continue; - var valueElems = fieldValue as IList; - if (valueElems != null) - { - // field is a collection .. dive deeper, if allowed - foreach (var el in valueElems) - EnumerateSearchable(results, el, qualifiedName, depth + 1, options, businessObject); - } - else - { - // field is a single entity .. check it - CheckSearchable( - results, options, qualifiedName, businessObject, fi, fieldValue, obj, - () => { return fieldValue.GetHashCode(); }); - - // dive deeper .. - EnumerateSearchable(results, fieldValue, qualifiedName, depth + 1, options, businessObject); - } - } - - // properties & objects behind - var properties = objType.GetProperties(); - foreach (var pi in properties) - { - var gip = pi.GetIndexParameters(); - if (gip.Length > 0) - // no indexed properties, yet - continue; - - // is the object marked to be skipped? - var x3 = pi.GetCustomAttribute(); - if (x3 != null) - continue; - - var x4 = pi.GetCustomAttribute(); - if (x4 != null) - continue; - - // get value(s) - var propValue = pi.GetValue(obj, null); - if (propValue == null) - continue; - var valueElems = propValue as IList; - if (valueElems != null) - { - // property is a collection .. dive deeper, if allowed - foreach (var el in valueElems) - EnumerateSearchable(results, el, qualifiedName, depth + 1, options, businessObject); - } - else - { - // field is a single entity .. check it - CheckSearchable( - results, options, qualifiedName, businessObject, pi, propValue, obj, - () => { return propValue.GetHashCode(); }); - - // dive deeper .. - EnumerateSearchable(results, propValue, qualifiedName, depth + 1, options, businessObject); - } - } - } - - // - // String manipulations - // - - public static string ReplacePercentPlaceholder( - string input, - string searchFor, - Func substLamda, - StringComparison comparisonType = StringComparison.InvariantCulture) - { - // access - if (input == null || searchFor == null || searchFor == "") - return input; - - // find - while (true) - { - // any occurence - var p = input.IndexOf(searchFor, comparisonType); - if (p < 0) - break; - - // split - var left = input.Substring(0, p); - var right = ""; - var rp = p + searchFor.Length; - if (rp < input.Length) - right = input.Substring(rp); - - // lambda - var repl = "" + substLamda?.Invoke(); - - // build new - input = left + repl + right; - } - - // ok - return input; - } - - // - // Base 64 - // - - public static string Base64Encode(string plainText) - { - var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText); - return System.Convert.ToBase64String(plainTextBytes); - } - - public static string Base64Decode(string base64EncodedData) - { - var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData); - return System.Text.Encoding.UTF8.GetString(base64EncodedBytes); - } - - // - // Generation of Ids - // - - private static Random MyRnd = new Random(); - - public static string GenerateIdAccordingTemplate(string tpl) - { - // generate a deterministic decimal digit string - var decimals = String.Format("{0:ffffyyMMddHHmmss}", DateTime.UtcNow); - decimals = new string(decimals.Reverse().ToArray()); - // convert this to an int - if (!Int64.TryParse(decimals, out Int64 decii)) - decii = MyRnd.Next(Int32.MaxValue); - // make an hex out of this - string hexamals = decii.ToString("X"); - // make an alphanumeric string out of this - string alphamals = ""; - var dii = decii; - while (dii >= 1) - { - var m = dii % 26; - alphamals += Convert.ToChar(65 + m); - dii = dii / 26; - } - - // now, "salt" the strings - for (int i = 0; i < 32; i++) - { - var c = Convert.ToChar(48 + MyRnd.Next(10)); - decimals += c; - hexamals += c; - alphamals += c; - } - - // now, can just use the template - var id = ""; - foreach (var tpli in tpl) - { - if (tpli == 'D' && decimals.Length > 0) - { - id += decimals[0]; - decimals = decimals.Remove(0, 1); - } - else - if (tpli == 'X' && hexamals.Length > 0) - { - id += hexamals[0]; - hexamals = hexamals.Remove(0, 1); - } - else - if (tpli == 'A' && alphamals.Length > 0) - { - id += alphamals[0]; - alphamals = alphamals.Remove(0, 1); - } - else - id += tpli; - } - - // ok - return id; - } - - } -} diff --git a/src/AasxCsharpLib_bkp/AasxCompatibilityModels/V20/AdminShellValidate.cs b/src/AasxCsharpLib_bkp/AasxCompatibilityModels/V20/AdminShellValidate.cs deleted file mode 100644 index 524683e57..000000000 --- a/src/AasxCsharpLib_bkp/AasxCompatibilityModels/V20/AdminShellValidate.cs +++ /dev/null @@ -1,326 +0,0 @@ -/* -Copyright (c) 2018-2021 Festo AG & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.ComponentModel.Design; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading.Tasks; -using System.Xml; -using System.Xml.Schema; -using JetBrains.Annotations; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using Newtonsoft.Json.Schema; - -//namespace AdminShellNS -namespace AdminShell_V20 -{ - /// - /// validates the XML content against the AASX XML schema. - /// - /// Please produce instances with . - /// - public class XmlValidator - { - private System.Xml.Schema.XmlSchemaSet xmlSchemaSet; - - internal XmlValidator(XmlSchemaSet xmlSchemaSet) - { - this.xmlSchemaSet = xmlSchemaSet; - } - - /// - /// validates the given XML content and stores the results in the . - /// - /// Validation records - /// Content to be validated - public void Validate(AasValidationRecordList recs, Stream xmlContent) - { - if (recs == null) - throw new ArgumentException($"Unexpected null {nameof(recs)}"); - - if (xmlContent == null) - throw new ArgumentException($"Unexpected null {nameof(xmlContent)}"); - - // load/ validate on same records - var settings = new System.Xml.XmlReaderSettings(); - settings.ValidationType = System.Xml.ValidationType.Schema; - settings.Schemas = xmlSchemaSet; - - settings.ValidationEventHandler += - (object sender, System.Xml.Schema.ValidationEventArgs e) => - { - recs.Add( - new AasValidationRecord( - AasValidationSeverity.Serialization, null, - $"XML: {e?.Exception?.LineNumber}, {e?.Exception?.LinePosition}: {e?.Message}")); - }; - - // use the xml stream - using (var reader = System.Xml.XmlReader.Create(xmlContent, settings)) - { - while (reader.Read()) - { - // Invoke callbacks - }; - } - } - } - - public enum AasValidationSeverity - { - Hint, Warning, SpecViolation, SchemaViolation, Serialization - } - - [UsedImplicitlyAttribute] // for eventual use - public enum AasValidationAction - { - No, ToBeDeleted - } - - public class AasValidationRecord - { - public AasValidationSeverity Severity = AasValidationSeverity.Hint; - public AasxCompatibilityModels.AdminShellV20.Referable Source = null; - public string Message = ""; - - public Action Fix = null; - - public AasValidationRecord(AasValidationSeverity Severity, AasxCompatibilityModels.AdminShellV20.Referable Source, - string Message, Action Fix = null) - { - this.Severity = Severity; - this.Source = Source; - this.Message = Message; - this.Fix = Fix; - } - - public override string ToString() - { - return $"[{Severity.ToString()}] in {"" + Source?.ToString()}: {"" + Message}"; - } - - public string DisplaySeverity { get { return "" + Severity.ToString(); } } - public string DisplaySource - { - get - { - return "" + ((Source != null) ? Source.ToString() : "(whole content)"); - } - } - public string DisplayMessage { get { return "" + Message?.ToString(); } } - } - - public class AasValidationRecordList : List - { - } - - public static class AasSchemaValidation - { - public enum SerializationFormat { XML, JSON } - - public static string[] GetSchemaResources(SerializationFormat fmt) - { - if (fmt == SerializationFormat.XML) - { - return new[] - { - "AdminShellNS.Resources.schemaV201.AAS.xsd", - "AdminShellNS.Resources.schemaV201.AAS_ABAC.xsd", - "AdminShellNS.Resources.schemaV201.IEC61360.xsd" - }; - } - if (fmt == SerializationFormat.JSON) - { - return new[] - { - "AdminShellNS.Resources.schemaV201.aas.json" - }; - } - return null; - } - - /// - /// produces a validator which validates XML AASX files. - /// - /// initialized validator - public static XmlValidator NewXmlValidator() - { - // Load the schema files - var files = GetSchemaResources(SerializationFormat.XML); - if (files == null) - throw new InvalidOperationException("No XML schema files could be found in the resources."); - - var xmlSchemaSet = new System.Xml.Schema.XmlSchemaSet(); - xmlSchemaSet.XmlResolver = new System.Xml.XmlUrlResolver(); - - try - { - Assembly myAssembly = Assembly.GetExecutingAssembly(); - foreach (var schemaFn in files) - { - using (Stream schemaStream = myAssembly.GetManifestResourceStream(schemaFn)) - { - using (XmlReader schemaReader = XmlReader.Create(schemaStream)) - { - xmlSchemaSet.Add(null, schemaReader); - } - } - } - } - catch (Exception ex) - { - throw new FileNotFoundException( - $"Error accessing embedded resource schema files: {ex.Message}"); - } - - var newRecs = new AasValidationRecordList(); - - // set up messages - xmlSchemaSet.ValidationEventHandler += (object sender, System.Xml.Schema.ValidationEventArgs e) => - { - newRecs.Add( - new AasValidationRecord( - AasValidationSeverity.Serialization, null, - $"{e?.Exception?.LineNumber}, {e?.Exception?.LinePosition}: {e?.Message}")); - }; - - // compile - try - { - xmlSchemaSet.Compile(); - } - catch (Exception ex) - { - throw new InvalidOperationException( - $"Error compiling schema files: {ex.Message}"); - } - - if (newRecs.Count > 0) - { - var parts = new List { $"Failed to compile the schema files:" }; - parts.AddRange(newRecs.Select((r) => r.Message)); - throw new InvalidOperationException(string.Join(Environment.NewLine, parts)); - } - - return new XmlValidator(xmlSchemaSet); - } - - /// - /// creates an XML validator and applies it on the given content. - /// - /// If you repeatedly need to validate XML against a schema, re-use an instance of - /// produced with . - /// - /// Validation records - /// Content to be validated - public static void ValidateXML(AasValidationRecordList recs, Stream xmlContent) - { - var validator = NewXmlValidator(); - validator.Validate(recs, xmlContent); - } - - public static int ValidateJSONAlternative(AasValidationRecordList recs, Stream jsonContent) - { - // see: https://github.com/RicoSuter/NJsonSchema/wiki/JsonSchemaValidator - var newRecs = new AasValidationRecordList(); - - // access - if (recs == null || jsonContent == null) - return -1; - - // Load the schema files - // right now: exactly ONE schema file - var files = GetSchemaResources(SerializationFormat.JSON); - if (files == null || files.Length != 1) - return -1; - - NJsonSchema.JsonSchema schema = null; - - try - { - Assembly myAssembly = Assembly.GetExecutingAssembly(); - foreach (var schemaFn in files) - { - using (Stream schemaStream = myAssembly.GetManifestResourceStream(schemaFn)) - { - using (var streamReader = new StreamReader(schemaStream)) - { - var allTxt = streamReader.ReadToEnd(); - schema = NJsonSchema.JsonSchema.FromJsonAsync(allTxt).GetAwaiter().GetResult(); - break; - } - } - } - } - catch (Exception ex) - { - throw new FileNotFoundException("ValidateJSON: Error loading schema: " + - ex.Message); - } - - if (schema == null) - { - throw new FileNotFoundException("ValidateJSON: Schema not found properly."); - } - - // create validator - var validator = new NJsonSchema.Validation.JsonSchemaValidator(); - - // load the JSON content - string jsonTxt = null; - try - { - using (var streamReader = new StreamReader(jsonContent)) - { - jsonTxt = streamReader.ReadToEnd(); - } - } - catch (Exception ex) - { - throw new InvalidOperationException("ValidateJSON: Error loading JSON content: " + - ex.Message); - } - - if (jsonTxt == null || jsonTxt == "") - throw new InvalidOperationException("ValidateJSON: Error loading JSON content gave null."); - - // validate - ICollection errors; - try - { - errors = validator.Validate(jsonTxt, schema); - } - catch (Exception ex) - { - throw new InvalidOperationException("ValidateJSON: Error when validating: " + - ex.Message); - } - - // re-format messages - if (errors != null) - foreach (var ve in errors) - { - var msg = ("" + ve.ToString()); - msg = Regex.Replace(msg, @"\s+", " "); - newRecs.Add(new AasValidationRecord(AasValidationSeverity.Serialization, null, - $"JSON: {ve.LineNumber,5},{ve.LinePosition:3}: {msg}")); - } - - // result - recs.AddRange(newRecs); - return newRecs.Count; - } - } -} diff --git a/src/AasxCsharpLib_bkp/AasxCsharpLibrary.csproj b/src/AasxCsharpLib_bkp/AasxCsharpLibrary.csproj deleted file mode 100644 index 2c3c19237..000000000 --- a/src/AasxCsharpLib_bkp/AasxCsharpLibrary.csproj +++ /dev/null @@ -1,42 +0,0 @@ - - - net6.0 - Library - AdminShellNS - false - - - TRACE;UseAasxCompatibilityModels - - - false - - - - PreserveNewest - - - - - Designer - PreserveNewest - - - Designer - PreserveNewest - - - Designer - PreserveNewest - - - - - - - - - - - - diff --git a/src/AasxCsharpLib_bkp/AdminShellCollections.cs b/src/AasxCsharpLib_bkp/AdminShellCollections.cs deleted file mode 100644 index 26fc3f837..000000000 --- a/src/AasxCsharpLib_bkp/AdminShellCollections.cs +++ /dev/null @@ -1,66 +0,0 @@ -/* -Copyright (c) 2018-2021 Festo AG & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace AdminShellNS -{ - public class MultiValueDictionary - { - private Dictionary> dict = new Dictionary>(); - public void Add(K key, V value) - { - if (dict.TryGetValue(key, out var list)) - list.Add(value); - else - dict.Add(key, new List { value }); - } - - public bool ContainsKey(K key) => dict.ContainsKey(key); - - public List this[K key] => dict[key]; - - public IEnumerable> Keys - { - get - { - return dict.Values; - } - } - } - - public class DoubleSidedDict - { - private Dictionary _forward = new Dictionary(); - private Dictionary _backward = new Dictionary(); - - public void AddPair(T1 item1, T2 item2) - { - _forward.Add(item1, item2); - _backward.Add(item2, item1); - } - - public bool Contains1(T1 key1) => _forward.ContainsKey(key1); - public bool Contains2(T2 key2) => _backward.ContainsKey(key2); - - public T2 Get2(T1 key1) => _forward[key1]; - public T1 Get1(T2 key2) => _backward[key2]; - - public T2 Get2OrDefault(T1 key1) - => (key1 != null && _forward.ContainsKey(key1)) ? _forward[key1] : default(T2); - public T1 Get1OrDefault(T2 key2) - => (key2 != null && _backward.ContainsKey(key2)) ? _backward[key2] : default(T1); - - public void Clear() { _forward.Clear(); _backward.Clear(); } - } -} diff --git a/src/AasxCsharpLib_bkp/AdminShellConverters.cs b/src/AasxCsharpLib_bkp/AdminShellConverters.cs deleted file mode 100644 index fd30b6ec7..000000000 --- a/src/AasxCsharpLib_bkp/AdminShellConverters.cs +++ /dev/null @@ -1,192 +0,0 @@ -/* -Copyright (c) 2018-2021 Festo AG & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Threading.Tasks; -using AasCore.Aas3_0_RC02; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using Newtonsoft.Json.Serialization; - -namespace AdminShellNS -{ - public static class AdminShellConverters - { - /// - /// This converter is used for reading JSON files; it claims to be responsible for - /// "Referable" (the base class) - /// and decides, which sub-class of the base class shall be populated. - /// If the object is SubmodelElement, the decision, shich special sub-class to create is done in a factory - /// SubmodelElementWrapper.CreateAdequateType(), - /// in order to have all sub-class specific decisions in one place (SubmodelElementWrapper) - /// Remark: There is a NuGet package JsonSubTypes, which could have done the job, except the fact of having - /// "modelType" being a class property with a contained property "name". - /// - public class JsonAasxConverter : JsonConverter - { - private string UpperClassProperty = "modelType"; - private string LowerClassProperty = "name"; - - public JsonAasxConverter() : base() - { - } - - public JsonAasxConverter(string UpperClassProperty, string LowerClassProperty) : base() - { - this.UpperClassProperty = UpperClassProperty; - this.LowerClassProperty = LowerClassProperty; - } - - public override bool CanConvert(Type objectType) - { - // Info MIHO 21 APR 2020: changed this from SubmodelElement to Referable - if (typeof(IReferable).IsAssignableFrom(objectType)) - return true; - return false; - } - - public override bool CanWrite - { - get { return false; } - } - - public override object ReadJson(JsonReader reader, - Type objectType, - object existingValue, - JsonSerializer serializer) - { - // Load JObject from stream - JObject jObject = JObject.Load(reader); - - // Create target object based on JObject - IReferable target = null; - - if (jObject.ContainsKey(UpperClassProperty)) - { - var j2 = jObject[UpperClassProperty]; - if (j2 != null) - foreach (var c in j2.Children()) - { - var cprop = c as Newtonsoft.Json.Linq.JProperty; - if (cprop == null) - continue; - if (cprop.Name == LowerClassProperty && cprop.Value.Type.ToString() == "String") - { - var cpval = cprop.Value.ToObject(); - if (cpval == null) - continue; - // Info MIHO 21 APR 2020: use Referable.CreateAdequateType instead of SMW... - var o = CreateAdequateType(cpval); - if (o != null) - target = o; - } - } - } - - // Populate the object properties - serializer.Populate(jObject.CreateReader(), target); - - return target; - } - - public static IReferable CreateAdequateType(string elementName) - { - if (elementName == KeyTypes.AssetAdministrationShell.ToString()) - return new AssetAdministrationShell("", null); //TODO: jtikekar: refactor default - //if (elementName == "Asset") //TODO: jtikekar Change - // return new AssetInformation(AssetKind.Instance); - if (elementName == KeyTypes.ConceptDescription.ToString()) - return new ConceptDescription(""); - if (elementName == KeyTypes.Submodel.ToString()) - return new Submodel(""); - //if (elementName == KeyTypes.View) - // return new View(); - return CreateSubmodelElementIstance(elementName); - } - - private static ISubmodelElement CreateSubmodelElementIstance(string typeName) - { - //TODO: jtikekar Need to test - Type type = Type.GetType(typeName); - if (type == null || !type.IsSubclassOf(typeof(ISubmodelElement))) - return null; - var sme = Activator.CreateInstance(type) as ISubmodelElement; - return sme; - } - - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) - { - throw new NotImplementedException(); - } - } - - /// - /// This converter / contract resolver for Json.NET adaptively filters different levels of depth - /// of nested AASX structures. - /// - public class AdaptiveFilterContractResolver : DefaultContractResolver - { - public bool AasHasViews = true; - public bool BlobHasValue = true; - public bool SubmodelHasElements = true; - public bool SmcHasValue = true; - public bool OpHasVariables = true; - - public AdaptiveFilterContractResolver() { } - - public AdaptiveFilterContractResolver(bool deep = true, bool complete = true) - { - if (!deep) - { - this.SubmodelHasElements = false; - this.SmcHasValue = false; - this.OpHasVariables = false; - } - if (!complete) - { - this.AasHasViews = false; - this.BlobHasValue = false; - } - - } - - protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) - { - JsonProperty property = base.CreateProperty(member, memberSerialization); - - if (!BlobHasValue && property.DeclaringType == typeof(Blob) && - property.PropertyName == "value") - property.ShouldSerialize = instance => { return false; }; - - if (!SubmodelHasElements && property.DeclaringType == typeof(Submodel) && - property.PropertyName == "submodelElements") - property.ShouldSerialize = instance => { return false; }; - - if (!SmcHasValue && property.DeclaringType == typeof(SubmodelElementCollection) && - property.PropertyName == "value") - property.ShouldSerialize = instance => { return false; }; - - if (!OpHasVariables && property.DeclaringType == typeof(Operation) && - (property.PropertyName == "in" || property.PropertyName == "out")) - property.ShouldSerialize = instance => { return false; }; - - if (!AasHasViews && property.DeclaringType == typeof(AssetAdministrationShell) && - property.PropertyName == "views") - property.ShouldSerialize = instance => { return false; }; - - return property; - } - } - - } -} diff --git a/src/AasxCsharpLib_bkp/AdminShellPackageEnv.cs b/src/AasxCsharpLib_bkp/AdminShellPackageEnv.cs deleted file mode 100644 index d0953358f..000000000 --- a/src/AasxCsharpLib_bkp/AdminShellPackageEnv.cs +++ /dev/null @@ -1,1454 +0,0 @@ -/* -Copyright (c) 2018-2021 Festo AG & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.IO; -using System.IO.Packaging; -using System.Linq; -using System.Text.RegularExpressions; -using System.Xml; -using System.Xml.Serialization; -using AasCore.Aas3_0_RC02; -using AdminShellNS; -using Extensions; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; - -namespace AdminShellNS -{ - /// - /// This class lets an outer functionality keep track on the supplementary files, which are in or - /// are pending to be added or deleted to an Package. - /// - public class AdminShellPackageSupplementaryFile /*: IReferable*/ - { - public delegate byte[] SourceGetByteChunk(); - - public enum LocationType { InPackage, AddPending, DeletePending } - - public enum SpecialHandlingType { None, EmbedAsThumbnail } - - public readonly Uri Uri = null; - - public readonly string UseMimeType = null; - - public readonly string SourceLocalPath = null; - public readonly SourceGetByteChunk SourceGetBytesDel = null; - - public LocationType Location; - public readonly SpecialHandlingType SpecialHandling; - - public AdminShellPackageSupplementaryFile( - Uri uri, string sourceLocalPath = null, LocationType location = LocationType.InPackage, - SpecialHandlingType specialHandling = SpecialHandlingType.None, - SourceGetByteChunk sourceGetBytesDel = null, string useMimeType = null) - { - Uri = uri; - UseMimeType = useMimeType; - SourceLocalPath = sourceLocalPath; - SourceGetBytesDel = sourceGetBytesDel; - Location = location; - SpecialHandling = specialHandling; - } - - // class derives from Referable in order to provide GetElementName - public string GetElementName() - { - return "File"; - } - - } - - public class ListOfAasSupplementaryFile : List - { - public AdminShellPackageSupplementaryFile FindByUri(string path) - { - if (path == null) - return null; - - return this.FirstOrDefault( - x => x?.Uri?.ToString().Trim() == path.Trim()); - } - } - - /// - /// Provides (static?) helpers for serializing AAS.. - /// - public static class AdminShellSerializationHelper - { - - public static string TryReadXmlFirstElementNamespaceURI(Stream s) - { - string res = null; - try - { - var xr = System.Xml.XmlReader.Create(s); - int i = 0; - while (xr.Read()) - { - // limit amount of read - i++; - if (i > 99) - // obviously not found - break; - - // find element - if (xr.NodeType == System.Xml.XmlNodeType.Element) - { - res = xr.NamespaceURI; - break; - } - } - xr.Close(); - } - catch (Exception ex) - { - LogInternally.That.SilentlyIgnoredError(ex); - } - - // return to zero pos - s.Seek(0, SeekOrigin.Begin); - - // give back - return res; - } - - /// - /// Skips first few tokens of an XML content until first "real" element is encountered - /// - /// - public static void XmlSkipHeader(XmlReader xmlReader) - { - while (xmlReader.NodeType == XmlNodeType.XmlDeclaration || - xmlReader.NodeType == XmlNodeType.Whitespace || - xmlReader.NodeType == XmlNodeType.Comment || - xmlReader.NodeType == XmlNodeType.None) - xmlReader.Read(); - } - - /// - /// De-serialize an open stream into Environment. Does version/ compatibility management. - /// - /// Open for read stream - /// - public static AasCore.Aas3_0_RC02.Environment DeserializeXmlFromStreamWithCompat(Stream s) - { - // not sure - AasCore.Aas3_0_RC02.Environment res = null; - - // try get first element - var nsuri = TryReadXmlFirstElementNamespaceURI(s); - - // read V1.0? - if (nsuri != null && nsuri.Trim() == "http://www.admin-shell.io/aas/1/0") - { -#if !DoNotUseAasxCompatibilityModels - XmlSerializer serializer = new XmlSerializer( - typeof(AasxCompatibilityModels.AdminShellV10.AdministrationShellEnv), - "http://www.admin-shell.io/aas/1/0"); - var v10 = serializer.Deserialize(s) as AasxCompatibilityModels.AdminShellV10.AdministrationShellEnv; - //res = new AdministrationShellEnv(v10); - res = new AasCore.Aas3_0_RC02.Environment(new List(), new List(), new List()); - res.ConvertFromV10(v10); - return res; -#else - throw (new Exception("Cannot handle AAS file format http://www.admin-shell.io/aas/1/0 !")); -#endif - } - - // read V2.0? - if (nsuri != null && nsuri.Trim() == "http://www.admin-shell.io/aas/2/0") - { -#if !DoNotUseAasxCompatibilityModels - XmlSerializer serializer = new XmlSerializer( - typeof(AasxCompatibilityModels.AdminShellV20.AdministrationShellEnv), - "http://www.admin-shell.io/aas/2/0"); - var v20 = serializer.Deserialize(s) as AasxCompatibilityModels.AdminShellV20.AdministrationShellEnv; - //res = new AdministrationShellEnv(v20); - res = new AasCore.Aas3_0_RC02.Environment(new List(), new List(), new List()); - res.ConvertFromV20(v20); - return res; -#else - throw (new Exception("Cannot handle AAS file format http://www.admin-shell.io/aas/1/0 !")); -#endif - } - - // read V3.0? - if (nsuri != null && nsuri.Trim() == Xmlization.NS) - { - //XmlSerializer serializer = new XmlSerializer( - // typeof(AasCore.Aas3_0_RC02.Environment), "http://www.admin-shell.io/aas/3/0"); - //res = serializer.Deserialize(s) as AasCore.Aas3_0_RC02.Environment; - - using (var xmlReader = XmlReader.Create(s)) - { - // TODO (MIHO, 2022-12-26): check if could be feature of AAS core - XmlSkipHeader(xmlReader); - res = Xmlization.Deserialize.EnvironmentFrom(xmlReader); - return res; - } - } - - // nope! - return null; - } - - //public static JsonSerializer BuildDefaultAasxJsonSerializer() - //{ - // var serializer = new JsonSerializer(); - // serializer.Converters.Add( - // new AdminShellConverters.JsonAasxConverter( - // "modelType", "name")); - // return serializer; - //} - - public static T DeserializeFromJSON(string data) where T : IReferable - { - //using (var tr = new StringReader(data)) - //{ - //var serializer = BuildDefaultAasxJsonSerializer(); - //var rf = (T)serializer.Deserialize(tr, typeof(T)); - - var node = System.Text.Json.Nodes.JsonNode.Parse(data); - var rf = Jsonization.Deserialize.IReferableFrom(node); - - return (T)rf; - //} - } - - //public static T DeserializeFromJSON(JToken obj) where T : IReferable - //{ - // if (obj == null) - // return default(T); - // var serializer = BuildDefaultAasxJsonSerializer(); - // var rf = obj.ToObject(serializer); - // return rf; - //} - - ///// - ///// Use this, if DeserializeFromJSON is too tight. - ///// - //public static T DeserializePureObjectFromJSON(string data) - //{ - // using (var tr = new StringReader(data)) - // { - // //var serializer = BuildDefaultAasxJsonSerializer(); - // //var rf = (T)serializer.Deserialize(tr, typeof(T)); - // return null; - // } - //} - } - - /// - /// This class encapsulates an AdminShellEnvironment and supplementary files into an AASX Package. - /// Specifically has the capability to load, update and store .XML, .JSON and .AASX packages. - /// - public class AdminShellPackageEnv : IDisposable - { - private string _fn = "New Package"; - - private string _tempFn = null; - - private AasCore.Aas3_0_RC02.Environment _aasEnv = new AasCore.Aas3_0_RC02.Environment(new List(), new List(), new List()); - private Package _openPackage = null; - private readonly ListOfAasSupplementaryFile _pendingFilesToAdd = new ListOfAasSupplementaryFile(); - private readonly ListOfAasSupplementaryFile _pendingFilesToDelete = new ListOfAasSupplementaryFile(); - - public AdminShellPackageEnv() { } - - public AdminShellPackageEnv(AasCore.Aas3_0_RC02.Environment env) - { - if (env != null) - _aasEnv = env; - } - - public AdminShellPackageEnv(string fn, bool indirectLoadSave = false) - { - Load(fn, indirectLoadSave); - } - - public bool IsOpen - { - get - { - return _openPackage != null; - } - } - - public string Filename - { - get - { - return _fn; - } - } - - public AasCore.Aas3_0_RC02.Environment AasEnv - { - get - { - return _aasEnv; - } - } - - private static AasCore.Aas3_0_RC02.Environment LoadXml(string fn) - { - try - { - using (var reader = new StreamReader(fn)) - { - var aasEnv = AdminShellSerializationHelper.DeserializeXmlFromStreamWithCompat( - reader.BaseStream); - - if (aasEnv == null) - throw new Exception("Type error for XML file"); - - return aasEnv; - } - } - catch (Exception ex) - { - throw new Exception( - $"While reading AAS {fn} at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); - } - } - - private static AasCore.Aas3_0_RC02.Environment LoadJson(string fn) - { - try - { - using (var file = System.IO.File.OpenRead(fn)) - { - //// TODO (Michael Hoffmeister, 2020-08-01): use a unified function to create a serializer - //var serializer = new JsonSerializer(); - //serializer.Converters.Add( - // new AdminShellConverters.JsonAasxConverter( - // "modelType", "name")); - - //var aasEnv = (AasCore.Aas3_0_RC02.Environment)serializer.Deserialize( - // file, typeof(AasCore.Aas3_0_RC02.Environment)); - - var node = System.Text.Json.Nodes.JsonNode.Parse(file); - var aasEnv = Jsonization.Deserialize.EnvironmentFrom(node); - - return aasEnv; - } - } - catch (Exception ex) - { - throw new Exception( - $"While reading AAS {fn} at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); - } - } - - /// is unequal if indirectLoadSave is used. - private static (AasCore.Aas3_0_RC02.Environment, Package) LoadPackageAasx(string fn, string fnToLoad) - { - AasCore.Aas3_0_RC02.Environment aasEnv; - Package openPackage = null; - - Package package; - try - { - package = Package.Open(fnToLoad, FileMode.Open); - } - catch (Exception ex) - { - throw new Exception( - fn == fnToLoad - ? $"While opening the package to read AASX {fn} " + - $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}" - : $"While opening the package to read AASX {fn} indirectly from {fnToLoad} " + - $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); - } - - try - { - // get the origin from the package - PackagePart originPart = null; - var xs = package.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aasx-origin"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/") - { - originPart = package.GetPart(x.TargetUri); - break; - } - - if (originPart == null) - throw (new Exception("Unable to find AASX origin. Aborting!")); - - // get the specs from the package - PackagePart specPart = null; - xs = originPart.GetRelationshipsByType("http://www.admin-shell.io/aasx/relationships/aas-spec"); - foreach (var x in xs) - { - specPart = package.GetPart(x.TargetUri); - break; - } - - if (specPart == null) - throw (new Exception("Unable to find AASX spec(s). Aborting!")); - - // open spec part to read - try - { - if (specPart.Uri.ToString().ToLower().Trim().EndsWith("json")) - { - using (var s = specPart.GetStream(FileMode.Open)) - { - //using (var file = new StreamReader(s)) - //{ - //JsonSerializer serializer = new JsonSerializer(); - //serializer.Converters.Add( - // new AdminShellConverters.JsonAasxConverter( - // "modelType", "name")); - - //aasEnv = (AasCore.Aas3_0_RC02.Environment)serializer.Deserialize( - // file, typeof(AasCore.Aas3_0_RC02.Environment)); - - var node = System.Text.Json.Nodes.JsonNode.Parse(s); - aasEnv = Jsonization.Deserialize.EnvironmentFrom(node); - //} - } - } - else - { - using (var s = specPart.GetStream(FileMode.Open)) - { - // own catch loop to be more specific - aasEnv = AdminShellSerializationHelper.DeserializeXmlFromStreamWithCompat(s); - openPackage = package; - - if (aasEnv == null) - throw new Exception("Type error for XML file!"); - } - } - } - catch (Exception ex) - { - throw new Exception( - fn == fnToLoad - ? $"While reading spec from the AASX {fn} " + - $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}" - : $"While reading spec from the {fn} (and indirectly over {fnToLoad}) " + - $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); - } - } - catch (Exception ex) - { - throw new Exception( - fn == fnToLoad - ? $"While reading the AASX {fn} " + - $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}" - : $"While reading the {fn} (and indirectly over {fnToLoad}) " + - $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); - } - finally - { - if (openPackage == null) - { - package.Close(); - } - } - - return (aasEnv, openPackage); - } - - public void Load(string fn, bool indirectLoadSave = false) - { - _fn = fn; - _openPackage?.Close(); - _openPackage = null; - - string extension = Path.GetExtension(fn).ToLower(); - switch (extension) - { - case ".xml": - { - _aasEnv = LoadXml(fn); - break; - } - case ".json": - { - _aasEnv = LoadJson(fn); - break; - } - case ".aasx": - { - var fnToLoad = fn; - _tempFn = null; - if (indirectLoadSave) - { - try - { - _tempFn = System.IO.Path.GetTempFileName().Replace(".tmp", ".aasx"); - System.IO.File.Copy(fn, _tempFn); - fnToLoad = _tempFn; - - } - catch (Exception ex) - { - throw new Exception( - $"While copying AASX {fn} for indirect load to {fnToLoad} " + - $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); - } - } - - // load package AASX - (_aasEnv, _openPackage) = LoadPackageAasx(fn, fnToLoad); - break; - } - default: - throw new Exception( - $"Does not know how to handle the extension {extension} of the file: {fn}"); - } - } - - public void LoadFromAasEnvString(string content) - { - try - { - //using (var file = new StringReader(content)) - //{ - // TODO (Michael Hoffmeister, 2020-08-01): use a unified function to create a serializer - //JsonSerializer serializer = new JsonSerializer(); - //serializer.Converters.Add(new AdminShellConverters.JsonAasxConverter("modelType", "name")); - //_aasEnv = (AasCore.Aas3_0_RC02.Environment)serializer.Deserialize( - // file, typeof(AasCore.Aas3_0_RC02.Environment)); - - var node = System.Text.Json.Nodes.JsonNode.Parse(content); - _aasEnv = Jsonization.Deserialize.EnvironmentFrom(node); - //} - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While reading AASENV string {0} gave: {1}", - AdminShellUtil.ShortLocation(ex), ex.Message))); - } - } - - public enum SerializationFormat { None, Xml, Json }; - - //public static XmlSerializerNamespaces GetXmlDefaultNamespaces() - //{ - // var nss = new XmlSerializerNamespaces(); - // nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace); - // nss.Add("aas", "http://www.admin-shell.io/aas/2/0"); - // nss.Add("IEC", "http://www.admin-shell.io/IEC61360/2/0"); - // nss.Add("abac", "http://www.admin-shell.io/aas/abac/2/0"); - // return nss; - //} - - public bool SaveAs(string fn, bool writeFreshly = false, SerializationFormat prefFmt = SerializationFormat.None, - MemoryStream useMemoryStream = null, bool saveOnlyCopy = false) - { - if (fn.ToLower().EndsWith(".xml")) - { - // save only XML - if (!saveOnlyCopy) - _fn = fn; - try - { - Stream s = (useMemoryStream != null) - ? (Stream)useMemoryStream - : System.IO.File.Open(fn, FileMode.Create, FileAccess.Write); - - try - { - // TODO (Michael Hoffmeister, 2020-08-01): use a unified function to create a serializer - //var serializer = new XmlSerializer(typeof(AasCore.Aas3_0_RC02.Environment)); - //var nss = GetXmlDefaultNamespaces(); - //serializer.Serialize(s, _aasEnv, nss); - - var writer = XmlWriter.Create(s, new XmlWriterSettings() { Indent = true }); - Xmlization.Serialize.To( - _aasEnv, writer); - writer.Flush(); - writer.Close(); - s.Flush(); - } - finally - { - // close? - if (useMemoryStream == null) - s.Close(); - } - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While writing AAS {0} at {1} gave: {2}", - fn, AdminShellUtil.ShortLocation(ex), ex.Message))); - } - return true; - } - - if (fn.ToLower().EndsWith(".json")) - { - // save only JSON - // This functionality is an initial test. - if (!saveOnlyCopy) - _fn = fn; - try - { - Stream s = (useMemoryStream != null) ? (Stream)useMemoryStream - : System.IO.File.Open(fn, FileMode.Create, FileAccess.Write); - - try - { - //// TODO (Michael Hoffmeister, 2020-08-01): use a unified function to create a serializer - //JsonSerializer serializer = new JsonSerializer() - //{ - // NullValueHandling = NullValueHandling.Ignore, - // ReferenceLoopHandling = ReferenceLoopHandling.Serialize, - // Formatting = Newtonsoft.Json.Formatting.Indented - //}; - - //var sw = new StreamWriter(s); - //var writer = new JsonTextWriter(sw); - - //serializer.Serialize(writer, _aasEnv); - //writer.Flush(); - //sw.Flush(); - //s.Flush(); - - //if (useMemoryStream == null) - //{ - // writer.Close(); - // sw.Close(); - //} - - using (var wr = new System.Text.Json.Utf8JsonWriter(s)) - { - Jsonization.Serialize.ToJsonObject(_aasEnv).WriteTo(wr, - new System.Text.Json.JsonSerializerOptions() - { - WriteIndented = true - }); - wr.Flush(); - s.Flush(); - } - } - finally - { - // close? - if (useMemoryStream == null) - s.Close(); - } - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While writing AAS {0} at {1} gave: {2}", - fn, AdminShellUtil.ShortLocation(ex), ex.Message))); - } - return true; - } - - if (fn.ToLower().EndsWith(".aasx")) - { - // save package AASX - try - { - // We want existing contents to be preserved, but do not want to allow the change of the file name. - // Therefore: copy the file to a new name, then re-open. - // fn could be changed, therefore close "old" package first - if (_openPackage != null) - { - try - { - _openPackage.Close(); - if (!writeFreshly) - { - if (_tempFn != null) - System.IO.File.Copy(_tempFn, fn); - else - { - /* TODO (MIHO, 2021-01-02): check again. - * Revisiting this code after a while, and after - * the code has undergo some changes by MR, the following copy command needed - * to be amended with a if to protect against self-copy. */ - if (_fn != fn) - System.IO.File.Copy(_fn, fn); - } - } - } - catch (Exception ex) - { - LogInternally.That.SilentlyIgnoredError(ex); - } - _openPackage = null; - } - - // approach is to utilize the existing package, if possible. If not, create from scratch - Package package = null; - if (useMemoryStream != null) - { - package = Package.Open( - useMemoryStream, (writeFreshly) ? FileMode.Create : FileMode.OpenOrCreate); - } - else - { - package = Package.Open( - (_tempFn != null) ? _tempFn : fn, - (writeFreshly) ? FileMode.Create : FileMode.OpenOrCreate); - } - _fn = fn; - - // get the origin from the package - PackagePart originPart = null; - var xs = package.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aasx-origin"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/") - { - originPart = package.GetPart(x.TargetUri); - break; - } - if (originPart == null) - { - // create, as not existing - originPart = package.CreatePart( - new Uri("/aasx/aasx-origin", UriKind.RelativeOrAbsolute), - System.Net.Mime.MediaTypeNames.Text.Plain, CompressionOption.Maximum); - using (var s = originPart.GetStream(FileMode.Create)) - { - var bytes = System.Text.Encoding.ASCII.GetBytes("Intentionally empty."); - s.Write(bytes, 0, bytes.Length); - } - package.CreateRelationship( - originPart.Uri, TargetMode.Internal, - "http://www.admin-shell.io/aasx/relationships/aasx-origin"); - } - - // get the specs from the package - PackagePart specPart = null; - PackageRelationship specRel = null; - xs = originPart.GetRelationshipsByType("http://www.admin-shell.io/aasx/relationships/aas-spec"); - foreach (var x in xs) - { - specRel = x; - specPart = package.GetPart(x.TargetUri); - break; - } - - // check, if we have to change the spec part - if (specPart != null && specRel != null) - { - var name = System.IO.Path.GetFileNameWithoutExtension( - specPart.Uri.ToString()).ToLower().Trim(); - var ext = System.IO.Path.GetExtension(specPart.Uri.ToString()).ToLower().Trim(); - if ((ext == ".json" && prefFmt == SerializationFormat.Xml) - || (ext == ".xml" && prefFmt == SerializationFormat.Json) - || (name.StartsWith("aasenv-with-no-id"))) - { - // try kill specpart - try - { - originPart.DeleteRelationship(specRel.Id); - package.DeletePart(specPart.Uri); - } - catch (Exception ex) - { - LogInternally.That.SilentlyIgnoredError(ex); - } - finally { specPart = null; specRel = null; } - } - } - - if (specPart == null) - { - // create, as not existing - var frn = "aasenv-with-no-id"; - if (_aasEnv.AssetAdministrationShells.Count > 0) - frn = _aasEnv.AssetAdministrationShells[0].GetFriendlyName() ?? frn; - var aas_spec_fn = "/aasx/#/#.aas"; - if (prefFmt == SerializationFormat.Json) - aas_spec_fn += ".json"; - else - aas_spec_fn += ".xml"; - aas_spec_fn = aas_spec_fn.Replace("#", "" + frn); - specPart = package.CreatePart( - new Uri(aas_spec_fn, UriKind.RelativeOrAbsolute), - System.Net.Mime.MediaTypeNames.Text.Xml, CompressionOption.Maximum); - originPart.CreateRelationship( - specPart.Uri, TargetMode.Internal, - "http://www.admin-shell.io/aasx/relationships/aas-spec"); - } - - // now, specPart shall be != null! - if (specPart.Uri.ToString().ToLower().Trim().EndsWith("json")) - { - using (var s = specPart.GetStream(FileMode.Create)) - { - JsonSerializer serializer = new JsonSerializer(); - serializer.NullValueHandling = NullValueHandling.Ignore; - serializer.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; - serializer.Formatting = Newtonsoft.Json.Formatting.Indented; - using (var sw = new StreamWriter(s)) - { - using (JsonWriter writer = new JsonTextWriter(sw)) - { - serializer.Serialize(writer, _aasEnv); - } - } - } - } - else - { - using (var s = specPart.GetStream(FileMode.Create)) - { - //var serializer = new XmlSerializer(typeof(AasCore.Aas3_0_RC02.Environment)); - //var nss = GetXmlDefaultNamespaces(); - //serializer.Serialize(s, _aasEnv, nss); - - var writer = XmlWriter.Create(s, new XmlWriterSettings() { Indent = true }); - Xmlization.Serialize.To( - _aasEnv, writer); - writer.Flush(); - writer.Close(); - s.Flush(); - } - } - - // there might be pending files to be deleted (first delete, then add, - // in case of identical files in both categories) - foreach (var psfDel in _pendingFilesToDelete) - { - // try find an existing part for that file .. - var found = false; - - // normal files - xs = specPart.GetRelationshipsByType("http://www.admin-shell.io/aasx/relationships/aas-suppl"); - foreach (var x in xs) - if (x.TargetUri == psfDel.Uri) - { - // try to delete - specPart.DeleteRelationship(x.Id); - package.DeletePart(psfDel.Uri); - found = true; - break; - } - - // thumbnails - xs = package.GetRelationshipsByType( - "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); - foreach (var x in xs) - if (x.TargetUri == psfDel.Uri) - { - // try to delete - package.DeleteRelationship(x.Id); - package.DeletePart(psfDel.Uri); - found = true; - break; - } - - if (!found) - throw (new Exception( - $"Not able to delete pending file {psfDel.Uri} in saving package {fn}")); - } - - // after this, there are no more pending for delete files - _pendingFilesToDelete.Clear(); - - // write pending supplementary files - foreach (var psfAdd in _pendingFilesToAdd) - { - // make sure .. - if ((psfAdd.SourceLocalPath == null && psfAdd.SourceGetBytesDel == null) || - psfAdd.Location != AdminShellPackageSupplementaryFile.LocationType.AddPending) - continue; - - // normal file? - if (psfAdd.SpecialHandling == AdminShellPackageSupplementaryFile.SpecialHandlingType.None || - psfAdd.SpecialHandling == - AdminShellPackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail) - { - - // try find an existing part for that file .. - PackagePart filePart = null; - if (psfAdd.SpecialHandling == AdminShellPackageSupplementaryFile.SpecialHandlingType.None) - { - xs = specPart.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aas-suppl"); - foreach (var x in xs) - if (x.TargetUri == psfAdd.Uri) - { - filePart = package.GetPart(x.TargetUri); - break; - } - } - if (psfAdd.SpecialHandling == - AdminShellPackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail) - { - xs = package.GetRelationshipsByType( - "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/" && x.TargetUri == psfAdd.Uri) - { - filePart = package.GetPart(x.TargetUri); - break; - } - } - - if (filePart == null) - { - // determine mimeType - var mimeType = psfAdd.UseMimeType; - // reconcile mime - if (mimeType == null && psfAdd.SourceLocalPath != null) - mimeType = AdminShellPackageEnv.GuessMimeType(psfAdd.SourceLocalPath); - // still null? - if (mimeType == null) - // see: https://stackoverflow.com/questions/6783921/ - // which-mime-type-to-use-for-a-binary-file-thats-specific-to-my-program - mimeType = "application/octet-stream"; - - // create new part and link - filePart = package.CreatePart(psfAdd.Uri, mimeType, CompressionOption.Maximum); - if (psfAdd.SpecialHandling == - AdminShellPackageSupplementaryFile.SpecialHandlingType.None) - specPart.CreateRelationship( - filePart.Uri, TargetMode.Internal, - "http://www.admin-shell.io/aasx/relationships/aas-suppl"); - if (psfAdd.SpecialHandling == - AdminShellPackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail) - package.CreateRelationship( - filePart.Uri, TargetMode.Internal, - "http://schemas.openxmlformats.org/package/2006/" + - "relationships/metadata/thumbnail"); - } - - // now should be able to write - using (var s = filePart.GetStream(FileMode.Create)) - { - if (psfAdd.SourceLocalPath != null) - { - var bytes = System.IO.File.ReadAllBytes(psfAdd.SourceLocalPath); - s.Write(bytes, 0, bytes.Length); - } - - if (psfAdd.SourceGetBytesDel != null) - { - var bytes = psfAdd.SourceGetBytesDel(); - if (bytes != null) - s.Write(bytes, 0, bytes.Length); - } - } - } - } - - // after this, there are no more pending for add files - _pendingFilesToAdd.Clear(); - - // flush, but leave open - package.Flush(); - _openPackage = package; - - // if in temp fn, close the package, copy to original fn, re-open the package - if (_tempFn != null) - try - { - package.Close(); - System.IO.File.Copy(_tempFn, _fn, overwrite: true); - _openPackage = Package.Open(_tempFn, FileMode.OpenOrCreate); - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While write AASX {0} indirectly at {1} gave: {2}", - fn, AdminShellUtil.ShortLocation(ex), ex.Message))); - } - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While write AASX {0} at {1} gave: {2}", - fn, AdminShellUtil.ShortLocation(ex), ex.Message))); - } - return true; - } - - // Don't know to handle - throw new Exception($"Does not know how to handle the file: {fn}"); - } - - /// - /// Temporariyl saves & closes package and executes lambda. Afterwards, the package is re-opened - /// under the same file name - /// - /// Action which is to be executed while the file is CLOSED - /// Format for the saved file - public void TemporarilySaveCloseAndReOpenPackage( - Action lambda, - AdminShellPackageEnv.SerializationFormat prefFmt = AdminShellPackageEnv.SerializationFormat.None) - { - // access - if (!this.IsOpen) - throw (new Exception( - string.Format("Could not temporarily close and re-open AASX {0}, because package" + - "not open as expected!", Filename))); - - try - { - // save (it will be open, still) - SaveAs(this.Filename, prefFmt: prefFmt); - - // close - _openPackage.Flush(); - _openPackage.Close(); - - // execute lambda - lambda?.Invoke(); - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While temporarily close and re-open AASX {0} at {1} gave: {2}", - Filename, AdminShellUtil.ShortLocation(ex), ex.Message))); - } - finally - { - // even after failing of the lambda, the package shall be re-opened - _openPackage = Package.Open(Filename, FileMode.OpenOrCreate); - } - } - - private int BackupIndex = 0; - - public void BackupInDir(string backupDir, int maxFiles) - { - // access - if (backupDir == null || maxFiles < 1) - return; - - // we do it not caring on any errors - try - { - // get index in form - if (BackupIndex == 0) - { - // do not always start at 0!! - var rnd = new Random(); - BackupIndex = rnd.Next(maxFiles); - } - var ndx = BackupIndex % maxFiles; - BackupIndex += 1; - - // build a filename - var bdfn = Path.Combine(backupDir, $"backup{ndx:000}.xml"); - - // raw save - using (var s = new StreamWriter(bdfn)) - { - //var serializer = new XmlSerializer(typeof(AasCore.Aas3_0_RC02.Environment)); - //var nss = new XmlSerializerNamespaces(); - //nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace); - //nss.Add("aas", "http://www.admin-shell.io/aas/2/0"); - //nss.Add("IEC61360", "http://www.admin-shell.io/IEC61360/2/0"); - //serializer.Serialize(s, _aasEnv, nss); - - var writer = XmlWriter.Create(s, new XmlWriterSettings() { Indent = true }); - Xmlization.Serialize.To( - _aasEnv, writer); - writer.Flush(); - writer.Close(); - s.Flush(); - } - } - catch (Exception ex) - { - LogInternally.That.SilentlyIgnoredError(ex); - } - } - - public Stream GetStreamFromUriOrLocalPackage(string uriString, - FileMode mode = FileMode.Open, - FileAccess access = FileAccess.Read) - { - // local - if (IsLocalFile(uriString)) - return GetLocalStreamFromPackage(uriString, mode, access); - - // no .. - return System.IO.File.Open(uriString, mode, access); - } - - public byte[] GetByteArrayFromUriOrLocalPackage(string uriString) - { - try - { - using (var input = GetStreamFromUriOrLocalPackage(uriString)) - { - using (MemoryStream ms = new MemoryStream()) - { - input.CopyTo(ms); - return ms.ToArray(); - } - } - } - catch (Exception ex) - { - AdminShellNS.LogInternally.That.SilentlyIgnoredError(ex); - return null; - } - } - - public bool IsLocalFile(string uriString) - { - // access - if (_openPackage == null) - return false; - if (uriString == null || uriString == "" || !uriString.StartsWith("/")) - return false; - - // check - var isLocal = _openPackage.PartExists(new Uri(uriString, UriKind.RelativeOrAbsolute)); - return isLocal; - } - - public Stream GetLocalStreamFromPackage(string uriString, FileMode mode = FileMode.Open, FileAccess access = FileAccess.Read) - { - // access - if (_openPackage == null) - throw (new Exception(string.Format($"AASX Package {_fn} not opened. Aborting!"))); - - // exist - var puri = new Uri(uriString, UriKind.RelativeOrAbsolute); - if (!_openPackage.PartExists(puri)) - throw (new Exception(string.Format($"AASX Package has no part {uriString}. Aborting!"))); - - // get part - var part = _openPackage.GetPart(puri); - if (part == null) - throw (new Exception( - string.Format($"Cannot access part {uriString} in {_fn}. Aborting!"))); - return part.GetStream(mode, access); - } - - public long GetStreamSizeFromPackage(string uriString) - { - long res = 0; - try - { - if (_openPackage == null) - return 0; - var part = _openPackage.GetPart(new Uri(uriString, UriKind.RelativeOrAbsolute)); - using (var s = part.GetStream(FileMode.Open)) - { - res = s.Length; - } - } - catch (Exception ex) - { - LogInternally.That.SilentlyIgnoredError(ex); - return 0; - } - return res; - } - - /// - /// Ensures: - ///
  • result == null || result.CanRead
- ///
- public Stream GetLocalThumbnailStream(ref Uri thumbUri) - { - // access - if (_openPackage == null) - throw (new Exception(string.Format($"AASX Package {_fn} not opened. Aborting!"))); - // get the thumbnail over the relationship - PackagePart thumbPart = null; - var xs = _openPackage.GetRelationshipsByType( - "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/") - { - thumbPart = _openPackage.GetPart(x.TargetUri); - thumbUri = x.TargetUri; - break; - } - if (thumbPart == null) - throw (new Exception("Unable to find AASX thumbnail. Aborting!")); - - var result = thumbPart.GetStream(FileMode.Open); - - // Post-condition - if (!(result == null || result.CanRead)) - { - throw new InvalidOperationException("Unexpected unreadable result stream"); - } - - return result; - } - - /// - /// Ensures: - ///
  • result == null || result.CanRead
- ///
- public Stream GetLocalThumbnailStream() - { - Uri dummy = null; - var result = GetLocalThumbnailStream(ref dummy); - - // Post-condition - if (!(result == null || result.CanRead)) - { - throw new InvalidOperationException("Unexpected unreadable result stream"); - } - - return result; - } - - public ListOfAasSupplementaryFile GetListOfSupplementaryFiles() - { - // new result - var result = new ListOfAasSupplementaryFile(); - - // access - if (_openPackage != null) - { - - // get the thumbnail(s) from the package - var xs = _openPackage.GetRelationshipsByType( - "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/") - { - result.Add(new AdminShellPackageSupplementaryFile( - x.TargetUri, - location: AdminShellPackageSupplementaryFile.LocationType.InPackage, - specialHandling: AdminShellPackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail)); - } - - // get the origin from the package - PackagePart originPart = null; - xs = _openPackage.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aasx-origin"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/") - { - originPart = _openPackage.GetPart(x.TargetUri); - break; - } - - if (originPart != null) - { - // get the specs from the origin - PackagePart specPart = null; - xs = originPart.GetRelationshipsByType("http://www.admin-shell.io/aasx/relationships/aas-spec"); - foreach (var x in xs) - { - specPart = _openPackage.GetPart(x.TargetUri); - break; - } - - if (specPart != null) - { - // get the supplementaries from the package, derived from spec - xs = specPart.GetRelationshipsByType("http://www.admin-shell.io/aasx/relationships/aas-suppl"); - foreach (var x in xs) - { - result.Add( - new AdminShellPackageSupplementaryFile( - x.TargetUri, location: AdminShellPackageSupplementaryFile.LocationType.InPackage)); - } - } - } - } - - // add or modify the files to delete - foreach (var psfDel in _pendingFilesToDelete) - { - // already in - var found = result.Find(x => { return x.Uri == psfDel.Uri; }); - if (found != null) - found.Location = AdminShellPackageSupplementaryFile.LocationType.DeletePending; - else - { - psfDel.Location = AdminShellPackageSupplementaryFile.LocationType.DeletePending; - result.Add(psfDel); - } - } - - // add the files to store as well - foreach (var psfAdd in _pendingFilesToAdd) - { - // already in (should not happen ?!) - var found = result.Find(x => { return x.Uri == psfAdd.Uri; }); - if (found != null) - found.Location = AdminShellPackageSupplementaryFile.LocationType.AddPending; - else - { - psfAdd.Location = AdminShellPackageSupplementaryFile.LocationType.AddPending; - result.Add(psfAdd); - } - } - - // done - return result; - } - - public static string GuessMimeType(string fn) - { - var file_ext = System.IO.Path.GetExtension(fn).ToLower().Trim(); - var content_type = System.Net.Mime.MediaTypeNames.Text.Plain; - if (file_ext == ".pdf") content_type = System.Net.Mime.MediaTypeNames.Application.Pdf; - if (file_ext == ".xml") content_type = System.Net.Mime.MediaTypeNames.Text.Xml; - if (file_ext == ".txt") content_type = System.Net.Mime.MediaTypeNames.Text.Plain; - if (file_ext == ".igs") content_type = "application/iges"; - if (file_ext == ".iges") content_type = "application/iges"; - if (file_ext == ".stp") content_type = "application/step"; - if (file_ext == ".step") content_type = "application/step"; - if (file_ext == ".jpg") content_type = System.Net.Mime.MediaTypeNames.Image.Jpeg; - if (file_ext == ".jpeg") content_type = System.Net.Mime.MediaTypeNames.Image.Jpeg; - if (file_ext == ".png") content_type = "image/png"; - if (file_ext == ".gif") content_type = System.Net.Mime.MediaTypeNames.Image.Gif; - return content_type; - } - - public void PrepareSupplementaryFileParameters(ref string targetDir, ref string targetFn) - { - // re-work target dir - if (targetDir != null) - targetDir = targetDir.Replace(@"\", "/"); - - // rework targetFn - if (targetFn != null) - targetFn = Regex.Replace(targetFn, @"[^A-Za-z0-9-.]+", "_"); - } - - /// - /// Add a file as supplementary file to package. Operation will be pending, package needs to be saved in order - /// materialize embedding. - /// - /// Target path of file in package - public string AddSupplementaryFileToStore( - string sourcePath, string targetDir, string targetFn, bool embedAsThumb, - AdminShellPackageSupplementaryFile.SourceGetByteChunk sourceGetBytesDel = null, string useMimeType = null) - { - // beautify parameters - if ((sourcePath == null && sourceGetBytesDel == null) || targetDir == null || targetFn == null) - return null; - - // build target path - targetDir = targetDir.Trim(); - if (!targetDir.EndsWith("/")) - targetDir += "/"; - targetFn = targetFn.Trim(); - if (sourcePath == "" || targetDir == "" || targetFn == "") - throw (new Exception("Trying add supplementary file with empty name or path!")); - - var targetPath = "" + targetDir.Trim() + targetFn.Trim(); - - // base function - AddSupplementaryFileToStore(sourcePath, targetPath, embedAsThumb, sourceGetBytesDel, useMimeType); - - // return target path - return targetPath; - } - - public void AddSupplementaryFileToStore(string sourcePath, string targetPath, bool embedAsThumb, - AdminShellPackageSupplementaryFile.SourceGetByteChunk sourceGetBytesDel = null, string useMimeType = null) - { - // beautify parameters - if ((sourcePath == null && sourceGetBytesDel == null) || targetPath == null) - return; - - sourcePath = sourcePath?.Trim(); - targetPath = targetPath.Trim(); - - // add record - _pendingFilesToAdd.Add( - new AdminShellPackageSupplementaryFile( - new Uri(targetPath, UriKind.RelativeOrAbsolute), - sourcePath, - location: AdminShellPackageSupplementaryFile.LocationType.AddPending, - specialHandling: (embedAsThumb - ? AdminShellPackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail - : AdminShellPackageSupplementaryFile.SpecialHandlingType.None), - sourceGetBytesDel: sourceGetBytesDel, - useMimeType: useMimeType) - ); - - } - - public void DeleteSupplementaryFile(AdminShellPackageSupplementaryFile psf) - { - if (psf == null) - throw (new Exception("No supplementary file given!")); - - if (psf.Location == AdminShellPackageSupplementaryFile.LocationType.AddPending) - { - // is still pending in add list -> remove - _pendingFilesToAdd.RemoveAll((x) => { return x.Uri == psf.Uri; }); - } - - if (psf.Location == AdminShellPackageSupplementaryFile.LocationType.InPackage) - { - // add to pending delete list - _pendingFilesToDelete.Add(psf); - } - } - - public void Close() - { - _openPackage?.Close(); - _openPackage = null; - _fn = ""; - _aasEnv = null; - } - - public void Flush() - { - if (_openPackage != null) - _openPackage.Flush(); - } - - public void Dispose() - { - Close(); - } - - public string MakePackageFileAvailableAsTempFile(string packageUri, bool keepFilename = false) - { - // access - if (packageUri == null) - return null; - - // get input stream - using (var input = GetLocalStreamFromPackage(packageUri)) - { - // generate tempfile name - string tempext = System.IO.Path.GetExtension(packageUri); - string temppath = System.IO.Path.GetTempFileName().Replace(".tmp", tempext); - - // maybe modify tempfile name? - if (keepFilename) - { - var masterFn = System.IO.Path.GetFileNameWithoutExtension(packageUri); - var tmpDir = System.IO.Path.GetDirectoryName(temppath); - var tmpFnExt = System.IO.Path.GetFileName(temppath); - - temppath = System.IO.Path.Combine(tmpDir, "" + masterFn + "_" + tmpFnExt); - } - - // copy to temp file - using (var temp = System.IO.File.OpenWrite(temppath)) - { - input.CopyTo(temp); - return temppath; - } - } - } - - } -} diff --git a/src/AasxCsharpLib_bkp/AdminShellUtil.cs b/src/AasxCsharpLib_bkp/AdminShellUtil.cs deleted file mode 100644 index 66be9718e..000000000 --- a/src/AasxCsharpLib_bkp/AdminShellUtil.cs +++ /dev/null @@ -1,705 +0,0 @@ -/* -Copyright (c) 2018-2021 Festo AG & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using AasCore.Aas3_0_RC02; -using Extensions; -using System; -using System.Collections; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading.Tasks; -using static AasxCompatibilityModels.AdminShellV20.SubmodelElementWrapper; -using static Extensions.ExtendIDataSpecificationContent; - -namespace AdminShellNS -{ - public static class AdminShellUtil - { - - #region Various utilities - // ------------------------------------------------------------------------------------ - - public static T[] GetEnumValues() where T : Enum - => (T[])Enum.GetValues(typeof(T)); - - public static IEnumerable GetEnumValues(T[] excludes) where T : Enum - { - foreach (var v in (T[])Enum.GetValues(typeof(T))) - if (!excludes.Contains(v)) - yield return v; - } - - #endregion - - #region V3 Methods - - public static string[] GetPopularMimeTypes() - { - return - new[] { - System.Net.Mime.MediaTypeNames.Text.Plain, - System.Net.Mime.MediaTypeNames.Text.Xml, - System.Net.Mime.MediaTypeNames.Text.Html, - "application/json", - "application/rdf+xml", - System.Net.Mime.MediaTypeNames.Application.Pdf, - System.Net.Mime.MediaTypeNames.Image.Jpeg, - "image/png", - System.Net.Mime.MediaTypeNames.Image.Gif, - "application/iges", - "application/step" - }; - } - - public static IEnumerable GetAdequateEnums(AasSubmodelElements[] excludeValues = null, AasSubmodelElements[] includeValues = null) - { - if (includeValues != null) - { - foreach (var en in includeValues) - yield return en; - } - else - { - foreach (var en in (AasSubmodelElements[])Enum.GetValues(typeof(AasSubmodelElements))) - { - if (en == AasSubmodelElements.SubmodelElement) - continue; - if (excludeValues != null && excludeValues.Contains(en)) - continue; - yield return en; - } - } - } - - public static AasSubmodelElements? AasSubmodelElementsFrom() where T : ISubmodelElement - { - if (typeof(T) == typeof(Property)) - return AasSubmodelElements.Property; - if (typeof(T) == typeof(MultiLanguageProperty)) - return AasSubmodelElements.MultiLanguageProperty; - if (typeof(T) == typeof(AasCore.Aas3_0_RC02.Range)) - return AasSubmodelElements.Range; - if (typeof(T) == typeof(AasCore.Aas3_0_RC02.File)) - return AasSubmodelElements.File; - if (typeof(T) == typeof(Blob)) - return AasSubmodelElements.Blob; - if (typeof(T) == typeof(ReferenceElement)) - return AasSubmodelElements.ReferenceElement; - if (typeof(T) == typeof(RelationshipElement)) - return AasSubmodelElements.RelationshipElement; - if (typeof(T) == typeof(AnnotatedRelationshipElement)) - return AasSubmodelElements.AnnotatedRelationshipElement; - if (typeof(T) == typeof(Capability)) - return AasSubmodelElements.Capability; - if (typeof(T) == typeof(SubmodelElementCollection)) - return AasSubmodelElements.SubmodelElementCollection; - if (typeof(T) == typeof(Operation)) - return AasSubmodelElements.Operation; - if (typeof(T) == typeof(BasicEventElement)) - return AasSubmodelElements.BasicEventElement; - if (typeof(T) == typeof(Entity)) - return AasSubmodelElements.Entity; - return null; - } - - - public static ISubmodelElement CreateSubmodelElementFromEnum(AasSubmodelElements smeEnum, ISubmodelElement sourceSme = null) - { - switch(smeEnum) - { - case AasSubmodelElements.Property: - { - return new Property(DataTypeDefXsd.String).UpdateFrom(sourceSme); - } - case AasSubmodelElements.MultiLanguageProperty: - { - return new MultiLanguageProperty().UpdateFrom(sourceSme); - } - case AasSubmodelElements.Range: - { - return new AasCore.Aas3_0_RC02.Range(DataTypeDefXsd.String).UpdateFrom(sourceSme); - } - case AasSubmodelElements.File: - { - return new AasCore.Aas3_0_RC02.File("").UpdateFrom(sourceSme); - } - case AasSubmodelElements.Blob: - { - return new Blob("").UpdateFrom(sourceSme); - } - case AasSubmodelElements.ReferenceElement: - { - return new ReferenceElement().UpdateFrom(sourceSme); - } - case AasSubmodelElements.RelationshipElement: - { - return new RelationshipElement(null, null).UpdateFrom(sourceSme); - } - case AasSubmodelElements.AnnotatedRelationshipElement: - { - return new AnnotatedRelationshipElement(null, null).UpdateFrom(sourceSme); - } - case AasSubmodelElements.Capability: - { - return new Capability(); - } - case AasSubmodelElements.SubmodelElementCollection: - { - return new SubmodelElementCollection().UpdateFrom(sourceSme); - } - case AasSubmodelElements.SubmodelElementList: - { - return new SubmodelElementList(AasSubmodelElements.SubmodelElement).UpdateFrom(sourceSme); - } - case AasSubmodelElements.Operation: - { - return new Operation().UpdateFrom(sourceSme); - } - case AasSubmodelElements.BasicEventElement: - { - return new BasicEventElement(null, Direction.Input, StateOfEvent.Off); - } - case AasSubmodelElements.Entity: - { - return new Entity(EntityType.SelfManagedEntity); - } - default: - { - return null; - } - } - } - - #endregion - public static string EvalToNonNullString(string fmt, object o, string elseString = "") - { - if (o == null) - return elseString; - return string.Format(fmt, o); - } - - public static string EvalToNonEmptyString(string fmt, string o, string elseString = "") - { - if (o == null || o == "") - return elseString; - return string.Format(fmt, o); - } - - /// - /// If len of exceeds then - /// string is shortened and returned with an ellipsis(…) at the end. - /// - /// Shortened string - public static string ShortenWithEllipses(string str, int maxLen) - { - if (str == null) - return null; - if (maxLen >= 0 && str.Length > maxLen) - str = str.Substring(0, maxLen) + "\u2026"; - return str; - } - - /// - /// Returns a string without newlines and shortened (with ellipsis) - /// to a certain length - /// - /// Single-line, shortened string - public static string ToSingleLineShortened(string str, int maxLen, string textNewLine = " ") - { - str = str.ReplaceLineEndings(textNewLine); - return ShortenWithEllipses(str, maxLen); - } - - /// Creates a filter-friendly name from the source. - /// - /// Assert.AreEqual("", AdminShellUtil.FilterFriendlyName("")); - /// Assert.AreEqual("someName", AdminShellUtil.FilterFriendlyName("someName")); - /// Assert.AreEqual("some__name", AdminShellUtil.FilterFriendlyName("some!;name")); - /// - public static string FilterFriendlyName(string src) - { - if (src == null) - return null; - return Regex.Replace(src, @"[^a-zA-Z0-9\-_]", "_"); - } - - /// - /// Assert.IsFalse(AdminShellUtil.HasWhitespace("")); - /// Assert.IsTrue(AdminShellUtil.HasWhitespace(" ")); - /// Assert.IsTrue(AdminShellUtil.HasWhitespace("aa bb")); - /// Assert.IsTrue(AdminShellUtil.HasWhitespace(" aabb")); - /// Assert.IsTrue(AdminShellUtil.HasWhitespace("aabb ")); - /// Assert.IsFalse(AdminShellUtil.HasWhitespace("aabb")); - /// - public static bool HasWhitespace(string src) - { - if (src == null) - throw new ArgumentNullException(nameof(src)); - foreach (var s in src) - if (char.IsWhiteSpace(s)) - return true; - return false; - } - - /// Assert.IsTrue(AdminShellUtil.ComplyIdShort("")); - public static bool ComplyIdShort(string src) - { - if (src == null) - throw new ArgumentNullException(nameof(src)); - var res = true; - foreach (var s in src) - if (!Char.IsLetterOrDigit(s) && s != '_') - res = false; - if (src.Length > 0 && !Char.IsLetter(src[0])) - res = false; - return res; - } - - public static string ByteSizeHumanReadable(long len) - { - // see: https://stackoverflow.com/questions/281640/ - // how-do-i-get-a-human-readable-file-size-in-bytes-abbreviation-using-net - string[] sizes = { "B", "KB", "MB", "GB", "TB" }; - int order = 0; - while (len >= 1024 && order < sizes.Length - 1) - { - order++; - len = len / 1024; - } - // Adjust the format string to your preferences. For example "{0:0.#}{1}" would - // show a single decimal place, and no space. - string res = String.Format("{0:0.##} {1}", len, sizes[order]); - return res; - } - - public static string ExtractPascalCasingLetters(string src) - { - // access - src = src?.Trim(); - if (src == null || src.Length < 1) - return null; - - // walk through - var res = ""; - var arm = true; - foreach (var c in src) - { - // take? - if (arm && Char.IsUpper(c)) - res += c; - // state for next iteration - arm = !Char.IsUpper(c); - } - - // result - return res; - } - - public static int CountHeadingSpaces(string line) - { - if (line == null) - return 0; - int j; - for (j = 0; j < line.Length; j++) - if (!Char.IsWhiteSpace(line[j])) - break; - return j; - } - - /// - /// Used to re-reformat a C# here string, which is multiline string introduced by @" ... "; - /// - public static string[] CleanHereStringToArray(string here) - { - if (here == null) - return null; - - // convert all weird breaks to pure new lines - here = here.Replace("\r\n", "\n"); - here = here.Replace("\n\r", "\n"); - - // convert all tabs to spaces - here = here.Replace("\t", " "); - - // split these - var lines = new List(here.Split('\n')); - if (lines.Count < 1) - return lines.ToArray(); - - // the first line could be special - string firstLine = null; - if (lines[0].Trim() != "") - { - firstLine = lines[0].Trim(); - lines.RemoveAt(0); - } - - // detect an constant amount of heading spaces - var headSpaces = int.MaxValue; - foreach (var line in lines) - if (line.Trim() != "") - headSpaces = Math.Min(headSpaces, CountHeadingSpaces(line)); - - // multi line trim possible? - if (headSpaces != int.MaxValue && headSpaces > 0) - for (int i = 0; i < lines.Count; i++) - if (lines[i].Length > headSpaces) - lines[i] = lines[i].Substring(headSpaces); - - // re-compose again - if (firstLine != null) - lines.Insert(0, firstLine); - - // return - return lines.ToArray(); - } - - /// - /// Used to re-reformat a C# here string, which is multiline string introduced by @" ... "; - /// - public static string CleanHereStringWithNewlines(string here, string nl = null) - { - if (nl == null) - nl = System.Environment.NewLine; - var lines = CleanHereStringToArray(here); - if (lines == null) - return null; - return String.Join(nl, lines); - } - - public static string ShortLocation(Exception ex) - { - if (ex == null || ex.StackTrace == null) - return ""; - string[] lines = ex.StackTrace.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None); - if (lines.Length < 1) - return ""; - // search for " in " - // as the most actual stacktrace might be a built-in function, this might not work and therefore - // go down in the stack - int currLine = 0; - while (true) - { - // nothing found at all - if (currLine >= lines.Length) - return ""; - // access current line - /* TODO (MIHO, 2020-11-12): replace with Regex for multi language. Ideally have Exception messages - always as English. */ - var p = lines[currLine].IndexOf(" in ", StringComparison.Ordinal); - if (p < 0) - p = lines[currLine].IndexOf(" bei ", StringComparison.Ordinal); - if (p < 0) - { - // advance to next oldest line - currLine++; - continue; - } - // search last "\" or "/", to get only filename portion and position - p = lines[currLine].LastIndexOfAny(new[] { '\\', '/' }); - if (p < 0) - { - // advance to next oldest line - currLine++; - continue; - } - // return this - return lines[currLine].Substring(p); - } - } - - public enum ConstantFoundEnum { No, AnyCase, ExactCase } - - public static ConstantFoundEnum CheckIfInConstantStringArray(string[] arr, string str) - { - if (arr == null || str == null) - return ConstantFoundEnum.No; - - bool anyCaseFound = false; - bool exactCaseFound = false; - foreach (var a in arr) - { - anyCaseFound = anyCaseFound || str.ToLower() == a.ToLower(); - exactCaseFound = exactCaseFound || str == a; - } - if (exactCaseFound) - return ConstantFoundEnum.ExactCase; - if (anyCaseFound) - return ConstantFoundEnum.AnyCase; - return ConstantFoundEnum.No; - } - - public static string CorrectCasingForConstantStringArray(string[] arr, string str) - { - if (arr == null || str == null) - return str; - - foreach (var a in arr) - if (str.ToLower() == a.ToLower()) - return a; - - return str; - } - - // - // String manipulations - // - - public static string ReplacePercentPlaceholder( - string input, - string searchFor, - Func substLamda, - StringComparison comparisonType = StringComparison.InvariantCulture) - { - // access - if (input == null || searchFor == null || searchFor == "") - return input; - - // find - while (true) - { - // any occurence - var p = input.IndexOf(searchFor, comparisonType); - if (p < 0) - break; - - // split - var left = input.Substring(0, p); - var right = ""; - var rp = p + searchFor.Length; - if (rp < input.Length) - right = input.Substring(rp); - - // lambda - var repl = "" + substLamda?.Invoke(); - - // build new - input = left + repl + right; - } - - // ok - return input; - } - - // - // Reflection - // - - public static void SetFieldLazyValue(FieldInfo f, object obj, object value) - { - // access - if (f == null || obj == null) - return; - - switch (Type.GetTypeCode(f.FieldType)) - { - case TypeCode.String: - f.SetValue(obj, "" + value); - break; - - case TypeCode.Byte: - if (Byte.TryParse("" + value, out var ui8)) - f.SetValue(obj, ui8); - break; - - case TypeCode.SByte: - if (SByte.TryParse("" + value, out var i8)) - f.SetValue(obj, i8); - break; - - case TypeCode.Int16: - if (Int16.TryParse("" + value, out var i16)) - f.SetValue(obj, i16); - break; - - case TypeCode.Int32: - if (Int32.TryParse("" + value, out var i32)) - f.SetValue(obj, i32); - break; - - case TypeCode.Int64: - if (Int64.TryParse("" + value, out var i64)) - f.SetValue(obj, i64); - break; - - case TypeCode.UInt16: - if (UInt16.TryParse("" + value, out var ui16)) - f.SetValue(obj, ui16); - break; - - case TypeCode.UInt32: - if (UInt32.TryParse("" + value, out var ui32)) - f.SetValue(obj, ui32); - break; - - case TypeCode.UInt64: - if (UInt64.TryParse("" + value, out var ui64)) - f.SetValue(obj, ui64); - break; - - case TypeCode.Single: - if (Single.TryParse("" + value, NumberStyles.Float, - CultureInfo.InvariantCulture, out var sgl)) - f.SetValue(obj, sgl); - break; - - case TypeCode.Double: - if (Double.TryParse("" + value, NumberStyles.Float, - CultureInfo.InvariantCulture, out var dbl)) - f.SetValue(obj, dbl); - break; - - case TypeCode.Boolean: - var isFalse = value == null - || (value is int vi && vi == 0) - || (value is string vs && vs == "") - || (value is bool vb && !vb); - f.SetValue(obj, isFalse); - break; - } - } - - // - // some URL enabled path handling - // - - /// - /// Uses System.IO.Path.GetExtension() to determine the extension part - /// of a path. If a URL based query is added to the extension, remove this. - /// - public static string GetExtensionWoQuery(string fn) - { - // access - if (fn == null) - return null; - - // use system function - var ext = System.IO.Path.GetExtension(fn).ToLower().Trim(); - - // as URLs *might* have an extension, but a loto f query string afterwards, - // lets try to cut of it - var extMatch = Regex.Match(ext, @"([._A-Za-z0-9]+)"); - if (extMatch.Success) - ext = extMatch.Groups[1].ToString(); - - // ok - return ext; - } - - // - // Base 64 - // - - public static string Base64Encode(string plainText) - { - var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText); - return System.Convert.ToBase64String(plainTextBytes); - } - - public static string Base64Decode(string base64EncodedData) - { - var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData); - return System.Text.Encoding.UTF8.GetString(base64EncodedBytes); - } - - // - // Generation of Ids - // - - private static Random MyRnd = new Random(); - - public static string GenerateIdAccordingTemplate(string tpl) - { - // generate a deterministic decimal digit string - var decimals = String.Format("{0:ffffyyMMddHHmmss}", DateTime.UtcNow); - decimals = new string(decimals.Reverse().ToArray()); - // convert this to an int - if (!Int64.TryParse(decimals, out Int64 decii)) - decii = MyRnd.Next(Int32.MaxValue); - // make an hex out of this - string hexamals = decii.ToString("X"); - // make an alphanumeric string out of this - string alphamals = ""; - var dii = decii; - while (dii >= 1) - { - var m = dii % 26; - alphamals += Convert.ToChar(65 + m); - dii = dii / 26; - } - - // now, "salt" the strings - for (int i = 0; i < 32; i++) - { - var c = Convert.ToChar(48 + MyRnd.Next(10)); - decimals += c; - hexamals += c; - alphamals += c; - } - - // now, can just use the template - var id = ""; - foreach (var tpli in tpl) - { - if (tpli == 'D' && decimals.Length > 0) - { - id += decimals[0]; - decimals = decimals.Remove(0, 1); - } - else - if (tpli == 'X' && hexamals.Length > 0) - { - id += hexamals[0]; - hexamals = hexamals.Remove(0, 1); - } - else - if (tpli == 'A' && alphamals.Length > 0) - { - id += alphamals[0]; - alphamals = alphamals.Remove(0, 1); - } - else - id += tpli; - } - - // ok - return id; - } - - public static string RemoveNewLinesAndLimit(string input, int maxLength = -1, string ellipsis = "..") - { - // access - if (input == null) - return null; - - // maybe do a generouse limit first - if (maxLength >= 1 && input.Length > 2 * maxLength) - input = input.Substring(0, 2 * maxLength); - - // now do expensive operations - input = input.Replace('\r', ' '); - input = input.Replace('\n', ' '); - input = Regex.Replace(input, @"\s+", " ", RegexOptions.Compiled); - - // now apply exact limit - if (maxLength >= 1 && input.Length > maxLength) - input = input.Substring(0, maxLength) + ellipsis; - - // ok - return input; - } - - - } -} diff --git a/src/AasxCsharpLib_bkp/AdminShellValidate.cs b/src/AasxCsharpLib_bkp/AdminShellValidate.cs deleted file mode 100644 index 938c91c57..000000000 --- a/src/AasxCsharpLib_bkp/AdminShellValidate.cs +++ /dev/null @@ -1,327 +0,0 @@ -/* -Copyright (c) 2018-2021 Festo AG & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.ComponentModel.Design; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading.Tasks; -using System.Xml; -using System.Xml.Schema; -using JetBrains.Annotations; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using Newtonsoft.Json.Schema; -using AasCore.Aas3_0_RC02; -using Environment = System.Environment; - -namespace AdminShellNS -{ - /// - /// validates the XML content against the AASX XML schema. - /// - /// Please produce instances with . - /// - public class XmlValidator - { - private System.Xml.Schema.XmlSchemaSet xmlSchemaSet; - - internal XmlValidator(XmlSchemaSet xmlSchemaSet) - { - this.xmlSchemaSet = xmlSchemaSet; - } - - /// - /// validates the given XML content and stores the results in the . - /// - /// Validation records - /// Content to be validated - public void Validate(AasValidationRecordList recs, Stream xmlContent) - { - if (recs == null) - throw new ArgumentException($"Unexpected null {nameof(recs)}"); - - if (xmlContent == null) - throw new ArgumentException($"Unexpected null {nameof(xmlContent)}"); - - // load/ validate on same records - var settings = new System.Xml.XmlReaderSettings(); - settings.ValidationType = System.Xml.ValidationType.Schema; - settings.Schemas = xmlSchemaSet; - - settings.ValidationEventHandler += - (object sender, System.Xml.Schema.ValidationEventArgs e) => - { - recs.Add( - new AasValidationRecord( - AasValidationSeverity.Serialization, null, - $"XML: {e?.Exception?.LineNumber}, {e?.Exception?.LinePosition}: {e?.Message}")); - }; - - // use the xml stream - using (var reader = System.Xml.XmlReader.Create(xmlContent, settings)) - { - while (reader.Read()) - { - // Invoke callbacks - }; - } - } - } - - public enum AasValidationSeverity - { - Hint, Warning, SpecViolation, SchemaViolation, Serialization - } - - [UsedImplicitlyAttribute] // for eventual use - public enum AasValidationAction - { - No, ToBeDeleted - } - - public class AasValidationRecord - { - public AasValidationSeverity Severity = AasValidationSeverity.Hint; - public IReferable Source = null; - public string Message = ""; - - public Action Fix = null; - - public AasValidationRecord(AasValidationSeverity Severity, IReferable Source, - string Message, Action Fix = null) - { - this.Severity = Severity; - this.Source = Source; - this.Message = Message; - this.Fix = Fix; - } - - public override string ToString() - { - return $"[{Severity.ToString()}] in {"" + Source?.ToString()}: {"" + Message}"; - } - - public string DisplaySeverity { get { return "" + Severity.ToString(); } } - public string DisplaySource - { - get - { - return "" + ((Source != null) ? Source.ToString() : "(whole content)"); - } - } - public string DisplayMessage { get { return "" + Message?.ToString(); } } - } - - public class AasValidationRecordList : List - { - } - - public static class AasSchemaValidation - { - public enum SerializationFormat { XML, JSON } - - public static string[] GetSchemaResources(SerializationFormat fmt) - { - if (fmt == SerializationFormat.XML) - { - return new[] - { - "AdminShellNS.Resources.schemaV201.AAS.xsd", - "AdminShellNS.Resources.schemaV201.AAS_ABAC.xsd", - "AdminShellNS.Resources.schemaV201.IEC61360.xsd" - }; - } - if (fmt == SerializationFormat.JSON) - { - return new[] - { - "AdminShellNS.Resources.schemaV201.aas.json" - }; - } - return null; - } - - /// - /// produces a validator which validates XML AASX files. - /// - /// initialized validator - public static XmlValidator NewXmlValidator() - { - // Load the schema files - var files = GetSchemaResources(SerializationFormat.XML); - if (files == null) - throw new InvalidOperationException("No XML schema files could be found in the resources."); - - var xmlSchemaSet = new System.Xml.Schema.XmlSchemaSet(); - xmlSchemaSet.XmlResolver = new System.Xml.XmlUrlResolver(); - - try - { - Assembly myAssembly = Assembly.GetExecutingAssembly(); - foreach (var schemaFn in files) - { - using (Stream schemaStream = myAssembly.GetManifestResourceStream(schemaFn)) - { - using (XmlReader schemaReader = XmlReader.Create(schemaStream)) - { - xmlSchemaSet.Add(null, schemaReader); - } - } - } - } - catch (Exception ex) - { - throw new FileNotFoundException( - $"Error accessing embedded resource schema files: {ex.Message}"); - } - - var newRecs = new AasValidationRecordList(); - - // set up messages - xmlSchemaSet.ValidationEventHandler += (object sender, System.Xml.Schema.ValidationEventArgs e) => - { - newRecs.Add( - new AasValidationRecord( - AasValidationSeverity.Serialization, null, - $"{e?.Exception?.LineNumber}, {e?.Exception?.LinePosition}: {e?.Message}")); - }; - - // compile - try - { - xmlSchemaSet.Compile(); - } - catch (Exception ex) - { - throw new InvalidOperationException( - $"Error compiling schema files: {ex.Message}"); - } - - if (newRecs.Count > 0) - { - var parts = new List { $"Failed to compile the schema files:" }; - parts.AddRange(newRecs.Select((r) => r.Message)); - throw new InvalidOperationException(string.Join(Environment.NewLine, parts)); - } - - return new XmlValidator(xmlSchemaSet); - } - - /// - /// creates an XML validator and applies it on the given content. - /// - /// If you repeatedly need to validate XML against a schema, re-use an instance of - /// produced with . - /// - /// Validation records - /// Content to be validated - public static void ValidateXML(AasValidationRecordList recs, Stream xmlContent) - { - var validator = NewXmlValidator(); - validator.Validate(recs, xmlContent); - } - - public static int ValidateJSONAlternative(AasValidationRecordList recs, Stream jsonContent) - { - // see: https://github.com/RicoSuter/NJsonSchema/wiki/JsonSchemaValidator - var newRecs = new AasValidationRecordList(); - - // access - if (recs == null || jsonContent == null) - return -1; - - // Load the schema files - // right now: exactly ONE schema file - var files = GetSchemaResources(SerializationFormat.JSON); - if (files == null || files.Length != 1) - return -1; - - NJsonSchema.JsonSchema schema = null; - - try - { - Assembly myAssembly = Assembly.GetExecutingAssembly(); - foreach (var schemaFn in files) - { - using (Stream schemaStream = myAssembly.GetManifestResourceStream(schemaFn)) - { - using (var streamReader = new StreamReader(schemaStream)) - { - var allTxt = streamReader.ReadToEnd(); - schema = NJsonSchema.JsonSchema.FromJsonAsync(allTxt).GetAwaiter().GetResult(); - break; - } - } - } - } - catch (Exception ex) - { - throw new FileNotFoundException("ValidateJSON: Error loading schema: " + - ex.Message); - } - - if (schema == null) - { - throw new FileNotFoundException("ValidateJSON: Schema not found properly."); - } - - // create validator - var validator = new NJsonSchema.Validation.JsonSchemaValidator(); - - // load the JSON content - string jsonTxt = null; - try - { - using (var streamReader = new StreamReader(jsonContent)) - { - jsonTxt = streamReader.ReadToEnd(); - } - } - catch (Exception ex) - { - throw new InvalidOperationException("ValidateJSON: Error loading JSON content: " + - ex.Message); - } - - if (jsonTxt == null || jsonTxt == "") - throw new InvalidOperationException("ValidateJSON: Error loading JSON content gave null."); - - // validate - ICollection errors; - try - { - errors = validator.Validate(jsonTxt, schema); - } - catch (Exception ex) - { - throw new InvalidOperationException("ValidateJSON: Error when validating: " + - ex.Message); - } - - // re-format messages - if (errors != null) - foreach (var ve in errors) - { - var msg = ("" + ve.ToString()); - msg = Regex.Replace(msg, @"\s+", " "); - newRecs.Add(new AasValidationRecord(AasValidationSeverity.Serialization, null, - $"JSON: {ve.LineNumber,5},{ve.LinePosition:3}: {msg}")); - } - - // result - recs.AddRange(newRecs); - return newRecs.Count; - } - } -} diff --git a/src/AasxCsharpLib_bkp/Display/EnumerationPlacmentBase.cs b/src/AasxCsharpLib_bkp/Display/EnumerationPlacmentBase.cs deleted file mode 100644 index 5920e6f6d..000000000 --- a/src/AasxCsharpLib_bkp/Display/EnumerationPlacmentBase.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace AdminShellNS.Display -{ - public class EnumerationPlacmentBase - { - - } -} diff --git a/src/AasxCsharpLib_bkp/Display/EnumerationPlacmentOperationVariable.cs b/src/AasxCsharpLib_bkp/Display/EnumerationPlacmentOperationVariable.cs deleted file mode 100644 index b6d0e3a0a..000000000 --- a/src/AasxCsharpLib_bkp/Display/EnumerationPlacmentOperationVariable.cs +++ /dev/null @@ -1,15 +0,0 @@ -using AasCore.Aas3_0_RC02; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace AdminShellNS.Display -{ - public class EnumerationPlacmentOperationVariable : EnumerationPlacmentBase - { - public OperationVariableDirection Direction; - public OperationVariable OperationVariable; - } -} diff --git a/src/AasxCsharpLib_bkp/Display/OperationVariableDirection.cs b/src/AasxCsharpLib_bkp/Display/OperationVariableDirection.cs deleted file mode 100644 index d64f9c794..000000000 --- a/src/AasxCsharpLib_bkp/Display/OperationVariableDirection.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace AdminShellNS.Display -{ - public enum OperationVariableDirection - { - In, - Out, - InOut - } -} diff --git a/src/AasxCsharpLib_bkp/Exceptions/NullValueException.cs b/src/AasxCsharpLib_bkp/Exceptions/NullValueException.cs deleted file mode 100644 index 7d44af167..000000000 --- a/src/AasxCsharpLib_bkp/Exceptions/NullValueException.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace AdminShellNS.Exceptions -{ - public class NullValueException: Exception - { - public NullValueException(string field) : base($"The field {field} is null!!") - { - - } - } -} diff --git a/src/AasxCsharpLib_bkp/Extensions/AasElementSelfDescription.cs b/src/AasxCsharpLib_bkp/Extensions/AasElementSelfDescription.cs deleted file mode 100644 index 8ac8f2ed2..000000000 --- a/src/AasxCsharpLib_bkp/Extensions/AasElementSelfDescription.cs +++ /dev/null @@ -1,29 +0,0 @@ -using AasCore.Aas3_0_RC02; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Extensions -{ - public class AasElementSelfDescription - { - public string AasElementName { get; set; } - - public string ElementAbbreviation { get; set; } - - public KeyTypes? KeyType { get; set; } - - public AasSubmodelElements? SmeType { get; set; } - - public AasElementSelfDescription(string aasElementName, string elementAbbreviation, - KeyTypes? keyType, AasSubmodelElements? smeType) - { - AasElementName = aasElementName; - ElementAbbreviation = elementAbbreviation; - KeyType = keyType; - SmeType = smeType; - } - } -} diff --git a/src/AasxCsharpLib_bkp/Extensions/ComparerUtils.cs b/src/AasxCsharpLib_bkp/Extensions/ComparerUtils.cs deleted file mode 100644 index 7becf56cb..000000000 --- a/src/AasxCsharpLib_bkp/Extensions/ComparerUtils.cs +++ /dev/null @@ -1,57 +0,0 @@ -using AasCore.Aas3_0_RC02; -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Extensions -{ - public class ComparerIdShort : IComparer - { - public int Compare(IReferable a, IReferable b) - { - return string.Compare(a?.IdShort, b?.IdShort, - CultureInfo.InvariantCulture, CompareOptions.IgnoreCase); - } - } - - public class ComparerIdentification : IComparer - { - public int Compare(IIdentifiable a, IIdentifiable b) - { - return string.Compare(a.Id, b.Id, - CultureInfo.InvariantCulture, CompareOptions.IgnoreCase | CompareOptions.IgnoreNonSpace); - } - } - - public class ComparerIndexed : IComparer - { - public int NullIndex = int.MaxValue; - public Dictionary Index = new(); - - public int Compare(IReferable a, IReferable b) - { - var ca = Index.ContainsKey(a); - var cb = Index.ContainsKey(b); - - if (!ca && !cb) - return 0; - // make CDs without usage to appear at end of list - if (!ca) - return +1; - if (!cb) - return -1; - - var ia = Index[a]; - var ib = Index[b]; - - if (ia == ib) - return 0; - if (ia < ib) - return -1; - return +1; - } - } -} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendAnnotatedRelationshipElement.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendAnnotatedRelationshipElement.cs deleted file mode 100644 index 0a9c9f212..000000000 --- a/src/AasxCsharpLib_bkp/Extensions/ExtendAnnotatedRelationshipElement.cs +++ /dev/null @@ -1,124 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using AasCore.Aas3_0_RC02; -using Extensions; -using AdminShellNS.Display; - -namespace Extensions -{ - public static class ExtendAnnotatedRelationshipElement - { - #region AasxPackageExplorer - - public static void Add(this AnnotatedRelationshipElement annotatedRelationshipElement, ISubmodelElement submodelElement) - { - if (annotatedRelationshipElement != null) - { - annotatedRelationshipElement.Annotations ??= new(); - - submodelElement.Parent = annotatedRelationshipElement; - - annotatedRelationshipElement.Annotations.Add((IDataElement)submodelElement); - } - } - - public static void Remove(this AnnotatedRelationshipElement annotatedRelationshipElement, ISubmodelElement submodelElement) - { - if(annotatedRelationshipElement != null) - { - if(annotatedRelationshipElement.Annotations != null) - { - annotatedRelationshipElement.Annotations.Remove((IDataElement)submodelElement); - } - } - } - - public static object AddChild(this AnnotatedRelationshipElement annotatedRelationshipElement, ISubmodelElement childSubmodelElement, EnumerationPlacmentBase placement = null) - { - if (childSubmodelElement == null || childSubmodelElement is not IDataElement) - return null; - - annotatedRelationshipElement.Annotations ??= new (); - - if (childSubmodelElement != null) - childSubmodelElement.Parent = annotatedRelationshipElement; - - annotatedRelationshipElement.Annotations.Add((IDataElement)childSubmodelElement); - return childSubmodelElement; - } - - #endregion - public static AnnotatedRelationshipElement ConvertAnnotationsFromV20(this AnnotatedRelationshipElement annotatedRelationshipElement, AasxCompatibilityModels.AdminShellV20.AnnotatedRelationshipElement sourceAnnotedRelElement) - { - if (sourceAnnotedRelElement == null) - { - return null; - } - - if (sourceAnnotedRelElement.annotations != null) - { - annotatedRelationshipElement.Annotations ??= new List(); - foreach (var submodelElementWrapper in sourceAnnotedRelElement.annotations) - { - var sourceSubmodelElement = submodelElementWrapper.submodelElement; - ISubmodelElement outputSubmodelElement = null; - if (sourceSubmodelElement != null) - { - outputSubmodelElement = outputSubmodelElement.ConvertFromV20(sourceSubmodelElement); - } - annotatedRelationshipElement.Annotations.Add((IDataElement)outputSubmodelElement); - } - } - - return annotatedRelationshipElement; - } - - public static T FindFirstIdShortAs(this AnnotatedRelationshipElement annotedRelationshipElement, string idShort) where T : ISubmodelElement - { - - var submodelElements = annotedRelationshipElement.Annotations.Where(sme => sme != null && sme is T && sme.IdShort.Equals(idShort, StringComparison.OrdinalIgnoreCase)); - - if (submodelElements.Any()) - { - return (T)submodelElements.First(); - } - - return default; - } - - public static AnnotatedRelationshipElement Set(this AnnotatedRelationshipElement elem, - Reference first, Reference second) - { - elem.First = first; - elem.Second = second; - return elem; - } - - public static AnnotatedRelationshipElement UpdateFrom( - this AnnotatedRelationshipElement elem, ISubmodelElement source) - { - if (source == null) - return elem; - - ((ISubmodelElement)elem).UpdateFrom(source); - - if (source is ReferenceElement srcRef) - { - if (srcRef.Value != null) - elem.First = srcRef.Value.Copy(); - } - - if (source is RelationshipElement srcRel) - { - if (srcRel.First != null) - elem.First = srcRel.First.Copy(); - } - - return elem; - } - - } -} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendAssetAdministrationShell.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendAssetAdministrationShell.cs deleted file mode 100644 index be4051ee3..000000000 --- a/src/AasxCsharpLib_bkp/Extensions/ExtendAssetAdministrationShell.cs +++ /dev/null @@ -1,242 +0,0 @@ -using AasCore.Aas3_0_RC02; -using AdminShellNS; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.CompilerServices; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading.Tasks; - -namespace Extensions -{ - public static class ExtendAssetAdministrationShell - { - #region AasxPackageExplorer - - public static Tuple ToCaptionInfo(this AssetAdministrationShell assetAdministrationShell) - { - var caption = AdminShellUtil.EvalToNonNullString("\"{0}\" ", assetAdministrationShell.IdShort, "\"AAS\""); - if (assetAdministrationShell.Administration != null) - caption += "V" + assetAdministrationShell.Administration.Version + "." + assetAdministrationShell.Administration.Revision; - - var info = ""; - if (assetAdministrationShell.Id != null) - info = $"[{assetAdministrationShell.Id}]"; - return Tuple.Create(caption, info); - } - - public static IEnumerable FindAllReferences(this AssetAdministrationShell assetAdministrationShell) - { - // Asset - //TODO:jtikekar support asset - //if (assetAdministrationShell.AssetInformation != null) - // yield return new LocatedReference(assetAdministrationShell, assetAdministrationShell.AssetInformation); - - // Submodel references - if (assetAdministrationShell.Submodels != null) - foreach (var r in assetAdministrationShell.Submodels) - yield return new LocatedReference(assetAdministrationShell, r); - - } - - #endregion - - public static bool HasSubmodelReference(this AssetAdministrationShell assetAdministrationShell, Reference submodelReference) - { - if (submodelReference == null) - { - return false; - } - - foreach (var aasSubmodelReference in assetAdministrationShell.Submodels) - { - if (aasSubmodelReference.Matches(submodelReference)) - { - return true; - } - } - - return false; - } - - public static void AddSubmodelReference(this AssetAdministrationShell assetAdministrationShell, Reference newSubmodelReference) - { - if (assetAdministrationShell.Submodels == null) - { - assetAdministrationShell.Submodels = new List(); - } - - assetAdministrationShell.Submodels.Add(newSubmodelReference); - } - - //TODO:jtikekar: Change the name, currently based on older implementation - public static string GetFriendlyName(this AssetAdministrationShell assetAdministrationShell) - { - if (string.IsNullOrEmpty(assetAdministrationShell.IdShort)) - { - return null; - } - - return Regex.Replace(assetAdministrationShell.IdShort, @"[^a-zA-Z0-9\-_]", "_"); - } - - public static AssetAdministrationShell ConvertFromV10(this AssetAdministrationShell assetAdministrationShell, AasxCompatibilityModels.AdminShellV10.AdministrationShell sourceAas) - { - if (sourceAas == null) - { - return null; - } - - if (string.IsNullOrEmpty(sourceAas.idShort)) - { - assetAdministrationShell.IdShort = ""; - } - else - { - assetAdministrationShell.IdShort = sourceAas.idShort; - } - - if (sourceAas.description != null) - { - assetAdministrationShell.Description = ExtensionsUtil.ConvertDescriptionFromV10(sourceAas.description); - } - - if (sourceAas.administration != null) - { - assetAdministrationShell.Administration = new AdministrativeInformation(version: sourceAas.administration.version, revision: sourceAas.administration.revision); - } - - if (sourceAas.derivedFrom != null) - { - var key = new Key(KeyTypes.AssetAdministrationShell, sourceAas.identification.id); - assetAdministrationShell.DerivedFrom = new Reference(ReferenceTypes.ModelReference, new List() { key }); - } - - if (sourceAas.submodelRefs != null || sourceAas.submodelRefs.Count != 0) - { - foreach (var submodelRef in sourceAas.submodelRefs) - { - var keyList = new List(); - foreach (var refKey in submodelRef.Keys) - { - //keyList.Add(new Key(ExtensionsUtil.GetKeyTypeFromString(refKey.type), refKey.value)); - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {refKey.type} not found."); - } - } - if (assetAdministrationShell.Submodels == null) - { - assetAdministrationShell.Submodels = new List(); - } - assetAdministrationShell.Submodels.Add(new Reference(ReferenceTypes.ModelReference, keyList)); - } - } - - if (sourceAas.hasDataSpecification != null) - { - //TODO: jtikekar : EmbeddedDataSpecification?? (as per old implementation) - if (assetAdministrationShell.EmbeddedDataSpecifications == null) - { - assetAdministrationShell.EmbeddedDataSpecifications = new List(); - } - foreach (var dataSpecification in sourceAas.hasDataSpecification.reference) - { - assetAdministrationShell.EmbeddedDataSpecifications.Add(new EmbeddedDataSpecification( - ExtensionsUtil.ConvertReferenceFromV10(dataSpecification, ReferenceTypes.GlobalReference), - null)); - } - } - - return assetAdministrationShell; - } - - public static AssetAdministrationShell ConvertFromV20(this AssetAdministrationShell assetAdministrationShell, AasxCompatibilityModels.AdminShellV20.AdministrationShell sourceAas) - { - if (sourceAas == null) - { - return null; - } - - if (string.IsNullOrEmpty(sourceAas.idShort)) - { - assetAdministrationShell.IdShort = ""; - } - else - { - assetAdministrationShell.IdShort = sourceAas.idShort; - } - - if (sourceAas.description != null) - { - assetAdministrationShell.Description = ExtensionsUtil.ConvertDescriptionFromV20(sourceAas.description); - } - - if (sourceAas.administration != null) - { - assetAdministrationShell.Administration = new AdministrativeInformation(version: sourceAas.administration.version, revision: sourceAas.administration.revision); - } - - if (sourceAas.derivedFrom != null) - { - var key = new Key(KeyTypes.AssetAdministrationShell, sourceAas.identification.id); - assetAdministrationShell.DerivedFrom = new Reference(ReferenceTypes.ModelReference, new List() { key }); - } - - if (sourceAas.submodelRefs != null || sourceAas.submodelRefs.Count != 0) - { - foreach (var submodelRef in sourceAas.submodelRefs) - { - var keyList = new List(); - foreach (var refKey in submodelRef.Keys) - { - //keyList.Add(new Key(ExtensionsUtil.GetKeyTypeFromString(refKey.type), refKey.value)); - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {refKey.type} not found."); - } - } - if (assetAdministrationShell.Submodels == null) - { - assetAdministrationShell.Submodels = new List(); - } - assetAdministrationShell.Submodels.Add(new Reference(ReferenceTypes.ModelReference, keyList)); - } - } - - if (sourceAas.hasDataSpecification != null) - { - //TODO: jtikekar : EmbeddedDataSpecification?? (as per old implementation) - if (assetAdministrationShell.EmbeddedDataSpecifications == null) - { - assetAdministrationShell.EmbeddedDataSpecifications = new List(); - } - - //TODO: jtikekar: DataSpecificationContent?? (as per old implementation) - foreach (var sourceDataSpec in sourceAas.hasDataSpecification) - { - if (sourceDataSpec.dataSpecification != null) - { - assetAdministrationShell.EmbeddedDataSpecifications.Add( - new EmbeddedDataSpecification( - ExtensionsUtil.ConvertReferenceFromV20(sourceDataSpec.dataSpecification, ReferenceTypes.GlobalReference), - null)); - } - } - } - - return assetAdministrationShell; - } - } -} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendAssetInformation.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendAssetInformation.cs deleted file mode 100644 index 41fb5b0c4..000000000 --- a/src/AasxCsharpLib_bkp/Extensions/ExtendAssetInformation.cs +++ /dev/null @@ -1,62 +0,0 @@ -using AasCore.Aas3_0_RC02; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Extensions -{ - public static class ExtendAssetInformation - { - #region AasxPackageExplorer - - public static Tuple ToCaptionInfo(this AssetInformation assetInformation) - { - //TODO:jtikekar support KeyType.AssetInformation - //var caption = Key.AssetInformation; - var caption = "AssetInformation"; - var info = "" + assetInformation.GlobalAssetId?.ToStringExtended(); - return Tuple.Create(caption, info); - } - - #endregion - public static AssetInformation ConvertFromV10(this AssetInformation assetInformation, AasxCompatibilityModels.AdminShellV10.Asset sourceAsset) - { - //Determine AssetKind - var assetKind = AssetKind.Instance; - if (sourceAsset.kind.IsType) - { - assetKind = AssetKind.Type; - } - - assetInformation.AssetKind = assetKind; - - - //Assign GlobalAssetId - var key = new Key(KeyTypes.GlobalReference, sourceAsset.identification.id); - assetInformation.GlobalAssetId = new Reference(ReferenceTypes.GlobalReference, new List { key }); - - return assetInformation; - } - - public static AssetInformation ConvertFromV20(this AssetInformation assetInformation, AasxCompatibilityModels.AdminShellV20.Asset sourceAsset) - { - //Determine AssetKind - var assetKind = AssetKind.Instance; - if (sourceAsset.kind.IsType) - { - assetKind = AssetKind.Type; - } - - assetInformation.AssetKind = assetKind; - - - //Assign GlobalAssetId - var key = new Key(KeyTypes.GlobalReference, sourceAsset.identification.id); - assetInformation.GlobalAssetId = new Reference(ReferenceTypes.GlobalReference, new List { key }); - - return assetInformation; - } - } -} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendBlob.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendBlob.cs deleted file mode 100644 index b49adce56..000000000 --- a/src/AasxCsharpLib_bkp/Extensions/ExtendBlob.cs +++ /dev/null @@ -1,69 +0,0 @@ -using AasCore.Aas3_0_RC02; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Extensions -{ - public static class ExtendBlob - { - public static void Set(this Blob blob, - string contentType = "", byte[]? value = null) - { - blob.ContentType = contentType; - blob.Value = value; - } - - public static Blob ConvertFromV10(this Blob blob, AasxCompatibilityModels.AdminShellV10.Blob sourceBlob) - { - blob.ContentType = sourceBlob.mimeType; - blob.Value = Encoding.ASCII.GetBytes(sourceBlob.value); - return blob; - } - - public static Blob ConvertFromV20(this Blob blob, AasxCompatibilityModels.AdminShellV20.Blob sourceBlob) - { - blob.ContentType = sourceBlob.mimeType; - blob.Value = Encoding.ASCII.GetBytes(sourceBlob.value); - return blob; - } - - public static Blob UpdateFrom(this Blob elem, ISubmodelElement source) - { - if (source == null) - return elem; - - ((ISubmodelElement)elem).UpdateFrom(source); - - if (source is Property srcProp) - { - if (srcProp.Value != null) - elem.Value = Encoding.Default.GetBytes(srcProp.Value); - } - - if (source is AasCore.Aas3_0_RC02.Range srcRng) - { - if (srcRng.Min != null) - elem.Value = Encoding.Default.GetBytes(srcRng.Min); - } - - if (source is MultiLanguageProperty srcMlp) - { - var s = srcMlp.Value?.GetDefaultString(); - if (s != null) - elem.Value = Encoding.Default.GetBytes(s); - } - - if (source is File srcFile) - { - if (srcFile.Value != null) - elem.Value = Encoding.Default.GetBytes(srcFile.Value); - } - - return elem; - } - - } -} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendConceptDescription.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendConceptDescription.cs deleted file mode 100644 index c7bc38ce9..000000000 --- a/src/AasxCsharpLib_bkp/Extensions/ExtendConceptDescription.cs +++ /dev/null @@ -1,299 +0,0 @@ -using AasCore.Aas3_0_RC02; -using AasxCompatibilityModels; -using AdminShellNS; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection.Metadata; -using System.Text; -using System.Threading.Tasks; - -namespace Extensions -{ - public static class ExtendConceptDescription - { - #region AasxPackageExplorer - - public static string GetDefaultPreferredName(this ConceptDescription conceptDescription,string defaultLang = null) - { - return "" + - conceptDescription.GetIEC61360()? - .PreferredName?.GetDefaultString(defaultLang); - } - - public static EmbeddedDataSpecification SetIEC61360Spec(this ConceptDescription conceptDescription, - string[] preferredNames = null, - string shortName = "", - string unit = "", - Reference unitId = null, - string valueFormat = null, - string sourceOfDefinition = null, - string symbol = null, - string dataType = "", - string[] definition = null - ) - { - var eds = new EmbeddedDataSpecification( - new Reference(ReferenceTypes.GlobalReference, - new List { ExtendIDataSpecificationContent.GetKeyForIec61360() }), - new DataSpecificationIec61360( - ExtendLangStringSet.CreateManyFromStringArray(preferredNames), - new List { new LangString("EN?", shortName)}, - unit, - unitId, - sourceOfDefinition, - symbol, - Stringification.DataTypeIec61360FromString(dataType), - ExtendLangStringSet.CreateManyFromStringArray(definition) - )); - - conceptDescription.EmbeddedDataSpecifications = new List { eds }; - - // TODO (MIHO, 2022-12-22): Check, but I think it makes no sense - // conceptDescription.IsCaseOf ??= new List(); - // conceptDescription.IsCaseOf.Add(new Reference(ReferenceTypes.ModelReference, new List() { new Key(KeyTypes.ConceptDescription, conceptDescription.Id) })); - - return eds; - } - - /* - - public static DataSpecificationIec61360 CreateDataSpecWithContentIec61360(this ConceptDescription conceptDescription) - { - var eds = EmbeddedDataSpecification.CreateIEC61360WithContent(); - conceptDescription.EmbeddedDataSpecification ??= new HasDataSpecification(); - conceptDescription.EmbeddedDataSpecification.Add(eds); - return eds.DataSpecificationContent?.DataSpecificationIEC61360; - } - - */ - - public static Tuple ToCaptionInfo(this ConceptDescription conceptDescription) - { - var caption = ""; - if (!string.IsNullOrEmpty(conceptDescription.IdShort)) - caption = $"\"{conceptDescription.IdShort.Trim()}\""; - if (conceptDescription.Id != null) - caption = (caption + " " + conceptDescription.Id).Trim(); - - var info = "" + conceptDescription.GetDefaultShortName(); - - return Tuple.Create(caption, info); - } - - public static string GetDefaultShortName(this ConceptDescription conceptDescription, string defaultLang = null) - { - return "" + - conceptDescription.GetIEC61360()? - .ShortName?.GetDefaultString(defaultLang); - } - - public static DataSpecificationIec61360 GetIEC61360(this ConceptDescription conceptDescription) - { - return conceptDescription.EmbeddedDataSpecifications?.GetIEC61360Content(); - } - - public static DataSpecificationPhysicalUnit GetPhysicalUnit(this ConceptDescription conceptDescription) - { - return conceptDescription.EmbeddedDataSpecifications?.GetPhysicalUnitContent(); - } - - public static IEnumerable FindAllReferences(this ConceptDescription conceptDescription) - { - yield break; - } - - #endregion - #region ListOfConceptDescription - public static ConceptDescription AddConceptDescriptionOrReturnExisting(this List conceptDescriptions, ConceptDescription newConceptDescription) - { - if(newConceptDescription == null) - { - return null; - } - if(conceptDescriptions != null) - { - var existingCd = conceptDescriptions.Where(c => c.Id == newConceptDescription.Id).First(); - if(existingCd != null) - { - return existingCd; - } - else - { - conceptDescriptions.Add(newConceptDescription); - } - } - - return newConceptDescription; - } - #endregion - - public static void Validate(this ConceptDescription conceptDescription,AasValidationRecordList results) - { - // access - if (results == null) - return; - - // check CD itself - //Handled by BaseValidation Method - //conceptDescription.Validate(results); - - // check IEC61360 spec - - //TODO:jtikekar Temporarily Removed - //var eds61360 = this.IEC61360DataSpec; - //if (eds61360 != null) - //{ - // // check data spec - // if (eds61360.dataSpecification == null || - // !(eds61360.dataSpecification.MatchesExactlyOneKey(DataSpecificationIEC61360.GetKey()))) - // results.Add(new AasValidationRecord( - // AasValidationSeverity.SpecViolation, this, - // "HasDataSpecification: data specification content set to IEC61360, but no " + - // "data specification reference set!", - // () => - // { - // eds61360.dataSpecification = new DataSpecificationRef( - // new Reference( - // DataSpecificationIEC61360.GetKey())); - // })); - - // // validate content - // if (eds61360.dataSpecificationContent?.dataSpecificationIEC61360 == null) - // { - // results.Add(new AasValidationRecord( - // AasValidationSeverity.SpecViolation, this, - // "HasDataSpecification: data specification reference set to IEC61360, but no " + - // "data specification content set!", - // () => - // { - // eds61360.dataSpecificationContent = new DataSpecificationContent(); - // eds61360.dataSpecificationContent.dataSpecificationIEC61360 = - // new DataSpecificationIEC61360(); - // })); - // } - // else - // { - // // validate - // eds61360.dataSpecificationContent.dataSpecificationIEC61360.Validate(results, this); - // } - } - - public static Key GetSingleKey(this ConceptDescription conceptDescription) - { - return new Key(KeyTypes.ConceptDescription, conceptDescription.Id); - } - public static ConceptDescription ConvertFromV10(this ConceptDescription conceptDescription, AasxCompatibilityModels.AdminShellV10.ConceptDescription sourceConceptDescription) - { - if (sourceConceptDescription == null) - { - return null; - } - - if (string.IsNullOrEmpty(sourceConceptDescription.idShort)) - { - conceptDescription.IdShort = ""; - } - else - { - conceptDescription.IdShort = sourceConceptDescription.idShort; - } - - if (sourceConceptDescription.description != null) - { - conceptDescription.Description = ExtensionsUtil.ConvertDescriptionFromV10(sourceConceptDescription.description); - } - - if (sourceConceptDescription.administration != null) - { - conceptDescription.Administration = new AdministrativeInformation(version: sourceConceptDescription.administration.version, revision: sourceConceptDescription.administration.revision); - } - - if (sourceConceptDescription.IsCaseOf != null && sourceConceptDescription.IsCaseOf.Count != 0) - { - if (conceptDescription.IsCaseOf == null) - { - conceptDescription.IsCaseOf = new List(); - } - foreach (var caseOf in sourceConceptDescription.IsCaseOf) - { - conceptDescription.IsCaseOf.Add(ExtensionsUtil.ConvertReferenceFromV10(caseOf, ReferenceTypes.ModelReference)); - } - } - - return conceptDescription; - } - - public static ConceptDescription ConvertFromV20(this ConceptDescription cd, AasxCompatibilityModels.AdminShellV20.ConceptDescription srcCD) - { - if (srcCD == null) - return null; - - if (string.IsNullOrEmpty(srcCD.idShort)) - cd.IdShort = ""; - else - cd.IdShort = srcCD.idShort; - - if (srcCD.identification?.id != null) - cd.Id = srcCD.identification.id; - - if (srcCD.description != null) - cd.Description = ExtensionsUtil.ConvertDescriptionFromV20(srcCD.description); - - if (srcCD.administration != null) - cd.Administration = new AdministrativeInformation( - version: srcCD.administration.version, revision: srcCD.administration.revision); - - if (srcCD.IsCaseOf != null && srcCD.IsCaseOf.Count != 0) - { - if (cd.IsCaseOf == null) - { - cd.IsCaseOf = new List(); - } - foreach (var caseOf in srcCD.IsCaseOf) - { - cd.IsCaseOf.Add(ExtensionsUtil.ConvertReferenceFromV20(caseOf, ReferenceTypes.ModelReference)); - } - } - - //jtikekar:as per old implementation - if(srcCD.embeddedDataSpecification != null) - { - foreach (var sourceEsd in srcCD.embeddedDataSpecification) - { - var esd = new EmbeddedDataSpecification(null, null); - esd.ConvertFromV20(sourceEsd); - cd.AddEmbeddedDataSpecification(esd); - } - } - - return cd; - } - - public static EmbeddedDataSpecification AddEmbeddedDataSpecification(this ConceptDescription cd, EmbeddedDataSpecification eds) - { - if (cd == null) - return null; - if (cd.EmbeddedDataSpecifications == null) - cd.EmbeddedDataSpecifications = new List(); - if (eds == null) - return null; - cd.EmbeddedDataSpecifications.Add(eds); - return eds; - } - - public static Reference GetCdReference(this ConceptDescription conceptDescription) - { - var key = new Key(KeyTypes.ConceptDescription, conceptDescription.Id); - return new Reference(ReferenceTypes.ModelReference, new List { key }); - } - - public static void AddIsCaseOf(this ConceptDescription cd, - Reference ico) - { - if (cd.IsCaseOf == null) - cd.IsCaseOf = new List(); - cd.IsCaseOf.Add(ico); - } - } -} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendDataElement.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendDataElement.cs deleted file mode 100644 index 299e3b350..000000000 --- a/src/AasxCsharpLib_bkp/Extensions/ExtendDataElement.cs +++ /dev/null @@ -1,19 +0,0 @@ -using AasCore.Aas3_0_RC02; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Extensions -{ - public static class ExtendDataElement - { - public static DataTypeDefXsd[] ValueTypes_Number = - new[] { DataTypeDefXsd.Decimal, DataTypeDefXsd.Double, DataTypeDefXsd.Float, - DataTypeDefXsd.Integer, DataTypeDefXsd.Long, DataTypeDefXsd.Int, DataTypeDefXsd.Short, - DataTypeDefXsd.Byte, DataTypeDefXsd.NonNegativeInteger, DataTypeDefXsd.NonPositiveInteger, - DataTypeDefXsd.UnsignedInt, DataTypeDefXsd.Integer, DataTypeDefXsd.UnsignedByte, - DataTypeDefXsd.UnsignedLong, DataTypeDefXsd.UnsignedShort, DataTypeDefXsd.NegativeInteger }; - } -} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendDataSpecificationIEC61360.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendDataSpecificationIEC61360.cs deleted file mode 100644 index 28da474ba..000000000 --- a/src/AasxCsharpLib_bkp/Extensions/ExtendDataSpecificationIEC61360.cs +++ /dev/null @@ -1,40 +0,0 @@ -using AasCore.Aas3_0_RC02; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Extensions -{ - public static class ExtendDataSpecificationIEC61360 - { - public static DataSpecificationIec61360 ConvertFromV20(this DataSpecificationIec61360 ds61360, AasxCompatibilityModels.AdminShellV20.DataSpecificationIEC61360 src616360) - { - if (src616360.preferredName != null) - ds61360.PreferredName = new List().ConvertFromV20(src616360.preferredName); - - if (src616360.shortName != null) - ds61360.ShortName = new List().ConvertFromV20(src616360.shortName); - - ds61360.Unit = src616360.unit; - if (src616360.unitId != null) - ds61360.UnitId = ExtensionsUtil.ConvertReferenceFromV20(AasxCompatibilityModels.AdminShellV20.Reference.CreateNew(src616360.unitId.keys), ReferenceTypes.GlobalReference); - - ds61360.ValueFormat = src616360.valueFormat; - ds61360.SourceOfDefinition = src616360.sourceOfDefinition; - ds61360.Symbol = src616360.symbol; - if (!(string.IsNullOrEmpty(src616360.dataType))) - { - var dt = src616360.dataType; - if (!dt.StartsWith("xs:")) - dt = "xs:" + dt; - ds61360.DataType = Stringification.DataTypeIec61360FromString(dt); - } - if (src616360.definition != null) - ds61360.Definition = new List().ConvertFromV20(src616360.definition); - - return ds61360; - } - } -} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendEmbeddedDataSpecification.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendEmbeddedDataSpecification.cs deleted file mode 100644 index e89dd5ad5..000000000 --- a/src/AasxCsharpLib_bkp/Extensions/ExtendEmbeddedDataSpecification.cs +++ /dev/null @@ -1,108 +0,0 @@ -using AasCore.Aas3_0_RC02; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -// using DataSpecificationContent = HasDataSpecification.DataSpecificationContent; - -namespace Extensions -{ - // TODO (Jui, 2022-12-21): I do not know, if to put the List<> extension here or in a separate file - public static class ExtendListOfEmbeddedDataSpecification - { - - - public static EmbeddedDataSpecification FindFirstIEC61360Spec(this List list) - { - foreach (var eds in list) - if (eds?.DataSpecificationContent is DataSpecificationIec61360 - || eds?.DataSpecification?.MatchesExactlyOneKey( - ExtendIDataSpecificationContent.GetKeyForIec61360()) == true) - return eds; - return null; - } - - public static DataSpecificationIec61360 GetIEC61360Content(this List list) - { - foreach (var eds in list) - if (eds?.DataSpecificationContent is DataSpecificationIec61360 dsiec) - return dsiec; - return null; - } - - public static DataSpecificationPhysicalUnit GetPhysicalUnitContent(this List list) - { - foreach (var eds in list) - if (eds?.DataSpecificationContent is DataSpecificationPhysicalUnit dspu) - return dspu; - return null; - } - } - - public static class ExtendEmbeddedDataSpecification - { - public static EmbeddedDataSpecification ConvertFromV20(this EmbeddedDataSpecification embeddedDataSpecification, AasxCompatibilityModels.AdminShellV20.EmbeddedDataSpecification sourceEmbeddedSpec) - { - if(sourceEmbeddedSpec != null) - { - embeddedDataSpecification.DataSpecification = ExtensionsUtil.ConvertReferenceFromV20(sourceEmbeddedSpec.dataSpecification, ReferenceTypes.GlobalReference); - - // TODO (MIHO, 2022-19-12): check again, see questions - var o2id = "http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360"; - var oldid = "http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/2/0"; - var newid = "http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"; - - if (sourceEmbeddedSpec.dataSpecification?.Matches("", false, "IRI", oldid, - AasxCompatibilityModels.AdminShellV20.Key.MatchMode.Identification) == true) - { - embeddedDataSpecification.DataSpecification.Keys[0].Value = newid; - } - - if (sourceEmbeddedSpec.dataSpecification?.Matches("", false, "IRI", o2id, - AasxCompatibilityModels.AdminShellV20.Key.MatchMode.Identification) == true) - { - embeddedDataSpecification.DataSpecification.Keys[0].Value = newid; - } - } - - if(sourceEmbeddedSpec.dataSpecificationContent?.dataSpecificationIEC61360 != null) - { - embeddedDataSpecification.DataSpecificationContent = - new DataSpecificationIec61360(null).ConvertFromV20( - sourceEmbeddedSpec.dataSpecificationContent.dataSpecificationIEC61360); - } - return embeddedDataSpecification; - } - - public static EmbeddedDataSpecification CreateIec61360WithContent(DataSpecificationIec61360 content = null) - { - if (content == null) - content = new DataSpecificationIec61360(null); - - var res = new EmbeddedDataSpecification( - new Reference(ReferenceTypes.GlobalReference, - new List( new[] { ExtendIDataSpecificationContent.GetKeyForIec61360() })), - content); - return res; - } - - public static bool FixReferenceWrtContent(this EmbeddedDataSpecification eds) - { - // does content tell something? - var ctc = ExtendIDataSpecificationContent.GuessContentTypeFor(eds?.DataSpecificationContent); - var ctr = ExtendIDataSpecificationContent.GuessContentTypeFor(eds?.DataSpecification); - - if (ctc == ExtendIDataSpecificationContent.ContentTypes.NoInfo) - return false; - - if (ctr == ctc) - return false; - - // ok, fix - eds.DataSpecification = new Reference(ReferenceTypes.GlobalReference, - new List { ExtendIDataSpecificationContent.GetKeyFor(ctc) }); - return true; - } - } -} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendEntity.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendEntity.cs deleted file mode 100644 index 4b520e1cf..000000000 --- a/src/AasxCsharpLib_bkp/Extensions/ExtendEntity.cs +++ /dev/null @@ -1,108 +0,0 @@ -using AasCore.Aas3_0_RC02; -using AdminShellNS.Display; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Extensions -{ - public static class ExtendEntity - { - #region AasxPackageExplorer - - public static void Add(this Entity entity, ISubmodelElement submodelElement) - { - if (entity != null) - { - entity.Statements ??= new(); - - submodelElement.Parent = entity; - - entity.Statements.Add(submodelElement); - } - } - - public static void Remove(this Entity entity, ISubmodelElement submodelElement) - { - if(entity != null) - { - if(entity.Statements != null) - { - entity.Statements.Remove(submodelElement); - } - } - } - - public static object AddChild(this Entity entity, ISubmodelElement childSubmodelElement, EnumerationPlacmentBase placement = null) - { - if (childSubmodelElement == null) - return null; - if (entity.Statements == null) - entity.Statements = new (); - if (childSubmodelElement != null) - childSubmodelElement.Parent = entity; - entity.Statements.Add(childSubmodelElement); - return childSubmodelElement; - } - - #endregion - public static Entity ConvertFromV20(this Entity entity, AasxCompatibilityModels.AdminShellV20.Entity sourceEntity) - { - if (sourceEntity == null) - { - return null; - } - - if (sourceEntity.statements != null) - { - entity.Statements ??= new List(); - foreach (var submodelElementWrapper in sourceEntity.statements) - { - var sourceSubmodelElement = submodelElementWrapper.submodelElement; - ISubmodelElement outputSubmodelElement = null; - if (sourceSubmodelElement != null) - { - outputSubmodelElement = outputSubmodelElement.ConvertFromV20(sourceSubmodelElement); - } - entity.Statements.Add(outputSubmodelElement); - } - } - - if (sourceEntity.assetRef != null) - { - //TODO:jtikekar whether to convert to Global or specific asset id - var assetRef = ExtensionsUtil.ConvertReferenceFromV20(sourceEntity.assetRef, ReferenceTypes.GlobalReference); - entity.GlobalAssetId = assetRef; - } - - return entity; - } - - public static T FindFirstIdShortAs(this Entity entity, string idShort) where T : ISubmodelElement - { - - var submodelElements = entity.Statements.Where(sme => (sme != null) && (sme is T) && sme.IdShort.Equals(idShort, StringComparison.OrdinalIgnoreCase)); - - if (submodelElements.Any()) - { - return (T)submodelElements.First(); - } - - return default; - } - - public static T CreateSMEForCD( - this Entity ent, - ConceptDescription conceptDescription, string category = null, string idShort = null, - string idxTemplate = null, int maxNum = 999, bool addSme = false, bool isTemplate = false) - where T : ISubmodelElement - { - if (ent.Statements == null) - ent.Statements = new List(); - return ent.Statements.CreateSMEForCD( - conceptDescription, category, idShort, idxTemplate, maxNum, addSme, isTemplate); - } - } -} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendEnvironment.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendEnvironment.cs deleted file mode 100644 index 1dc5111e5..000000000 --- a/src/AasxCsharpLib_bkp/Extensions/ExtendEnvironment.cs +++ /dev/null @@ -1,1052 +0,0 @@ -using AasCore.Aas3_0_RC02; -using Extensions; -using AdminShellNS; -using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Runtime.CompilerServices; - -namespace Extensions -{ - public static class ExtendEnvironment - { - #region Environment - - #region AasxPackageExplorer - - public static void RecurseOnReferables(this AasCore.Aas3_0_RC02.Environment environment, - object state, Func, IReferable, bool> lambda, bool includeThis = false) - { - // includeThis does not make sense, as no Referable - // just use the others - foreach (var idf in environment.FindAllReferable(onlyIdentifiables: true)) - idf?.RecurseOnReferables(state, lambda, includeThis); - } - - #endregion - - public static AasValidationRecordList ValidateAll(this AasCore.Aas3_0_RC02.Environment environment) - { - // collect results - var results = new AasValidationRecordList(); - - // all entities - foreach (var rf in environment.FindAllReferable()) - rf.Validate(results); - - // give back - return results; - } - - public static int AutoFix(this AasCore.Aas3_0_RC02.Environment environment, IEnumerable records) - { - // access - if (records == null) - return -1; - - // collect Referables (expensive safety measure) - var allowedReferables = environment.FindAllReferable().ToList(); - - // go thru records - int res = 0; - foreach (var rec in records) - { - // access - if (rec == null || rec.Fix == null || rec.Source == null) - continue; - - // minimal safety measure - if (!allowedReferables.Contains(rec.Source)) - continue; - - // apply fix - res++; - try - { - rec.Fix.Invoke(); - } - catch - { - res--; - } - } - - // return number of applied fixes - return res; - } - - public static IEnumerable FindAllReferable(this AasCore.Aas3_0_RC02.Environment environment, bool onlyIdentifiables = false) - { - if (environment.AssetAdministrationShells != null) - foreach (var aas in environment.AssetAdministrationShells) - if (aas != null) - { - // AAS itself - yield return aas; - } - - if (environment.Submodels != null) - foreach (var sm in environment.Submodels) - if (sm != null) - { - yield return sm; - - if (!onlyIdentifiables) - { - // TODO (MIHO, 2020-08-26): not very elegant, yet. Avoid temporary collection - var allsme = new List(); - sm.RecurseOnSubmodelElements(null, (state, parents, sme) => - { - allsme.Add(sme); return true; - }); - foreach (var sme in allsme) - yield return sme; - } - } - - if (environment.ConceptDescriptions != null) - foreach (var cd in environment.ConceptDescriptions) - if (cd != null) - yield return cd; - } - -#if !DoNotUseAasxCompatibilityModels - - public static AasCore.Aas3_0_RC02.Environment ConvertFromV10(this AasCore.Aas3_0_RC02.Environment environment, AasxCompatibilityModels.AdminShellV10.AdministrationShellEnv sourceEnvironement) - { - //Convert Administration Shells - if (sourceEnvironement.AdministrationShells != null) - { - if (environment.AssetAdministrationShells == null) - { - environment.AssetAdministrationShells = new List(); - } - foreach (var sourceAas in sourceEnvironement.AdministrationShells) - { - var sourceAsset = sourceEnvironement?.FindAsset(sourceAas.assetRef); - if (sourceAsset != null) - { - var newAssetInformation = new AssetInformation(AssetKind.Instance); - newAssetInformation = newAssetInformation.ConvertFromV10(sourceAsset); - - var newAas = new AssetAdministrationShell(id: sourceAas.identification.id, newAssetInformation); - newAas = newAas.ConvertFromV10(sourceAas); - - environment.AssetAdministrationShells.Add(newAas); - } - - } - } - - //Convert Submodels - if (sourceEnvironement.Submodels != null) - { - if (environment.Submodels == null) - { - environment.Submodels = new List(); - } - foreach (var sourceSubmodel in sourceEnvironement.Submodels) - { - var newSubmodel = new Submodel(sourceSubmodel.identification.id); - newSubmodel = newSubmodel.ConvertFromV10(sourceSubmodel); - environment.Submodels.Add(newSubmodel); - } - } - - if (sourceEnvironement.ConceptDescriptions != null) - { - if (environment.ConceptDescriptions == null) - { - environment.ConceptDescriptions = new List(); - } - foreach (var sourceConceptDescription in sourceEnvironement.ConceptDescriptions) - { - var newConceptDescription = new ConceptDescription(sourceConceptDescription.identification.id); - newConceptDescription = newConceptDescription.ConvertFromV10(sourceConceptDescription); - environment.ConceptDescriptions.Add(newConceptDescription); - } - } - - return environment; - } - - - public static AasCore.Aas3_0_RC02.Environment ConvertFromV20(this AasCore.Aas3_0_RC02.Environment environment, AasxCompatibilityModels.AdminShellV20.AdministrationShellEnv sourceEnvironement) - { - //Convert Administration Shells - if (sourceEnvironement.AdministrationShells != null) - { - if (environment.AssetAdministrationShells == null) - { - environment.AssetAdministrationShells = new List(); - } - foreach (var sourceAas in sourceEnvironement.AdministrationShells) - { - // first make the AAS - var newAas = new AssetAdministrationShell(id: sourceAas.identification.id, null); - newAas = newAas.ConvertFromV20(sourceAas); - environment.AssetAdministrationShells.Add(newAas); - - var sourceAsset = sourceEnvironement?.FindAsset(sourceAas.assetRef); - if (sourceAsset != null) - { - var newAssetInformation = new AssetInformation(AssetKind.Instance); - newAssetInformation = newAssetInformation.ConvertFromV20(sourceAsset); - newAas.AssetInformation = newAssetInformation; - } - - } - } - - //Convert Submodels - if (sourceEnvironement.Submodels != null) - { - if (environment.Submodels == null) - { - environment.Submodels = new List(); - } - foreach (var sourceSubmodel in sourceEnvironement.Submodels) - { - var newSubmodel = new Submodel(sourceSubmodel.identification.id); - newSubmodel = newSubmodel.ConvertFromV20(sourceSubmodel); - environment.Submodels.Add(newSubmodel); - } - } - - if (sourceEnvironement.ConceptDescriptions != null) - { - if (environment.ConceptDescriptions == null) - { - environment.ConceptDescriptions = new List(); - } - foreach (var sourceConceptDescription in sourceEnvironement.ConceptDescriptions) - { - var newConceptDescription = new ConceptDescription(sourceConceptDescription.identification.id); - newConceptDescription = newConceptDescription.ConvertFromV20(sourceConceptDescription); - environment.ConceptDescriptions.Add(newConceptDescription); - } - } - - return environment; - } - -#endif - - //TODO:jtikekar to test - public static AasCore.Aas3_0_RC02.Environment CreateFromExistingEnvironment(this AasCore.Aas3_0_RC02.Environment environment, AasCore.Aas3_0_RC02.Environment sourceEnvironment, List filterForAas = null, List filterForAssets = null, List filterForSubmodel = null, List filterForConceptDescriptions = null) - { - if (filterForAas == null) - { - filterForAas = new List(); - } - - if (filterForAssets == null) - { - filterForAssets = new List(); - } - - if (filterForSubmodel == null) - { - filterForSubmodel = new List(); - } - - if (filterForConceptDescriptions == null) - { - filterForConceptDescriptions = new List(); - } - - //var outputEnvironment = new AasCore.Aas3_0_RC02.Environment(); - - //Copy AssetAdministrationShells - foreach (var aas in sourceEnvironment.AssetAdministrationShells) - { - if (filterForAas.Contains(aas)) - { - environment.AssetAdministrationShells.Add(aas); - - if (aas.Submodels != null && aas.Submodels.Count > 0) - { - foreach (var submodelReference in aas.Submodels) - { - var submodel = sourceEnvironment.FindSubmodel(submodelReference); - if (submodel != null) - { - filterForSubmodel.Add(submodel); - } - } - } - } - } - - //Copy Submodel - foreach (var submodel in sourceEnvironment.Submodels) - { - if (filterForSubmodel.Contains(submodel)) - { - environment.Submodels.Add(submodel); - - //Find Used CDs - environment.CreateFromExistingEnvRecurseForCDs(sourceEnvironment, submodel.SubmodelElements, ref filterForConceptDescriptions); - } - } - - //Copy ConceptDescription - foreach (var conceptDescription in sourceEnvironment.ConceptDescriptions) - { - if (filterForConceptDescriptions.Contains(conceptDescription)) - { - environment.ConceptDescriptions.Add(conceptDescription); - } - } - - return environment; - - } - - public static void CreateFromExistingEnvRecurseForCDs(this AasCore.Aas3_0_RC02.Environment environment, AasCore.Aas3_0_RC02.Environment sourceEnvironment, List submodelElements, ref List filterForConceptDescription) - { - if (submodelElements == null || submodelElements.Count == 0 || filterForConceptDescription == null || filterForConceptDescription.Count == 0) - { - return; - } - - foreach (var submodelElement in submodelElements) - { - if (submodelElement == null) - { - return; - } - - if (submodelElement.SemanticId != null) - { - var conceptDescription = sourceEnvironment.FindConceptDescriptionByReference(submodelElement.SemanticId); - if (conceptDescription != null) - { - filterForConceptDescription.Add(conceptDescription); - } - } - - if (submodelElement is SubmodelElementCollection smeColl) - { - environment.CreateFromExistingEnvRecurseForCDs(sourceEnvironment, smeColl.Value, ref filterForConceptDescription); - } - - if (submodelElement is SubmodelElementList smeList) - { - environment.CreateFromExistingEnvRecurseForCDs(sourceEnvironment, smeList.Value, ref filterForConceptDescription); - } - - if (submodelElement is Entity entity) - { - environment.CreateFromExistingEnvRecurseForCDs(sourceEnvironment, entity.Statements, ref filterForConceptDescription); - } - - if (submodelElement is AnnotatedRelationshipElement annotatedRelationshipElement) - { - var annotedELements = new List(); - foreach (var annotation in annotatedRelationshipElement.Annotations) - { - annotedELements.Add(annotation); - } - environment.CreateFromExistingEnvRecurseForCDs(sourceEnvironment, annotedELements, ref filterForConceptDescription); - } - - if (submodelElement is Operation operation) - { - var operationELements = new List(); - foreach (var inputVariable in operation.InputVariables) - { - operationELements.Add(inputVariable.Value); - } - - foreach (var outputVariable in operation.OutputVariables) - { - operationELements.Add(outputVariable.Value); - } - - foreach (var inOutVariable in operation.InoutputVariables) - { - operationELements.Add(inOutVariable.Value); - } - - environment.CreateFromExistingEnvRecurseForCDs(sourceEnvironment, operationELements, ref filterForConceptDescription); - - } - } - } - - public static ConceptDescription Add(this AasCore.Aas3_0_RC02.Environment env, ConceptDescription cd) - { - if (cd == null) - return null; - if (env.ConceptDescriptions == null) - env.ConceptDescriptions = new(); - env.ConceptDescriptions.Add(cd); - return cd; - } - - public static Submodel Add(this AasCore.Aas3_0_RC02.Environment env, Submodel sm) - { - if (sm == null) - return null; - if (env.Submodels == null) - env.Submodels = new(); - env.Submodels.Add(sm); - return sm; - } - - public static AssetAdministrationShell Add(this AasCore.Aas3_0_RC02.Environment env, AssetAdministrationShell aas) - { - if (aas == null) - return null; - if (env.AssetAdministrationShells == null) - env.AssetAdministrationShells = new(); - env.AssetAdministrationShells.Add(aas); - return aas; - } - - //public static JsonWriter SerialiazeJsonToStream(this AasCore.Aas3_0_RC02.Environment environment, StreamWriter streamWriter, bool leaveJsonWriterOpen = false) - //{ - // streamWriter.AutoFlush = true; - - // JsonSerializer serializer = new JsonSerializer() - // { - // NullValueHandling = NullValueHandling.Ignore, - // ReferenceLoopHandling = ReferenceLoopHandling.Serialize, - // Formatting = Newtonsoft.Json.Formatting.Indented - // }; - - // JsonWriter writer = new JsonTextWriter(streamWriter); - // serializer.Serialize(writer, environment); - // if (leaveJsonWriterOpen) - // return writer; - // writer.Close(); - // return null; - //} - - - #endregion - - #region Submodel Queries - - public static IEnumerable FindAllSubmodelGroupedByAAS(this AasCore.Aas3_0_RC02.Environment environment, Func p = null) - { - if (environment.AssetAdministrationShells == null || environment.Submodels == null) - yield break; - foreach (var aas in environment.AssetAdministrationShells) - { - if (aas?.Submodels == null) - continue; - foreach (var smref in aas.Submodels) - { - var sm = environment.FindSubmodel(smref); - if (sm != null && (p == null || p(aas, sm))) - yield return sm; - } - } - } - public static Submodel FindSubmodel(this AasCore.Aas3_0_RC02.Environment environment, Reference submodelReference) - { - if (submodelReference == null) - { - return null; - } - - if (submodelReference.Keys.Count != 1) // Can have only one reference key - { - return null; - } - - var key = submodelReference.Keys[0]; - if (key.Type != KeyTypes.Submodel) - { - return null; - } - - var submodels = environment.Submodels.Where(s => s.Id.Equals(key.Value, StringComparison.OrdinalIgnoreCase)); - if (submodels.Any()) - { - return submodels.First(); - } - - return null; - } - - public static Submodel FindSubmodelById(this AasCore.Aas3_0_RC02.Environment environment, string submodelId) - { - if (string.IsNullOrEmpty(submodelId)) - { - return null; - } - - var submodels = environment.Submodels.Where(s => s.Id.Equals(submodelId)); - if (submodels.Any()) - { - return submodels.First(); - } - - return null; - } - - public static IEnumerable FindAllSubmodelsGroupedByAAS(this AasCore.Aas3_0_RC02.Environment environment, Func p = null) - { - if (environment.AssetAdministrationShells == null || environment.Submodels == null) - yield break; - foreach (var aas in environment.AssetAdministrationShells) - { - if (aas?.Submodels == null) - continue; - foreach (var submodelReference in aas.Submodels) - { - var submodel = environment.FindSubmodel(submodelReference); - if (submodel != null && (p == null || p(aas, submodel))) - yield return submodel; - } - } - } - - public static IEnumerable FindAllSubmodelBySemanticId(this AasCore.Aas3_0_RC02.Environment environment, string semanticId) - { - if (semanticId == null) - yield break; - - foreach (var submodel in environment.Submodels) - if (true == submodel.SemanticId?.Matches(semanticId)) - yield return submodel; - } - - #endregion - - #region AssetAdministrationShell Queries - public static AssetAdministrationShell FindAasWithSubmodelId(this AasCore.Aas3_0_RC02.Environment environment, string submodelId) - { - if (submodelId == null) - { - return null; - } - - var aas = environment.AssetAdministrationShells.Where(a => (a.Submodels?.Where(s => s.Matches(submodelId)).First()) != null).First(); - - return aas; - } - - public static AssetAdministrationShell FindAasById(this AasCore.Aas3_0_RC02.Environment environment, string aasId) - { - if (string.IsNullOrEmpty(aasId)) - { - return null; - } - - var aas = environment.AssetAdministrationShells.Where(a => a.Id.Equals(aasId)).First(); - - return aas; - } - - #endregion - - #region ConceptDescription Queries - - public static ConceptDescription FindConceptDescriptionById( - this AasCore.Aas3_0_RC02.Environment env, string cdId) - { - if (string.IsNullOrEmpty(cdId)) - return null; - - var conceptDescription = env.ConceptDescriptions.Where(c => c.Id.Equals(cdId)).FirstOrDefault(); - return conceptDescription; - } - - public static ConceptDescription FindConceptDescriptionByReference( - this AasCore.Aas3_0_RC02.Environment env, Reference rf) - { - if (rf == null) - return null; - - return env.FindConceptDescriptionById(rf.GetAsIdentifier()); - } - - #endregion - - #region Referable Queries - - /// - /// Result of FindReferable in Environment - /// - public class ReferableRootInfo - { - public AssetAdministrationShell AAS = null; - public AssetInformation Asset = null; - public Submodel Submodel = null; - public ConceptDescription CD = null; - - public int NrOfRootKeys = 0; - - public bool IsValid - { - get - { - return NrOfRootKeys > 0 && (AAS != null || Submodel != null || Asset != null); - } - } - } - - //TODO: jtikekar Need to test - public static IReferable FindReferableByReference( - this AasCore.Aas3_0_RC02.Environment environment, - Reference reference, - int keyIndex = 0, - List submodelElementList = null, - ReferableRootInfo rootInfo = null) - { - // access - var keyList = reference?.Keys; - if (keyList == null || keyList.Count == 0 || keyIndex >= keyList.Count) - return null; - - // shortcuts - var firstKeyType = keyList[keyIndex].Type; - var firstKeyId = keyList[keyIndex].Value; - - // different pathes - switch (firstKeyType) - { - case KeyTypes.AssetAdministrationShell: - { - var aas = environment.FindAasById(firstKeyId); - - // side info? - if (rootInfo != null) - { - rootInfo.AAS = aas; - rootInfo.NrOfRootKeys = 1 + keyIndex; - } - - //Not found or already at the end of our search - if (aas == null || keyIndex >= keyList.Count - 1) - { - return aas; - } - - return environment.FindReferableByReference(reference, ++keyIndex); - } - - // TODO (MIHO, 2023-01-01): stupid generalization :-( - case KeyTypes.GlobalReference: - case KeyTypes.ConceptDescription: - { - // In meta model V3, multiple important things might by identified - // by a flat GlobalReference :-( - - // find an Asset by that id? - var keyedAas = environment.FindAasWithAssetInformation(firstKeyId); - if (keyedAas?.AssetInformation != null) - { - // found an Asset - - // side info? - if (rootInfo != null) - { - rootInfo.AAS = keyedAas; - rootInfo.Asset = keyedAas?.AssetInformation; - rootInfo.NrOfRootKeys = 1 + keyIndex; - } - - // give back the AAS - return keyedAas; - } - - // Concept?Description - var keyedCd = environment.FindConceptDescriptionById(firstKeyId); - if (keyedCd != null) - { - // side info? - if (rootInfo != null) - { - rootInfo.CD = keyedCd; - rootInfo.NrOfRootKeys = 1 + keyIndex; - } - - // give back the CD - return keyedCd; - } - - // Nope - return null; - } - - case KeyTypes.Submodel: - { - var submodel = environment.FindSubmodelById(firstKeyId); - // No? - if (submodel == null) - return null; - - // notice in side info - if (rootInfo != null) - { - rootInfo.Submodel = submodel; - rootInfo.NrOfRootKeys = 1 + keyIndex; - - // add even more info - if (rootInfo.AAS == null) - { - foreach (var aas2 in environment.AssetAdministrationShells) - { - var smref2 = environment.FindSubmodelById(submodel.Id); - if (smref2 != null) - { - rootInfo.AAS = aas2; - break; - } - } - } - } - - // at the end of the journey? - if (keyIndex >= keyList.Count - 1) - return submodel; - - return environment.FindReferableByReference(reference, ++keyIndex, submodel.SubmodelElements); - } - } - - if (firstKeyType.IsSME() && submodelElementList != null) - { - var submodelElement = submodelElementList.Where( - sme => sme.IdShort.Equals(keyList[keyIndex].Value, - StringComparison.OrdinalIgnoreCase)).First(); - - //This is required element - if (keyIndex + 1 >= keyList.Count) - { - return submodelElement; - } - - //Recurse again - if (submodelElement != null && submodelElement is SubmodelElementCollection smeColl) - { - return environment.FindReferableByReference(reference, ++keyIndex, smeColl.Value); - } - - if (submodelElement != null && submodelElement is SubmodelElementList smeList) - { - return environment.FindReferableByReference(reference, ++keyIndex, smeList.Value); - } - } - - //Nothing in this environment - return null; - } - - #endregion - - #region AasxPackageExplorer - - public static IEnumerable FindAllSubmodelElements(this AasCore.Aas3_0_RC02.Environment environment, - Predicate match = null, AssetAdministrationShell onlyForAAS = null) where T : ISubmodelElement - { - // more or less two different schemes - if (onlyForAAS != null) - { - if (onlyForAAS.Submodels == null) - yield break; - foreach (var smr in onlyForAAS.Submodels) - { - var sm = environment.FindSubmodel(smr); - if (sm?.SubmodelElements != null) - foreach (var x in sm.SubmodelElements.FindDeep(match)) - yield return x; - } - } - else - { - if (environment.Submodels != null) - foreach (var sm in environment.Submodels) - if (sm?.SubmodelElements != null) - foreach (var x in sm.SubmodelElements.FindDeep(match)) - yield return x; - } - } - - public static IEnumerable FindAllReferences(this AasCore.Aas3_0_RC02.Environment environment) - { - if (environment.AssetAdministrationShells != null) - foreach (var aas in environment.AssetAdministrationShells) - if (aas != null) - foreach (var r in aas.FindAllReferences()) - yield return r; - - //if (this.Assets != null) - // foreach (var asset in this.Assets) - // if (asset != null) - // foreach (var r in asset.FindAllReferences()) - // yield return new LocatedReference(asset, r); - - if (environment.Submodels != null) - foreach (var sm in environment.Submodels) - if (sm != null) - foreach (var r in sm.FindAllReferences()) - yield return r; - - if (environment.ConceptDescriptions != null) - foreach (var cd in environment.ConceptDescriptions) - if (cd != null) - foreach (var r in cd.FindAllReferences()) - yield return new LocatedReference(cd, r); - } - - /// - /// Tries renaming an Identifiable, specifically: the identification of an Identifiable and - /// all references to it. - /// Currently supported: ConceptDescriptions - /// Returns a list of Referables, which were changed or null in case of error - /// - public static List RenameIdentifiable(this AasCore.Aas3_0_RC02.Environment environment, string oldId, string newId) - where T : IClass - { - // access - if (oldId == null || newId == null || oldId.Equals(newId)) - return null; - - var res = new List(); - - if (typeof(T) == typeof(ConceptDescription)) - { - // check, if exist or not exist - var cdOld = environment.FindConceptDescriptionById(oldId); - if (cdOld == null || environment.FindConceptDescriptionById(newId) != null) - return null; - - // rename old cd - cdOld.Id = newId; - res.Add(cdOld); - - // search all SMEs referring to this CD - foreach (var sme in environment.FindAllSubmodelElements(match: (s) => - { - return (s != null && s.SemanticId != null && s.SemanticId.Matches(oldId)); - })) - { - sme.SemanticId.Keys[0].Value = newId; - res.Add(sme); - } - - // seems fine - return res; - } - else - if (typeof(T) == typeof(Submodel)) - { - // check, if exist or not exist - var smOld = environment.FindSubmodelById(oldId); - if (smOld == null || environment.FindSubmodelById(newId) != null) - return null; - - // recurse all possible Referenes in the aas env - foreach (var lr in environment.FindAllReferences()) - { - var r = lr?.Reference; - if (r != null) - for (int i = 0; i < r.Keys.Count; i++) - if (r.Keys[i].Matches(KeyTypes.Submodel, oldId, MatchMode.Relaxed)) - { - // directly replace - r.Keys[i].Value = newId; - if (res.Contains(lr.Identifiable)) - res.Add(lr.Identifiable); - } - } - - // rename old Submodel - smOld.Id = newId; - - // seems fine - return res; - } - else - if (typeof(T) == typeof(AssetAdministrationShell)) - { - // check, if exist or not exist - var aasOld = environment.FindAasById(oldId); - if (aasOld == null || environment.FindAasById(newId) != null) - return null; - - // recurse? -> no? - - // rename old Asset - aasOld.Id = newId; - - // seems fine - return res; - } - else - //TODO:jtikekar support asset - if (typeof(T) == typeof(AssetInformation)) - { - // check, if exist or not exist - var assetOld = environment.FindAasWithAssetInformation(oldId); - if (assetOld == null || environment.FindAasWithAssetInformation(newId) != null) - return null; - - // recurse all possible Referenes in the aas env - foreach (var lr in environment.FindAllReferences()) - { - var r = lr?.Reference; - if (r != null) - for (int i = 0; i < r.Keys.Count; i++) - if (r.Keys[i].Matches(KeyTypes.GlobalReference, oldId)) - { - // directly replace - r.Keys[i].Value = newId; - if (res.Contains(lr.Identifiable)) - res.Add(lr.Identifiable); - } - } - - // rename old Asset - assetOld.AssetInformation.GlobalAssetId = new Reference(ReferenceTypes.GlobalReference, new List() { new Key(KeyTypes.GlobalReference, newId)}); - - // seems fine - return res; - } - - // no result is false, as well - return null; - } - - public static AssetAdministrationShell FindAasWithAssetInformation(this AasCore.Aas3_0_RC02.Environment environment, string globalAssetId) - { - if(string.IsNullOrEmpty(globalAssetId)) - { - return null; - } - - foreach(var aas in environment.AssetAdministrationShells) - { - if(aas.AssetInformation.GlobalAssetId.GetAsIdentifier().Equals(globalAssetId)) - { - return aas; - } - } - - return null; - } - - public static ComparerIndexed CreateIndexedComparerCdsForSmUsage(this AasCore.Aas3_0_RC02.Environment environment) - { - var cmp = new ComparerIndexed(); - int nr = 0; - foreach (var sm in environment.FindAllSubmodelGroupedByAAS()) - foreach (var sme in sm.FindDeep()) - { - if (sme.SemanticId == null) - continue; - var cd = environment.FindConceptDescriptionByReference(sme.SemanticId); - if (cd == null) - continue; - if (cmp.Index.ContainsKey(cd)) - continue; - cmp.Index[cd] = nr++; - } - return cmp; - } - - public static ISubmodelElement CopySubmodelElementAndCD(this AasCore.Aas3_0_RC02.Environment environment, - AasCore.Aas3_0_RC02.Environment srcEnv, ISubmodelElement srcElem, bool copyCD = false, bool shallowCopy = false) - { - // access - if (srcEnv == null || srcElem == null) - return null; - - // 1st result pretty easy (calling function will add this to the appropriate Submodel) - var res = srcElem.Copy(); - - // copy the CDs.. - if (copyCD) - environment.CopyConceptDescriptionsFrom(srcEnv, srcElem, shallowCopy); - - // give back - return res; - } - - public static Reference CopySubmodelRefAndCD( this AasCore.Aas3_0_RC02.Environment environment, - AasCore.Aas3_0_RC02.Environment srcEnv, Reference srcSubRef, bool copySubmodel = false, bool copyCD = false, - bool shallowCopy = false) - { - // access - if (srcEnv == null || srcSubRef == null) - return null; - - // need to have the source Submodel - var srcSub = srcEnv.FindSubmodel(srcSubRef); - if (srcSub == null) - return null; - - // 1st result pretty easy (calling function will add this to the appropriate AAS) - var dstSubRef =srcSubRef.Copy(); - - // get the destination and shall src != dst - var dstSub = environment.FindSubmodel(dstSubRef); - if (srcSub == dstSub) - return null; - - // maybe we need the Submodel in our environment, as well - if (dstSub == null && copySubmodel) - { - dstSub = srcSub.Copy(); - environment.Submodels.Add(dstSub); - } - else - if (dstSub != null) - { - // there is already an submodel, just add members - if (!shallowCopy && srcSub.SubmodelElements != null) - { - if (dstSub.SubmodelElements == null) - dstSub.SubmodelElements = new List(); - foreach (var smw in srcSub.SubmodelElements) - dstSub.SubmodelElements.Add( - smw.Copy()); - } - } - - // copy the CDs.. - if (copyCD && srcSub.SubmodelElements != null) - foreach (var smw in srcSub.SubmodelElements) - environment.CopyConceptDescriptionsFrom(srcEnv, smw, shallowCopy); - - // give back - return dstSubRef; - } - - private static void CopyConceptDescriptionsFrom(this AasCore.Aas3_0_RC02.Environment environment, - AasCore.Aas3_0_RC02.Environment srcEnv, ISubmodelElement src, bool shallowCopy = false) - { - // access - if (srcEnv == null || src == null || src.SemanticId == null) - return; - // check for this SubmodelElement in Source - var cdSrc = srcEnv.FindConceptDescriptionByReference(src.SemanticId); - if (cdSrc == null) - return; - // check for this SubmodelElement in Destnation (this!) - var cdDest = environment.FindConceptDescriptionByReference(src.SemanticId); - if (cdDest != null) - return; - // copy new - environment.ConceptDescriptions.Add(cdSrc.Copy()); - // recurse? - if (!shallowCopy && src is SubmodelElementCollection) - foreach (var m in (src as SubmodelElementCollection).Value) - environment.CopyConceptDescriptionsFrom(srcEnv, m, shallowCopy: false); - - } - #endregion - - } - - - -} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendFile.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendFile.cs deleted file mode 100644 index 8b8cc7576..000000000 --- a/src/AasxCsharpLib_bkp/Extensions/ExtendFile.cs +++ /dev/null @@ -1,68 +0,0 @@ -using AasCore.Aas3_0_RC02; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Extensions -{ - public static class ExtendFile - { - public static string ValueAsText(this File file) - { - return "" + file.Value; - } - - public static void Set(this File file, - string contentType = "", string value = "") - { - file.ContentType = contentType; - file.Value = value; - } - - public static File ConvertFromV10(this File file, AasxCompatibilityModels.AdminShellV10.File sourceFile) - { - file.ContentType = sourceFile.mimeType; - file.Value = sourceFile.value; - return file; - } - public static File ConvertFromV20(this File file, AasxCompatibilityModels.AdminShellV20.File sourceFile) - { - file.ContentType = sourceFile.mimeType; - file.Value = sourceFile.value; - return file; - } - - public static File UpdateFrom(this File elem, ISubmodelElement source) - { - if (source == null) - return elem; - - ((ISubmodelElement)elem).UpdateFrom(source); - - if (source is Property srcProp) - { - elem.Value = srcProp.Value; - } - - if (source is AasCore.Aas3_0_RC02.Range srcRng) - { - elem.Value = srcRng.Min; - } - - if (source is MultiLanguageProperty srcMlp) - { - elem.Value = "" + srcMlp.Value?.GetDefaultString(); - } - - if (source is File srcFile) - { - elem.Value = "" + srcFile.Value; - } - - return elem; - } - - } -} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendHasDataSpecification.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendHasDataSpecification.cs deleted file mode 100644 index 1a34c6d18..000000000 --- a/src/AasxCsharpLib_bkp/Extensions/ExtendHasDataSpecification.cs +++ /dev/null @@ -1,26 +0,0 @@ -using AasCore.Aas3_0_RC02; -using AasxCompatibilityModels; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.CompilerServices; -using System.Text; -using System.Threading.Tasks; - -namespace Extensions -{ - public static class ExtendHasDataSpecification - { - public static IHasDataSpecification ConvertFromV20(this IHasDataSpecification embeddedDataSpecifications, AasxCompatibilityModels.AdminShellV20.HasDataSpecification sourceSpecification) - { - foreach(var sourceSpec in sourceSpecification) - { - var newEmbeddedSpec = new EmbeddedDataSpecification(null, null); - newEmbeddedSpec.ConvertFromV20(sourceSpec); - embeddedDataSpecifications.EmbeddedDataSpecifications.Add(newEmbeddedSpec); - } - - return embeddedDataSpecifications; - } - } -} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendIDataSpecificationContent.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendIDataSpecificationContent.cs deleted file mode 100644 index 4f020cea9..000000000 --- a/src/AasxCsharpLib_bkp/Extensions/ExtendIDataSpecificationContent.cs +++ /dev/null @@ -1,68 +0,0 @@ -using Extensions; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using AasCore.Aas3_0_RC02; -using AdminShellNS; - -namespace Extensions -{ - public static class ExtendIDataSpecificationContent - { - public enum ContentTypes { NoInfo, Iec61360, PhysicalUnit} - - public static Key GetKeyForIec61360() - { - return new Key(KeyTypes.GlobalReference, - "http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"); - } - - public static Reference GetReferencForIec61360() - { - return new Reference(ReferenceTypes.GlobalReference, new List { GetKeyForIec61360() }); - } - - public static Key GetKeyForPhysicalUnit() - { - return new Key(KeyTypes.GlobalReference, - "http://admin-shell.io/DataSpecificationTemplates/DataSpecificationPhysicalUnit/3/0"); - } - - public static Key GetKeyFor(ContentTypes ct) - { - if (ct == ContentTypes.Iec61360) - return GetKeyForIec61360(); - if (ct == ContentTypes.PhysicalUnit) - return GetKeyForPhysicalUnit(); - return null; - } - - public static IDataSpecificationContent ContentFactoryFor(ContentTypes ct) - { - if (ct == ContentTypes.Iec61360) - return new DataSpecificationIec61360(null); - if (ct == ContentTypes.PhysicalUnit) - return new DataSpecificationPhysicalUnit("", "", null); - return null; - } - - public static ContentTypes GuessContentTypeFor(Reference rf) - { - foreach (var v in AdminShellUtil.GetEnumValues(new[] { ContentTypes.NoInfo })) - if (rf?.MatchesExactlyOneKey(GetKeyFor(v)) == true) - return v; - return ContentTypes.NoInfo; - } - - public static ContentTypes GuessContentTypeFor(IDataSpecificationContent content) - { - if (content is DataSpecificationIec61360) - return ContentTypes.Iec61360; - if (content is DataSpecificationPhysicalUnit) - return ContentTypes.PhysicalUnit; - return ContentTypes.NoInfo; - } - } -} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendIIdentifiable.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendIIdentifiable.cs deleted file mode 100644 index 29d8ffc33..000000000 --- a/src/AasxCsharpLib_bkp/Extensions/ExtendIIdentifiable.cs +++ /dev/null @@ -1,28 +0,0 @@ -using AasCore.Aas3_0_RC02; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Extensions -{ - public static class ExtendIIdentifiable - { - #region List of Identifiers - - public static string ToStringExtended(this List identifiables,string delimiter = ",") - { - return string.Join(delimiter, identifiables.Select((x) => x.Id)); - } - - #endregion - public static Reference GetReference(this IIdentifiable identifiable) - { - var key = new Key(ExtensionsUtil.GetKeyType(identifiable), identifiable.Id); - var outputReference = new Reference(ReferenceTypes.ModelReference, new List() { key }); - - return outputReference; - } - } -} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendIReferable.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendIReferable.cs deleted file mode 100644 index 340900668..000000000 --- a/src/AasxCsharpLib_bkp/Extensions/ExtendIReferable.cs +++ /dev/null @@ -1,600 +0,0 @@ -using AasCore.Aas3_0_RC02; -using AdminShellNS; -using AdminShellNS.Display; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Net.Http.Headers; -using System.Text; -using System.Threading.Tasks; - -namespace Extensions -{ - public static class ExtendIReferable - { - #region AasxPackageExplorer - - public static void RecurseOnReferables(this IReferable referable, - object state, Func, IReferable, bool> lambda, - bool includeThis = false) - { - if(referable is Submodel submodel) - { - submodel.RecurseOnReferables(state, lambda, includeThis); - } - else if(referable is SubmodelElementCollection submodelElementCollection) - { - submodelElementCollection.RecurseOnReferables(state, lambda, includeThis); - } - else if(referable is SubmodelElementList submodelElementList) - { - submodelElementList.RecurseOnReferables(state, lambda, includeThis); - } - else if (includeThis) - lambda(state, null, referable); - } - - public static void Remove(this IReferable referable, ISubmodelElement submodelElement) - { - if(referable is Submodel submodel) - { - submodel.Remove(submodelElement); - } - else if(referable is AnnotatedRelationshipElement annotatedRelationshipElement) - { - annotatedRelationshipElement.Remove(submodelElement); - } - else if(referable is SubmodelElementCollection submodelElementCollection) - { - submodelElementCollection.Remove(submodelElement); - } - else if(referable is SubmodelElementList submodelElementList) - { - submodelElementList.Remove(submodelElement); - } - else if(referable is Entity entity) - { - entity.Remove(submodelElement); - } - } - - public static void Add(this IReferable referable, ISubmodelElement submodelElement) - { - if (referable is Submodel submodel) - { - submodel.Add(submodelElement); - } - else if (referable is AnnotatedRelationshipElement annotatedRelationshipElement) - { - annotatedRelationshipElement.Add(submodelElement); - } - else if (referable is SubmodelElementCollection submodelElementCollection) - { - submodelElementCollection.Add(submodelElement); - } - else if (referable is SubmodelElementList submodelElementList) - { - submodelElementList.Add(submodelElement); - } - else if (referable is Entity entity) - { - entity.Add(submodelElement); - } - } - - #region Display - - public static EnumerationPlacmentBase GetChildrenPlacement(this IReferable referable, ISubmodelElement submodelElement) - { - if(referable is Operation operation) - { - return operation.GetChildrenPlacement(submodelElement); - } - - return null; - } - - #endregion - - public static IIdentifiable FindParentFirstIdentifiable(this IReferable referable) - { - IReferable curr = referable; - while (curr != null) - { - if (curr is IIdentifiable curri) - return curri; - curr = curr.Parent as IReferable; - } - return null; - } - - #endregion - - #region ListOfReferables - public static Reference GetReference(this List referables) - { - return new Reference(ReferenceTypes.GlobalReference, referables.ToKeyList()); - } - - public static List ToKeyList(this List referables) - { - var res = new List(); - foreach (var rf in referables) - res.Add(new Key(rf.GetSelfDescription()?.KeyType ?? KeyTypes.GlobalReference, rf.IdShort)); - return res; - } - #endregion - - public static string ToIdShortString(this IReferable rf) - { - if (rf.IdShort == null || rf.IdShort.Trim().Length < 1) - return (""); - return rf.IdShort.Trim(); - } - - public static Reference GetReference(this IReferable referable) - { - if (referable is IIdentifiable identifiable) - { - return identifiable.GetReference(); - } - else if (referable is ISubmodelElement submodelElement) - { - return submodelElement.GetModelReference(); - } - else - return null; - } - public static void Validate(this IReferable referable,AasValidationRecordList results) - { - referable.BaseValidation(results); - - if(referable is ConceptDescription conceptDescription) - { - conceptDescription.Validate(results); - } - else if(referable is Submodel submodel) - { - submodel.Validate(results); - } - else if(referable is ISubmodelElement submodelElement) - { - submodelElement.Validate(results); - } - } - - public static void BaseValidation(this IReferable referable, AasValidationRecordList results) - { - // access - if (results == null) - return; - - // check - if (string.IsNullOrEmpty(referable.IdShort)) - results.Add(new AasValidationRecord( - AasValidationSeverity.SpecViolation, referable, - "Referable: missing idShort", - () => - { - referable.IdShort = "TO_FIX"; - })); - - if (referable.Description != null && (referable.Description.Count < 1)) - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, referable, - "Referable: existing description with missing langString", - () => - { - referable.Description = null; - })); - } - - /// - /// Tells, if the IReferable is used with an index instead of idShort. - /// - public static bool IsIndexed(this IReferable rf) - { - return rf is SubmodelElementList; - } - - public static AasElementSelfDescription GetSelfDescription(this IReferable referable) - { - if (referable is AssetAdministrationShell) - { - return new AasElementSelfDescription("AssetAdministrationShell", "AAS", - KeyTypes.AssetAdministrationShell, null); - } - else if (referable is ConceptDescription) - { - return new AasElementSelfDescription("ConceptDescription", "CD", - KeyTypes.ConceptDescription, null); - } - else if (referable is Submodel) - { - return new AasElementSelfDescription("Submodel", "SM", - KeyTypes.Submodel, null); - } - else if (referable is Property) - { - return new AasElementSelfDescription("Property", "Prop", - KeyTypes.Property, AasSubmodelElements.Property); - } - else if (referable is MultiLanguageProperty) - { - return new AasElementSelfDescription("MultiLanguageProperty", "MLP", - KeyTypes.MultiLanguageProperty, AasSubmodelElements.MultiLanguageProperty); - } - else if(referable is AasCore.Aas3_0_RC02.Range) - { - return new AasElementSelfDescription("Range", "Range", - KeyTypes.Range, AasSubmodelElements.Range); - } - else if(referable is Blob) - { - return new AasElementSelfDescription("Blob", "Blob", - KeyTypes.Blob, AasSubmodelElements.Blob); - } - else if(referable is AasCore.Aas3_0_RC02.File) - { - return new AasElementSelfDescription("File", "File", - KeyTypes.File, AasSubmodelElements.File); - } - else if(referable is ReferenceElement) - { - return new AasElementSelfDescription("ReferenceElement", "Ref", - KeyTypes.ReferenceElement, AasSubmodelElements.ReferenceElement); - } - else if(referable is RelationshipElement) - { - return new AasElementSelfDescription("RelationshipElement", "Rel", - KeyTypes.RelationshipElement, AasSubmodelElements.RelationshipElement); - } - else if(referable is AnnotatedRelationshipElement) - { - return new AasElementSelfDescription("AnnotatedRelationshipElement", "RelA", - KeyTypes.AnnotatedRelationshipElement, AasSubmodelElements.AnnotatedRelationshipElement); - } - else if(referable is Capability) - { - return new AasElementSelfDescription("Capability", "Cap", - KeyTypes.Capability, AasSubmodelElements.Capability); - } - else if(referable is SubmodelElementCollection) - { - return new AasElementSelfDescription("SubmodelElementCollection", "SMC", - KeyTypes.SubmodelElementCollection, AasSubmodelElements.SubmodelElementCollection); - } - else if(referable is SubmodelElementList) - { - return new AasElementSelfDescription("SubmodelElementList", "SML", - KeyTypes.SubmodelElementList, AasSubmodelElements.SubmodelElementList); - } - else if(referable is Operation) - { - return new AasElementSelfDescription("Operation", "Opr", - KeyTypes.Operation, AasSubmodelElements.Operation); - } - else if(referable is Entity) - { - return new AasElementSelfDescription("Entity", "Ent", - KeyTypes.Entity, AasSubmodelElements.Entity); - } - else if(referable is BasicEventElement) - { - return new AasElementSelfDescription("BasicEventElement", "Evt", - - KeyTypes.BasicEventElement, AasSubmodelElements.BasicEventElement); - } - else if(referable is IDataElement) - { - return new AasElementSelfDescription("DataElement", "DE", - KeyTypes.DataElement, AasSubmodelElements.DataElement); - } - else if(referable is ISubmodelElement) - { - return new AasElementSelfDescription("SubmodelElement", "SME", - KeyTypes.SubmodelElement, AasSubmodelElements.SubmodelElement); - } - else - { - return new AasElementSelfDescription("Referable", "Ref", - KeyTypes.Referable, null); - } - } - public static void CollectReferencesByParent(this IReferable referable, List refs) - { - // access - if (refs == null) - return; - - // check, if this is identifiable - if (referable is IIdentifiable) - { - var idf = referable as IIdentifiable; - if (idf != null) - { - //var k = Key.CreateNew( - // idf.GetElementName(), true, idf.identification?.idType, idf.identification?.id); - - var key = new Key((KeyTypes)Stringification.KeyTypesFromString(idf.GetType().Name), idf.Id); - refs.Insert(0, key); - } - } - else - { - //var k = Key.CreateNew(this.GetElementName(), true, "IdShort", referable.IdShort); - var key = new Key((KeyTypes)Stringification.KeyTypesFromString(referable.GetType().Name), referable.IdShort); - refs.Insert(0, key); - // recurse upwards! - if (referable.Parent is IReferable prf) - prf.CollectReferencesByParent(refs); - } - } - public static void SetTimeStamp(this IReferable referable, DateTime timeStamp) - { - IReferable newReferable = referable; - do - { - newReferable.TimeStamp = timeStamp; - if (newReferable != newReferable.Parent) - { - newReferable = (IReferable)newReferable.Parent; - } - else - newReferable = null; - } - while (newReferable != null); - } - - public static bool EnumeratesChildren(this ISubmodelElement elem) - { - var num = elem.EnumerateChildren().Count(); - return (num > 0); - } - - public static IEnumerable EnumerateChildren(this IReferable referable) - { - if (referable is Submodel submodel && submodel.SubmodelElements != null) - { - if (submodel.SubmodelElements != null) - { - foreach (var submodelElement in submodel.SubmodelElements) - { - yield return submodelElement; - } - } - } - else if (referable is SubmodelElementCollection submodelElementCollection) - { - if (submodelElementCollection.Value != null) - { - foreach (var submodelElement in submodelElementCollection.Value) - { - yield return submodelElement; - } - } - } - else if (referable is SubmodelElementList submodelElementList) - { - if (submodelElementList.Value != null) - { - foreach (var submodelElement in submodelElementList.Value) - { - yield return submodelElement; - } - } - } - else if (referable is AnnotatedRelationshipElement annotatedRelationshipElement) - { - if (annotatedRelationshipElement.Annotations != null) - { - foreach (var submodelElement in annotatedRelationshipElement.Annotations) - { - yield return submodelElement; - } - } - } - else if (referable is Entity entity) - { - if (entity.Statements != null) - { - foreach (var submodelElement in entity.Statements) - { - yield return submodelElement; - } - } - } - else if (referable is Operation operation) - { - if (operation.InputVariables != null) - foreach (var inputVariable in operation.InputVariables) - { - yield return inputVariable.Value; - } - - if (operation.OutputVariables != null) - foreach (var outputVariable in operation.OutputVariables) - { - yield return outputVariable.Value; - } - - if (operation.InoutputVariables != null) - foreach (var inOutVariable in operation.InoutputVariables) - { - yield return inOutVariable.Value; - } - } - else - { - yield break; - } - } - - - public static void SetAllParentsAndTimestamps(this IReferable referable, IReferable parent, DateTime timeStamp, DateTime timeStampCreate) - { - if (parent == null) - return; - - referable.Parent = parent; - referable.TimeStamp = timeStamp; - referable.TimeStampCreate = timeStampCreate; - - foreach (var submodelElement in referable.EnumerateChildren()) - { - submodelElement.SetAllParentsAndTimestamps(referable, timeStamp, timeStampCreate); - } - } - - public static Submodel GetParentSubmodel(this IReferable referable) - { - IReferable parent = referable; - while (parent is not Submodel && parent != null) - parent = (IReferable)parent.Parent; - return parent as Submodel; - } - - public static string CollectIdShortByParent(this IReferable referable) - { - // recurse first - var head = ""; - if (referable is not IIdentifiable && referable.Parent is IReferable parentReferable) - // can go up - head = parentReferable.CollectIdShortByParent() + "/"; - // add own - var myid = ""; - if (string.IsNullOrEmpty(referable.IdShort)) - myid = referable.IdShort.Trim(); - // together - return head + myid; - } - - public static void AddDescription(this IReferable referable,string language, string Text) - { - if (referable.Description == null) - referable.Description = new List(); - referable.Description.Add(new LangString(language, Text)); - } - - public static List ListOfIReferableFrom( - System.Text.Json.Nodes.JsonNode node) - { - var res = new List(); - if (node == null) - return res; - var array = node.AsArray(); - foreach (var it in array) - { - var ir = Jsonization.Deserialize.IReferableFrom(it); - res.Add(ir); - } - return res; - } - - public static Key ToKey(this IReferable rf) - { - var sd = rf.GetSelfDescription(); - if (sd == null || !sd.KeyType.HasValue) - return null; - if (rf is IIdentifiable rfi) - return new Key(sd.KeyType.Value, rfi.Id); - return new Key(sd.KeyType.Value, rf.IdShort); - } - - public static System.Text.Json.Nodes.JsonNode ToJsonObject(List classes) - { - var jar = new System.Text.Json.Nodes.JsonArray(); - if (classes != null) - foreach (var c in classes) - jar.Add(Jsonization.Serialize.ToJsonObject(c)); - return jar; - } - - public static IEnumerable FindAllQualifierType(this IReferable rf, string qualifierType) - { - if (!(rf is IQualifiable rfq) || rfq.Qualifiers == null || qualifierType == null) - yield break; - foreach (var q in rfq.Qualifiers) - if (q.Type.Trim().ToLower() == qualifierType.Trim().ToLower()) - yield return q; - } - - public static Qualifier HasQualifierOfType(this IReferable rf, string qualifierType) - { - if (!(rf is IQualifiable rfq) || rfq.Qualifiers == null) - return null; - foreach (var q in rfq.Qualifiers) - if (q.Type?.Trim().ToLower() == qualifierType?.Trim().ToLower()) - return q; - return null; - } - - public static Qualifier Add(this IReferable rf, Qualifier q) - { - if (!(rf is IQualifiable rfq)) - return null; - if (rfq.Qualifiers == null) - rfq.Qualifiers = new List(); - rfq.Qualifiers.Add(q); - return q; - } - - public static IEnumerable FindAllExtensionName(this IReferable rf, string extensionName) - { - if (!(rf is IHasExtensions rfe) || rfe.Extensions == null) - yield break; - foreach (var e in rfe.Extensions) - if (e.Name?.Trim().ToLower() == extensionName?.Trim().ToLower()) - yield return e; - } - - - public static Extension HasExtensionOfName(this IReferable rf, string extensionName) - { - if (!(rf is IHasExtensions rfe) || rfe.Extensions == null) - return null; - foreach (var e in rfe.Extensions) - if (e.Name?.Trim().ToLower() == extensionName?.Trim().ToLower()) - return e; - return null; - } - - public static Extension Add(this IReferable rf, Extension ext) - { - if (rf.Extensions == null) - rf.Extensions = new List(); - rf.Extensions.Add(ext); - return ext; - } - - public static void MigrateV20QualifiersToExtensions(this IReferable rf) - { - // access - if (!(rf is IQualifiable iq) || iq.Qualifiers == null || !(rf is IHasExtensions ihe)) - return; - - // Qualifiers to migrate - var toMigrate = new[] { - "Animate.Args", "Plotting.Args", "TimeSeries.Args", "BOM.Args", "ImageMap.Args" - }; - - List toMove = new List(); - foreach (var q in iq.Qualifiers) - foreach (var tm in toMigrate) - if (q?.Type?.Equals(tm, StringComparison.InvariantCultureIgnoreCase) == true) - toMove.Add(q); - - // now move these - for (int i=0; i ToCaptionInfo(this ISubmodelElement submodelElement) - { - var caption = AdminShellUtil.EvalToNonNullString("\"{0}\" ", submodelElement.IdShort, ""); - var info = ""; - // TODO (MIHO, 2021-07-08): obvious error .. info should receive semanticId .. but would change - // display presentation .. therefore to be checked again - if (submodelElement.SemanticId != null) - AdminShellUtil.EvalToNonEmptyString("\u21e8 {0}", submodelElement.SemanticId.ToStringExtended(), ""); - return Tuple.Create(caption, info); - } - - public static void ValueFromText(this ISubmodelElement submodelElement, string text, string defaultLang = null) - { - switch(submodelElement) - { - case Property property: - { - property.ValueFromText(text); - break; - } - case MultiLanguageProperty multiLanguageProperty: - { - multiLanguageProperty.ValueFromText(text, defaultLang); - break; - } - default: - { - throw new Exception("Unhandled submodel element type"); - } - } - } - - #endregion - public static IEnumerable FindAllParents(this ISubmodelElement submodelElement, - Predicate p, - bool includeThis = false, bool includeSubmodel = false, - bool passOverMiss = false) - { - // call for this? - if (includeThis) - { - if (p == null || p.Invoke(submodelElement)) - yield return submodelElement; - else - if (!passOverMiss) - yield break; - } - - // daisy chain all parents .. - if (submodelElement.Parent != null) - { - if (submodelElement.Parent is ISubmodelElement psme) - { - foreach (var q in psme.FindAllParents(p, includeThis: true, - passOverMiss: passOverMiss)) - yield return q; - } - else if (includeSubmodel && submodelElement.Parent is Submodel psm) - { - if (p == null || p.Invoke(psm)) - yield return submodelElement; - } - } - } - - public static IEnumerable FindAllParentsWithSemanticId( - this ISubmodelElement submodelElement, Reference semId, - bool includeThis = false, bool includeSubmodel = false, bool passOverMiss = false) - { - return (FindAllParents(submodelElement, - (rf) => (true == (rf as IHasSemantics)?.SemanticId?.Matches(semId, - matchMode: MatchMode.Relaxed)), - includeThis: includeThis, includeSubmodel: includeSubmodel, passOverMiss: passOverMiss)); - } - - public static string ValueAsText(this ISubmodelElement submodelElement, string defaultLang = null) - { - //TODO:Need to check/test this logic again - if (submodelElement is Property property) - { - return property.ValueAsText(); - } - - if (submodelElement is MultiLanguageProperty multiLanguageProperty) - { - return multiLanguageProperty.ValueAsText(defaultLang); - } - - if (submodelElement is AasCore.Aas3_0_RC02.Range range) - { - return range.ValueAsText(); - } - - if (submodelElement is File file) - { - return file.ValueAsText(); - } - - return ""; - } - - public static Qualifier FindQualifierOfType(this ISubmodelElement submodelElement, string qualifierType) - { - if (submodelElement.Qualifiers == null || submodelElement.Qualifiers.Count == 0) - { - return null; - } - - foreach (var qualifier in submodelElement.Qualifiers) - { - if (qualifier.Type.Equals(qualifierType, StringComparison.OrdinalIgnoreCase)) - { - return qualifier; - } - } - - return null; - - } - - public static Reference GetModelReference(this ISubmodelElement sme, bool includeParents = true) - { - // this will be the tail of our chain - var keyList = new List(); - var keyType = ExtensionsUtil.GetKeyType(sme); - var key = new Key(keyType, sme.IdShort); - keyList.Add(key); - - // keys for Parents will be INSERTED in front, iteratively - var currentParent = sme.Parent; - while (includeParents && currentParent != null) - { - if (currentParent is IIdentifiable identifiable) - { - var currentParentKey = new Key(ExtensionsUtil.GetKeyType(identifiable), identifiable.Id); - keyList.Insert(0, currentParentKey); - currentParent = null; - } - else if (currentParent is IReferable referable) - { - var currentParentKey = new Key(ExtensionsUtil.GetKeyType(referable), referable.IdShort); - keyList.Insert(0, currentParentKey); - currentParent = referable.Parent; - } - - } - - var outputReference = new Reference(ReferenceTypes.ModelReference, keyList); - outputReference.ReferredSemanticId = sme.SemanticId; - return outputReference; - } - - public static IEnumerable FindDeep(this ISubmodelElement submodelElement) - { - if (submodelElement is T) - { - yield return (T)submodelElement; - } - - foreach (var x in submodelElement.Descend().OfType()) - yield return x; - - //if (submodelElement is SubmodelElementList sml && sml.Value != null) - // foreach (var ce in sml.Value) - // if (ce != null) - // foreach (var x in ce.FindDeep()) - // yield return x; - - //if (submodelElement is AnnotatedRelationshipElement arel && arel.Annotations != null) - // foreach (var x in arel.FindDeep()) - // yield return x; - - //if (submodelElement is Entity entity) - // foreach (var statement in entity.Statements) - // foreach (var x in statement.FindDeep()) - // yield return x; - - //if (submodelElement is Operation operation) - //{ - // var variableCollection = new SubmodelElementCollection(); - // variableCollection.Value = new List(); - // foreach (var inputVariable in operation.InputVariables) - // { - // variableCollection.Value.Add(inputVariable.Value); - // } - // foreach (var outputVariable in operation.OutputVariables) - // { - // variableCollection.Value.Add(outputVariable.Value); - // } - // foreach (var inOutVariable in operation.InoutputVariables) - // { - // variableCollection.Value.Add(inOutVariable.Value); - // } - // yield return (T)variableCollection.FindDeep(); - //} - } - - public static ISubmodelElement ConvertFromV10(this ISubmodelElement submodelElement, AdminShellV10.SubmodelElement sourceSubmodelElement, bool shallowCopy = false) - { - ISubmodelElement outputSubmodelElement = null; - if (sourceSubmodelElement != null) - { - if (sourceSubmodelElement is AdminShellV10.SubmodelElementCollection collection) - { - var newSmeCollection = new SubmodelElementCollection(); - outputSubmodelElement = newSmeCollection.ConvertFromV10(collection, shallowCopy); - } - else if (sourceSubmodelElement is AdminShellV10.Property sourceProperty) - { - var newProperty = new Property(DataTypeDefXsd.String); - outputSubmodelElement = newProperty.ConvertFromV10(sourceProperty); - } - else if (sourceSubmodelElement is AdminShellV10.File sourceFile) - { - var newFile = new File(""); - outputSubmodelElement = newFile.ConvertFromV10(sourceFile); - } - else if (sourceSubmodelElement is AdminShellV10.Blob blob) - { - var newBlob = new Blob(""); - outputSubmodelElement = newBlob.ConvertFromV10(blob); - } - else if (sourceSubmodelElement is AdminShellV10.ReferenceElement sourceReferenceElement) - { - outputSubmodelElement = new ReferenceElement(); - } - else if (sourceSubmodelElement is AdminShellV10.RelationshipElement sourceRelationshipElement) - { - var newFirst = ExtensionsUtil.ConvertReferenceFromV10(sourceRelationshipElement.first, ReferenceTypes.ModelReference); - var newSecond = ExtensionsUtil.ConvertReferenceFromV10(sourceRelationshipElement.second, ReferenceTypes.ModelReference); - outputSubmodelElement = new RelationshipElement(newFirst, newSecond); - } - - if (sourceSubmodelElement is AdminShellV10.Operation sourceOperation) - { - var newInputVariables = new List(); - var newOutputVariables = new List(); - if (sourceOperation.valueIn != null) - { - - foreach (var inputVariable in sourceOperation.valueIn) - { - if (inputVariable.value.submodelElement != null) - { - ISubmodelElement newSubmodelElement = null; - newSubmodelElement = newSubmodelElement.ConvertFromV10(inputVariable.value.submodelElement); - var newOpVariable = new OperationVariable(newSubmodelElement); - newInputVariables.Add(newOpVariable); - } - } - } - if (sourceOperation.valueOut != null) - { - foreach (var outputVariable in sourceOperation.valueOut) - { - if (outputVariable.value.submodelElement != null) - { - ISubmodelElement newSubmodelElement = null; - newSubmodelElement = newSubmodelElement.ConvertFromV10(outputVariable.value.submodelElement); - var newOpVariable = new OperationVariable(newSubmodelElement); - newOutputVariables.Add(newOpVariable); - } - } - } - - outputSubmodelElement = new Operation(inputVariables: newInputVariables, outputVariables: newOutputVariables); - } - - - outputSubmodelElement.BasicConversionFromV10(sourceSubmodelElement); - } - - return outputSubmodelElement; - } - - private static void BasicConversionFromV10(this ISubmodelElement submodelElement, AdminShellV10.SubmodelElement sourceSubmodelElement) - { - if (!string.IsNullOrEmpty(sourceSubmodelElement.idShort)) - { - submodelElement.IdShort = sourceSubmodelElement.idShort; - } - - if (!string.IsNullOrEmpty(sourceSubmodelElement.category)) - { - submodelElement.Category = sourceSubmodelElement.category; - } - - if (sourceSubmodelElement.description != null) - { - submodelElement.Description = ExtensionsUtil.ConvertDescriptionFromV10(sourceSubmodelElement.description); - } - - if (sourceSubmodelElement.semanticId != null) - { - var keyList = new List(); - foreach (var refKey in sourceSubmodelElement.semanticId.Keys) - { - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {refKey.type} not found."); - } - } - submodelElement.SemanticId = new Reference(ReferenceTypes.GlobalReference, keyList); - } - - if (sourceSubmodelElement.kind != null) - { - if (sourceSubmodelElement.kind.IsInstance) - { - submodelElement.Kind = ModelingKind.Instance; - } - else - { - submodelElement.Kind = ModelingKind.Template; - } - } - - if (sourceSubmodelElement.qualifiers != null && sourceSubmodelElement.qualifiers.Count != 0) - { - if (submodelElement.Qualifiers == null && submodelElement.Qualifiers.Count != 0) - { - submodelElement.Qualifiers = new List(); - } - - foreach (var sourceQualifier in sourceSubmodelElement.qualifiers) - { - var newQualifier = new Qualifier("", DataTypeDefXsd.String); - newQualifier = newQualifier.ConvertFromV10(sourceQualifier); - submodelElement.Qualifiers.Add(newQualifier); - } - } - - if (sourceSubmodelElement.hasDataSpecification != null) - { - //TODO: jtikekar : EmbeddedDataSpecification?? (as per old implementation) - if (submodelElement.EmbeddedDataSpecifications == null) - { - submodelElement.EmbeddedDataSpecifications = new List(); - } - foreach (var dataSpecification in sourceSubmodelElement.hasDataSpecification.reference) - { - submodelElement.EmbeddedDataSpecifications.Add( - new EmbeddedDataSpecification( - ExtensionsUtil.ConvertReferenceFromV10(dataSpecification, ReferenceTypes.GlobalReference), - null)); - } - } - } - - public static ISubmodelElement ConvertFromV20(this ISubmodelElement submodelElement, AdminShellV20.SubmodelElement sourceSubmodelElement, bool shallowCopy = false) - { - ISubmodelElement outputSubmodelElement = null; - if (sourceSubmodelElement != null) - { - if (sourceSubmodelElement is AdminShellV20.SubmodelElementCollection collection) - { - var newSmeCollection = new SubmodelElementCollection(); - outputSubmodelElement = newSmeCollection.ConvertFromV20(collection, shallowCopy); - } - else if (sourceSubmodelElement is AdminShellV20.Property sourceProperty) - { - var newProperty = new Property(DataTypeDefXsd.String); - outputSubmodelElement = newProperty.ConvertFromV20(sourceProperty); - } - else if (sourceSubmodelElement is AdminShellV20.MultiLanguageProperty sourceMultiLangProp) - { - var newMultiLangProperty = new MultiLanguageProperty(); - outputSubmodelElement = newMultiLangProperty.ConvertFromV20(sourceMultiLangProp); - } - else if (sourceSubmodelElement is AdminShellV20.Range sourceRange) - { - var newRange = new AasCore.Aas3_0_RC02.Range(DataTypeDefXsd.String); - outputSubmodelElement = newRange.ConvertFromV20(sourceRange); - } - else if (sourceSubmodelElement is AdminShellV20.File sourceFile) - { - var newFile = new File(""); - outputSubmodelElement = newFile.ConvertFromV20(sourceFile); - } - else if (sourceSubmodelElement is AdminShellV20.Blob blob) - { - var newBlob = new Blob(""); - outputSubmodelElement = newBlob.ConvertFromV20(blob); - } - else if (sourceSubmodelElement is AdminShellV20.ReferenceElement sourceReferenceElement) - { - var newReference = ExtensionsUtil.ConvertReferenceFromV20(sourceReferenceElement.value, ReferenceTypes.ModelReference); - outputSubmodelElement = new ReferenceElement(value: newReference); - } - else if (sourceSubmodelElement is AdminShellV20.AnnotatedRelationshipElement sourceAnnotedRelationshipElement) - { - var newFirst = ExtensionsUtil.ConvertReferenceFromV20(sourceAnnotedRelationshipElement.first, ReferenceTypes.ModelReference); - var newSecond = ExtensionsUtil.ConvertReferenceFromV20(sourceAnnotedRelationshipElement.second, ReferenceTypes.ModelReference); - var newAnnotedRelElement = new AnnotatedRelationshipElement(newFirst, newSecond); - outputSubmodelElement = newAnnotedRelElement.ConvertAnnotationsFromV20(sourceAnnotedRelationshipElement); - } - else if (sourceSubmodelElement is AdminShellV20.RelationshipElement sourceRelationshipElement) - { - var newFirst = ExtensionsUtil.ConvertReferenceFromV20(sourceRelationshipElement.first, ReferenceTypes.ModelReference); - var newSecond = ExtensionsUtil.ConvertReferenceFromV20(sourceRelationshipElement.second, ReferenceTypes.ModelReference); - outputSubmodelElement = new RelationshipElement(newFirst, newSecond); - } - else if (sourceSubmodelElement is AdminShellV20.BasicEvent sourceBasicEvent) - { - var newObserved = ExtensionsUtil.ConvertReferenceFromV20(sourceBasicEvent.observed, ReferenceTypes.ModelReference); - - outputSubmodelElement = new BasicEventElement(newObserved, Direction.Input, StateOfEvent.Off); //TODO: jtikekar default values of enums - } - else if (sourceSubmodelElement is AdminShellV20.Entity sourceEntity) - { - var entityType = Stringification.EntityTypeFromString(sourceEntity.entityType); - var newEntity = new Entity(entityType ?? EntityType.CoManagedEntity); - outputSubmodelElement = newEntity.ConvertFromV20(sourceEntity); - } - else if (sourceSubmodelElement is AdminShellV20.Operation sourceOperation) - { - var newInputVariables = new List(); - var newOutputVariables = new List(); - var newInOutVariables = new List(); - if (sourceOperation.inputVariable != null) - { - - foreach (var inputVariable in sourceOperation.inputVariable) - { - if (inputVariable.value.submodelElement != null) - { - ISubmodelElement newSubmodelElement = null; - newSubmodelElement = newSubmodelElement.ConvertFromV20(inputVariable.value.submodelElement); - var newOpVariable = new OperationVariable(newSubmodelElement); - newInputVariables.Add(newOpVariable); - } - } - } - if (sourceOperation.outputVariable != null) - { - foreach (var outputVariable in sourceOperation.outputVariable) - { - if (outputVariable.value.submodelElement != null) - { - ISubmodelElement newSubmodelElement = null; - newSubmodelElement = newSubmodelElement.ConvertFromV20(outputVariable.value.submodelElement); - var newOpVariable = new OperationVariable(newSubmodelElement); - newOutputVariables.Add(newOpVariable); - } - } - } - - if (sourceOperation.inoutputVariable != null) - { - foreach (var inOutVariable in sourceOperation.inoutputVariable) - { - if (inOutVariable.value.submodelElement != null) - { - ISubmodelElement newSubmodelElement = null; - newSubmodelElement = newSubmodelElement.ConvertFromV20(inOutVariable.value.submodelElement); - var newOpVariable = new OperationVariable(newSubmodelElement); - newInOutVariables.Add(newOpVariable); - } - } - } - - outputSubmodelElement = new Operation(inputVariables: newInputVariables, outputVariables: newOutputVariables, inoutputVariables: newInOutVariables); - } - - outputSubmodelElement.BasicConversionFromV20(sourceSubmodelElement); - } - - return outputSubmodelElement; - } - - private static void BasicConversionFromV20(this ISubmodelElement submodelElement, AdminShellV20.SubmodelElement sourceSubmodelElement) - { - if (!string.IsNullOrEmpty(sourceSubmodelElement.idShort)) - submodelElement.IdShort = sourceSubmodelElement.idShort; - - if (!string.IsNullOrEmpty(sourceSubmodelElement.category)) - submodelElement.Category = sourceSubmodelElement.category; - - if (sourceSubmodelElement.description != null) - submodelElement.Description = ExtensionsUtil.ConvertDescriptionFromV20(sourceSubmodelElement.description); - - if (sourceSubmodelElement.semanticId != null) - { - var keyList = new List(); - foreach (var refKey in sourceSubmodelElement.semanticId.Keys) - { - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - // DECISION: After phone call with Birgit, set all CD to GlobalReference - // assuming it is always a external concept - if (keyType == KeyTypes.ConceptDescription) - keyType = KeyTypes.GlobalReference; - - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {refKey.type} not found."); - } - } - submodelElement.SemanticId = new Reference(ReferenceTypes.GlobalReference, keyList); - } - - if (sourceSubmodelElement.kind != null) - { - if (sourceSubmodelElement.kind.IsInstance) - submodelElement.Kind = ModelingKind.Instance; - else - submodelElement.Kind = ModelingKind.Template; - } - - if (sourceSubmodelElement.qualifiers != null && sourceSubmodelElement.qualifiers.Count != 0) - { - if (submodelElement.Qualifiers == null || submodelElement.Qualifiers.Count == 0) - submodelElement.Qualifiers = new List(); - - foreach (var sourceQualifier in sourceSubmodelElement.qualifiers) - { - var newQualifier = new Qualifier("", DataTypeDefXsd.String); - newQualifier = newQualifier.ConvertFromV20(sourceQualifier); - submodelElement.Qualifiers.Add(newQualifier); - } - } - - if (sourceSubmodelElement.hasDataSpecification != null) - { - //TODO: jtikekar : EmbeddedDataSpecification?? (as per old implementation) - if (submodelElement.EmbeddedDataSpecifications == null) - submodelElement.EmbeddedDataSpecifications = new List(); - - //TODO: jtikekar: DataSpecificationContent?? (as per old implementation) - foreach (var sourceDataSpec in sourceSubmodelElement.hasDataSpecification) - { - submodelElement.EmbeddedDataSpecifications.Add( - new EmbeddedDataSpecification( - ExtensionsUtil.ConvertReferenceFromV20(sourceDataSpec.dataSpecification, ReferenceTypes.GlobalReference), - null)); - } - } - - // move Qualifiers to Extensions - submodelElement.MigrateV20QualifiersToExtensions(); - } - - #region List - - public static IReferable FindReferableByReference( - this List submodelElements, Reference rf, int keyIndex) - { - return FindReferableByReference(submodelElements, rf?.Keys, keyIndex); - } - - public static IReferable FindReferableByReference( - this List submodelElements, List keys, int keyIndex) - { - // first index needs to exist .. - if (submodelElements == null || keys == null || keyIndex >= keys.Count) - return null; - - - // over all wrappers - foreach (var smw in submodelElements) - if (smw != null && smw.IdShort.Equals(keys[keyIndex].Value, StringComparison.OrdinalIgnoreCase)) - { - // match on this level. Did we find a leaf element? - if ((keyIndex + 1) >= keys.Count) - return smw; - - // dive into SMC? - if (smw is SubmodelElementCollection smc) - { - var found = FindReferableByReference(smc.Value, keys, keyIndex + 1); - if (found != null) - return found; - } - // dive into SML? - if (smw is SubmodelElementList submodelElementList) - { - var found = FindReferableByReference(submodelElementList.Value, keys, keyIndex + 1); - if (found != null) - return found; - } - - // dive into AnnotedRelationshipElement? - if (smw is AnnotatedRelationshipElement annotatedRelationshipElement) - { - var annotations = new List(annotatedRelationshipElement.Annotations); - var found = FindReferableByReference(annotations, keys, keyIndex + 1); - if (found != null) - return found; - } - - // dive into Entity statements? - if (smw is Entity ent) - { - var found = FindReferableByReference(ent.Statements, keys, keyIndex + 1); - if (found != null) - return found; - } - - // else: - return null; - } - - // no? - return null; - } - - public static IEnumerable FindDeep(this List submodelElements, Predicate match = null) where T : ISubmodelElement - { - foreach (var smw in submodelElements) - { - var current = smw; - if (current == null) - continue; - - // call lambda for this element - if (current is T) - if (match == null || match.Invoke((T)current)) - yield return (T)current; - - // dive into? - // TODO (MIHO, 2020-07-31): would be nice to use IEnumerateChildren for this .. - if (current is SubmodelElementCollection smc && smc.Value != null) - foreach (var x in smc.Value.FindDeep(match)) - yield return x; - - if (current is AnnotatedRelationshipElement are && are.Annotations != null) - { - var annotationsList = new List(are.Annotations); - foreach (var x in annotationsList.FindDeep(match)) - yield return x; - } - - if (current is Entity ent && ent.Statements != null) - foreach (var x in ent.Statements.FindDeep(match)) - yield return x; - - if (current is Operation op) - { - var operationVariables = new List(); - foreach(var opVariable in op.InputVariables) - { - operationVariables.Add(opVariable.Value); - } - - foreach(var opVariable in op.InoutputVariables) - { - operationVariables.Add(opVariable.Value); - } - - foreach(var opVariable in op.OutputVariables) - { - operationVariables.Add(opVariable.Value); - } - - foreach (var x in operationVariables.FindDeep(match)) - yield return x; - } - } - } - - public static void CopyManySMEbyCopy(this List submodelElements, ConceptDescription destCD, - List sourceSmc, ConceptDescription sourceCD, - bool createDefault = false, Action setDefault = null, - MatchMode matchMode = MatchMode.Relaxed) where T : ISubmodelElement - { - submodelElements.CopyManySMEbyCopy(destCD.GetSingleKey(), sourceSmc, sourceCD.GetSingleKey(), - createDefault ? destCD : null, setDefault, matchMode); - } - - public static void CopyManySMEbyCopy(this List submodelElements, Key destSemanticId, - List sourceSmc, Key sourceSemanticId, - ConceptDescription createDefault = null, Action setDefault = null, - MatchMode matchMode = MatchMode.Relaxed) where T : ISubmodelElement - { - // bool find possible sources - bool foundSrc = false; - if (sourceSmc == null) - return; - foreach (var src in sourceSmc.FindAllSemanticIdAs(sourceSemanticId, matchMode)) - { - // type of found src? - AasSubmodelElements aeSrc = (AasSubmodelElements)Enum.Parse(typeof(AasSubmodelElements), src.GetType().Name); - - // ok? - if (src == null || aeSrc == AasSubmodelElements.SubmodelElement) - continue; - foundSrc = true; - - // ok, create new one - var dst = AdminShellNS.AdminShellUtil.CreateSubmodelElementFromEnum(aeSrc, src); - if (dst != null) - { - // make same things sure - dst.IdShort = src.IdShort; - dst.Category = src.Category; - dst.SemanticId = new Reference(ReferenceTypes.ModelReference, new List() { destSemanticId}); - - // instantanously add it? - submodelElements.Add(dst); - } - } - - // default? - if (createDefault != null && !foundSrc) - { - // ok, default - var dflt = submodelElements.CreateSMEForCD(createDefault, addSme: true); - - // set default? - setDefault?.Invoke(dflt); - } - } - - public static T CopyOneSMEbyCopy(this List submodelElements, ConceptDescription destCD, - List sourceSmc, Key[] sourceKeys, - bool createDefault = false, Action setDefault = null, - MatchMode matchMode = MatchMode.Relaxed, - string idShort = null, bool addSme = false) where T : ISubmodelElement - { - return submodelElements.CopyOneSMEbyCopy(destCD?.GetSingleKey(), sourceSmc, sourceKeys, - createDefault ? destCD : null, setDefault, matchMode, idShort, addSme); - } - - public static T CopyOneSMEbyCopy(this List submodelELements, ConceptDescription destCD, - List sourceSmc, ConceptDescription sourceCD, - bool createDefault = false, Action setDefault = null, - MatchMode matchMode = MatchMode.Relaxed, - string idShort = null, bool addSme = false) where T : ISubmodelElement - { - return submodelELements.CopyOneSMEbyCopy(destCD?.GetSingleKey(), sourceSmc, new[] { sourceCD?.GetSingleKey() }, - createDefault ? destCD : null, setDefault, matchMode, idShort, addSme); - } - - public static T CopyOneSMEbyCopy(this List submodelElements, Key destSemanticId, - List sourceSmc, Key[] sourceSemanticId, - ConceptDescription createDefault = null, Action setDefault = null, - MatchMode matchMode = MatchMode.Relaxed, - string idShort = null, bool addSme = false) where T : ISubmodelElement - { - // get source - var src = sourceSmc.FindFirstAnySemanticIdAs(sourceSemanticId, matchMode); - - // may be make an adaptive conversion - if (src == null) - { - var anySrc = sourceSmc?.FindFirstAnySemanticId(sourceSemanticId, matchMode: matchMode); - src = submodelElements.AdaptiveConvertTo(anySrc, createDefault, - idShort: idShort, addSme: false); - } - - // proceed - AasSubmodelElements aeSrc = (AasSubmodelElements)Enum.Parse(typeof(AasSubmodelElements), src?.GetType().Name); - if (src == null || aeSrc == AasSubmodelElements.SubmodelElement) - { - // create a default? - if (createDefault == null) - return default(T); - - // ok, default - var dflt = submodelElements.CreateSMEForCD(createDefault, idShort: idShort, addSme: addSme); - - // set default? - setDefault?.Invoke(dflt); - - // return - return dflt; - } - - // ok, create new one - var dst = AdminShellNS.AdminShellUtil.CreateSubmodelElementFromEnum(aeSrc, src); - if (dst == null) - return default(T); - - // make same things sure - dst.IdShort = src.IdShort; - dst.Category = src.Category; - dst.SemanticId = new Reference(ReferenceTypes.ModelReference, new List() { destSemanticId}); - - // instantanously add it? - if (addSme) - submodelElements.Add(dst); - - // give back - return (T)dst; - } - - public static T AdaptiveConvertTo(this List submodelElements, - ISubmodelElement anySrc, - ConceptDescription createDefault = null, - string idShort = null, bool addSme = false) where T : ISubmodelElement - { - if (typeof(T) == typeof(MultiLanguageProperty) - && anySrc is Property srcProp) - { - var res = submodelElements.CreateSMEForCD(createDefault, idShort: idShort, addSme: addSme); - if (res is MultiLanguageProperty mlp) - { - mlp.Value = new List() { new LangString("EN?", srcProp.Value) }; - mlp.ValueId = srcProp.ValueId; - return res; - } - } - - if (typeof(T) == typeof(Property) - && anySrc is MultiLanguageProperty srcMlp) - { - var res = submodelElements.CreateSMEForCD(createDefault, idShort: idShort, addSme: addSme); - if (res is Property prp) - { - prp.Value = "" + srcMlp.Value?.GetDefaultString(); - prp.ValueId = srcMlp.ValueId; - return res; - } - } - - return default(T); - } - - public static IEnumerable FindAllIdShort(this List submodelElements, - string idShort) - { - foreach (var smw in submodelElements) - if (smw != null) - if (smw.IdShort.Trim().ToLower() == idShort.Trim().ToLower()) - yield return smw; - } - - public static IEnumerable FindAllIdShortAs(this List submodelElements, - string idShort) where T : class, ISubmodelElement - { - foreach (var smw in submodelElements) - if (smw is T) - if (smw.IdShort.Trim().ToLower() == idShort.Trim().ToLower()) - yield return smw as T; - } - - public static ISubmodelElement FindFirstIdShort(this List submodelElements, - string idShort) - { - return submodelElements.FindAllIdShort(idShort)?.FirstOrDefault(); - } - - public static T FindFirstIdShortAs(this List submodelElements, - string idShort) where T : class, ISubmodelElement - { - return submodelElements.FindAllIdShortAs(idShort)?.FirstOrDefault(); - } - - - public static ISubmodelElement FindFirstAnySemanticId(this List submodelElements, - Key[] semId, Type[] allowedTypes = null, MatchMode matchMode = MatchMode.Strict) - { - if (semId == null) - return null; - foreach (var si in semId) - { - var found = submodelElements.FindAllSemanticId(si, allowedTypes, matchMode)? - .FirstOrDefault(); - if (found != null) - return found; - } - return null; - } - - public static T FindFirstAnySemanticIdAs(this List submodelElements, Key[] semId, MatchMode matchMode = MatchMode.Strict) - where T : ISubmodelElement - { - if (semId == null) - return default(T); - foreach (var si in semId) - { - var found = submodelElements.FindAllSemanticIdAs(si, matchMode).FirstOrDefault(); - if (found != null) - return found; - } - return default(T); - } - - public static T CreateNew(string idShort = null, string category = null, Reference semanticId = null) - where T : ISubmodelElement, new() - { - var res = new T(); - if (idShort != null) - res.IdShort = idShort; - if (category != null) - res.Category = category; - if (semanticId != null) - res.SemanticId = semanticId.Copy(); - return res; - } - - public static T CreateSMEForCD(this List submodelELements, ConceptDescription conceptDescription, string category = null, string idShort = null, - string idxTemplate = null, int maxNum = 999, bool addSme = false, bool isTemplate = false) - where T : ISubmodelElement - { - // access - if (conceptDescription == null) - return default(T); - - // fin type enum - var smeType = AdminShellUtil.AasSubmodelElementsFrom(); - if (!smeType.HasValue) - return default(T); - - // try to potentially figure out idShort - var ids = conceptDescription.IdShort; - - //TODO:jtikekar Temporarily removed - if ((ids == null || ids.Trim() == "") && conceptDescription.GetIEC61360() != null) - ids = conceptDescription.GetIEC61360().ShortName? - .GetDefaultString(); - - if (idShort != null) - ids = idShort; - - if (ids == null) - return default(T); - - // unique? - if (idxTemplate != null) - ids = submodelELements.IterateIdShortTemplateToBeUnique(idxTemplate, maxNum); - - // make a new instance - var semanticId = conceptDescription.GetCdReference(); - ISubmodelElement sme = AdminShellUtil.CreateSubmodelElementFromEnum(smeType.Value); - if (sme == null) - return default(T); - sme.IdShort = ids; - sme.SemanticId = semanticId.Copy(); - if (category != null) - sme.Category = category; - if (isTemplate) - sme.Kind = ModelingKind.Template; - - // if its a SMC, make sure its accessible - if (sme is SubmodelElementCollection smc) - smc.Value = new List(); - - // instantanously add it? - if (addSme) - submodelELements.Add(sme); - - // give back - return (T)sme; - } - - public static IEnumerable FindAllSemanticIdAs(this List submodelELements, Key semId, MatchMode matchMode = MatchMode.Strict) - where T : ISubmodelElement - { - foreach (var submodelElement in submodelELements) - if (submodelElement != null && submodelElement is T - && submodelElement.SemanticId != null) - if (submodelElement.SemanticId.MatchesExactlyOneKey(semId, matchMode)) - yield return (T)submodelElement; - } - - public static IEnumerable FindAllSemanticIdAs(this List submodelELements, - Reference semId, MatchMode matchMode = MatchMode.Strict) - where T : ISubmodelElement - { - foreach (var submodelElement in submodelELements) - if (submodelElement != null && submodelElement is T - && submodelElement.SemanticId != null) - if (submodelElement.SemanticId.Matches(semId, matchMode)) - yield return (T)submodelElement; - } - - public static T FindFirstSemanticIdAs(this List submodelElements, - Key semId, MatchMode matchMode = MatchMode.Strict) - where T : ISubmodelElement - { - return submodelElements.FindAllSemanticIdAs(semId, matchMode).FirstOrDefault(); - } - - public static T FindFirstSemanticIdAs(this List submodelElements, - Reference semId, MatchMode matchMode = MatchMode.Strict) - where T : ISubmodelElement - { - return submodelElements.FindAllSemanticIdAs(semId, matchMode).FirstOrDefault(); - } - - public static void RecurseOnReferables(this List submodelElements, object state, List parents, - Func, IReferable, bool> lambda) - { - if (lambda == null) - return; - if (parents == null) - parents = new List(); - - // over all elements - foreach (var submodelElement in submodelElements) - { - var current = submodelElement; - if (current == null) - continue; - - // call lambda for this element - // AND decide, if to recurse! - var goDeeper = lambda(state, parents, current); - - if (goDeeper) - { - // add to parents - parents.Add(current); - - // dive into? - if (current is SubmodelElementCollection smc) - smc.Value?.RecurseOnReferables(state, parents, lambda); - - if (current is Entity ent) - ent.Statements?.RecurseOnReferables(state, parents, lambda); - - if (current is Operation operation) - { - SubmodelElementCollection opVariableCollection = new SubmodelElementCollection(); - foreach (var inputVariable in operation.InputVariables) - { - opVariableCollection.Value.Add(inputVariable.Value); - } - - foreach (var outputVariable in operation.OutputVariables) - { - opVariableCollection.Value.Add(outputVariable.Value); - } - - foreach (var inOutVariable in operation.InoutputVariables) - { - opVariableCollection.Value.Add(inOutVariable.Value); - } - - opVariableCollection.Value.RecurseOnReferables(state, parents, lambda); - } - - if (current is AnnotatedRelationshipElement annotatedRelationshipElement) - { - var annotationElements = new List(); - if (annotatedRelationshipElement.Annotations != null) - foreach (var annotation in annotatedRelationshipElement.Annotations) - { - annotationElements.Add(annotation); - } - annotationElements.RecurseOnReferables(state, parents, lambda); - } - - // remove from parents - parents.RemoveAt(parents.Count - 1); - } - } - } - - public static void RecurseOnSubmodelElements(this List submodelElements, object state, List parents, Action, ISubmodelElement> lambda) - { - // trivial - if (lambda == null) - return; - if (parents == null) - parents = new List(); - - // over all elements - foreach (var smw in submodelElements) - { - var current = smw; - if (current == null) - continue; - - // call lambda for this element - lambda(state, parents, current); - - // add to parents - parents.Add(current); - - // dive into? - if (current is SubmodelElementCollection smc) - smc.Value?.RecurseOnSubmodelElements(state, parents, lambda); - - if (current is Entity ent) - ent.Statements?.RecurseOnSubmodelElements(state, parents, lambda); - - if (current is Operation operation) - { - SubmodelElementCollection opVariableCollection = new SubmodelElementCollection(); - foreach (var inputVariable in operation.InputVariables) - { - opVariableCollection.Value.Add(inputVariable.Value); - } - - foreach (var outputVariable in operation.OutputVariables) - { - opVariableCollection.Value.Add(outputVariable.Value); - } - - foreach (var inOutVariable in operation.InoutputVariables) - { - opVariableCollection.Value.Add(inOutVariable.Value); - } - - opVariableCollection.Value.RecurseOnSubmodelElements(state, parents, lambda); - } - - if (current is AnnotatedRelationshipElement annotatedRelationshipElement) - { - var annotationElements = new List(); - foreach (var annotation in annotatedRelationshipElement.Annotations) - { - annotationElements.Add(annotation); - } - annotationElements.RecurseOnSubmodelElements(state, parents, lambda); - } - - // remove from parents - parents.RemoveAt(parents.Count - 1); - } - } - - public static IEnumerable FindAllSemanticIdAs(this List submodelELements, string semanticId) where T : ISubmodelElement - { - foreach (var submodelElement in submodelELements) - { - if (submodelElement != null && submodelElement is T && submodelElement.SemanticId != null) - { - if (submodelElement.SemanticId.Matches(semanticId)) - { - yield return (T)submodelElement; - } - } - } - } - - public static T FindFirstSemanticIdAs(this List submodelELements, string semanticId) where T : ISubmodelElement - { - return submodelELements.FindAllSemanticIdAs(semanticId).FirstOrDefault(); - } - - public static T FindFirstAnySemanticIdAs(this List submodelELements, string[] semanticIds) where T : ISubmodelElement - { - if (semanticIds == null) - return default; - foreach (var semanticId in semanticIds) - { - var found = submodelELements.FindFirstSemanticIdAs(semanticId); - if (found != null) - return found; - } - return default; - } - - public static IEnumerable FindAllSemanticId( - this List smes, - string[] allowedSemanticIds, - bool invertedAllowed = false) where T : ISubmodelElement - { - if (allowedSemanticIds == null || allowedSemanticIds.Length < 1) - yield break; - - foreach (var sme in smes) - { - if (sme == null || !(sme is T)) - continue; - - if (sme.SemanticId == null || sme.SemanticId.Keys.Count < 1) - { - if (invertedAllowed) - yield return (T)sme; - continue; - } - - var found = false; - foreach (var semanticId in allowedSemanticIds) - if (sme.SemanticId.Matches(semanticId)) - { - found = true; - break; - } - - if (invertedAllowed) - found = !found; - - if (found) - yield return (T)sme; - } - } - - public static T FindFirstAnySemanticId(this List submodelElements, string[] allowedSemanticIds, bool invertAllowed = false) where T : ISubmodelElement - { - return submodelElements.FindAllSemanticId(allowedSemanticIds, invertAllowed).FirstOrDefault(); - } - - public static IEnumerable FindAllSemanticId( - this List smes, - Key[] allowedSemanticIds, MatchMode mm = MatchMode.Strict, - bool invertedAllowed = false) where T : ISubmodelElement - { - if (allowedSemanticIds == null || allowedSemanticIds.Length < 1) - yield break; - - foreach (var sme in smes) - { - if (sme == null || !(sme is T)) - continue; - - if (sme.SemanticId == null || sme.SemanticId.Keys.Count < 1) - { - if (invertedAllowed) - yield return (T)sme; - continue; - } - - var found = false; - foreach (var semanticId in allowedSemanticIds) - if (sme.SemanticId.MatchesExactlyOneKey(semanticId, mm)) - { - found = true; - break; - } - - if (invertedAllowed) - found = !found; - - if (found) - yield return (T)sme; - } - } - - public static T FindFirstAnySemanticId( - this List submodelElements, - Key[] allowedSemanticIds, MatchMode mm = MatchMode.Strict, - bool invertAllowed = false) where T : ISubmodelElement - { - return submodelElements.FindAllSemanticId(allowedSemanticIds, mm, invertAllowed).FirstOrDefault(); - } - - public static IEnumerable FindAllSemanticId( - this List submodelElements, Key semId, - Type[] allowedTypes = null, - MatchMode matchMode = MatchMode.Strict) - { - foreach (var smw in submodelElements) - if (smw != null && smw.SemanticId != null) - { - if (smw == null) - continue; - - if (allowedTypes != null) - { - var smwt = smw.GetType(); - if (!allowedTypes.Contains(smwt)) - continue; - } - - if (smw.SemanticId.MatchesExactlyOneKey(semId, matchMode)) - yield return smw; - } - } - - public static ISubmodelElement FindFirstSemanticId(this List submodelElements, Key semId, Type[] allowedTypes = null, MatchMode matchMode = MatchMode.Strict) - { - return submodelElements.FindAllSemanticId(semId, allowedTypes, matchMode)?.FirstOrDefault(); - } - - public static IEnumerable FindAllSemanticIdAs( - this List smes, - ConceptDescription cd, MatchMode matchMode = MatchMode.Strict) - where T : ISubmodelElement - { - foreach (var x in FindAllSemanticIdAs(smes, cd.GetReference(), matchMode)) - yield return x; - } - - public static T FindFirstSemanticIdAs( - this List smes, - ConceptDescription cd, MatchMode matchMode = MatchMode.Strict) - where T : ISubmodelElement - { - return smes.FindAllSemanticIdAs(cd, matchMode).FirstOrDefault(); - } - - - public static string IterateIdShortTemplateToBeUnique(this List submodelElements, string idShortTemplate, int maxNum) - { - if (idShortTemplate == null || maxNum < 1 || !idShortTemplate.Contains("{0")) - return null; - - int i = 1; - while (i < maxNum) - { - var ids = string.Format(idShortTemplate, i); - if (submodelElements.CheckIdShortIsUnique(ids)) - return ids; - i++; - } - - return null; - } - - public static bool CheckIdShortIsUnique(this List submodelElements, string idShort) - { - idShort = idShort?.Trim(); - if (idShort == null || idShort.Length < 1) - return false; - - var res = true; - foreach (var smw in submodelElements) - if (smw != null && smw.IdShort != null && smw.IdShort == idShort) - { - res = false; - break; - } - - return res; - } - - #endregion - - public static ISubmodelElement UpdateFrom(this ISubmodelElement elem, ISubmodelElement source) - { - if (source == null) - return elem; - - // IReferable - elem.Category = source.Category; - elem.IdShort = source.IdShort; - elem.DisplayName = source.DisplayName?.Copy(); - elem.Description = source.Description?.Copy(); - elem.Checksum = source.Checksum; - - // IHasKind - if (source.Kind.HasValue) - elem.Kind = source.Kind.Value; - - // IHasSemantics - if (source.SemanticId != null) - elem.SemanticId = source.SemanticId.Copy(); - if (source.SupplementalSemanticIds != null) - elem.SupplementalSemanticIds = source.SupplementalSemanticIds.Copy(); - - // IQualifiable - if (source.Qualifiers != null) - elem.Qualifiers = source.Qualifiers.Copy(); - - // IHasDataSpecification - if (source.EmbeddedDataSpecifications != null) - elem.EmbeddedDataSpecifications = source.EmbeddedDataSpecifications.Copy(); - - return elem; - } - - // - // Factories - // - - private static readonly Dictionary AasSubmodelElementsToAbbrev = ( - new Dictionary() - { - { AasSubmodelElements.AnnotatedRelationshipElement, "RelA" }, - { AasSubmodelElements.BasicEventElement, "BEvt" }, - { AasSubmodelElements.Blob, "Blob" }, - { AasSubmodelElements.Capability, "Cap" }, - { AasSubmodelElements.DataElement, "DE" }, - { AasSubmodelElements.Entity, "Ent" }, - { AasSubmodelElements.EventElement, "Evt" }, - { AasSubmodelElements.File, "File" }, - { AasSubmodelElements.MultiLanguageProperty, "MLP" }, - { AasSubmodelElements.Operation, "Opr" }, - { AasSubmodelElements.Property, "Prop" }, - { AasSubmodelElements.Range, "Range" }, - { AasSubmodelElements.ReferenceElement, "Ref" }, - { AasSubmodelElements.RelationshipElement, "Rel" }, - { AasSubmodelElements.SubmodelElement, "SME" }, - { AasSubmodelElements.SubmodelElementList, "SML" }, - { AasSubmodelElements.SubmodelElementCollection, "SMC" } - }); - - /// - /// Retrieve the string abbreviation of . - /// - /// - /// If is not a valid literal, return null. - /// - public static string? ToString(AasSubmodelElements? that) - { - if (!that.HasValue) - { - return null; - } - else - { - if (AasSubmodelElementsToAbbrev.TryGetValue(that.Value, out string? value)) - { - return value; - } - else - { - return null; - } - } - } - - private static readonly Dictionary _aasSubmodelElementsFromAbbrev = ( - new Dictionary() - { - { "RelA", AasSubmodelElements.AnnotatedRelationshipElement }, - { "BEvt", AasSubmodelElements.BasicEventElement }, - { "Blob", AasSubmodelElements.Blob }, - { "Cap", AasSubmodelElements.Capability }, - { "DE", AasSubmodelElements.DataElement }, - { "Ent", AasSubmodelElements.Entity }, - { "Evt", AasSubmodelElements.EventElement }, - { "File", AasSubmodelElements.File }, - { "MLP", AasSubmodelElements.MultiLanguageProperty }, - { "Opr", AasSubmodelElements.Operation }, - { "Prop", AasSubmodelElements.Property }, - { "Range", AasSubmodelElements.Range }, - { "Ref", AasSubmodelElements.ReferenceElement }, - { "Rel", AasSubmodelElements.RelationshipElement }, - { "SME", AasSubmodelElements.SubmodelElement }, - { "SML", AasSubmodelElements.SubmodelElementList }, - { "SMC", AasSubmodelElements.SubmodelElementCollection } - }); - - /// - /// Parse the string abbreviation of . - /// - /// - /// If is not a valid string representation - /// of a literal of , - /// return null. - /// - public static AasSubmodelElements? AasSubmodelElementsFromAbbrev(string text) - { - if (_aasSubmodelElementsFromAbbrev.TryGetValue(text, out AasSubmodelElements value)) - { - return value; - } - else - { - return null; - } - } - - /// - /// Parse the string representation or the abbreviation of . - /// - /// - /// If is not a valid string representation - /// of a literal of , - /// return null. - /// - public static AasSubmodelElements? AasSubmodelElementsFromStringOrAbbrev(string text) - { - var res = Stringification.AasSubmodelElementsFromString(text); - if (res.HasValue) - return res; - - return AasSubmodelElementsFromAbbrev(text); - } - - } -} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendKey.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendKey.cs deleted file mode 100644 index 141308e50..000000000 --- a/src/AasxCsharpLib_bkp/Extensions/ExtendKey.cs +++ /dev/null @@ -1,229 +0,0 @@ -using AasCore.Aas3_0_RC02; -using AasxCompatibilityModels; -using AdminShellNS; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.Serialization; -using System.Text.RegularExpressions; - -namespace Extensions -{ - public static class ExtendKey - { - public static Key CreateFrom(Reference r) - { - if (r == null || r.Count() != 1) - return null; - return r.Keys[0].Copy(); - } - - public static bool Matches(this Key key, - KeyTypes type, string id, MatchMode matchMode = MatchMode.Strict) - { - if (matchMode == MatchMode.Strict) - return key.Type == type && key.Value == id; - - if (matchMode == MatchMode.Relaxed) - return (key.Type == type || key.Type == KeyTypes.GlobalReference || type == KeyTypes.GlobalReference) - && key.Value == id; - - if (matchMode == MatchMode.Identification) - return key.Value == id; - - return false; - } - public static bool Matches(this Key key, Key otherKey) - { - if (otherKey == null) - { - return false; - } - - if (key.Type == otherKey.Type && key.Value.Equals(otherKey.Value)) - { - return true; - } - - return false; - } - - public static bool Matches(this Key key, Key otherKey, MatchMode matchMode = MatchMode.Strict) - { - if (matchMode == MatchMode.Strict) - return key.Type == otherKey.Type && key.Value == otherKey.Value; - - if (matchMode == MatchMode.Relaxed) - return (key.Type == otherKey.Type || key.Type == KeyTypes.GlobalReference || otherKey.Type == KeyTypes.GlobalReference) - && (key.Value == otherKey.Value); - - if (matchMode == MatchMode.Identification) - return key.Value == otherKey.Value; - - return false; - } - - public static bool MatchesSetOfTypes(this Key key, IEnumerable set) - { - foreach (var kt in set) - if (key.Type == kt) - return true; - return false; - } - - - public static AasValidationAction Validate(this Key key, AasValidationRecordList results, IReferable container) - { - // access - if (results == null || container == null) - return AasValidationAction.No; - - var res = AasValidationAction.No; - - // check - if (key == null) - { - // violation case - results.Add(new AasValidationRecord( - AasValidationSeverity.SpecViolation, container, - "Key: is null", - () => - { - res = AasValidationAction.ToBeDeleted; - })); - } - else - { - - // check type - var tf = AdminShellUtil.CheckIfInConstantStringArray(Enum.GetNames(typeof(KeyTypes)), Stringification.ToString(key.Type)); - if (tf == AdminShellUtil.ConstantFoundEnum.No) - // violation case - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, container, - "Key: type is not in allowed enumeration values", - () => - { - key.Type = KeyTypes.GlobalReference; - })); - if (tf == AdminShellUtil.ConstantFoundEnum.AnyCase) - // violation case - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, container, - "Key: type in wrong casing", - () => - { - //NO IdType in V3 - //key.idType = AdminShellUtil.CorrectCasingForConstantStringArray( - // KeyElements, key.type); - })); - } - - // may give result "to be deleted" - return res; - } - - - - public static string ToStringExtended(this Key key, int format = 1) - { - if (format == 2) - return "" + key.Value; - return $"[{key.Type}, {key.Value}]"; - } - - public static bool IsAbsolute(this Key key) - { - return key.Type == KeyTypes.GlobalReference || key.Type == KeyTypes.AssetAdministrationShell || key.Type == KeyTypes.Submodel; - } - - public static Key Parse(string cell, KeyTypes typeIfNotSet = KeyTypes.GlobalReference, - bool allowFmtAll = false, bool allowFmt0 = false, - bool allowFmt1 = false, bool allowFmt2 = false) - { - // access and defaults? - if (cell == null || cell.Trim().Length < 1) - return null; - - // format == 1 - if (allowFmtAll || allowFmt1) - { - var m = Regex.Match(cell, @"\((\w+)\)( ?)(.*)$"); - if (m.Success) - { - return new Key( - Stringification.KeyTypesFromString(m.Groups[1].ToString()) ?? KeyTypes.GlobalReference, - m.Groups[3].ToString()); - } - } - - // format == 2 - if (allowFmtAll || allowFmt2) - { - var m = Regex.Match(cell, @"( ?)(.*)$"); - if (m.Success) - { - return new Key( - typeIfNotSet, m.Groups[2].ToString()); - } - } - - // format == 0 - if (allowFmtAll || allowFmt0) - { - var m = Regex.Match(cell, @"\[(\w+),( ?)(.*)\]"); - if (m.Success) - { - return new Key( - Stringification.KeyTypesFromString(m.Groups[1].ToString()) ?? KeyTypes.GlobalReference, - m.Groups[3].ToString()); - } - } - - // no - return null; - } - - // ------------------------------------------------------------------------------------------------------------- - #region Handling with enums for KeyTypes - - // see: https://stackoverflow.com/questions/27372816/how-to-read-the-value-for-an-enummember-attribute - //public static string? GetEnumMemberValue(this T value) - // where T : Enum - //{ - // return typeof(T) - // .GetTypeInfo() - // .DeclaredMembers - // .SingleOrDefault(x => x.Name == value.ToString()) - // ?.GetCustomAttribute(false) - // ?.Value; - //} - - //public static KeyTypes? MapFrom(AasReferables input) - //{ - // var st = input.GetEnumMemberValue(); - // var res = Stringification.KeyTypesFromString(st); - // return res; - //} - - //public static List MapFrom(IEnumerable input) - //{ - // List res = new(); - // foreach (var i in input) - // { - // var x = MapFrom(i); - // if (x.HasValue) - // res.Add(x.Value); - // } - // return res; - //} - - //public static List GetAllKeyTypesForAasReferables() - // => ExtendKey.MapFrom(Enum.GetValues(typeof(AasReferables)).OfType()); - - #endregion - - } -} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendKeyList.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendKeyList.cs deleted file mode 100644 index 86d899062..000000000 --- a/src/AasxCsharpLib_bkp/Extensions/ExtendKeyList.cs +++ /dev/null @@ -1,183 +0,0 @@ -using AasCore.Aas3_0_RC02; -using AasxCompatibilityModels; -using AdminShellNS; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.Serialization; -using System.Text.RegularExpressions; -using Extensions; - -namespace Extensions -{ - public static class ExtendKeyList - { - public static bool IsEmpty(this List keys) - { - return keys.Count < 1; - } - - public static bool Matches(this List keys, List other, MatchMode matchMode = MatchMode.Strict) - { - if (other == null || other.Count != keys.Count) - return false; - - var same = true; - for (int i = 0; i < keys.Count; i++) - same = same && keys[i].Matches(other[i], matchMode); - - return same; - } - - public static List ReplaceLastKey(this List keys,List newKeys) - { - var res = new List(keys); - if (res.Count < 1 || newKeys == null || newKeys.Count < 1) - return res; - - res.Remove(res.Last()); - res.AddRange(newKeys); - return res; - } - - public static bool StartsWith(this List keyList, List otherKeyList) - { - if (otherKeyList == null || otherKeyList.Count == 0) - return false; - - // simply test element-wise - for (int i = 0; i < otherKeyList.Count; i++) - { - // does head have more elements than this list? - if (i >= keyList.Count) - return false; - - if (!otherKeyList[i].Matches(keyList[i])) - return false; - } - - // ok! - return true; - } - - public static bool StartsWith(this List keyList,List head, bool emptyIsTrue = false, - MatchMode matchMode = MatchMode.Relaxed) - { - // access - if (head == null) - return false; - if (head.Count == 0) - return emptyIsTrue; - - // simply test element-wise - for (int i = 0; i < head.Count; i++) - { - // does head have more elements than this list? - if (i >= keyList.Count) - return false; - - if (!head[i].Matches(keyList[i], matchMode)) - return false; - } - - // ok! - return true; - } - - public static string ToStringExtended(this List keys, int format = 1, string delimiter = ",") - { - return string.Join(delimiter, keys.Select((k) => k.ToStringExtended(format))); - } - - public static void Validate(this List keys, AasValidationRecordList results, - IReferable container) - { - // access - if (results == null || keys == null || container == null) - return; - - // iterate thru - var idx = 0; - while (idx < keys.Count) - { - var act = keys[idx].Validate(results, container); - if (act == AasValidationAction.ToBeDeleted) - { - keys.RemoveAt(idx); - continue; - } - idx++; - } - } - - public static bool MatchesSetOfTypes(this List key, IEnumerable set) - { - var res = true; - foreach (var kt in key) - if (!key.MatchesSetOfTypes(set)) - res = false; - return res; - } - - public static List Parse(string input) - { - // access - if (input == null) - return null; - - // split - var parts = input.Split(',', ';'); - var kl = new List(); - - foreach (var p in parts) - { - var k = ExtendKey.Parse(p); - if (k != null) - kl.Add(k); - } - - return kl; - } - - /// - /// Take only idShort, ignore all other key-types and create a '/'-separated list - /// - /// Empty string or list of idShorts - public static string BuildIdShortPath(this List keyList, - int startPos = 0, int count = int.MaxValue) - { - if (keyList == null || startPos >= keyList.Count) - return ""; - int nr = 0; - var res = ""; - for (int i = startPos; i < keyList.Count && nr < count; i++) - { - nr++; - //// if (keyList[i].Type.Trim().ToLower() == Key.IdShort.Trim().ToLower()) - { - if (res != "") - res += "/"; - res += keyList[i].Value; - } - } - return res; - } - - public static List SubList(this List keyList, - int startPos, int count = int.MaxValue) - { - var res = new List(); - if (startPos >= keyList.Count()) - return res; - int nr = 0; - for (int i = startPos; i < keyList.Count() && nr < count; i++) - { - nr++; - res.Add(keyList[i]); - } - return res; - } - } -} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendKeyTypes.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendKeyTypes.cs deleted file mode 100644 index 2b00c5fd1..000000000 --- a/src/AasxCsharpLib_bkp/Extensions/ExtendKeyTypes.cs +++ /dev/null @@ -1,22 +0,0 @@ -using AasCore.Aas3_0_RC02; -using AdminShellNS; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.Serialization; - -namespace Extensions -{ - public static class ExtendKeyTypes - { - public static bool IsSME(this KeyTypes keyType) - { - foreach (var kt in Constants.AasSubmodelElementsAsKeys) - if (kt.HasValue && kt.Value == keyType) - return true; - return false; - } - } -} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendLangString.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendLangString.cs deleted file mode 100644 index 1dc8f9504..000000000 --- a/src/AasxCsharpLib_bkp/Extensions/ExtendLangString.cs +++ /dev/null @@ -1,35 +0,0 @@ -using AasCore.Aas3_0_RC02; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Extensions -{ - public static class ExtendLangString - { - // constants - public static string LANG_DEFAULT = "en"; - - // MIHO: not required, see ExtendLangStringSte - //public static string GetDefaultString(this List langStrings, string defaultLang = null) - //{ - // // start - // if (defaultLang == null) - // defaultLang = "en"; - // defaultLang = defaultLang.Trim().ToLower(); - // string res = null; - - // // search - // foreach (var ls in langStrings) - // if (ls.Language.Trim().ToLower() == defaultLang) - // res = ls.Text; - // if (res == null && langStrings.Count > 0) - // res = langStrings[0].Text; - - // // found? - // return res; - //} - } -} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendLangStringSet.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendLangStringSet.cs deleted file mode 100644 index c5743605c..000000000 --- a/src/AasxCsharpLib_bkp/Extensions/ExtendLangStringSet.cs +++ /dev/null @@ -1,165 +0,0 @@ -using AasCore.Aas3_0_RC02; -using System; -using System.Collections.Generic; -using System.Text.RegularExpressions; - -namespace Extensions -{ - public static class ExtendLangStringSet - { - #region AasxPackageExplorer - - public static bool IsValid(this List langStringSet) - { - if(langStringSet != null && langStringSet.Count >=1) - { - return true; - } - - return false; - } - - #endregion - public static bool IsEmpty(this List langStringSet) - { - if (langStringSet == null || langStringSet.Count == 0) - { - return true; - } - - return false; - } - public static string GetDefaultString(this List langStringSet, string defaultLang = null) - { - // start - if (defaultLang == null) - defaultLang = "en"; //Default Lang in old implementation is en - - string res = null; - - // search - foreach (var langString in langStringSet) - if (langString.Language.Equals(defaultLang, StringComparison.OrdinalIgnoreCase)) - res = langString.Text; - - if (res == null && langStringSet.Count > 0) - res = langStringSet[0].Text; - - // found? - return res; - } - - public static List Create(string language, string text) - { - return new List { new LangString(language, text) }; - } - - public static List CreateManyFromStringArray(string[] s) - { - if (s == null) - return null; - var r = new List(); - var i = 0; - while ((i + 1) < s.Length) - { - r.Add(new LangString(s[i], s[i + 1])); - i += 2; - } - return r; - } - - // TODO (Jui, 2023-01-05): Check why the generic Copy does not apply here?! - public static List Copy(this List original) - { - var res = new List(); - if (original != null) - foreach (var o in original) - res.Add(o.Copy()); - return res; - } - - public static List Set(this List lss, string lang, string text) - { - foreach (var ls in lss) - if (ls.Language.Trim().ToLower() == lang?.Trim().ToLower()) - { - ls.Text = text; - return lss; - } - lss.Add(new LangString(lang, text)); - return lss; - } - - public static List ConvertFromV20( - this List langStringSet, - AasxCompatibilityModels.AdminShellV20.LangStringSet sourceLangStrings) - { - - //if (!sourceLangStrings.langString.IsNullOrEmpty()) - if (sourceLangStrings.langString!= null && sourceLangStrings.langString.Count != 0) - { - langStringSet = new List(); - foreach (var sourceLangString in sourceLangStrings.langString) - { - var langString = new LangString(sourceLangString.lang, sourceLangString.str); - langStringSet.Add(langString); - } - } - return langStringSet; - } - - public static List ConvertFromV20( - this List lss, - AasxCompatibilityModels.AdminShellV20.LangStringSetIEC61360 src) - { - - //if (!sourceLangStrings.langString.IsNullOrEmpty()) - if (src != null && src.Count != 0) - { - lss = new List(); - foreach (var sourceLangString in src) - { - var langString = new LangString(sourceLangString.lang, sourceLangString.str); - lss.Add(langString); - } - } - return lss; - } - - public static List Parse(string cell) - { - // access - if (cell == null) - return null; - - // iterative approach - var res = new List(); - while (true) - { - // trivial case and finite end - if (!cell.Contains("@")) - { - if (cell.Trim() != "") - res.Add(new LangString(ExtendLangString.LANG_DEFAULT, cell)); - break; - } - - // OK, pick the next couple - var m = Regex.Match(cell, @"(.*?)@(\w+)", RegexOptions.Singleline); - if (!m.Success) - { - // take emergency exit? - res.Add(new LangString("??", cell)); - break; - } - - // use the match and shorten cell .. - res.Add(new LangString(m.Groups[2].ToString(), m.Groups[1].ToString().Trim())); - cell = cell.Substring(m.Index + m.Length); - } - - return res; - } - - } -} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendModelKind.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendModelKind.cs deleted file mode 100644 index 142f91c65..000000000 --- a/src/AasxCsharpLib_bkp/Extensions/ExtendModelKind.cs +++ /dev/null @@ -1,33 +0,0 @@ -using AasCore.Aas3_0_RC02; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using AdminShellNS; - -namespace Extensions -{ - public static class ExtendModelKind - { - public static void Validate(this ModelingKind modelingKind, AasValidationRecordList results, IReferable container) - { - // access - if (results == null || container == null) - return; - - // check - if (modelingKind != ModelingKind.Template && modelingKind != ModelingKind.Instance) - { - // violation case - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, container, - $"ModelingKind: enumeration value neither Template nor Instance", - () => - { - modelingKind = ModelingKind.Instance; - })); - } - } - } -} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendMultiLanguageProperty.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendMultiLanguageProperty.cs deleted file mode 100644 index 6dd634852..000000000 --- a/src/AasxCsharpLib_bkp/Extensions/ExtendMultiLanguageProperty.cs +++ /dev/null @@ -1,127 +0,0 @@ -using AasCore.Aas3_0_RC02; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Extensions -{ - public static class ExtendMultiLanguageProperty - { - #region AasxPackageExplorer - - public static void ValueFromText(this MultiLanguageProperty multiLanguageProperty, string text, string defaultLang) - { - multiLanguageProperty.Value ??= new List(); - - multiLanguageProperty.Value.Add(new LangString(defaultLang == null? "en" : defaultLang, text)); - } - - #endregion - - public static string ValueAsText(this MultiLanguageProperty multiLanguageProperty, string defaultLang = null) - { - //TODO: need to check/test again - //return "" + multiLanguageProperty.Value?.LangStrings.FirstOrDefault().Text; - return "" + multiLanguageProperty.Value?.GetDefaultString(defaultLang); - } - - public static MultiLanguageProperty ConvertFromV20(this MultiLanguageProperty property, AasxCompatibilityModels.AdminShellV20.MultiLanguageProperty sourceProperty) - { - if (sourceProperty == null) - { - return null; - } - - if (sourceProperty.valueId != null) - { - var keyList = new List(); - foreach (var refKey in sourceProperty.valueId.Keys) - { - //keyList.Add(new Key(ExtensionsUtil.GetKeyTypeFromString(refKey.type), refKey.value)); - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value not found for property {property.IdShort}"); - } - } - property.ValueId = new Reference(ReferenceTypes.GlobalReference, keyList); - } - - var newLangStrings = new List(); - - List newLangStringSet = new(newLangStrings); - - property.Value = newLangStringSet.ConvertFromV20(sourceProperty.value); - - return property; - - } - - public static MultiLanguageProperty UpdateFrom( - this MultiLanguageProperty elem, ISubmodelElement source) - { - if (source == null) - return elem; - - ((ISubmodelElement)elem).UpdateFrom(source); - - if (source is Property srcProp) - { - elem.Value = new List { new LangString("EN?", srcProp.Value) }; - if (srcProp.ValueId != null) - elem.ValueId = srcProp.ValueId.Copy(); - } - - if (source is MultiLanguageProperty srcMlp) - { - if (srcMlp.Value != null) - elem.Value = srcMlp.Value.Copy(); - if (srcMlp.ValueId != null) - elem.ValueId = srcMlp.ValueId.Copy(); - } - - if (source is AasCore.Aas3_0_RC02.Range srcRng) - { - if (srcRng.Min != null) - elem.Value = new List { new LangString("EN?", srcRng.Min) }; - } - - if (source is File srcFile) - { - elem.Value = new List { new LangString("EN?", srcFile.Value) }; - } - - return elem; - } - - public static MultiLanguageProperty Set(this MultiLanguageProperty mlp, - List ls) - { - mlp.Value = ls; - return mlp; - } - - public static MultiLanguageProperty Set(this MultiLanguageProperty mlp, - LangString ls) - { - if (ls == null) - return mlp; - if (mlp.Value == null) - mlp.Value = new List(); - mlp.Value.Set(ls.Language, ls.Text); - return mlp; - } - - public static MultiLanguageProperty Set(this MultiLanguageProperty mlp, - string lang, string str) - { - return mlp.Set(new LangString(lang, str)); - } - } -} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendObject.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendObject.cs deleted file mode 100644 index 2f0db29c2..000000000 --- a/src/AasxCsharpLib_bkp/Extensions/ExtendObject.cs +++ /dev/null @@ -1,137 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Threading.Tasks; -using Extensions.ArrayExtensions; - -namespace Extensions -{ - public static class ExtendObject - { - private static readonly MethodInfo CloneMethod = typeof(Object).GetMethod("MemberwiseClone", BindingFlags.NonPublic | BindingFlags.Instance); - - public static bool IsPrimitive(this Type type) - { - if (type == typeof(String)) return true; - return (type.IsValueType & type.IsPrimitive); - } - - public static Object Copy(this Object originalObject) - { - return InternalCopy(originalObject, new Dictionary(new ReferenceEqualityComparer())); - } - - private static Object InternalCopy(Object originalObject, IDictionary visited) - { - if (originalObject == null) return null; - var typeToReflect = originalObject.GetType(); - if (IsPrimitive(typeToReflect)) return originalObject; - if (visited.ContainsKey(originalObject)) return visited[originalObject]; - if (typeof(Delegate).IsAssignableFrom(typeToReflect)) return null; - var cloneObject = CloneMethod.Invoke(originalObject, null); - if (typeToReflect.IsArray) - { - var arrayType = typeToReflect.GetElementType(); - if (IsPrimitive(arrayType) == false) - { - Array clonedArray = (Array)cloneObject; - clonedArray.ForEach((array, indices) => array.SetValue(InternalCopy(clonedArray.GetValue(indices), visited), indices)); - } - - } - visited.Add(originalObject, cloneObject); - CopyFields(originalObject, visited, cloneObject, typeToReflect); - RecursiveCopyBaseTypePrivateFields(originalObject, visited, cloneObject, typeToReflect); - return cloneObject; - } - - private static void RecursiveCopyBaseTypePrivateFields(object originalObject, IDictionary visited, object cloneObject, Type typeToReflect) - { - if (typeToReflect.BaseType != null) - { - RecursiveCopyBaseTypePrivateFields(originalObject, visited, cloneObject, typeToReflect.BaseType); - CopyFields(originalObject, visited, cloneObject, typeToReflect.BaseType, BindingFlags.Instance | BindingFlags.NonPublic, info => info.IsPrivate); - } - } - - private static void CopyFields(object originalObject, IDictionary visited, object cloneObject, Type typeToReflect, BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.FlattenHierarchy, Func filter = null) - { - foreach (FieldInfo fieldInfo in typeToReflect.GetFields(bindingFlags)) - { - if (filter != null && filter(fieldInfo) == false) continue; - if (IsPrimitive(fieldInfo.FieldType)) continue; - var originalFieldValue = fieldInfo.GetValue(originalObject); - var clonedFieldValue = InternalCopy(originalFieldValue, visited); - fieldInfo.SetValue(cloneObject, clonedFieldValue); - } - } - public static T Copy(this T original) - { - return (T)Copy((Object)original); - } - } - - public class ReferenceEqualityComparer : EqualityComparer - { - public override bool Equals(object x, object y) - { - return ReferenceEquals(x, y); - } - public override int GetHashCode(object obj) - { - if (obj == null) return 0; - return obj.GetHashCode(); - } - } - - namespace ArrayExtensions - { - public static class ArrayExtensions - { - public static void ForEach(this Array array, Action action) - { - if (array.LongLength == 0) return; - ArrayTraverse walker = new ArrayTraverse(array); - do action(array, walker.Position); - while (walker.Step()); - } - } - - internal class ArrayTraverse - { - public int[] Position; - private int[] maxLengths; - - public ArrayTraverse(Array array) - { - maxLengths = new int[array.Rank]; - for (int i = 0; i < array.Rank; ++i) - { - maxLengths[i] = array.GetLength(i) - 1; - } - Position = new int[array.Rank]; - } - - public bool Step() - { - for (int i = 0; i < Position.Length; ++i) - { - if (Position[i] < maxLengths[i]) - { - Position[i]++; - for (int j = 0; j < i; j++) - { - Position[j] = 0; - } - return true; - } - } - return false; - } - } - } - -} - diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendOperation.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendOperation.cs deleted file mode 100644 index 12ad52979..000000000 --- a/src/AasxCsharpLib_bkp/Extensions/ExtendOperation.cs +++ /dev/null @@ -1,148 +0,0 @@ -using AasCore.Aas3_0_RC02; -using AdminShellNS.Display; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Runtime.CompilerServices; -using System.Text; -using System.Threading.Tasks; - -namespace Extensions -{ - public static class ExtendOperation - { - #region AasxPackageExplorer - - public static object AddChild(this Operation operation, ISubmodelElement childSubmodelElement, EnumerationPlacmentBase placement = null) - { - // not enough information to select list of children? - var pl = placement as EnumerationPlacmentOperationVariable; - if (childSubmodelElement == null || pl == null) - return null; - - // ok, use information - var ov = new OperationVariable(childSubmodelElement); - - if (childSubmodelElement != null) - childSubmodelElement.Parent = operation; - - if (pl.Direction == OperationVariableDirection.In) - { - operation.InputVariables ??= new List(); - operation.InputVariables.Add(ov); - } - - if (pl.Direction == OperationVariableDirection.Out) - { - operation.OutputVariables ??= new List(); - operation.OutputVariables.Add(ov); - } - - if (pl.Direction == OperationVariableDirection.InOut) - { - operation.InoutputVariables ??= new List(); - operation.InoutputVariables.Add(ov); - } - - return ov; - } - - public static EnumerationPlacmentBase GetChildrenPlacement(this Operation operation, ISubmodelElement child) - { - // trivial - if (child == null) - return null; - - // search - OperationVariableDirection? dir = null; - OperationVariable opvar = null; - if (operation.InputVariables != null) - foreach (var ov in operation.InputVariables) - if (ov?.Value == child) - { - dir = OperationVariableDirection.In; - opvar = ov; - } - - if (operation.OutputVariables != null) - foreach (var ov in operation.OutputVariables) - if (ov?.Value == child) - { - dir = OperationVariableDirection.Out; - opvar = ov; - } - - if (operation.InoutputVariables != null) - foreach (var ov in operation.InoutputVariables) - if (ov?.Value == child) - { - dir = OperationVariableDirection.InOut; - opvar = ov; - } - - // found - if (!dir.HasValue) - return null; - return new EnumerationPlacmentOperationVariable() - { - Direction = dir.Value, - OperationVariable = opvar - }; - } - - public static List GetVars(this Operation op, OperationVariableDirection dir) - { - if (dir == OperationVariableDirection.In) - return op.InputVariables; - if (dir == OperationVariableDirection.Out) - return op.OutputVariables; - return op.InoutputVariables; - } - - public static List SetVars( - this Operation op, OperationVariableDirection dir, List value) - { - if (dir == OperationVariableDirection.In) - { - op.InputVariables = value; - return op.InputVariables; - } - if (dir == OperationVariableDirection.Out) - { - op.OutputVariables = value; - return op.OutputVariables; - } - - op.InoutputVariables = value; - return op.InoutputVariables; - } - - #endregion - - public static Operation UpdateFrom( - this Operation elem, ISubmodelElement source) - { - if (source == null) - return elem; - - ((ISubmodelElement)elem).UpdateFrom(source); - - if (source is SubmodelElementCollection srcColl) - { - if (srcColl.Value != null) - elem.InputVariables = srcColl.Value.Copy().Select( - (isme) => new OperationVariable(isme)).ToList(); - } - - if (source is SubmodelElementCollection srcList) - { - if (srcList.Value != null) - elem.InputVariables = srcList.Value.Copy().Select( - (isme) => new OperationVariable(isme)).ToList(); - } - - return elem; - } - } -} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendProperty.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendProperty.cs deleted file mode 100644 index b9e9d4e4d..000000000 --- a/src/AasxCsharpLib_bkp/Extensions/ExtendProperty.cs +++ /dev/null @@ -1,266 +0,0 @@ -using AasCore.Aas3_0_RC02; -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Extensions -{ - public static class ExtendProperty - { - #region AasxPackageExplorer - - public static void ValueFromText(this Property property, string text) - { - property.Value = text; - } - - #endregion - public static bool IsValueTrue(this Property property) - { - if(property.ValueType == DataTypeDefXsd.Boolean) - { - if(property.Value.Equals("true", StringComparison.OrdinalIgnoreCase)) - { - return true; - } - } - - return false; - } - - public static string ValueAsText(this Property property) - { - return "" + property.Value; - } - - public static double? ValueAsDouble(this Property prop) - { - // pointless - if (prop.Value == null || prop.Value.Trim() == "") - return null; - - // type? - if (!ExtendDataElement.ValueTypes_Number.Contains(prop.ValueType)) - return null; - - // try convert - if (double.TryParse(prop.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out double dbl)) - return dbl; - - // no - return null; - } - public static Property ConvertFromV10(this Property property, AasxCompatibilityModels.AdminShellV10.Property sourceProperty) - { - if (sourceProperty == null) - { - return null; - } - var propertyType = Stringification.DataTypeDefXsdFromString("xs:" + sourceProperty.valueType); - if (propertyType != null) - { - property.ValueType = (DataTypeDefXsd)propertyType; - } - else - { - Console.WriteLine($"ValueType {sourceProperty.valueType} not found for property {sourceProperty.idShort}"); - } - property.Value = sourceProperty.value; - if (sourceProperty.valueId != null) - { - var keyList = new List(); - foreach (var refKey in sourceProperty.valueId.Keys) - { - //keyList.Add(new Key(ExtensionsUtil.GetKeyTypeFromString(refKey.type), refKey.value)); - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {sourceProperty.valueType} not found for property {property.IdShort}"); - } - } - property.ValueId = new Reference(ReferenceTypes.GlobalReference, keyList); - } - - return property; - } - - public static Property ConvertFromV20(this Property property, AasxCompatibilityModels.AdminShellV20.Property sourceProperty) - { - if (sourceProperty == null) - { - return null; - } - - var propertyType = Stringification.DataTypeDefXsdFromString("xs:" + sourceProperty.valueType); - if (propertyType != null) - { - property.ValueType = (DataTypeDefXsd)propertyType; - } - else - { - Console.WriteLine($"ValueType {sourceProperty.valueType} not found for property {sourceProperty.idShort}"); - } - property.Value = sourceProperty.value; - if (sourceProperty.valueId != null) - { - var keyList = new List(); - foreach (var refKey in sourceProperty.valueId.Keys) - { - //keyList.Add(new Key(ExtensionsUtil.GetKeyTypeFromString(refKey.type), refKey.value)); - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {sourceProperty.valueType} not found for property {property.IdShort}"); - } - } - property.ValueId = new Reference(ReferenceTypes.GlobalReference, keyList); - } - - return property; - } - - public static Property UpdateFrom(this Property elem, ISubmodelElement source) - { - if (source == null) - return elem; - - ((ISubmodelElement)elem).UpdateFrom(source); - - if (source is Property srcProp) - { - elem.ValueType = srcProp.ValueType; - elem.Value = srcProp.Value; - if (srcProp.ValueId != null) - elem.ValueId = srcProp.ValueId.Copy(); - } - - if (source is AasCore.Aas3_0_RC02.Range srcRng) - { - elem.ValueType = srcRng.ValueType; - elem.Value = srcRng.Min; - } - - if (source is MultiLanguageProperty srcMlp) - { - elem.ValueType = DataTypeDefXsd.String; - elem.Value = "" + srcMlp.Value?.GetDefaultString(); - if (srcMlp.ValueId != null) - elem.ValueId = srcMlp.ValueId.Copy(); - } - - if (source is File srcFile) - { - elem.ValueType = DataTypeDefXsd.String; - elem.Value = "" + srcFile.Value; - } - - return elem; - } - - // MIHO: Jui, why was this required? -#if OLD - - public static void UpdatePropertyFrom(this Property property, Property sourceProperty) - { - if (sourceProperty.Extensions != null) - { - property.Extensions = sourceProperty.Extensions; - } - if (sourceProperty.Category != null) - { - property.Category = sourceProperty.Category; - } - if (sourceProperty.IdShort != null) - { - property.IdShort = sourceProperty.IdShort; - } - if (sourceProperty.DisplayName != null) - { - property.DisplayName = sourceProperty.DisplayName; - } - if (sourceProperty.Description != null) - { - property.Description = sourceProperty.Description; - } - if (sourceProperty.Checksum != null) - { - property.Checksum = sourceProperty.Checksum; - } - if (sourceProperty.Kind != null) - { - property.Kind = sourceProperty.Kind; - } - if (sourceProperty.SemanticId != null) - { - property.SemanticId = sourceProperty.SemanticId; - } - if (sourceProperty.SupplementalSemanticIds != null) - { - property.SupplementalSemanticIds = sourceProperty.SupplementalSemanticIds; - } - if (sourceProperty.Qualifiers != null) - { - property.Qualifiers = sourceProperty.Qualifiers; - } - if (sourceProperty.EmbeddedDataSpecifications != null) - { - property.EmbeddedDataSpecifications = sourceProperty.EmbeddedDataSpecifications; - } - if (true) - { - property.ValueType = sourceProperty.ValueType; - } - if (sourceProperty.ValueId != null) - { - property.ValueId = sourceProperty.ValueId; - } - if (sourceProperty.Value != null) - { - property.Value = sourceProperty.Value; - } - } -#endif - - public static Property Set(this Property prop, - DataTypeDefXsd valueType = DataTypeDefXsd.String, string value = "") - { - prop.ValueType = valueType; - prop.Value = value; - return prop; - } - - public static Property Set(this Property prop, - KeyTypes type, string value) - { - prop.ValueId = ExtendReference.CreateFromKey(new Key(type, value)); - return prop; - } - - public static Property Set(this Property prop, - Qualifier q) - { - if (q != null) - prop.Add(q); - return prop; - } - - public static Property Set(this Property prop, - Extension ext) - { - if (ext != null) - prop.Add(ext); - return prop; - } - } -} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendQualifier.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendQualifier.cs deleted file mode 100644 index 44a495d65..000000000 --- a/src/AasxCsharpLib_bkp/Extensions/ExtendQualifier.cs +++ /dev/null @@ -1,192 +0,0 @@ -using AasCore.Aas3_0_RC02; -using Newtonsoft.Json.Linq; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading.Tasks; - -namespace Extensions -{ - public static class ExtendQualifier - { - public static Qualifier ConvertFromV10(this Qualifier qualifier, AasxCompatibilityModels.AdminShellV10.Qualifier sourceQualifier) - { - if (sourceQualifier.semanticId != null) - { - var keyList = new List(); - foreach (var refKey in sourceQualifier.semanticId.Keys) - { - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {refKey.type} not found."); - } - } - qualifier.SemanticId = new Reference(ReferenceTypes.GlobalReference, keyList); - } - - qualifier.Type = sourceQualifier.qualifierType; - qualifier.Value = sourceQualifier.qualifierValue; - - if (sourceQualifier.qualifierValueId != null) - { - var keyList = new List(); - foreach (var refKey in sourceQualifier.qualifierValueId.Keys) - { - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {refKey.type} not found."); - } - } - qualifier.ValueId = new Reference(ReferenceTypes.GlobalReference, keyList); - } - - return qualifier; - } - - public static Qualifier ConvertFromV20(this Qualifier qualifier, AasxCompatibilityModels.AdminShellV20.Qualifier sourceQualifier) - { - if (sourceQualifier.semanticId != null) - { - var keyList = new List(); - foreach (var refKey in sourceQualifier.semanticId.Keys) - { - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {refKey.type} not found."); - } - - } - qualifier.SemanticId = new Reference(ReferenceTypes.GlobalReference, keyList); - } - - qualifier.Type = sourceQualifier.type; - qualifier.Value = sourceQualifier.value; - - if (sourceQualifier.valueId != null) - { - var keyList = new List(); - foreach (var refKey in sourceQualifier.valueId.Keys) - { - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {refKey.type} not found."); - } - } - qualifier.ValueId = new Reference(ReferenceTypes.GlobalReference, keyList); - } - - return qualifier; - } - - // ReSharper disable MethodOverloadWithOptionalParameter .. this seems to work, anyhow - // ReSharper disable RedundantArgumentDefaultValue - public static string ToStringExtended(this Qualifier q, - int format = 0, string delimiter = ",") - { - var res = "" + q.Type; - if (res == "") - res += "" + q.SemanticId?.ToStringExtended(format, delimiter); - - if (q.Value != null) - res += " = " + q.Value; - else if (q.ValueId != null) - res += " = " + q.ValueId?.ToStringExtended(format, delimiter); - - return res; - } - // ReSharper enable MethodOverloadWithOptionalParameter - // ReSharper enable RedundantArgumentDefaultValue - - // - // - // List - // - // - - #region QualifierCollection - - public static Qualifier FindQualifierOfType(this List qualifiers, string qualifierType) - { - if(qualifierType == null) - { - return null; - } - - foreach(var qualifier in qualifiers) - { - if(qualifier != null && qualifierType.Equals(qualifier.Type)) - { - return qualifier; - } - } - - return null; - } - - // ReSharper disable MethodOverloadWithOptionalParameter .. this seems to work, anyhow - // ReSharper disable RedundantArgumentDefaultValue - public static string ToStringExtended(this List qualifiers, - int format = 0, string delimiter = ";", string referencesDelimiter = ",") - { - var res = ""; - foreach (var q in qualifiers) - { - if (res != "") - res += delimiter; - res += q.ToStringExtended(format, referencesDelimiter); - } - return res; - } - // ReSharper enable MethodOverloadWithOptionalParameter - // ReSharper enable RedundantArgumentDefaultValue - - public static Qualifier FindType(this List qualifiers, string type) - { - if (type == null || qualifiers == null) - return null; - foreach (var q in qualifiers) - if (q != null && q.Type != null && q.Type.Trim() == type.Trim()) - return q; - return null; - } - - public static Qualifier Parse(string input) - { - var m = Regex.Match(input, @"\s*([^,]*)(,[^=]+){0,1}\s*=\s*([^,]*)(,.+){0,1}\s*"); - if (!m.Success) - return null; - - return new Qualifier( - valueType: DataTypeDefXsd.String, - type: m.Groups[1].ToString().Trim(), - semanticId: ExtendReference.Parse(m.Groups[1].ToString().Trim()), - value: m.Groups[3].ToString().Trim(), - valueId: ExtendReference.Parse(m.Groups[1].ToString().Trim()) - ); - } - - #endregion - } -} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendRange.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendRange.cs deleted file mode 100644 index e67c7b40c..000000000 --- a/src/AasxCsharpLib_bkp/Extensions/ExtendRange.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using AAS = AasCore.Aas3_0_RC02; - -namespace Extensions -{ - public static class ExtendRange - { - public static string ValueAsText(this AasCore.Aas3_0_RC02.Range range) - { - return "" + range.Min + " .. " + range.Max; - } - - public static AasCore.Aas3_0_RC02.Range ConvertFromV20(this AasCore.Aas3_0_RC02.Range range, AasxCompatibilityModels.AdminShellV20.Range sourceRange) - { - if (sourceRange == null) - { - return null; - } - - var propertyType = AAS.Stringification.DataTypeDefXsdFromString("xs:" + sourceRange.valueType); - if (propertyType != null) - { - range.ValueType = (AAS.DataTypeDefXsd)propertyType; - } - else - { - Console.WriteLine($"ValueType {sourceRange.valueType} not found for property {range.IdShort}"); - } - - range.Max = sourceRange.max; - range.Min = sourceRange.min; - - return range; - } - - public static AAS.Range UpdateFrom(this AAS.Range elem, AAS.ISubmodelElement source) - { - if (source == null) - return elem; - - ((AAS.ISubmodelElement)elem).UpdateFrom(source); - - if (source is AAS.Property srcProp) - { - elem.ValueType = srcProp.ValueType; - elem.Min = srcProp.Value; - elem.Max = elem.Min; - } - - if (source is AAS.MultiLanguageProperty srcMlp) - { - elem.ValueType = AAS.DataTypeDefXsd.String; - elem.Min = "" + srcMlp.Value?.GetDefaultString(); - elem.Max = elem.Min; - } - - if (source is AAS.File srcFile) - { - elem.ValueType = AAS.DataTypeDefXsd.String; - elem.Min = "" + srcFile.Value; - elem.Max = elem.Min; - } - - return elem; - } - } -} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendReference.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendReference.cs deleted file mode 100644 index ad4870212..000000000 --- a/src/AasxCsharpLib_bkp/Extensions/ExtendReference.cs +++ /dev/null @@ -1,263 +0,0 @@ -using AasCore.Aas3_0_RC02; -using AdminShellNS.Exceptions; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.CompilerServices; -using System.Text; -using System.Threading.Tasks; - -namespace Extensions -{ - public static class ExtendReference - { - #region AasxPackageExplorer - - public static AasElementSelfDescription GetSelfDescription(this Reference reference) - { - return new AasElementSelfDescription("Reference", "Rfc", null, null); - } - - public static bool IsValid(this Reference reference) - { - return reference.Keys != null && !reference.Keys.IsEmpty(); - } - - /// - /// Formaly a static constructor. - /// Creates a Reference from a key, guessing Reference.Type. - /// - /// Given single Key - /// Reference with guessed type - public static Reference CreateFromKey(Key k) - { - var res = new Reference(ReferenceTypes.GlobalReference, new List { k }); - res.Type = res.GuessType(); - return res; - } - - /// - /// Formaly a static constructor. - /// Creates a Reference from a key, guessing Reference.Type. - /// - public static Reference CreateFromKey(KeyTypes type, - string value) - { - var res = new Reference(ReferenceTypes.GlobalReference, - new List { new Key(type, value) }); - res.Type = res.GuessType(); - return res; - } - - /// - /// Formaly a static constructor. - /// Creates a Reference from a list of keys, guessing Reference.Type. - /// - /// - /// - public static Reference CreateNew(List lk) - { - var res = new Reference(ReferenceTypes.GlobalReference, new List()); - if (lk == null) - return res; - res.Keys.AddRange(lk.Copy()); - res.Type = res.GuessType(); - return res; - } - - // TODO (Jui, 2023-01-05): Check why the generic Copy does not apply here?! - public static Reference Copy(this Reference original) - { - var res = new Reference(original.Type, new List()); - if (original != null) - foreach (var o in original.Keys) - res.Add(o.Copy()); - return res; - } - - - public static Reference Parse(string input) - { - var res = new Reference(ReferenceTypes.GlobalReference, new List()); - if (input == null) - return res; - - res.Keys = ExtendKeyList.Parse(input); - res.Type = res.GuessType(); - return res; - } - - //This is alternative for operator overloding method +, as operator overloading cannot be done in extension classes - public static Reference Add(this Reference a, Reference b) - { - a.Keys?.AddRange(b?.Keys); - return a; - } - - public static Reference Add(this Reference a, Key k) - { - if (k != null) - a.Keys?.Add(k); - return a; - } - - public static bool IsEmpty(this Reference reference) - { - if (reference == null || reference.Keys == null || reference.Keys.Count < 1) - { - return true; - } - - return false; - } - - #endregion - - public static bool Matches (this Reference reference, KeyTypes keyType, string id, MatchMode matchMode = MatchMode.Strict) - { - if(reference.IsEmpty()) - { - return false; - } - - if(reference.Keys.Count == 1) - { - var key = reference.Keys[0]; - return key.Matches(new Key(keyType, id), matchMode); - } - - return false; - } - - public static bool Matches(this Reference reference, string id) - { - if (string.IsNullOrEmpty(id)) - { - return false; - } - - if (reference.Keys.Count == 1) // As per old implementation - { - if (reference.Keys[0].Value == id) - return true; - } - - return false; - } - - public static bool Matches(this Reference reference, Reference otherReference, MatchMode matchMode = MatchMode.Strict) - { - if (reference.Keys == null || reference.Keys.Count == 0 || otherReference?.Keys == null || otherReference.Keys.Count == 0) - { - return false; - } - - bool match = true; - for (int i = 0; i < reference.Keys.Count; i++) - { - match = match && reference.Keys[i].Matches(otherReference.Keys[i], matchMode); - } - - return match; - } - - public static bool MatchesExactlyOneKey(this Reference reference, Key key, MatchMode matchMode = MatchMode.Strict) - { - if(key == null || reference.Keys == null || reference.Keys.Count != 1) - { - return false; - } - - var referenceKey = reference.Keys[0]; - return referenceKey.Matches(key, matchMode); - } - - public static string GetAsIdentifier(this Reference reference) - { - if (reference.Type == ReferenceTypes.GlobalReference) // Applying only to Global Reference, based on older implementation, TODO:Make it Generic - { - if (reference.Keys == null || reference.Keys.Count < 1) - { - return null; - } - - return reference.Keys[0].Value; - } - - return null; - } - - public static string MostSignificantInfo(this Reference reference) - { - if (reference.Keys.Count < 1) - { - return "-"; - } - - var i = reference.Keys.Count - 1; - var output = reference.Keys[i].Value; - if (reference.Keys[i].Type == KeyTypes.FragmentReference && i > 0) - output += reference.Keys[i - 1].Value; - return output; - } - - public static Key GetAsExactlyOneKey(this Reference reference) - { - if (reference.Keys == null || reference.Keys.Count != 1) - { - return null; - } - - var key = reference.Keys[0]; - return new Key(key.Type, key.Value); - } - - public static string ToStringExtended(this Reference reference, int format = 1, string delimiter = ",") - { - if(reference.Keys == null) - { - throw new NullValueException("Keys"); - } - - return reference.Keys.ToStringExtended(format, delimiter); - } - - public static ReferenceTypes GuessType(this Reference reference) - { - var setAasRefs = Constants.AasReferables.Where((kt) => kt != null).Select(kt => kt.Value).ToArray(); - var allAasRefs = true; - foreach (var k in reference.Keys) - if (!k.MatchesSetOfTypes(setAasRefs)) - allAasRefs = false; - if (allAasRefs) - return ReferenceTypes.ModelReference; - else - return ReferenceTypes.GlobalReference; - } - - public static int Count(this Reference rf) - { - return rf.Keys.Count; - } - - public static Key Last(this Reference rf) - { - return rf.Keys.Last(); - } - - public static string ListOfValues(this Reference rf, string delim) - { - string res = ""; - if (rf.Keys != null) - foreach (var x in rf.Keys) - { - if (x == null) - continue; - if (res != "") res += delim; - res += x.Value; - } - return res; - } - } - -} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendReferenceElement.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendReferenceElement.cs deleted file mode 100644 index 4fdc888a0..000000000 --- a/src/AasxCsharpLib_bkp/Extensions/ExtendReferenceElement.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using AAS = AasCore.Aas3_0_RC02; -using AasCore.Aas3_0_RC02; - -namespace Extensions -{ - public static class ExtendReferenceElement - { - public static AAS.ReferenceElement Set(this AAS.ReferenceElement elem, - Reference rf) - { - elem.Value = rf; - return elem; - } - - public static AAS.ReferenceElement UpdateFrom( - this AAS.ReferenceElement elem, AAS.ISubmodelElement source) - { - if (source == null) - return elem; - - ((AAS.ISubmodelElement)elem).UpdateFrom(source); - - if (source is AAS.RelationshipElement srcRel) - { - if (srcRel.First != null) - elem.Value = srcRel.First.Copy(); - } - - if (source is AAS.AnnotatedRelationshipElement srcRelA) - { - if (srcRelA.First != null) - elem.Value = srcRelA.First.Copy(); - } - - return elem; - } - } -} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendRelationshipElement.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendRelationshipElement.cs deleted file mode 100644 index 45dfa17b3..000000000 --- a/src/AasxCsharpLib_bkp/Extensions/ExtendRelationshipElement.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using AAS = AasCore.Aas3_0_RC02; - -namespace Extensions -{ - public static class ExtendRelationshipElement - { - public static AAS.RelationshipElement Set(this AAS.RelationshipElement elem, - AAS.Reference first, AAS.Reference second) - { - elem.First = first; - elem.Second = second; - return elem; - } - - public static AAS.RelationshipElement UpdateFrom( - this AAS.RelationshipElement elem, AAS.ISubmodelElement source) - { - if (source == null) - return elem; - - ((AAS.ISubmodelElement)elem).UpdateFrom(source); - - if (source is AAS.ReferenceElement srcRef) - { - if (srcRef.Value != null) - elem.First = srcRef.Value.Copy(); - } - - if (source is AAS.AnnotatedRelationshipElement srcRelA) - { - if (srcRelA.First != null) - elem.First = srcRelA.First.Copy(); - } - - return elem; - } - } -} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendStream.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendStream.cs deleted file mode 100644 index fefe4af1f..000000000 --- a/src/AasxCsharpLib_bkp/Extensions/ExtendStream.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Extensions -{ - public static class ExtendStream - { - public static byte[] ToByteArray(this Stream stream) - { - using (stream) - { - using MemoryStream memStream = new(); - stream.CopyTo(memStream); - return memStream.ToArray(); - } - } - } -} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendStringification.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendStringification.cs deleted file mode 100644 index cb554c921..000000000 --- a/src/AasxCsharpLib_bkp/Extensions/ExtendStringification.cs +++ /dev/null @@ -1,15 +0,0 @@ -using AasCore.Aas3_0_RC02; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Extensions -{ - public static class ExtendStringification - { - public static IEnumerable DataTypeXsdToStringArray() => - Enum.GetValues(typeof(DataTypeDefXsd)).OfType().Select((dt) => Stringification.ToString(dt)); - } -} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendSubmodel.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendSubmodel.cs deleted file mode 100644 index 3f07b4ff9..000000000 --- a/src/AasxCsharpLib_bkp/Extensions/ExtendSubmodel.cs +++ /dev/null @@ -1,455 +0,0 @@ -using AasCore.Aas3_0_RC02; -using AdminShellNS; -using AdminShellNS.Display; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Extensions -{ - public static class ExtendSubmodel - { - #region AasxPackageExplorer - - /// - /// Recurses on all Submodel elements of a Submodel or SME, which allows children. - /// The state object will be passed to the lambda function in order to provide - /// stateful approaches. Include this element, as well. - /// - /// State object to be provided to lambda. Could be null. - /// The lambda function as (state, parents, SME) - /// The lambda shall return TRUE in order to deep into recursion. - /// Include this element as well. parents will then - /// include this element as well! - public static void RecurseOnReferables(this Submodel submodel, - object state, Func, IReferable, bool> lambda, - bool includeThis = false) - { - var parents = new List(); - if (includeThis) - { - lambda(state, null, submodel); - parents.Add(submodel); - } - submodel.SubmodelElements?.RecurseOnReferables(state, parents, lambda); - } - - public static void Remove(this Submodel submodel, ISubmodelElement submodelElement) - { - if(submodel != null) - { - if(submodel.SubmodelElements != null) - { - submodel.SubmodelElements.Remove(submodelElement); - } - } - } - - public static object AddChild(this Submodel submodel,ISubmodelElement childSubmodelElement, EnumerationPlacmentBase placement = null) - { - if (childSubmodelElement == null) - return null; - submodel.SubmodelElements ??= new (); - if (childSubmodelElement != null) - childSubmodelElement.Parent = submodel; - submodel.SubmodelElements.Add(childSubmodelElement); - return childSubmodelElement; - } - - public static Tuple ToCaptionInfo(this Submodel submodel) - { - var caption = AdminShellUtil.EvalToNonNullString("\"{0}\" ", submodel.IdShort, ""); - if (submodel.Administration != null) - caption += "V" + submodel.Administration.Version + "." + submodel.Administration.Revision; - var info = ""; - if (submodel.Id != null) - info = $"[{submodel.Id}]"; - return Tuple.Create(caption, info); - } - - public static IEnumerable FindAllReferences(this Submodel submodel) - { - // not nice: use temp list - var temp = new List(); - - // recurse - submodel.RecurseOnSubmodelElements(null, (state, parents, sme) => - { - if (sme is ReferenceElement re) - if (re.Value != null) - temp.Add(re.Value); - if (sme is RelationshipElement rl) - { - if (rl.First != null) - temp.Add(rl.First); - if (rl.Second != null) - temp.Add(rl.Second); - } - // recurse - return true; - }); - - // now, give back - foreach (var r in temp) - yield return new LocatedReference(submodel, r); - } - - #endregion - public static void Validate(this Submodel submodel,AasValidationRecordList results) - { - // access - if (results == null) - return; - - // check - submodel.BaseValidation(results); - submodel.Kind.Value.Validate(results,submodel); - submodel.SemanticId.Keys.Validate(results, submodel); - } - public static Submodel ConvertFromV10(this Submodel submodel, AasxCompatibilityModels.AdminShellV10.Submodel sourceSubmodel, bool shallowCopy = false) - { - if (sourceSubmodel == null) - { - return null; - } - - if (string.IsNullOrEmpty(sourceSubmodel.idShort)) - { - submodel.IdShort = ""; - } - else - { - submodel.IdShort = sourceSubmodel.idShort; - } - - if (sourceSubmodel.description != null) - { - submodel.Description = ExtensionsUtil.ConvertDescriptionFromV10(sourceSubmodel.description); - } - - if (sourceSubmodel.administration != null) - { - submodel.Administration = new AdministrativeInformation(version: sourceSubmodel.administration.version, revision: sourceSubmodel.administration.revision); - } - - if (sourceSubmodel.semanticId != null) - { - var keyList = new List(); - foreach (var refKey in sourceSubmodel.semanticId.Keys) - { - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {refKey.type} not found."); - } - } - submodel.SemanticId = new Reference(ReferenceTypes.GlobalReference, keyList); - } - - if (sourceSubmodel.kind != null) - { - if (sourceSubmodel.kind.IsInstance) - { - submodel.Kind = ModelingKind.Instance; - } - else - { - submodel.Kind = ModelingKind.Template; - } - } - - if (sourceSubmodel.qualifiers != null && sourceSubmodel.qualifiers.Count != 0) - { - if (submodel.Qualifiers == null && submodel.Qualifiers.Count != 0) - { - submodel.Qualifiers = new List(); - } - - foreach (var sourceQualifier in sourceSubmodel.qualifiers) - { - var newQualifier = new Qualifier("", DataTypeDefXsd.String); - newQualifier = newQualifier.ConvertFromV10(sourceQualifier); - submodel.Qualifiers.Add(newQualifier); - } - } - - if (!shallowCopy && sourceSubmodel.submodelElements != null) - { - if (submodel.SubmodelElements == null) - { - submodel.SubmodelElements = new List(); - } - - foreach (var submodelElementWrapper in sourceSubmodel.submodelElements) - { - var sourceSubmodelELement = submodelElementWrapper.submodelElement; - ISubmodelElement outputSubmodelElement = null; - if (sourceSubmodelELement != null) - { - outputSubmodelElement = outputSubmodelElement.ConvertFromV10(sourceSubmodelELement, shallowCopy); - submodel.SubmodelElements.Add(outputSubmodelElement); - } - - } - } - - return submodel; - - } - - public static Submodel ConvertFromV20(this Submodel sm, AasxCompatibilityModels.AdminShellV20.Submodel srcSM, bool shallowCopy = false) - { - if (srcSM == null) - return null; - - if (string.IsNullOrEmpty(srcSM.idShort)) - sm.IdShort = ""; - else - sm.IdShort = srcSM.idShort; - - if (srcSM.identification?.id != null) - sm.Id = srcSM.identification.id; - - if (srcSM.description != null) - sm.Description = ExtensionsUtil.ConvertDescriptionFromV20(srcSM.description); - - if (srcSM.administration != null) - sm.Administration = new AdministrativeInformation( - version: srcSM.administration.version, revision: srcSM.administration.revision); - - if (srcSM.semanticId != null) - { - var keyList = new List(); - foreach (var refKey in srcSM.semanticId.Keys) - { - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {refKey.type} not found."); - } - } - sm.SemanticId = new Reference(ReferenceTypes.GlobalReference, keyList); - } - - if (srcSM.kind != null) - { - if (srcSM.kind.IsInstance) - { - sm.Kind = ModelingKind.Instance; - } - else - { - sm.Kind = ModelingKind.Template; - } - } - - if (srcSM.qualifiers != null && srcSM.qualifiers.Count != 0) - { - if (sm.Qualifiers == null) - { - sm.Qualifiers = new List(); - } - - foreach (var sourceQualifier in srcSM.qualifiers) - { - var newQualifier = new Qualifier("", DataTypeDefXsd.String); - newQualifier = newQualifier.ConvertFromV20(sourceQualifier); - sm.Qualifiers.Add(newQualifier); - } - } - - if (!shallowCopy && srcSM.submodelElements != null) - { - if (sm.SubmodelElements == null) - { - sm.SubmodelElements = new List(); - } - - foreach (var submodelElementWrapper in srcSM.submodelElements) - { - var sourceSubmodelELement = submodelElementWrapper.submodelElement; - ISubmodelElement outputSubmodelElement = null; - if (sourceSubmodelELement != null) - { - outputSubmodelElement = outputSubmodelElement.ConvertFromV20(sourceSubmodelELement, shallowCopy); - sm.SubmodelElements.Add(outputSubmodelElement); - } - - } - } - - // move Qualifiers to Extensions - sm.MigrateV20QualifiersToExtensions(); - - return sm; - } - - public static T FindFirstIdShortAs(this Submodel submodel, string idShort) where T : ISubmodelElement - { - - var submodelElement = submodel.SubmodelElements.Where(sme => (sme != null) && (sme is T) && sme.IdShort.Equals(idShort, StringComparison.OrdinalIgnoreCase)).FirstOrDefault(); - - return (T)submodelElement; - } - - public static IEnumerable FindDeep(this Submodel submodel) - { - if (submodel.SubmodelElements == null || submodel.SubmodelElements.Count == 0) - { - yield break; - } - - foreach (var submodelElement in submodel.SubmodelElements) - { - foreach (var x in submodelElement.FindDeep()) - yield return x; - } - } - - public static Reference GetModelReference(this Submodel submodel) - { - var key = new Key(KeyTypes.Submodel, submodel.Id); - var outputReference = new Reference(ReferenceTypes.ModelReference, new List() { key }) - { - ReferredSemanticId = submodel.SemanticId - }; - - return outputReference; - } - - /// - /// If instance, return semanticId as one key. - /// If template, return identification as key. - /// - public static Key GetSemanticKey(this Submodel submodel) - { - if (submodel.Kind == ModelingKind.Instance) - return submodel.SemanticId.GetAsExactlyOneKey(); - else - return new Key(KeyTypes.Submodel, submodel.Id); - } - - public static List SmeForWrite(this Submodel submodel) - { - if (submodel.SubmodelElements == null) - submodel.SubmodelElements = new(); - return submodel.SubmodelElements; - } - - public static void RecurseOnSubmodelElements(this Submodel submodel, object state, Func, ISubmodelElement, bool> lambda) - { - submodel.SubmodelElements?.RecurseOnReferables(state, null, (o, par, rf) => - { - if (rf is ISubmodelElement sme) - return lambda(o, par, sme); - else - return true; - }); - } - - public static ISubmodelElement FindSubmodelElementByIdShort(this Submodel submodel, string smeIdShort) - { - if (submodel.SubmodelElements == null || submodel.SubmodelElements.Count == 0) - { - return null; - } - - var submodelElements = submodel.SubmodelElements.Where(sme => (sme != null) && sme.IdShort.Equals(smeIdShort, StringComparison.OrdinalIgnoreCase)); - if (submodelElements.Any()) - { - return submodelElements.First(); - } - else - { - return null; - } - } - - public static void SetAllParents(this Submodel submodel, DateTime timestamp) - { - if (submodel.SubmodelElements != null) - foreach (var sme in submodel.SubmodelElements) - SetParentsForSME(submodel, sme, timestamp); - } - - public static void SetParentsForSME(IReferable parent, ISubmodelElement submodelElement, DateTime timestamp) - { - if (submodelElement == null) - return; - - submodelElement.Parent = parent; - submodelElement.TimeStamp = timestamp; - submodelElement.TimeStampCreate = timestamp; - - foreach (var childElement in submodelElement.EnumerateChildren()) - { - SetParentsForSME(submodelElement, childElement, timestamp); - } - } - - public static void SetParentsForSME(IReferable parent, ISubmodelElement submodelElement) - { - if (submodelElement == null) - return; - - submodelElement.Parent = parent; - - foreach (var childElement in submodelElement.EnumerateChildren()) - { - SetParentsForSME(submodelElement, childElement); - } - } - - public static void SetAllParents(this Submodel submodel) - { - if (submodel.SubmodelElements != null) - foreach (var sme in submodel.SubmodelElements) - SetParentsForSME(submodel, sme); - } - - public static void Add(this Submodel submodel, ISubmodelElement submodelElement) - { - if (submodel.SubmodelElements == null) - { - submodel.SubmodelElements = new List(); - } - - submodelElement.Parent = submodel; - submodel.SubmodelElements.Add(submodelElement); - } - - public static void Insert(this Submodel submodel, int index, ISubmodelElement submodelElement) - { - if (submodel.SubmodelElements == null) - { - submodel.SubmodelElements = new List(); - } - - submodelElement.Parent = submodel; - submodel.SubmodelElements.Insert(index, submodelElement); - } - - public static T CreateSMEForCD( - this Submodel sm, - ConceptDescription conceptDescription, string category = null, string idShort = null, - string idxTemplate = null, int maxNum = 999, bool addSme = false, bool isTemplate = false) - where T : ISubmodelElement - { - if (sm.SubmodelElements == null) - sm.SubmodelElements = new List(); - return sm.SubmodelElements.CreateSMEForCD( - conceptDescription, category, idShort, idxTemplate, maxNum, addSme, isTemplate); - } - - } -} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendSubmodelElementCollection.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendSubmodelElementCollection.cs deleted file mode 100644 index c5ca34340..000000000 --- a/src/AasxCsharpLib_bkp/Extensions/ExtendSubmodelElementCollection.cs +++ /dev/null @@ -1,194 +0,0 @@ -using AasCore.Aas3_0_RC02; -using AdminShellNS.Display; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Extensions -{ - public static class ExtendSubmodelElementCollection - { - #region AasxPackageExplorer - - /// - /// Recurses on all Submodel elements of a Submodel or SME, which allows children. - /// The state object will be passed to the lambda function in order to provide - /// stateful approaches. Include this element, as well. - /// - /// State object to be provided to lambda. Could be null. - /// The lambda function as (state, parents, SME) - /// The lambda shall return TRUE in order to deep into recursion. - /// Include this element as well. parents will then - /// include this element as well! - public static void RecurseOnReferables(this SubmodelElementCollection submodelElementCollection, - object state, Func, IReferable, bool> lambda, - bool includeThis = false) - { - var parents = new List(); - if (includeThis) - { - lambda(state, null, submodelElementCollection); - parents.Add(submodelElementCollection); - } - submodelElementCollection.Value?.RecurseOnReferables(state, parents, lambda); - } - - public static void Remove(this SubmodelElementCollection submodelElementCollection, ISubmodelElement submodelElement) - { - if(submodelElementCollection != null) - { - if(submodelElementCollection.Value != null) - { - submodelElementCollection.Value.Remove(submodelElement); - } - } - } - - public static object AddChild(this SubmodelElementCollection submodelElementCollection, ISubmodelElement childSubmodelElement, EnumerationPlacmentBase placement = null) - { - if (childSubmodelElement == null) - return null; - if (submodelElementCollection.Value == null) - submodelElementCollection.Value = new (); - if (childSubmodelElement != null) - childSubmodelElement.Parent = submodelElementCollection; - submodelElementCollection.Value.Add(childSubmodelElement); - return childSubmodelElement; - } - - #endregion - public static T FindFirstIdShortAs(this SubmodelElementCollection submodelElementCollection, string idShort) where T : ISubmodelElement - { - - var submodelElement = submodelElementCollection.Value.Where(sme => (sme != null) && (sme is T) && sme.IdShort.Equals(idShort, StringComparison.OrdinalIgnoreCase)).FirstOrDefault(); - - return (T)submodelElement; - } - - public static SubmodelElementCollection ConvertFromV10(this SubmodelElementCollection submodelElementCollection, AasxCompatibilityModels.AdminShellV10.SubmodelElementCollection sourceSmeCollection, bool shallowCopy = false) - { - if (sourceSmeCollection == null) - return null; - - if (submodelElementCollection.Value == null) - { - submodelElementCollection.Value = new List(); - } - - if (!shallowCopy) - { - foreach (var submodelElementWrapper in sourceSmeCollection.value) - { - var sourceSubmodelElement = submodelElementWrapper.submodelElement; - ISubmodelElement outputSubmodelElement = null; - if (sourceSubmodelElement != null) - { - outputSubmodelElement = outputSubmodelElement.ConvertFromV10(sourceSubmodelElement, shallowCopy); - } - - submodelElementCollection.Value.Add(outputSubmodelElement); - } - } - - return submodelElementCollection; - } - - public static SubmodelElementCollection ConvertFromV20(this SubmodelElementCollection submodelElementCollection, AasxCompatibilityModels.AdminShellV20.SubmodelElementCollection sourceSmeCollection, bool shallowCopy = false) - { - if (sourceSmeCollection == null) - return null; - - if (submodelElementCollection.Value == null) - { - submodelElementCollection.Value = new List(); - } - - if (!shallowCopy) - { - foreach (var submodelElementWrapper in sourceSmeCollection.value) - { - var sourceSubmodelElement = submodelElementWrapper.submodelElement; - ISubmodelElement outputSubmodelElement = null; - if (sourceSubmodelElement != null) - { - outputSubmodelElement = outputSubmodelElement.ConvertFromV20(sourceSubmodelElement, shallowCopy); - } - - submodelElementCollection.Value.Add(outputSubmodelElement); - } - } - - return submodelElementCollection; - } - - public static void Add(this SubmodelElementCollection submodelElementCollection, ISubmodelElement submodelElement) - { - submodelElementCollection.Value ??= new List(); - - submodelElement.Parent = submodelElementCollection; - submodelElementCollection.Value.Add(submodelElement); - } - - public static void Insert(this SubmodelElementCollection submodelElementCollection, int index, ISubmodelElement submodelElement) - { - if (submodelElementCollection.Value == null) - { - submodelElementCollection.Value = new List(); - } - - submodelElement.Parent = submodelElementCollection; - submodelElementCollection.Value.Insert(index, submodelElement); - } - - public static T CreateSMEForCD( - this SubmodelElementCollection smc, - ConceptDescription conceptDescription, string category = null, string idShort = null, - string idxTemplate = null, int maxNum = 999, bool addSme = false, bool isTemplate = false) - where T : ISubmodelElement - { - if (smc.Value == null) - smc.Value = new List(); - return smc.Value.CreateSMEForCD( - conceptDescription, category, idShort, idxTemplate, maxNum, addSme, isTemplate); - } - - public static SubmodelElementCollection UpdateFrom( - this SubmodelElementCollection elem, ISubmodelElement source) - { - if (source == null) - return elem; - - ((ISubmodelElement)elem).UpdateFrom(source); - - if (source is SubmodelElementList srcList) - { - if (srcList.Value != null) - elem.Value = srcList.Value.Copy(); - } - - if (source is Operation srcOp) - { - Action, List> appov = (dst, src) => - { - if (src == null) - return; - foreach (var ov in src) - if (ov.Value != null) - dst.Append(ov.Value.Copy()); - }; - - elem.Value = new(); - appov(elem.Value, srcOp.InputVariables); - appov(elem.Value, srcOp.InoutputVariables); - appov(elem.Value, srcOp.OutputVariables); - if (elem.Value.Count < 1) - elem.Value = null; - } - - return elem; - } - - } -} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtendSubmodelElementList.cs b/src/AasxCsharpLib_bkp/Extensions/ExtendSubmodelElementList.cs deleted file mode 100644 index 4d700549f..000000000 --- a/src/AasxCsharpLib_bkp/Extensions/ExtendSubmodelElementList.cs +++ /dev/null @@ -1,200 +0,0 @@ -using AasCore.Aas3_0_RC02; -using AdminShellNS.Display; -using Newtonsoft.Json.Linq; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Extensions -{ - public static class ExtendSubmodelElementList - { - #region AasxPackageExplorer - - /// - /// Recurses on all Submodel elements of a Submodel or SME, which allows children. - /// The state object will be passed to the lambda function in order to provide - /// stateful approaches. Include this element, as well. - /// - /// State object to be provided to lambda. Could be null. - /// The lambda function as (state, parents, SME) - /// The lambda shall return TRUE in order to deep into recursion. - /// Include this element as well. parents will then - /// include this element as well! - public static void RecurseOnReferables(this SubmodelElementList submodelElementList, - object state, Func, IReferable, bool> lambda, - bool includeThis = false) - { - var parents = new List(); - if (includeThis) - { - lambda(state, null, submodelElementList); - parents.Add(submodelElementList); - } - submodelElementList.Value?.RecurseOnReferables(state, parents, lambda); - } - - public static void Add(this SubmodelElementList submodelElementList, ISubmodelElement submodelElement) - { - if (submodelElementList != null) - { - submodelElementList.Value ??= new(); - - submodelElement.Parent = submodelElementList; - - submodelElementList.Value.Add(submodelElement); - } - } - - public static void Remove(this SubmodelElementList submodelElementList, ISubmodelElement submodelElement) - { - if (submodelElementList != null) - { - if (submodelElementList.Value != null) - { - submodelElementList.Value.Remove(submodelElement); - } - } - } - - public static object AddChild(this SubmodelElementList submodelElementList, ISubmodelElement childSubmodelElement, EnumerationPlacmentBase placement = null) - { - if (childSubmodelElement == null) - return null; - if (submodelElementList.Value == null) - submodelElementList.Value = new(); - if (childSubmodelElement != null) - childSubmodelElement.Parent = submodelElementList; - submodelElementList.Value.Add(childSubmodelElement); - return childSubmodelElement; - } - - #endregion - public static T FindFirstIdShortAs(this SubmodelElementList submodelElementList, string idShort) where T : ISubmodelElement - { - - var submodelElements = submodelElementList.Value.Where(sme => sme != null && sme is T && sme.IdShort.Equals(idShort, StringComparison.OrdinalIgnoreCase)); - - if (submodelElements.Any()) - { - return (T)submodelElements.First(); - } - - return default; - } - - public static SubmodelElementList UpdateFrom( - this SubmodelElementList elem, ISubmodelElement source) - { - if (source == null) - return elem; - - ((ISubmodelElement)elem).UpdateFrom(source); - - if (source is SubmodelElementCollection srcColl) - { - if (srcColl.Value != null) - elem.Value = srcColl.Value.Copy(); - } - - if (source is Operation srcOp) - { - Action, List> appov = (dst, src) => - { - if (src == null) - return; - foreach (var ov in src) - if (ov.Value != null) - dst.Append(ov.Value.Copy()); - }; - - elem.Value = new(); - appov(elem.Value, srcOp.InputVariables); - appov(elem.Value, srcOp.InoutputVariables); - appov(elem.Value, srcOp.OutputVariables); - if (elem.Value.Count < 1) - elem.Value = null; - } - - return elem; - } - - // advanced checks - - public class ConstraintStat - { - /// - /// Constraint AASd-107: If a first level child element in a SubmodelElementList has a semanticId - /// it shall be identical to SubmodelElementList/semanticIdListElement. - /// - public bool AllChildSemIdMatch = true; - - /// - /// Constraint AASd-108: All first level child elements in a SubmodelElementList shall have the - /// same submodel element type as specified in SubmodelElementList/typeValueListElement. - /// - public bool AllChildSmeTypeMatch = true; - - /// - /// Constraint AASd-109: If SubmodelElementList/typeValueListElement equal to Property or Range, - /// SubmodelElementList/valueTypeListElement shall be set and all first level child elements in - /// the SubmodelElementList shall have the the value type as specified in - /// SubmodelElementList/valueTypeListElement - /// - public bool AllChildValueTypeMatch = true; - } - - public static ConstraintStat EvalConstraintStat(this SubmodelElementList list) - { - // access - var res = new ConstraintStat(); - if (list.Value == null) - return res; - - // prepare SME type - var smeTypeToCheck = list.TypeValueListElement; - - // prepare value type - var valueTypeToCheck = list.ValueTypeListElement; - - // eval - foreach (var sme in list.Value) - { - // need self description - var smesd = sme.GetSelfDescription(); - if (smesd == null) - continue; - - // sem id? - if (res.AllChildSemIdMatch - && list.SemanticIdListElement?.IsValid() == true - && sme.SemanticId?.IsValid() == true - && !list.SemanticIdListElement.Matches(sme.SemanticId)) - res.AllChildSemIdMatch = false; - - // type of SME? - if (res.AllChildSmeTypeMatch - && smesd.SmeType != smeTypeToCheck) - res.AllChildSmeTypeMatch = false; - - // value type to check - if (valueTypeToCheck.HasValue - && res.AllChildValueTypeMatch - && sme is Property prop - && prop.ValueType != valueTypeToCheck.Value) - res.AllChildValueTypeMatch = false; - - if (valueTypeToCheck.HasValue - && res.AllChildValueTypeMatch - && sme is AasCore.Aas3_0_RC02.Range range - && range.ValueType != valueTypeToCheck.Value) - res.AllChildValueTypeMatch = false; - } - - // ok - return res; - } - } -} diff --git a/src/AasxCsharpLib_bkp/Extensions/ExtensionsUtil.cs b/src/AasxCsharpLib_bkp/Extensions/ExtensionsUtil.cs deleted file mode 100644 index fc2940ab2..000000000 --- a/src/AasxCsharpLib_bkp/Extensions/ExtensionsUtil.cs +++ /dev/null @@ -1,115 +0,0 @@ -using AasCore.Aas3_0_RC02; -using AasxCompatibilityModels; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Extensions -{ - public static class ExtensionsUtil - { - - public static Reference ConvertReferenceFromV10(AdminShellV10.Reference sourceReference, ReferenceTypes referenceTypes) - { - Reference outputReference = null; - if (sourceReference != null) - { - var keyList = new List(); - foreach (var refKey in sourceReference.Keys) - { - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {refKey.type} not found."); - } - } - outputReference = new Reference(referenceTypes, keyList); - } - - return outputReference; - } - - public static Reference ConvertReferenceFromV20(AdminShellV20.Reference sourceReference, ReferenceTypes referenceTypes) - { - Reference outputReference = null; - if (sourceReference != null) - { - var keyList = new List(); - foreach (var refKey in sourceReference.Keys) - { - // Fix, as Asset does not exist anymore - if (refKey.type?.Trim().Equals("Asset", StringComparison.InvariantCultureIgnoreCase) == true) - refKey.type = "GlobalReference"; - - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {refKey.type} not found."); - } - } - outputReference = new Reference(referenceTypes, keyList); - } - - return outputReference; - } - - internal static List ConvertDescriptionFromV10(AdminShellV10.Description sourceDescription) - { - var newLangStrList = new List(); - foreach (var ls in sourceDescription.langString) - { - newLangStrList.Add(new LangString(ls.lang, ls.str)); - } - - return new List(newLangStrList); - } - - internal static List ConvertDescriptionFromV20(AdminShellV20.Description sourceDescription) - { - var newLangStrList = new List(); - foreach (var ls in sourceDescription.langString) - { - newLangStrList.Add(new LangString(ls.lang, ls.str)); - } - - return new List(newLangStrList); - } - - internal static KeyTypes GetKeyType(IClass aasElement) - { - return aasElement switch - { - AssetAdministrationShell => KeyTypes.AssetAdministrationShell, - Submodel => KeyTypes.Submodel, - ConceptDescription => KeyTypes.ConceptDescription, - SubmodelElementCollection => KeyTypes.SubmodelElementCollection, - SubmodelElementList => KeyTypes.SubmodelElementList, - BasicEventElement => KeyTypes.BasicEventElement, - Blob => KeyTypes.Blob, - Entity => KeyTypes.Entity, - File => KeyTypes.File, - MultiLanguageProperty => KeyTypes.MultiLanguageProperty, - Property => KeyTypes.Property, - Operation => KeyTypes.Operation, - AasCore.Aas3_0_RC02.Range => KeyTypes.Range, - ReferenceElement => KeyTypes.ReferenceElement, - RelationshipElement => KeyTypes.RelationshipElement, - AnnotatedRelationshipElement => KeyTypes.AnnotatedRelationshipElement, - IIdentifiable => KeyTypes.Identifiable, - IReferable => KeyTypes.Referable, - Reference => KeyTypes.GlobalReference,//TODO:jtikekar what about model reference - _ => KeyTypes.SubmodelElement, // default case - }; - } - } -} diff --git a/src/AasxCsharpLib_bkp/Extensions/LocatedReference.cs b/src/AasxCsharpLib_bkp/Extensions/LocatedReference.cs deleted file mode 100644 index 433578d61..000000000 --- a/src/AasxCsharpLib_bkp/Extensions/LocatedReference.cs +++ /dev/null @@ -1,22 +0,0 @@ -using AasCore.Aas3_0_RC02; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Extensions -{ - public class LocatedReference - { - public IIdentifiable Identifiable; - public Reference Reference; - - public LocatedReference() { } - public LocatedReference(IIdentifiable identifiable, Reference reference) - { - Identifiable = identifiable; - Reference = reference; - } - } -} diff --git a/src/AasxCsharpLib_bkp/Extensions/MatchMode.cs b/src/AasxCsharpLib_bkp/Extensions/MatchMode.cs deleted file mode 100644 index f30029657..000000000 --- a/src/AasxCsharpLib_bkp/Extensions/MatchMode.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Extensions -{ - public enum MatchMode - { - Strict, //may be not needed in future, as no local flag in V3 - Relaxed, //should be as default - Identification - } -} diff --git a/src/AasxCsharpLib_bkp/IAasxOnlineConnection.cs b/src/AasxCsharpLib_bkp/IAasxOnlineConnection.cs deleted file mode 100644 index 7ce13b014..000000000 --- a/src/AasxCsharpLib_bkp/IAasxOnlineConnection.cs +++ /dev/null @@ -1,33 +0,0 @@ -/* -Copyright (c) 2018-2021 Festo AG & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using AasCore.Aas3_0_RC02; -using AdminShellNS; - -namespace AasxIntegrationBase -{ - /// - /// This interface describes a connection for a server resource of AASX contents, such as OPC UA or REST - /// - public interface IAasxOnlineConnection - { - bool IsValid(); - bool IsConnected(); - string GetInfo(); - Stream GetThumbnailStream(); - string UpdatePropertyValue( - AasCore.Aas3_0_RC02.Environment env, Submodel submodel, ISubmodelElement sme); - } -} diff --git a/src/AasxCsharpLib_bkp/LICENSE.txt b/src/AasxCsharpLib_bkp/LICENSE.txt deleted file mode 100644 index 2e5ee87b9..000000000 --- a/src/AasxCsharpLib_bkp/LICENSE.txt +++ /dev/null @@ -1,1475 +0,0 @@ -Copyright (c) 2018-2021 Festo AG & Co. KG -, -author: Michael Hoffmeister - -Copyright (c) 2019-2021 PHOENIX CONTACT GmbH & Co. KG -, -author: Andreas Orzelski - -Copyright (c) 2019-2020 Fraunhofer IOSB-INA Lemgo, - eine rechtlich nicht selbstaendige Einrichtung der Fraunhofer-Gesellschaft - zur Foerderung der angewandten Forschung e.V. - -Copyright (c) 2020 Schneider Electric Automation GmbH -, -author: Marco Mendes - -Copyright (c) 2020 SICK AG - -Copyright (c) 2021 KEB Automation KG - -Copyright (c) 2021 Lenze SE -author: Jonas Grote, Denis Göllner, Sebastian Bischof - -The AASX Package Explorer is licensed under the Apache License 2.0 -(Apache-2.0, see below). - -The AASX Package Explorer is a sample application for demonstration of the -features of the Asset Administration Shell. -The implementation uses the concepts of the document "Details of the Asset -Administration Shell" published on www.plattform-i40.de which is licensed -under Creative Commons CC BY-ND 3.0 DE. - -When using eCl@ss or IEC CDD data, please check the corresponding license -conditions. - -------------------------------------------------------------------------------- - -The components below are used in AASX Package Explorer. -The related licenses are listed for information purposes only. -Some licenses may only apply to their related plugins. - -The browser functionality is licensed under the cefSharp license (see below). - -The Newtonsoft.JSON serialization is licensed under the MIT License -(MIT, see below). - -The QR code generation is licensed under the MIT license (MIT, see below). - -The Zxing.Net Dot Matrix Code (DMC) generation is licensed under -the Apache License 2.0 (Apache-2.0, see below). - -The Grapevine REST server framework is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The AutomationML.Engine is licensed under the MIT license (MIT, see below). - -The MQTT server and client is licensed under the MIT license (MIT, see below). - -The ClosedXML Excel reader/writer is licensed under the MIT license (MIT, -see below). - -The CountryFlag WPF control is licensed under the Code Project Open License -(CPOL, see below). - -The DocumentFormat.OpenXml SDK is licensed under the MIT license (MIT, -see below). - -The ExcelNumberFormat number parser is licensed under the MIT license (MIT, -see below). - -The FastMember reflection access is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The IdentityModel OpenID client is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The jose-jwt object signing and encryption is licensed under the -MIT license (MIT, see below). - -The ExcelDataReader is licensed under the MIT license (MIT, see below). - -Portions copyright (c) by OPC Foundation, Inc. and licensed under the -Reciprocal Community License (RCL, see below) - -The OPC UA Example Code of OPC UA Standard is licensed under the MIT license -(MIT, see below). - -The MSAGL (Microsoft Automatic Graph Layout) is licensed under the MIT license -(MIT, see below) - -Glob (https://www.nuget.org/packages/Glob/) is licensed under the MIT license -(MIT, see below). - -The Magick.NET library is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The SSharp.NET library (https://github.com/PetroProtsyk/SSharp) is licensed -under Apache License 2.0 (Apache-2.0, see below). - -------------------------------------------------------------------------------- - - -With respect to AASX Package Explorer -===================================== - -(http://www.apache.org/licenses/LICENSE-2.0) - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - -With respect to cefSharp -======================== - -(https://raw.githubusercontent.com/cefsharp/CefSharp/master/LICENSE) - -Copyright © The CefSharp Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - - * Neither the name of Google Inc. nor the name Chromium Embedded - Framework nor the name CefSharp nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -With respect to Newtonsoft.Json -=============================== - -(https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md) - -The MIT License (MIT) - -Copyright (c) 2007 James Newton-King - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -With respect to QRcoder -======================= - -(https://github.com/codebude/QRCoder/blob/master/LICENSE.txt) - -The MIT License (MIT) - -Copyright (c) 2013-2018 Raffael Herrmann - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -With respect to ZXing.Net -========================= -With respect to Grapevine -========================= -With respect to FastMember -========================== -With respect to IdentityModel -============================= - -(http://www.apache.org/licenses/LICENSE-2.0) - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - -With respect to AutomationML.Engine -=================================== - -(https://raw.githubusercontent.com/AutomationML/AMLEngine2.1/master/license.txt) - -The MIT License (MIT) - -Copyright 2017 AutomationML e.V. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - - -With respect to MQTTnet -======================= - -(https://github.com/chkr1011/MQTTnet/blob/master/LICENSE) - -MIT License - -MQTTnet Copyright (c) 2016-2019 Christian Kratky - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With resepct to ClosedXML -========================= - -(https://github.com/ClosedXML/ClosedXML/blob/develop/LICENSE) - -MIT License - -Copyright (c) 2016 ClosedXML - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With resepct to CountryFlag -=========================== - -(https://www.codeproject.com/Articles/190722/WPF-CountryFlag-Control) - -The Code Project Open License (CPOL) 1.02 - -Copyright © 2017 Meshack Musundi - -Preamble - -This License governs Your use of the Work. This License is intended to allow -developers to use the Source Code and Executable Files provided as part of -the Work in any application in any form. - -The main points subject to the terms of the License are: - - Source Code and Executable Files can be used in commercial applications; - Source Code and Executable Files can be redistributed; and - Source Code can be modified to create derivative works. - No claim of suitability, guarantee, or any warranty whatsoever is provided. - The software is provided "as-is". - The Article(s) accompanying the Work may not be distributed or republished - without the Author's consent - -This License is entered between You, the individual or other entity reading or -otherwise making use of the Work licensed pursuant to this License and the -individual or other entity which offers the Work under the terms of this -License ("Author"). - -License - -THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS -CODE PROJECT OPEN LICENSE ("LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT -AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED -UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. - -BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HEREIN, YOU ACCEPT AND AGREE -TO BE BOUND BY THE TERMS OF THIS LICENSE. THE AUTHOR GRANTS YOU THE RIGHTS -CONTAINED HEREIN IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND -CONDITIONS. IF YOU DO NOT AGREE TO ACCEPT AND BE BOUND BY THE TERMS OF THIS -LICENSE, YOU CANNOT MAKE ANY USE OF THE WORK. - -Definitions. - "Articles" means, collectively, all articles written by Author which -describes how the Source Code and Executable Files for the Work may -be used by a user. - "Author" means the individual or entity that offers the Work under -the terms of this License. - "Derivative Work" means a work based upon the Work or upon the Work -and other pre-existing works. - "Executable Files" refer to the executables, binary files, -configuration and any required data files included in the Work. - "Publisher" means the provider of the website, magazine, CD-ROM, -DVD or other medium from or by which the Work is obtained by You. - "Source Code" refers to the collection of source code and -configuration files used to create the Executable Files. - "Standard Version" refers to such a Work if it has not been modified, -or has been modified in accordance with the consent of the Author, -such consent being in the full discretion of the Author. - "Work" refers to the collection of files distributed by the Publisher, -including the Source Code, Executable Files, binaries, data files, -documentation, whitepapers and the Articles. - "You" is you, an individual or entity wishing to use the Work and -exercise your rights under this License. - -Fair Use/Fair Use Rights. Nothing in this License is intended to reduce, -limit, or restrict any rights arising from fair use, fair dealing, -first sale or other limitations on the exclusive rights of the -copyright owner under copyright law or other applicable laws. - -License Grant. Subject to the terms and conditions of this License, the -Author hereby grants You a worldwide, royalty-free, non-exclusive, -perpetual (for the duration of the applicable copyright) license -to exercise the rights in the Work as stated below: - You may use the standard version of the Source Code or Executable -Files in Your own applications. - You may apply bug fixes, portability fixes and other modifications -obtained from the Public Domain or from the Author. A Work modified -in such a way shall still be considered the standard version and will -be subject to this License. - You may otherwise modify Your copy of this Work (excluding the Articles) -in any way to create a Derivative Work, provided that You insert a prominent -notice in each changed file stating how, when and where You changed that file. - You may distribute the standard version of the Executable Files and Source -Code or Derivative Work in aggregate with other (possibly commercial) -programs as part of a larger (possibly commercial) software distribution. - The Articles discussing the Work published in any form by the author may -not be distributed or republished without the Author's consent. The author -retains copyright to any such Articles. You may use the Executable Files and -Source Code pursuant to this License but you may not repost or republish or -otherwise distribute or make available the Articles, without the prior written -consent of the Author. - -Any subroutines or modules supplied by You and linked into the Source Code -or Executable Files of this Work shall not be considered part of this Work -and will not be subject to the terms of this License. - -Patent License. Subject to the terms and conditions of this License, each -Author hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, -royalty-free, irrevocable (except as stated in this section) patent license -to make, have made, use, import, and otherwise transfer the Work. - -Restrictions. The license granted in Section 3 above is expressly made subject -to and limited by the following restrictions: - You agree not to remove any of the original copyright, patent, trademark, -and attribution notices and associated disclaimers that may appear in the -Source Code or Executable Files. - You agree not to advertise or in any way imply that this Work is a product -of Your own. - The name of the Author may not be used to endorse or promote products -derived from the Work without the prior written consent of the Author. - You agree not to sell, lease, or rent any part of the Work. This does -not restrict you from including the Work or any part of the Work inside -a larger software distribution that itself is being sold. The Work by itself, -though, cannot be sold, leased or rented. - You may distribute the Executable Files and Source Code only under the terms -of this License, and You must include a copy of, or the Uniform Resource -Identifier for, this License with every copy of the Executable Files or -Source Code You distribute and ensure that anyone receiving such Executable -Files and Source Code agrees that the terms of this License apply to such -Executable Files and/or Source Code. You may not offer or impose any terms -on the Work that alter or restrict the terms of this License or the -recipients' exercise of the rights granted hereunder. You may not sublicense -the Work. You must keep intact all notices that refer to this License and to -the disclaimer of warranties. You may not distribute the Executable Files or -Source Code with any technological measures that control access or use of the -Work in a manner inconsistent with the terms of this License. - You agree not to use the Work for illegal, immoral or improper -purposes, or on pages containing illegal, immoral or improper material. -The Work is subject to applicable export laws. You agree to comply with all -such laws and regulations that may apply to the Work after Your receipt of -the Work. - -Representations, Warranties and Disclaimer. THIS WORK IS PROVIDED "AS IS", -"WHERE IS" AND "AS AVAILABLE", WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES OR -CONDITIONS OR GUARANTEES. YOU, THE USER, ASSUME ALL RISK IN ITS USE, -INCLUDING COPYRIGHT INFRINGEMENT, PATENT INFRINGEMENT, SUITABILITY, ETC. -AUTHOR EXPRESSLY DISCLAIMS ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES -OR CONDITIONS, INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS -OF MERCHANTABILITY, MERCHANTABLE QUALITY OR FITNESS FOR A PARTICULAR -PURPOSE, OR ANY WARRANTY OF TITLE OR NON-INFRINGEMENT, OR THAT THE WORK -(OR ANY PORTION THEREOF) IS CORRECT, USEFUL, BUG-FREE OR FREE OF VIRUSES. -YOU MUST PASS THIS DISCLAIMER ON WHENEVER YOU DISTRIBUTE THE WORK OR DERIVATIVE -WORKS. - -Indemnity. You agree to defend, indemnify and hold harmless the Author and the -Publisher from and against any claims, suits, losses, damages, liabilities, -costs, and expenses (including reasonable legal or attorneys’ fees) -resulting from or relating to any use of the Work by You. - -Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, -IN NO EVENT WILL THE AUTHOR OR THE PUBLISHER BE LIABLE TO YOU ON ANY LEGAL -THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY -DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK OR OTHERWISE, -EVEN IF THE AUTHOR OR THE PUBLISHER HAS BEEN ADVISED OF THE POSSIBILITY -OF SUCH DAMAGES. - -Termination. - This License and the rights granted hereunder will terminate -automatically upon any breach by You of any term of this License. -Individuals or entities who have received Derivative Works from You under -this License, however, will not have their licenses terminated provided such -individuals or entities remain in full compliance with those licenses. -Sections 1, 2, 6, 7, 8, 9, 10 and 11 will survive any termination of -this License. - If You bring a copyright, trademark, patent or any other infringement -claim against any contributor over infringements You claim are made by the -Work, your License from such contributor to the Work ends automatically. - Subject to the above terms and conditions, this License is perpetual -(for the duration of the applicable copyright in the Work). -Notwithstanding the above, the Author reserves the right to release the Work -under different license terms or to stop distributing the Work at any time; -provided, however that any such election will not serve to withdraw this -License (or any other license that has been, or is required to be, -granted under the terms of this License), and this License will continue -in full force and effect unless terminated as stated above. - -Publisher. The parties hereby confirm that the Publisher shall not, under -any circumstances, be responsible for and shall not have any liability -in respect of the subject matter of this License. The Publisher makes no -warranty whatsoever in connection with the Work and shall not be liable -to You or any party on any legal theory for any damages whatsoever, including -without limitation any general, special, incidental or consequential damages -arising in connection to this license. The Publisher reserves the right to -cease making the Work available to You at any time without notice - -Miscellaneous - This License shall be governed by the laws of the location of the head -office of the Author or if the Author is an individual, the laws of -location of the principal place of residence of the Author. - If any provision of this License is invalid or unenforceable under -applicable law, it shall not affect the validity or enforceability of the -remainder of the terms of this License, and without further action by the -parties to this License, such provision shall be reformed to the minimum -extent necessary to make such provision valid and enforceable. - No term or provision of this License shall be deemed waived and no -breach consented to unless such waiver or consent shall be in writing -and signed by the party to be charged with such waiver or consent. - This License constitutes the entire agreement between the parties -with respect to the Work licensed herein. There are no understandings, -agreements or representations with respect to the Work not specified herein. -The Author shall not be bound by any additional provisions that may appear -in any communication from You. This License may not be modified without -the mutual written agreement of the Author and You. - - -With respect to DocumentFormat.OpenXml -====================================== - -(https://github.com/OfficeDev/Open-XML-SDK/blob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) Microsoft Corporation - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With respect to ExcelNumberFormat -================================= - -(https://github.com/andersnm/ExcelNumberFormat/blob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2017 andersnm - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With respect to jose-jwt -======================== - -(https://github.com/dvsekhvalnov/jose-jwt/blob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2014-2019 dvsekhvalnov - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -With resepect to ExcelDataReader -================================ - -(https://github.com/ExcelDataReader/ExcelDataReader/blob/develop/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2014 ExcelDataReader - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With resepect to OPC UA Example Code -==================================== - - * Copyright (c) 2005-2019 The OPC Foundation, Inc. All rights reserved. - * - * OPC Foundation MIT License 1.00 - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - * The complete license agreement can be found here: - * http://opcfoundation.org/License/MIT/1.00/ - - -With respect to OPC Foundation -============================== - -RCL License -Reciprocal Community License 1.00 (RCL1.00) -Version 1.00, June 24, 2009 -Copyright (C) 2008,2009 OPC Foundation, Inc., All Rights Reserved. - -https://opcfoundation.org/license/rcl.html - -Remark: PHOENIX CONTACT GmbH & Co. KG and Festo SE & Co. KG are members -of OPC foundation. - -With respect to MSAGL (Microsoft Automatic Graph Layout) -======================================================== -(see: https://github.com/microsoft/automatic-graph-layout/blob/master/LICENSE) - -Microsoft Automatic Graph Layout, MSAGL - -Copyright (c) Microsoft Corporation - -All rights reserved. - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -""Software""), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -With respect to Glob (https://www.nuget.org/packages/Glob/) -=========================================================== -(see: https://raw.githubusercontent.com/kthompson/glob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2013-2019 Kevin Thompson - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -With respect to Magick.NET -========================== - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - 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. - -With respect to SSharp.NET library -================================== - - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - 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. diff --git a/src/AasxCsharpLib_bkp/LogInternally.cs b/src/AasxCsharpLib_bkp/LogInternally.cs deleted file mode 100644 index f5a9bfad9..000000000 --- a/src/AasxCsharpLib_bkp/LogInternally.cs +++ /dev/null @@ -1,84 +0,0 @@ -/* -Copyright (c) 2020 ZHAW Zürcher Hochschule für Angewandte Wissenschaften -Author: Marko Ristin - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using Exception = System.Exception; - -namespace AdminShellNS -{ - public static class Logging - { - // see: https://stackoverflow.com/questions/9314172/getting-all-messages-from-innerexceptions - private static string GetExceptionMessages(this Exception e, string msgs = "") - { - if (e == null) return string.Empty; - if (msgs == "") msgs = e.Message; - if (e.InnerException != null) - msgs += "\r\nInnerException: " + GetExceptionMessages(e.InnerException); - return msgs; - } - - public static string FormatError(Exception ex, string where) - { - var res = string.Format("Error: {0}: {1} {2} at {3}.", - where, - ex.Message, - ex.GetExceptionMessages(), - ex.StackTrace); - - var inner = ex.InnerException; - while (inner != null) - { - res += $"Inner message: {inner.Message}" + Environment.NewLine; - inner = inner.InnerException; - } - - return res; - } - } - - public class InternalLog - { - /// - /// Logs the exception to STDERR. - /// - public void Error(Exception ex, string where) - { - System.Console.Error.WriteLine(Logging.FormatError(ex, where)); - } - - /// - /// Logs that the exception is silently ignored to STDERR. - /// - public void SilentlyIgnoredError(Exception ex) - { - System.Console.Error.WriteLine("The exception is silently ignored: {0} {1} at {2}.", - ex.Message, - ((ex.InnerException != null) ? ex.InnerException.Message : ""), - ex.StackTrace); - } - - /// - /// Does no logging at all. Allows to have non-empty catch clauses. - /// - public void CompletelyIgnoredError(Exception ex) - { - } - } - - /// - /// Handles logging meant to be read by developers (*i.e*, not by the users of the software). - /// - /// Please see AasxIntegrationBase\LogInstance.cs for how to keep logs intended - /// for the user. - public static class LogInternally - { - public static readonly InternalLog That = new InternalLog(); - } -} \ No newline at end of file diff --git a/src/AasxCsharpLib_bkp/Properties/AssemblyInfo.cs b/src/AasxCsharpLib_bkp/Properties/AssemblyInfo.cs deleted file mode 100644 index 9aa23c08b..000000000 --- a/src/AasxCsharpLib_bkp/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// Allgemeine Informationen über eine Assembly werden über die folgenden -// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, -// die einer Assembly zugeordnet sind. -[assembly: AssemblyTitle("AasxCsharpLibrary")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("AasxCsharpLibrary")] -[assembly: AssemblyCopyright("Copyright © 2019")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly -// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von -// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen. -[assembly: ComVisible(false)] - -// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird -[assembly: Guid("9863799b-4e44-4da2-9120-c85c7985bc6d")] - -// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: -// -// Hauptversion -// Nebenversion -// Buildnummer -// Revision -// -// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, -// indem Sie "*" wie unten gezeigt eingeben: -//// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/AasxCsharpLib_bkp/Resources/schemaV201/AAS.xsd b/src/AasxCsharpLib_bkp/Resources/schemaV201/AAS.xsd deleted file mode 100644 index 2e6c24f6b..000000000 --- a/src/AasxCsharpLib_bkp/Resources/schemaV201/AAS.xsd +++ /dev/null @@ -1,555 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/AasxCsharpLib_bkp/Resources/schemaV201/AAS_ABAC.xsd b/src/AasxCsharpLib_bkp/Resources/schemaV201/AAS_ABAC.xsd deleted file mode 100644 index 4048a5746..000000000 --- a/src/AasxCsharpLib_bkp/Resources/schemaV201/AAS_ABAC.xsd +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLib_bkp/Resources/schemaV201/IEC61360.xsd b/src/AasxCsharpLib_bkp/Resources/schemaV201/IEC61360.xsd deleted file mode 100644 index d52f04f1e..000000000 --- a/src/AasxCsharpLib_bkp/Resources/schemaV201/IEC61360.xsd +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/AasxCsharpLib_bkp/Resources/schemaV201/aas.json b/src/AasxCsharpLib_bkp/Resources/schemaV201/aas.json deleted file mode 100644 index 9583c2b1f..000000000 --- a/src/AasxCsharpLib_bkp/Resources/schemaV201/aas.json +++ /dev/null @@ -1,1148 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2019-09/schema", - "title": "AssetAdministrationShellEnvironment", - "$id": "http://www.admin-shell.io/schema/json/v2.0.1", - "type": "object", - "required": ["assetAdministrationShells", "submodels", "assets", "conceptDescriptions"], - "properties": { - "assetAdministrationShells": { - "type": "array", - "items": { - "$ref": "#/definitions/AssetAdministrationShell" - } - }, - "submodels": { - "type": "array", - "items": { - "$ref": "#/definitions/Submodel" - } - }, - "assets": { - "type": "array", - "items": { - "$ref": "#/definitions/Asset" - } - }, - "conceptDescriptions": { - "type": "array", - "items": { - "$ref": "#/definitions/ConceptDescription" - } - } - }, - "definitions": { - "Referable": { - "type": "object", - "properties": { - "idShort": { - "type": "string" - }, - "category": { - "type": "string" - }, - "description": { - "type": "array", - "items": { - "$ref": "#/definitions/LangString" - } - }, - "parent": { - "$ref": "#/definitions/Reference" - }, - "modelType": { - "$ref": "#/definitions/ModelType" - } - }, - "required": [ "idShort", "modelType" ] - }, - "Identifiable": { - "allOf": [ - { "$ref": "#/definitions/Referable" }, - { "properties": { - "identification": { - "$ref": "#/definitions/Identifier" - }, - "administration": { - "$ref": "#/definitions/AdministrativeInformation" - } - }, - "required": [ "identification" ] - } - ] - }, - "Qualifiable": { - "type": "object", - "properties": { - "qualifiers": { - "type": "array", - "items": { - "$ref": "#/definitions/Constraint" - } - } - } - }, - "HasSemantics": { - "type": "object", - "properties": { - "semanticId": { - "$ref": "#/definitions/Reference" - } - } - }, - "HasDataSpecification": { - "type": "object", - "properties": { - "embeddedDataSpecifications": { - "type": "array", - "items": { - "$ref": "#/definitions/EmbeddedDataSpecification" - } - } - } - }, - "AssetAdministrationShell": { - "allOf": [ - { "$ref": "#/definitions/Identifiable" }, - { "$ref": "#/definitions/HasDataSpecification" }, - { "properties": { - "derivedFrom": { - "$ref": "#/definitions/Reference" - }, - "asset": { - "$ref": "#/definitions/Reference" - }, - "submodels": { - "type": "array", - "items": { - "$ref": "#/definitions/Reference" - } - }, - "views": { - "type": "array", - "items": { - "$ref": "#/definitions/View" - } - }, - "conceptDictionaries": { - "type": "array", - "items": { - "$ref": "#/definitions/ConceptDictionary" - } - }, - "security": { - "$ref": "#/definitions/Security" - } - }, - "required": [ "asset" ] - } - ] - }, - "Identifier": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "idType": { - "$ref": "#/definitions/KeyType" - } - }, - "required": [ "id", "idType" ] - }, - "KeyType": { - "type": "string", - "enum": ["Custom", "IRDI", "IRI", "IdShort", "FragmentId"] - }, - "AdministrativeInformation": { - "type": "object", - "properties": { - "version": { - "type": "string" - }, - "revision": { - "type": "string" - } - } - }, - "LangString": { - "type": "object", - "properties": { - "language": { - "type": "string" - }, - "text": { - "type": "string" - } - }, - "required": [ "language", "text" ] - }, - "Reference": { - "type": "object", - "properties": { - "keys": { - "type": "array", - "items": { - "$ref": "#/definitions/Key" - } - } - }, - "required": [ "keys" ] - }, - "Key": { - "type": "object", - "properties": { - "type": { - "$ref": "#/definitions/KeyElements" - }, - "idType": { - "$ref": "#/definitions/KeyType" - }, - "value": { - "type": "string" - }, - "local": { - "type": "boolean" - } - }, - "required": [ "type", "idType", "value", "local" ] - }, - "KeyElements": { - "type": "string", - "enum": [ - "Asset", - "AssetAdministrationShell", - "ConceptDescription", - "Submodel", - "AccessPermissionRule", - "AnnotatedRelationshipElement", - "BasicEvent", - "Blob", - "Capability", - "ConceptDictionary", - "DataElement", - "File", - "Entity", - "Event", - "MultiLanguageProperty", - "Operation", - "Property", - "Range", - "ReferenceElement", - "RelationshipElement", - "SubmodelElement", - "SubmodelElementCollection", - "View", - "GlobalReference", - "FragmentReference" - ] - }, - "ModelTypes": { - "type": "string", - "enum": [ - "Asset", - "AssetAdministrationShell", - "ConceptDescription", - "Submodel", - "AccessPermissionRule", - "AnnotatedRelationshipElement", - "BasicEvent", - "Blob", - "Capability", - "ConceptDictionary", - "DataElement", - "File", - "Entity", - "Event", - "MultiLanguageProperty", - "Operation", - "Property", - "Range", - "ReferenceElement", - "RelationshipElement", - "SubmodelElement", - "SubmodelElementCollection", - "View", - "GlobalReference", - "FragmentReference", - "Constraint", - "Formula", - "Qualifier" - ] - }, - "ModelType": { - "type": "object", - "properties": { - "name": { - "$ref": "#/definitions/ModelTypes" - } - }, - "required": [ "name" ] - }, - "EmbeddedDataSpecification": { - "type": "object", - "properties": { - "dataSpecification": { - "$ref": "#/definitions/Reference" - }, - "dataSpecificationContent": { - "$ref": "#/definitions/DataSpecificationContent" - } - }, - "required": [ "dataSpecification", "dataSpecificationContent" ] - }, - "DataSpecificationContent": { - "oneOf": [ - { "$ref": "#/definitions/DataSpecificationIEC61360Content" }, - { "$ref": "#/definitions/DataSpecificationPhysicalUnitContent" } - ] - }, - "DataSpecificationPhysicalUnitContent": { - "type": "object", - "properties": { - "unitName": { - "type": "string" - }, - "unitSymbol": { - "type": "string" - }, - "definition": { - "type": "array", - "items": { - "$ref": "#/definitions/LangString" - } - }, - "siNotation": { - "type": "string" - }, - "siName": { - "type": "string" - }, - "dinNotation": { - "type": "string" - }, - "eceName": { - "type": "string" - }, - "eceCode": { - "type": "string" - }, - "nistName": { - "type": "string" - }, - "sourceOfDefinition": { - "type": "string" - }, - "conversionFactor": { - "type": "string" - }, - "registrationAuthorityId": { - "type": "string" - }, - "supplier": { - "type": "string" - } - }, - "required": [ "unitName", "unitSymbol", "definition" ] - }, - "DataSpecificationIEC61360Content": { - "allOf": [ - { "$ref": "#/definitions/ValueObject" }, - { - "type": "object", - "properties": { - "dataType": { - "enum": [ - "DATE", - "STRING", - "STRING_TRANSLATABLE", - "REAL_MEASURE", - "REAL_COUNT", - "REAL_CURRENCY", - "BOOLEAN", - "URL", - "RATIONAL", - "RATIONAL_MEASURE", - "TIME", - "TIMESTAMP", - "INTEGER_COUNT", - "INTEGER_MEASURE", - "INTEGER_CURRENCY" - ] - }, - "definition": { - "type": "array", - "items": { - "$ref": "#/definitions/LangString" - } - }, - "preferredName": { - "type": "array", - "items": { - "$ref": "#/definitions/LangString" - } - }, - "shortName": { - "type": "array", - "items": { - "$ref": "#/definitions/LangString" - } - }, - "sourceOfDefinition": { - "type": "string" - }, - "symbol": { - "type": "string" - }, - "unit": { - "type": "string" - }, - "unitId": { - "$ref": "#/definitions/Reference" - }, - "valueFormat": { - "type": "string" - }, - "valueList": { - "$ref": "#/definitions/ValueList" - }, - "levelType": { - "type": "array", - "items": { - "$ref": "#/definitions/LevelType" - } - } - }, - "required": [ "preferredName" ] - } - ] - }, - "LevelType": { - "type": "string", - "enum": [ "Min", "Max", "Nom", "Typ" ] - }, - "ValueList": { - "type": "object", - "properties": { - "valueReferencePairTypes": { - "type": "array", - "minItems": 1, - "items": { - "$ref": "#/definitions/ValueReferencePairType" - } - } - }, - "required": [ "valueReferencePairTypes" ] - }, - "ValueReferencePairType": { - "allOf": [ - { "$ref": "#/definitions/ValueObject" } - ] - }, - "ValueObject": { - "type": "object", - "properties": { - "value": { "type": "string" }, - "valueId": { - "$ref": "#/definitions/Reference" - }, - "valueType": { - "type": "string", - "enum": [ - "anyUri", - "base64Binary", - "boolean", - "date", - "dateTime", - "dateTimeStamp", - "decimal", - "integer", - "long", - "int", - "short", - "byte", - "nonNegativeInteger", - "positiveInteger", - "unsignedLong", - "unsignedInt", - "unsignedShort", - "unsignedByte", - "nonPositiveInteger", - "negativeInteger", - "double", - "duration", - "dayTimeDuration", - "yearMonthDuration", - "float", - "gDay", - "gMonth", - "gMonthDay", - "gYear", - "gYearMonth", - "hexBinary", - "NOTATION", - "QName", - "string", - "normalizedString", - "token", - "language", - "Name", - "NCName", - "ENTITY", - "ID", - "IDREF", - "NMTOKEN", - "time" - ]} - } - }, - "Asset": { - "allOf": [ - { "$ref": "#/definitions/Identifiable" }, - { "$ref": "#/definitions/HasDataSpecification" }, - { "properties": { - "kind": { - "$ref": "#/definitions/AssetKind" - }, - "assetIdentificationModel": { - "$ref": "#/definitions/Reference" - }, - "billOfMaterial": { - "$ref": "#/definitions/Reference" - } - }, - "required": [ "kind" ] - } - ] - }, - "AssetKind": { - "type": "string", - "enum": ["Type", "Instance"] - }, - "ModelingKind": { - "type": "string", - "enum": ["Template", "Instance"] - }, - "Submodel": { - "allOf": [ - { "$ref": "#/definitions/Identifiable" }, - { "$ref": "#/definitions/HasDataSpecification" }, - { "$ref": "#/definitions/Qualifiable" }, - { "$ref": "#/definitions/HasSemantics" }, - { "properties": { - "kind": { - "$ref": "#/definitions/ModelingKind" - }, - "submodelElements": { - "type": "array", - "items": { - "$ref": "#/definitions/SubmodelElement" - } - } - } - } - ] - }, - "Constraint": { - "type": "object", - "properties": { - "modelType": { - "$ref": "#/definitions/ModelType" - } - }, - "required": [ "modelType" ] - }, - "Operation": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" }, - { "properties": { - "inputVariable": { - "type": "array", - "items": { - "$ref": "#/definitions/OperationVariable" - } - }, - "outputVariable": { - "type": "array", - "items": { - "$ref": "#/definitions/OperationVariable" - } - }, - "inoutputVariable": { - "type": "array", - "items": { - "$ref": "#/definitions/OperationVariable" - } - } - } - } - ] - }, - "OperationVariable": { - "type": "object", - "properties": { - "value": { - "oneOf": [ - { "$ref": "#/definitions/Blob" }, - { "$ref": "#/definitions/File" }, - { "$ref": "#/definitions/Capability" }, - { "$ref": "#/definitions/Entity" }, - { "$ref": "#/definitions/Event" }, - { "$ref": "#/definitions/BasicEvent" }, - { "$ref": "#/definitions/MultiLanguageProperty" }, - { "$ref": "#/definitions/Operation" }, - { "$ref": "#/definitions/Property" }, - { "$ref": "#/definitions/Range" }, - { "$ref": "#/definitions/ReferenceElement" }, - { "$ref": "#/definitions/RelationshipElement" }, - { "$ref": "#/definitions/SubmodelElementCollection" } - ] - } - }, - "required": [ "value" ] - }, - "SubmodelElement": { - "allOf": [ - { "$ref": "#/definitions/Referable" }, - { "$ref": "#/definitions/HasDataSpecification" }, - { "$ref": "#/definitions/HasSemantics" }, - { "$ref": "#/definitions/Qualifiable" }, - { "properties": { - "kind": { - "$ref": "#/definitions/ModelingKind" - } - } - } - ] - }, - "Event": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" } - ] - }, - "BasicEvent": { - "allOf": [ - { "$ref": "#/definitions/Event" }, - { "properties": { - "observed": { - "$ref": "#/definitions/Reference" - } - }, - "required": [ "observed" ] - } - ] - }, - "EntityType": { - "type": "string", - "enum": ["CoManagedEntity", "SelfManagedEntity"] - }, - "Entity": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" }, - { "properties": { - "statements": { - "type": "array", - "items": { - "$ref": "#/definitions/SubmodelElement" - } - }, - "entityType": { - "$ref": "#/definitions/EntityType" - }, - "asset": { - "$ref": "#/definitions/Reference" - } - }, - "required": [ "entityType" ] - } - ] - }, - "View": { - "allOf": [ - { "$ref": "#/definitions/Referable" }, - { "$ref": "#/definitions/HasDataSpecification" }, - { "$ref": "#/definitions/HasSemantics" }, - { "properties": { - "containedElements": { - "type": "array", - "items": { - "$ref": "#/definitions/Reference" - } - } - } - } - ] - }, - "ConceptDictionary": { - "allOf": [ - { "$ref": "#/definitions/Referable" }, - { "$ref": "#/definitions/HasDataSpecification" }, - { "properties": { - "conceptDescriptions": { - "type": "array", - "items": { - "$ref": "#/definitions/Reference" - } - } - } - } - ] - }, - "ConceptDescription": { - "allOf": [ - { "$ref": "#/definitions/Identifiable" }, - { "$ref": "#/definitions/HasDataSpecification" }, - { "properties": { - "isCaseOf": { - "type": "array", - "items": { - "$ref": "#/definitions/Reference" - } - } - } - } - ] - }, - "Capability": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" } - ] - }, - "Property": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" }, - { "$ref": "#/definitions/ValueObject" } - ] - }, - "Range": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" }, - { "properties": { - "valueType": { - "type": "string", - "enum": [ - "anyUri", - "base64Binary", - "boolean", - "date", - "dateTime", - "dateTimeStamp", - "decimal", - "integer", - "long", - "int", - "short", - "byte", - "nonNegativeInteger", - "positiveInteger", - "unsignedLong", - "unsignedInt", - "unsignedShort", - "unsignedByte", - "nonPositiveInteger", - "negativeInteger", - "double", - "duration", - "dayTimeDuration", - "yearMonthDuration", - "float", - "gDay", - "gMonth", - "gMonthDay", - "gYear", - "gYearMonth", - "hexBinary", - "NOTATION", - "QName", - "string", - "normalizedString", - "token", - "language", - "Name", - "NCName", - "ENTITY", - "ID", - "IDREF", - "NMTOKEN", - "time" - ] - }, - "min": { "type": "string" }, - "max": { "type": "string" } - }, - "required": [ "valueType"] - } - ] - }, - "MultiLanguageProperty": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" }, - { "properties": { - "value": { - "type": "array", - "items": { - "$ref": "#/definitions/LangString" - } - }, - "valueId": { - "$ref": "#/definitions/Reference" - } - } - } - ] - }, - "File": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" }, - { "properties": { - "value": { - "type": "string" - }, - "mimeType": { - "type": "string" - } - }, - "required": [ "mimeType" ] - } - ] - }, - "Blob": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" }, - { "properties": { - "value": { - "type": "string" - }, - "mimeType": { - "type": "string" - } - }, - "required": [ "mimeType" ] - } - ] - }, - "ReferenceElement": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" }, - { "properties": { - "value": { - "$ref": "#/definitions/Reference" - } - } - } - ] - }, - "SubmodelElementCollection": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" }, - { "properties": { - "value": { - "type": "array", - "items": { - "oneOf": [ - { "$ref": "#/definitions/Blob" }, - { "$ref": "#/definitions/File" }, - { "$ref": "#/definitions/Capability" }, - { "$ref": "#/definitions/Entity" }, - { "$ref": "#/definitions/Event" }, - { "$ref": "#/definitions/BasicEvent" }, - { "$ref": "#/definitions/MultiLanguageProperty" }, - { "$ref": "#/definitions/Operation" }, - { "$ref": "#/definitions/Property" }, - { "$ref": "#/definitions/Range" }, - { "$ref": "#/definitions/ReferenceElement" }, - { "$ref": "#/definitions/RelationshipElement" }, - { "$ref": "#/definitions/SubmodelElementCollection" } - ] - } - }, - "allowDuplicates": { - "type": "boolean" - }, - "ordered": { - "type": "boolean" - } - } - } - ] - }, - "RelationshipElement": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" }, - { "properties": { - "first": { - "$ref": "#/definitions/Reference" - }, - "second": { - "$ref": "#/definitions/Reference" - } - }, - "required": [ "first", "second" ] - } - ] - }, - "AnnotatedRelationshipElement": { - "allOf": [ - { "$ref": "#/definitions/RelationshipElement" }, - { "properties": { - "annotation": { - "type": "array", - "items": { - "oneOf": [ - { "$ref": "#/definitions/Blob" }, - { "$ref": "#/definitions/File" }, - { "$ref": "#/definitions/MultiLanguageProperty" }, - { "$ref": "#/definitions/Property" }, - { "$ref": "#/definitions/Range" }, - { "$ref": "#/definitions/ReferenceElement" } - ] - } - } - } - } - ] - }, - "Qualifier": { - "allOf": [ - { "$ref": "#/definitions/Constraint" }, - { "$ref": "#/definitions/HasSemantics" }, - { "$ref": "#/definitions/ValueObject" }, - { "properties": { - "type": { - "type": "string" - } - }, - "required": [ "type" ] - } - ] - }, - "Formula": { - "allOf": [ - { "$ref": "#/definitions/Constraint" }, - { "properties": { - "dependsOn": { - "type": "array", - "items": { - "$ref": "#/definitions/Reference" - } - } - } - } - ] - }, - "Security": { - "type": "object", - "properties": { - "accessControlPolicyPoints": { - "$ref": "#/definitions/AccessControlPolicyPoints" - }, - "certificate": { - "type": "array", - "items": { - "oneOf": [ - { "$ref": "#/definitions/BlobCertificate" } - ] - } - }, - "requiredCertificateExtension": { - "type": "array", - "items": { - "$ref": "#/definitions/Reference" - } - } - }, - "required": [ "accessControlPolicyPoints" ] - }, - "Certificate": { - "type": "object" - }, - "BlobCertificate": { - "allOf": [ - { "$ref": "#/definitions/Certificate" }, - { "properties": { - "blobCertificate": { - "$ref": "#/definitions/Blob" - }, - "containedExtension": { - "type": "array", - "items": { - "$ref": "#/definitions/Reference" - } - }, - "lastCertificate": { - "type": "boolean" - } - } - } - ] - }, - "AccessControlPolicyPoints": { - "type": "object", - "properties": { - "policyAdministrationPoint": { - "$ref": "#/definitions/PolicyAdministrationPoint" - }, - "policyDecisionPoint": { - "$ref": "#/definitions/PolicyDecisionPoint" - }, - "policyEnforcementPoint": { - "$ref": "#/definitions/PolicyEnforcementPoint" - }, - "policyInformationPoints": { - "$ref": "#/definitions/PolicyInformationPoints" - } - }, - "required": [ "policyAdministrationPoint", "policyDecisionPoint", "policyEnforcementPoint" ] - }, - "PolicyAdministrationPoint": { - "type": "object", - "properties": { - "localAccessControl": { - "$ref": "#/definitions/AccessControl" - }, - "externalAccessControl": { - "type": "boolean" - } - }, - "required": [ "externalAccessControl" ] - }, - "PolicyInformationPoints": { - "type": "object", - "properties": { - "internalInformationPoint": { - "type": "array", - "items": { - "$ref": "#/definitions/Reference" - } - }, - "externalInformationPoint": { - "type": "boolean" - } - }, - "required": [ "externalInformationPoint" ] - }, - "PolicyEnforcementPoint": { - "type": "object", - "properties": { - "externalPolicyEnforcementPoint": { - "type": "boolean" - } - }, - "required": [ "externalPolicyEnforcementPoint" ] - }, - "PolicyDecisionPoint": { - "type": "object", - "properties": { - "externalPolicyDecisionPoints": { - "type": "boolean" - } - }, - "required": [ "externalPolicyDecisionPoints" ] - }, - "AccessControl": { - "type": "object", - "properties": { - "selectableSubjectAttributes": { - "$ref": "#/definitions/Reference" - }, - "defaultSubjectAttributes": { - "$ref": "#/definitions/Reference" - }, - "selectablePermissions": { - "$ref": "#/definitions/Reference" - }, - "defaultPermissions": { - "$ref": "#/definitions/Reference" - }, - "selectableEnvironmentAttributes": { - "$ref": "#/definitions/Reference" - }, - "defaultEnvironmentAttributes": { - "$ref": "#/definitions/Reference" - }, - "accessPermissionRule": { - "type": "array", - "items": { - "$ref": "#/definitions/AccessPermissionRule" - } - } - } - }, - "AccessPermissionRule": { - "allOf": [ - { "$ref": "#/definitions/Referable" }, - { "$ref": "#/definitions/Qualifiable" }, - { "properties": { - "targetSubjectAttributes": { - "type": "array", - "items": { - "$ref": "#/definitions/SubjectAttributes" - }, - "minItems": 1 - }, - "permissionsPerObject": { - "type": "array", - "items": { - "$ref": "#/definitions/PermissionsPerObject" - } - } - }, - "required": [ "targetSubjectAttributes" ] - } - ] - }, - "SubjectAttributes": { - "type": "object", - "properties": { - "subjectAttributes": { - "type": "array", - "items": { - "$ref": "#/definitions/Reference" - }, - "minItems": 1 - } - } - }, - "PermissionsPerObject": { - "type": "object", - "properties": { - "object": { - "$ref": "#/definitions/Reference" - }, - "targetObjectAttributes": { - "$ref": "#/definitions/ObjectAttributes" - }, - "permission": { - "type": "array", - "items": { - "$ref": "#/definitions/Permission" - } - } - } - }, - "ObjectAttributes": { - "type": "object", - "properties": { - "objectAttribute": { - "type": "array", - "items": { - "$ref": "#/definitions/Property" - }, - "minItems": 1 - } - } - }, - "Permission": { - "type": "object", - "properties": { - "permission": { - "$ref": "#/definitions/Reference" - }, - "kindOfPermission": { - "type": "string", - "enum": ["Allow", "Deny", "NotApplicable", "Undefined"] - } - }, - "required": [ "permission", "kindOfPermission" ] - } - } -} diff --git a/src/AasxCsharpLibrary.Tests/AasxCsharpLibrary.Tests.csproj b/src/AasxCsharpLibrary.Tests/AasxCsharpLibrary.Tests.csproj deleted file mode 100644 index 65684b16f..000000000 --- a/src/AasxCsharpLibrary.Tests/AasxCsharpLibrary.Tests.csproj +++ /dev/null @@ -1,24 +0,0 @@ - - - net6.0-windows - Library - false - 8 - false - - - - PreserveNewest - - - - - Always - - - - - - - - diff --git a/src/AasxCsharpLibrary.Tests/DocTestAdminShellUtil.cs b/src/AasxCsharpLibrary.Tests/DocTestAdminShellUtil.cs deleted file mode 100644 index e6bd57845..000000000 --- a/src/AasxCsharpLibrary.Tests/DocTestAdminShellUtil.cs +++ /dev/null @@ -1,67 +0,0 @@ -// This file was automatically generated by doctest-csharp. -// !!! DO NOT EDIT OR APPEND !!! - -using NUnit.Framework; - -namespace AdminShellNS.Tests -{ - public class DocTest_AdminShellUtil_cs - { - [Test] - public void AtLine40AndColumn12() - { - Assert.AreEqual("someName", AdminShellUtil.FilterFriendlyName("someName")); - } - - [Test] - public void AtLine41AndColumn12() - { - Assert.AreEqual("some__name", AdminShellUtil.FilterFriendlyName("some!;name")); - } - - [Test] - public void AtLine51AndColumn12() - { - Assert.IsFalse(AdminShellUtil.HasWhitespace("")); - } - - [Test] - public void AtLine52AndColumn12() - { - Assert.IsTrue(AdminShellUtil.HasWhitespace(" ")); - } - - [Test] - public void AtLine53AndColumn12() - { - Assert.IsTrue(AdminShellUtil.HasWhitespace("aa bb")); - } - - [Test] - public void AtLine54AndColumn12() - { - Assert.IsTrue(AdminShellUtil.HasWhitespace(" aabb")); - } - - [Test] - public void AtLine55AndColumn12() - { - Assert.IsTrue(AdminShellUtil.HasWhitespace("aabb ")); - } - - [Test] - public void AtLine56AndColumn12() - { - Assert.IsFalse(AdminShellUtil.HasWhitespace("aabb")); - } - - [Test] - public void AtLine68AndColumn12() - { - Assert.IsTrue(AdminShellUtil.ComplyIdShort("")); - } - } -} - -// This file was automatically generated by doctest-csharp. -// !!! DO NOT EDIT OR APPEND !!! diff --git a/src/AasxCsharpLibrary.Tests/LICENSE.txt b/src/AasxCsharpLibrary.Tests/LICENSE.txt deleted file mode 100644 index 75f36a4ff..000000000 --- a/src/AasxCsharpLibrary.Tests/LICENSE.txt +++ /dev/null @@ -1,1475 +0,0 @@ -Copyright (c) 2018-2023 Festo AG & Co. KG -, -author: Michael Hoffmeister - -Copyright (c) 2019-2021 PHOENIX CONTACT GmbH & Co. KG -, -author: Andreas Orzelski - -Copyright (c) 2019-2020 Fraunhofer IOSB-INA Lemgo, - eine rechtlich nicht selbstaendige Einrichtung der Fraunhofer-Gesellschaft - zur Foerderung der angewandten Forschung e.V. - -Copyright (c) 2020 Schneider Electric Automation GmbH -, -author: Marco Mendes - -Copyright (c) 2020 SICK AG - -Copyright (c) 2021 KEB Automation KG - -Copyright (c) 2021 Lenze SE -author: Jonas Grote, Denis Göllner, Sebastian Bischof - -The AASX Package Explorer is licensed under the Apache License 2.0 -(Apache-2.0, see below). - -The AASX Package Explorer is a sample application for demonstration of the -features of the Asset Administration Shell. -The implementation uses the concepts of the document "Details of the Asset -Administration Shell" published on www.plattform-i40.de which is licensed -under Creative Commons CC BY-ND 3.0 DE. - -When using eCl@ss or IEC CDD data, please check the corresponding license -conditions. - -------------------------------------------------------------------------------- - -The components below are used in AASX Package Explorer. -The related licenses are listed for information purposes only. -Some licenses may only apply to their related plugins. - -The browser functionality is licensed under the cefSharp license (see below). - -The Newtonsoft.JSON serialization is licensed under the MIT License -(MIT, see below). - -The QR code generation is licensed under the MIT license (MIT, see below). - -The Zxing.Net Dot Matrix Code (DMC) generation is licensed under -the Apache License 2.0 (Apache-2.0, see below). - -The Grapevine REST server framework is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The AutomationML.Engine is licensed under the MIT license (MIT, see below). - -The MQTT server and client is licensed under the MIT license (MIT, see below). - -The ClosedXML Excel reader/writer is licensed under the MIT license (MIT, -see below). - -The CountryFlag WPF control is licensed under the Code Project Open License -(CPOL, see below). - -The DocumentFormat.OpenXml SDK is licensed under the MIT license (MIT, -see below). - -The ExcelNumberFormat number parser is licensed under the MIT license (MIT, -see below). - -The FastMember reflection access is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The IdentityModel OpenID client is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The jose-jwt object signing and encryption is licensed under the -MIT license (MIT, see below). - -The ExcelDataReader is licensed under the MIT license (MIT, see below). - -Portions copyright (c) by OPC Foundation, Inc. and licensed under the -Reciprocal Community License (RCL, see below) - -The OPC UA Example Code of OPC UA Standard is licensed under the MIT license -(MIT, see below). - -The MSAGL (Microsoft Automatic Graph Layout) is licensed under the MIT license -(MIT, see below) - -Glob (https://www.nuget.org/packages/Glob/) is licensed under the MIT license -(MIT, see below). - -The Magick.NET library is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The SSharp.NET library (https://github.com/PetroProtsyk/SSharp) is licensed -under Apache License 2.0 (Apache-2.0, see below). - -------------------------------------------------------------------------------- - - -With respect to AASX Package Explorer -===================================== - -(http://www.apache.org/licenses/LICENSE-2.0) - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - -With respect to cefSharp -======================== - -(https://raw.githubusercontent.com/cefsharp/CefSharp/master/LICENSE) - -Copyright © The CefSharp Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - - * Neither the name of Google Inc. nor the name Chromium Embedded - Framework nor the name CefSharp nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -With respect to Newtonsoft.Json -=============================== - -(https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md) - -The MIT License (MIT) - -Copyright (c) 2007 James Newton-King - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -With respect to QRcoder -======================= - -(https://github.com/codebude/QRCoder/blob/master/LICENSE.txt) - -The MIT License (MIT) - -Copyright (c) 2013-2018 Raffael Herrmann - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -With respect to ZXing.Net -========================= -With respect to Grapevine -========================= -With respect to FastMember -========================== -With respect to IdentityModel -============================= - -(http://www.apache.org/licenses/LICENSE-2.0) - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - -With respect to AutomationML.Engine -=================================== - -(https://raw.githubusercontent.com/AutomationML/AMLEngine2.1/master/license.txt) - -The MIT License (MIT) - -Copyright 2017 AutomationML e.V. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - - -With respect to MQTTnet -======================= - -(https://github.com/chkr1011/MQTTnet/blob/master/LICENSE) - -MIT License - -MQTTnet Copyright (c) 2016-2019 Christian Kratky - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With resepct to ClosedXML -========================= - -(https://github.com/ClosedXML/ClosedXML/blob/develop/LICENSE) - -MIT License - -Copyright (c) 2016 ClosedXML - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With resepct to CountryFlag -=========================== - -(https://www.codeproject.com/Articles/190722/WPF-CountryFlag-Control) - -The Code Project Open License (CPOL) 1.02 - -Copyright © 2017 Meshack Musundi - -Preamble - -This License governs Your use of the Work. This License is intended to allow -developers to use the Source Code and Executable Files provided as part of -the Work in any application in any form. - -The main points subject to the terms of the License are: - - Source Code and Executable Files can be used in commercial applications; - Source Code and Executable Files can be redistributed; and - Source Code can be modified to create derivative works. - No claim of suitability, guarantee, or any warranty whatsoever is provided. - The software is provided "as-is". - The Article(s) accompanying the Work may not be distributed or republished - without the Author's consent - -This License is entered between You, the individual or other entity reading or -otherwise making use of the Work licensed pursuant to this License and the -individual or other entity which offers the Work under the terms of this -License ("Author"). - -License - -THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS -CODE PROJECT OPEN LICENSE ("LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT -AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED -UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. - -BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HEREIN, YOU ACCEPT AND AGREE -TO BE BOUND BY THE TERMS OF THIS LICENSE. THE AUTHOR GRANTS YOU THE RIGHTS -CONTAINED HEREIN IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND -CONDITIONS. IF YOU DO NOT AGREE TO ACCEPT AND BE BOUND BY THE TERMS OF THIS -LICENSE, YOU CANNOT MAKE ANY USE OF THE WORK. - -Definitions. - "Articles" means, collectively, all articles written by Author which -describes how the Source Code and Executable Files for the Work may -be used by a user. - "Author" means the individual or entity that offers the Work under -the terms of this License. - "Derivative Work" means a work based upon the Work or upon the Work -and other pre-existing works. - "Executable Files" refer to the executables, binary files, -configuration and any required data files included in the Work. - "Publisher" means the provider of the website, magazine, CD-ROM, -DVD or other medium from or by which the Work is obtained by You. - "Source Code" refers to the collection of source code and -configuration files used to create the Executable Files. - "Standard Version" refers to such a Work if it has not been modified, -or has been modified in accordance with the consent of the Author, -such consent being in the full discretion of the Author. - "Work" refers to the collection of files distributed by the Publisher, -including the Source Code, Executable Files, binaries, data files, -documentation, whitepapers and the Articles. - "You" is you, an individual or entity wishing to use the Work and -exercise your rights under this License. - -Fair Use/Fair Use Rights. Nothing in this License is intended to reduce, -limit, or restrict any rights arising from fair use, fair dealing, -first sale or other limitations on the exclusive rights of the -copyright owner under copyright law or other applicable laws. - -License Grant. Subject to the terms and conditions of this License, the -Author hereby grants You a worldwide, royalty-free, non-exclusive, -perpetual (for the duration of the applicable copyright) license -to exercise the rights in the Work as stated below: - You may use the standard version of the Source Code or Executable -Files in Your own applications. - You may apply bug fixes, portability fixes and other modifications -obtained from the Public Domain or from the Author. A Work modified -in such a way shall still be considered the standard version and will -be subject to this License. - You may otherwise modify Your copy of this Work (excluding the Articles) -in any way to create a Derivative Work, provided that You insert a prominent -notice in each changed file stating how, when and where You changed that file. - You may distribute the standard version of the Executable Files and Source -Code or Derivative Work in aggregate with other (possibly commercial) -programs as part of a larger (possibly commercial) software distribution. - The Articles discussing the Work published in any form by the author may -not be distributed or republished without the Author's consent. The author -retains copyright to any such Articles. You may use the Executable Files and -Source Code pursuant to this License but you may not repost or republish or -otherwise distribute or make available the Articles, without the prior written -consent of the Author. - -Any subroutines or modules supplied by You and linked into the Source Code -or Executable Files of this Work shall not be considered part of this Work -and will not be subject to the terms of this License. - -Patent License. Subject to the terms and conditions of this License, each -Author hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, -royalty-free, irrevocable (except as stated in this section) patent license -to make, have made, use, import, and otherwise transfer the Work. - -Restrictions. The license granted in Section 3 above is expressly made subject -to and limited by the following restrictions: - You agree not to remove any of the original copyright, patent, trademark, -and attribution notices and associated disclaimers that may appear in the -Source Code or Executable Files. - You agree not to advertise or in any way imply that this Work is a product -of Your own. - The name of the Author may not be used to endorse or promote products -derived from the Work without the prior written consent of the Author. - You agree not to sell, lease, or rent any part of the Work. This does -not restrict you from including the Work or any part of the Work inside -a larger software distribution that itself is being sold. The Work by itself, -though, cannot be sold, leased or rented. - You may distribute the Executable Files and Source Code only under the terms -of this License, and You must include a copy of, or the Uniform Resource -Identifier for, this License with every copy of the Executable Files or -Source Code You distribute and ensure that anyone receiving such Executable -Files and Source Code agrees that the terms of this License apply to such -Executable Files and/or Source Code. You may not offer or impose any terms -on the Work that alter or restrict the terms of this License or the -recipients' exercise of the rights granted hereunder. You may not sublicense -the Work. You must keep intact all notices that refer to this License and to -the disclaimer of warranties. You may not distribute the Executable Files or -Source Code with any technological measures that control access or use of the -Work in a manner inconsistent with the terms of this License. - You agree not to use the Work for illegal, immoral or improper -purposes, or on pages containing illegal, immoral or improper material. -The Work is subject to applicable export laws. You agree to comply with all -such laws and regulations that may apply to the Work after Your receipt of -the Work. - -Representations, Warranties and Disclaimer. THIS WORK IS PROVIDED "AS IS", -"WHERE IS" AND "AS AVAILABLE", WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES OR -CONDITIONS OR GUARANTEES. YOU, THE USER, ASSUME ALL RISK IN ITS USE, -INCLUDING COPYRIGHT INFRINGEMENT, PATENT INFRINGEMENT, SUITABILITY, ETC. -AUTHOR EXPRESSLY DISCLAIMS ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES -OR CONDITIONS, INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS -OF MERCHANTABILITY, MERCHANTABLE QUALITY OR FITNESS FOR A PARTICULAR -PURPOSE, OR ANY WARRANTY OF TITLE OR NON-INFRINGEMENT, OR THAT THE WORK -(OR ANY PORTION THEREOF) IS CORRECT, USEFUL, BUG-FREE OR FREE OF VIRUSES. -YOU MUST PASS THIS DISCLAIMER ON WHENEVER YOU DISTRIBUTE THE WORK OR DERIVATIVE -WORKS. - -Indemnity. You agree to defend, indemnify and hold harmless the Author and the -Publisher from and against any claims, suits, losses, damages, liabilities, -costs, and expenses (including reasonable legal or attorneys’ fees) -resulting from or relating to any use of the Work by You. - -Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, -IN NO EVENT WILL THE AUTHOR OR THE PUBLISHER BE LIABLE TO YOU ON ANY LEGAL -THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY -DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK OR OTHERWISE, -EVEN IF THE AUTHOR OR THE PUBLISHER HAS BEEN ADVISED OF THE POSSIBILITY -OF SUCH DAMAGES. - -Termination. - This License and the rights granted hereunder will terminate -automatically upon any breach by You of any term of this License. -Individuals or entities who have received Derivative Works from You under -this License, however, will not have their licenses terminated provided such -individuals or entities remain in full compliance with those licenses. -Sections 1, 2, 6, 7, 8, 9, 10 and 11 will survive any termination of -this License. - If You bring a copyright, trademark, patent or any other infringement -claim against any contributor over infringements You claim are made by the -Work, your License from such contributor to the Work ends automatically. - Subject to the above terms and conditions, this License is perpetual -(for the duration of the applicable copyright in the Work). -Notwithstanding the above, the Author reserves the right to release the Work -under different license terms or to stop distributing the Work at any time; -provided, however that any such election will not serve to withdraw this -License (or any other license that has been, or is required to be, -granted under the terms of this License), and this License will continue -in full force and effect unless terminated as stated above. - -Publisher. The parties hereby confirm that the Publisher shall not, under -any circumstances, be responsible for and shall not have any liability -in respect of the subject matter of this License. The Publisher makes no -warranty whatsoever in connection with the Work and shall not be liable -to You or any party on any legal theory for any damages whatsoever, including -without limitation any general, special, incidental or consequential damages -arising in connection to this license. The Publisher reserves the right to -cease making the Work available to You at any time without notice - -Miscellaneous - This License shall be governed by the laws of the location of the head -office of the Author or if the Author is an individual, the laws of -location of the principal place of residence of the Author. - If any provision of this License is invalid or unenforceable under -applicable law, it shall not affect the validity or enforceability of the -remainder of the terms of this License, and without further action by the -parties to this License, such provision shall be reformed to the minimum -extent necessary to make such provision valid and enforceable. - No term or provision of this License shall be deemed waived and no -breach consented to unless such waiver or consent shall be in writing -and signed by the party to be charged with such waiver or consent. - This License constitutes the entire agreement between the parties -with respect to the Work licensed herein. There are no understandings, -agreements or representations with respect to the Work not specified herein. -The Author shall not be bound by any additional provisions that may appear -in any communication from You. This License may not be modified without -the mutual written agreement of the Author and You. - - -With respect to DocumentFormat.OpenXml -====================================== - -(https://github.com/OfficeDev/Open-XML-SDK/blob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) Microsoft Corporation - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With respect to ExcelNumberFormat -================================= - -(https://github.com/andersnm/ExcelNumberFormat/blob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2017 andersnm - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With respect to jose-jwt -======================== - -(https://github.com/dvsekhvalnov/jose-jwt/blob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2014-2019 dvsekhvalnov - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -With resepect to ExcelDataReader -================================ - -(https://github.com/ExcelDataReader/ExcelDataReader/blob/develop/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2014 ExcelDataReader - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With resepect to OPC UA Example Code -==================================== - - * Copyright (c) 2005-2019 The OPC Foundation, Inc. All rights reserved. - * - * OPC Foundation MIT License 1.00 - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - * The complete license agreement can be found here: - * http://opcfoundation.org/License/MIT/1.00/ - - -With respect to OPC Foundation -============================== - -RCL License -Reciprocal Community License 1.00 (RCL1.00) -Version 1.00, June 24, 2009 -Copyright (C) 2008,2009 OPC Foundation, Inc., All Rights Reserved. - -https://opcfoundation.org/license/rcl.html - -Remark: PHOENIX CONTACT GmbH & Co. KG and Festo SE & Co. KG are members -of OPC foundation. - -With respect to MSAGL (Microsoft Automatic Graph Layout) -======================================================== -(see: https://github.com/microsoft/automatic-graph-layout/blob/master/LICENSE) - -Microsoft Automatic Graph Layout, MSAGL - -Copyright (c) Microsoft Corporation - -All rights reserved. - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -""Software""), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -With respect to Glob (https://www.nuget.org/packages/Glob/) -=========================================================== -(see: https://raw.githubusercontent.com/kthompson/glob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2013-2019 Kevin Thompson - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -With respect to Magick.NET -========================== - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - 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. - -With respect to SSharp.NET library -================================== - - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - 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. diff --git a/src/AasxCsharpLibrary.Tests/Properties/AssemblyInfo.cs b/src/AasxCsharpLibrary.Tests/Properties/AssemblyInfo.cs deleted file mode 100644 index e76309e43..000000000 --- a/src/AasxCsharpLibrary.Tests/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// Allgemeine Informationen über eine Assembly werden über die folgenden -// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, -// die einer Assembly zugeordnet sind. -[assembly: AssemblyTitle("AasxCsharpLibrary.TestsNew")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("AasxCsharpLibrary.TestsNew")] -[assembly: AssemblyCopyright("Copyright © 2020")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly -// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von -// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen. -[assembly: ComVisible(false)] - -// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird -[assembly: Guid("2f21feff-f0ef-40b5-ba05-09fc9f499ae9")] - -// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: -// -// Hauptversion -// Nebenversion -// Buildnummer -// Revision -// -// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, -// indem Sie "*" wie unten gezeigt eingeben: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/AasxCsharpLibrary.Tests/TemporaryDirectory.cs b/src/AasxCsharpLibrary.Tests/TemporaryDirectory.cs deleted file mode 100644 index 94c002bf0..000000000 --- a/src/AasxCsharpLibrary.Tests/TemporaryDirectory.cs +++ /dev/null @@ -1,23 +0,0 @@ -using IDisposable = System.IDisposable; - -namespace AdminShellNS.Tests -{ - class TemporaryDirectory : IDisposable - { - public readonly string Path; - - public TemporaryDirectory() - { - this.Path = System.IO.Path.Combine( - System.IO.Path.GetTempPath(), - System.IO.Path.GetRandomFileName()); - - System.IO.Directory.CreateDirectory(this.Path); - } - - public void Dispose() - { - System.IO.Directory.Delete(this.Path, true); - } - } -} diff --git a/src/AasxCsharpLibrary.Tests/TestAdminShellUtil.cs b/src/AasxCsharpLibrary.Tests/TestAdminShellUtil.cs deleted file mode 100644 index b6ce2eac3..000000000 --- a/src/AasxCsharpLibrary.Tests/TestAdminShellUtil.cs +++ /dev/null @@ -1,28 +0,0 @@ -using NUnit.Framework; - -namespace AdminShellNS.Tests -{ - // ReSharper disable UnusedType.Global - public class Test_EvalToNonNullString - { - [Test] - public void NonNull_Gives_Formatted() - { - var result = AdminShellNS.AdminShellUtil.EvalToNonNullString( - "some message: {0}", 1984, "something else"); - - Assert.That(result, Is.EqualTo("some message: 1984")); - } - - [Test] - public void Null_Gives_ElseString() - { - var result = AdminShellNS.AdminShellUtil.EvalToNonNullString( - "some message: {0}", null, "something else"); - - Assert.That(result, Is.EqualTo("something else")); - } - } - // ReSharper restore UnusedType.Global - -} diff --git a/src/AasxCsharpLibrary.Tests/TestAgainstAasCorePackage.cs b/src/AasxCsharpLibrary.Tests/TestAgainstAasCorePackage.cs deleted file mode 100644 index dfe5fc069..000000000 --- a/src/AasxCsharpLibrary.Tests/TestAgainstAasCorePackage.cs +++ /dev/null @@ -1,85 +0,0 @@ -using System; -using System.IO; -using System.Linq; -using System.Text; -using NUnit.Framework; - -namespace AdminShellNS.Tests -{ - public class TestAgainstAasCorePackage - { - /** - * Retrieve the bytes of the valid XML file 01_Festo.aasx.xml from the - * test resources. - */ - private static byte[] Get01FestoAasxXmlBytes() - { - string pth = Path.Combine( - TestContext.CurrentContext.TestDirectory, - "TestResources\\AasxCsharpLibrary.Tests\\XmlValidation\\expectedOk\\" + - "01_Festo.aasx.xml"); - - if (!File.Exists(pth)) - { - throw new FileNotFoundException( - $"Could not find the XML file: {pth}"); - } - - return File.ReadAllBytes(pth); - } - - [Test] - public void TestThatSupplementaryMaterialIsLoaded() - { - var packaging = new AasCore.Aas3.Package.Packaging(); - using var tmpDir = new TemporaryDirectory(); - - var pth = System.IO.Path.Combine(tmpDir.Path, "dummy.aasx"); - - var supplUri = new Uri( - "/aasx-suppl/some-company/some-manual.pdf", - UriKind.Relative); - - var supplContent = Encoding.UTF8.GetBytes("some content"); - - // Create a package - { - using var pkg = packaging.Create(pth); - - var spec = pkg.MakeSpec( - pkg.PutPart( - new Uri("/aasx/some-company/data.xml", UriKind.Relative), - "text/xml", - Get01FestoAasxXmlBytes())); - - pkg.RelateSupplementaryToSpec( - pkg.PutPart( - supplUri, - "application/pdf", - supplContent), - spec); - - pkg.Flush(); - } - - // Load the AASX using AasxCsharpLibrary - { - using var package = new AdminShellPackageEnv(pth); - - Assert.IsTrue(package.IsOpen); - - var lst = package.GetListOfSupplementaryFiles(); - - Assert.AreEqual(1, lst.Count); - var suppl = lst.First(); - Assert.AreEqual(supplUri, suppl.Uri); - Assert.AreEqual( - Encoding.UTF8.GetString(supplContent), - Encoding.UTF8.GetString( - package.GetByteArrayFromUriOrLocalPackage( - suppl.Uri.ToString())) - ); - } - } - } -} \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestLoadSaveChain.cs b/src/AasxCsharpLibrary.Tests/TestLoadSaveChain.cs deleted file mode 100644 index 48b7b66a9..000000000 --- a/src/AasxCsharpLibrary.Tests/TestLoadSaveChain.cs +++ /dev/null @@ -1,189 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Environment = System.Environment; -using InvalidOperationException = System.InvalidOperationException; -using Path = System.IO.Path; - -namespace AdminShellNS.Tests -{ - static class SamplesAasxDir - { - public static List ListAasxPaths() - { - var variable = "SAMPLE_AASX_DIR"; - - var sampleAasxDir = System.Environment.GetEnvironmentVariable(variable); - if (sampleAasxDir == null) - { - throw new InvalidOperationException( - $"The environment variable {variable} has not been set. " + - "Did you set it manually to the directory containing sample AASXs? " + - "Otherwise, run the test through Test.ps1?"); - } - - if (!System.IO.Directory.Exists(sampleAasxDir)) - { - throw new InvalidOperationException( - $"The directory containing the sample AASXs does not exist or is not a directory: " + - $"{sampleAasxDir}; did you download the samples with DownloadSamples.ps1?"); - } - - var result = System.IO.Directory.GetFiles(sampleAasxDir) - .Where(p => System.IO.Path.GetExtension(p) == ".aasx") - .ToList(); - - result.Sort(); - - return result; - } - } - - /* - TODO (mristin, 2020-10-05): The class is unused since all its tests were disabled temporarily and - will be fixed in the near future. - - Once the tests are enabled, please remove this Resharper directive. - */ - // ReSharper disable once UnusedType.Global - public class TestLoadSaveChain - { - private static void AssertFilesEqual(string firstPath, string secondPath, string aasxPath) - { - string firstContent = System.IO.File.ReadAllText(firstPath); - string secondContent = System.IO.File.ReadAllText(secondPath); - - string[] firstLines = firstContent.Split( - new[] { "\r\n", "\r", "\n" }, - System.StringSplitOptions.None - ); - - string[] secondLines = secondContent.Split( - new[] { "\r\n", "\r", "\n" }, - System.StringSplitOptions.None - ); - - int min = (firstLines.Length < secondLines.Length) - ? firstLines.Length - : secondLines.Length; - - for (var i = 0; i < min; i++) - { - if (firstLines[i] != secondLines[i]) - { - int start = (i < 20) ? 0 : i - 20; - var sb = new System.Text.StringBuilder(); - sb.AppendLine("The first and the second export in the chain differ:"); - - for (var j = start; j < i; j++) - { - sb.AppendLine($"[{i,6}:SAME IN BOTH]{firstLines[j]}"); - } - - sb.AppendLine($"[{i,6}:IN FIRST ]{firstLines[i]}"); - sb.AppendLine($"[{i,6}:IN SECOND ]{secondLines[i]}"); - - sb.AppendLine($"The AASX sample used was: {aasxPath}"); - throw new AssertionException(sb.ToString()); - } - } - } - - /* - TODO (mristin, 2020-10-05): This test has been temporary disabled so that we can merge in the branch - MIHO/EnhanceDocumentShelf. The test should be fixed in a future pull request and we will then re-enable it - again. - - Please do not forget to remove the Resharper directive at the top of this class. - - [TestCase(".xml")] - - dead-csharp ignore this comment - */ - public void TestLoadSaveLoadAssertEqual(string extension) - { - List aasxPaths = SamplesAasxDir.ListAasxPaths(); - - using var tmpDir = new TemporaryDirectory(); - foreach (string aasxPath in aasxPaths) - { - /* - * The chain is as follows: - * - First load from AASX (package A) - * - Convert package 1 to `extension` format and save as path 1 - * - Load from the path 1 in `extension` format (package B) - * - Save package B in `extension` format to path 2 - * - * We expect the content of the two files (path 1 and path 2, respectively) to be equal. - */ - using var packageA = new AdminShellPackageEnv(aasxPath); - string path1 = System.IO.Path.Combine(tmpDir.Path, $"first{extension}"); - string path2 = System.IO.Path.Combine(tmpDir.Path, $"second{extension}"); - - packageA.SaveAs(path1, writeFreshly: true); - - using var packageB = new AdminShellPackageEnv(path1); - packageB.SaveAs(path2, writeFreshly: true); - AssertFilesEqual(path1, path2, aasxPath); - } - } - - - /* - TODO (mristin, 2020-10-05): This test has been temporary disabled so that we can merge in the branch - MIHO/EnhanceDocumentShelf. The test should be fixed in a future pull request and we will then re-enable it - again. - - Please do not forget to remove the Resharper directive at the top of this class. - - [Test] - - dead-csharp ignore this comment - */ - public void TestLoadSaveXmlValidate() - { - var validator = AasSchemaValidation.NewXmlValidator(); - - List aasxPaths = SamplesAasxDir.ListAasxPaths(); - - using var tmpDir = new TemporaryDirectory(); - string tmpDirPath = tmpDir.Path; - - foreach (string aasxPath in aasxPaths) - { - using var package = new AdminShellPackageEnv(aasxPath); - /* - TODO (mristin, 2020-09-17): Remove autofix once XSD and Aasx library in sync - - Package has been loaded, now we need to do an automatic check & fix. - - This is necessary as Aasx library is still not conform with the XSD AASX schema and breaks - certain constraints (*e.g.*, the cardinality of langString = 1..*). - */ - var recs = package.AasEnv.ValidateAll(); - if (recs != null) - { - package.AasEnv.AutoFix(recs); - } - - // Save as XML - string name = Path.GetFileName(aasxPath); - string outPath = System.IO.Path.Combine(tmpDirPath, $"{name}.converted.xml"); - package.SaveAs(outPath, writeFreshly: true); - - using var fileStream = System.IO.File.OpenRead(outPath); - var records = new AasValidationRecordList(); - validator.Validate(records, fileStream); - if (records.Count != 0) - { - var parts = new List - { - $"Failed to validate XML file exported from {aasxPath} to {outPath}:" - }; - parts.AddRange(records.Select((r) => r.Message)); - throw new AssertionException(string.Join(Environment.NewLine, parts)); - } - } - } - } -} diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/01_Festo.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/01_Festo.aasx.xml deleted file mode 100644 index ac57a24bd..000000000 --- a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/01_Festo.aasx.xml +++ /dev/null @@ -1,8384 +0,0 @@ - - - - - Festo_3S7PM0CP4BD - CONSTANT - smart.festo.com/demo/aas/1/1/454576463545648365874 - - - HTTP://PK.FESTO.COM/3S7PM0CP4BD - - - - - - www.company.com/ids/sm/4343_5072_7091_3242 - - - - - www.company.com/ids/sm/2543_5072_7091_2660 - - - - - www.company.com/ids/sm/6053_5072_7091_5102 - - - - - www.company.com/ids/sm/6563_5072_7091_4267 - - - - - smart.festo.com/demo/sm/instance/1/1/13B7CCD9BF7A3F24 - - - - - - - - - FPK_3s7plfdrs35 - - Festo OVEL Vacuum generator - Festo OVEL Vakuumsaugdüse - - HTTP://PK.FESTO.COM/3S7PM0CP4BD - Instance - - - - - Nameplate - www.company.com/ids/sm/4343_5072_7091_3242 - - - https://www.hsu-hh.de/aut/aas/nameplate - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Festo AG & Co. KG - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - OVEL Vacuum generator - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Ruiter Straße 82 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 73734 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Esslingen-Berkheim - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Baden-Württemberg - - - - false - false - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - OVEL-5-H-10-P-VQ4-UA-Z-C-A-V1PNLK-H3 - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - JO43 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - ProductCountryOfOrigin - PARAMETER - - - 0173-1#02-AAO841#001 - - - Instance - - string - DE - - - - - YearOfConstruction - PARAMETER - - - 0173-1#02-AAP906#001 - - - Instance - - integer - 2019 - - - - - Marking_CE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - 0173-1#07-CAA016#001 - - - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/marking_ce.png - - - - false - false - - - - - Marking_CRUUS - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CRUUSLabelingPresent - PARAMETER - - - 0173-1#02-AAR528#005 - - - Instance - - boolean - 1 - - - 0173-1#07-CAA016#001 - - - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/marking_cruus.jpg - - - - false - false - - - - - Marking_RCM - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - RCMLabelingPresent - PARAMETER - - - 0173-1#02-AAR528#005 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/marking_rcm.jpg - - - - false - false - - - - - - Document - www.company.com/ids/sm/2543_5072_7091_2660 - - - https://www.hsu-hh.de/aut/aas/document - - - Instance - - - - - DeclarationCEMarking - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Festo - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Festo AG & Co. KG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Erklärung zur CE-Kennzeichnung bei Produkten der Festo AG & Co.KG - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - CE_Kennzeichnung_2016_de.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/CE_Kennzeichnung_2016_de.pdf - - - - false - false - - - - - DeclarationRoHS - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Festo - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Festo AG & Co. KG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - RoHS 2011/65/EU und delegierte Fassung (EU) 2015/863 - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - RoHS_2011_65_EU_Konzern_Information_de.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/RoHS_2011_65_EU_Konzern_Information_de.pdf - - - - false - false - - - - - DeclarationCRUUS - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - UL - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Underwriter Laboratories LLC - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Certificate of compliance - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - SPAE_UL_4531318_-_2_EN.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/SPAE_UL_4531318_-_2_EN.pdf - - - - false - false - - - - - DeclarationIOLink - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Festo - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Festo AG & Co. KG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Manufacturer's declaration of conformity - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - OVEL_IO_Link_5439356_-_3_EN.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/OVEL_IO_Link_5439356_-_3_EN.pdf - - - - false - false - - - - - Manual_OVEL_EN - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - 8070874 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Festo - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Festo AG & Co. KG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - 2017-05 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Operating instructions Vacuum generator OVEL - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - The OVEL vacuum generator is used to generate a vacuum. - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - OVEL_2017-05_8070876g1_EN.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/OVEL_2017-05_8070876g1_EN.pdf - - - - false - false - - - - - Manual_OVEL_DE - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - 8070874 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Festo - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Festo AG & Co. KG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - 2017-05 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Bedienungsanleitung Vakuumsaugdüse OVEL - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - Die Vakuumsaugdüse OVEL wird bestimmungsgemäß zur Erzeugung von Vakuum eingesetzt. - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - OVEL_2017-05_8070875d1_DE.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/OVEL_2017-05_8070875d1_DE.pdf - - - - false - false - - - - - Manual_SPAE_EN - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - 8058480 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Festo - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Festo AG & Co. KG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - 2017-03b - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Operating instructions Pressure sensor SPAE - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - The SPAE pressure sensor is intended for measuring the relative pressure in pneumatic applications. The SPAE converts pneumatic pressure values into a pressure proportional voltage. The measurement result is shown on the display. - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - SPAE_2017-03b_8058481d1_EN.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/SPAE_2017-03b_8058481d1_EN.pdf - - - - false - false - - - - - Manual_SPAE_DE - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - 8058480 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Festo - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Festo AG & Co. KG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - 2017-03b - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Bedienungsanleitung Drucksensor SPAE - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - Der Drucksensor SPAE dient bestimmungsgemäß zur Erfassung des Relativdrucks in Pneumatikapplikationen. Der SPAE wandelt pneumatische Druckwerte in eine druckproportionale Spannung. Das Messergebnis wird im Display angezeigt. - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - SPAE_2017-03b_8058481d1_DE.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/SPAE_2017-03b_8058481d1_DE.pdf - - - - false - false - - - - - ApplicationNote_SPAE_EN - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Festo - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Festo AG & Co. KG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - 1.10 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Application Note IO-Link parameter description - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - A brief explanation of the contents (identification, parameter and commands, block parameterization, teach-In, process data, using different pressure units, diagnosis) - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - 09.02.2015 - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - SPAE_100017_ApplNote.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/SPAE_100017_ApplNote.pdf - - - - false - false - - - - - - Service - www.company.com/ids/sm/6053_5072_7091_5102 - - - https://www.hsu-hh.de/aut/aas/service - - - Instance - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Festo AG & Co. KG - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Ruiter Straße 82 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 73734 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Esslingen-Berkheim - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Baden-Württemberg - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - technikservice@festo.com - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - string - https://www.festo.com - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +49711347-3000 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - +49711 347-2190 - - - - false - false - - - - - - Identification - www.company.com/ids/sm/6563_5072_7091_4267 - - - https://www.hsu-hh.de/aut/aas/identification - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Festo AG & Co. KG - - - - - GLNOfManufacturer - PARAMETER - - - 0173-1#02-AAY812#001 - - - Instance - - string - 2220000020640 - - - - - SupplierOfTheIdentifier - - - 0173-1#02-AAP796#004 - - - Instance - - - - - - - - MAN_PROD_NUM - - - 0173-1#02-AAO676#003 - - - Instance - - - - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - OVEL Vacuum generator - - - - - ManufacturerProductDescription - PARAMETER - - - 0173-1#02-AAU734#001 - - - Instance - - langString - Compact vacuum generator with IO-Link sensor - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Festo AG & Co. KG - - - - - GLNOfSupplier - PARAMETER - - - 0173-1#02-AAY813#001 - - - Instance - - string - 2220000020640 - - - - - SupplierIdProvider - PARAMETER - - - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - Instance - - - - - - - - SUP_PROD_NUM - PARAMETER - - - 0173-1#02-AAO736#004 - - - Instance - - - - - - - - SupplierProductDesignation - - - 0173-1#02-AAM551#002 - - - Instance - - string - OVEL Vacuum generator - - - - - SupplierProductDescription - PARAMETER - - - 0173-1#02-AAU730#001 - - - Instance - - langString - Compact vacuum generator with IO-Link sensor - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - string - OVEL-5-H-10-P-VQ4-UA-Z-C-A-V1PNLK-H3 - - - - - ClassificationSystem - PARAMETER - - - 0173-1#02-AAO715#002 - - - Instance - - string - eclass - - - - - SecondaryKeyTyp - - - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - Instance - - - - - - - - TypThumbnail - PARAMETER - - - https://www.hsu-hh.de/aut/aas/thumbnail - - - Instance - - image/jpeg - /Festo_OVEL_product_rendering.png - - - - - AssetId - PARAMETER - - - https://www.hsu-hh.de/aut/aas/assetid - - - Instance - - anyURI - HTTP://PK.FESTO.COM/3S7PM0CP4BD - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - smart.festo.com/demo/aas/1/1/454576463545648365874 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - SecondaryKeyInstance - PARAMETER - - - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - Instance - - - - - - - - DateOfManufacture - PARAMETER - - - 0173-1#02-AAR972#002 - - - Instance - - date - - - - - - DeviceRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/devicerevision - - - Instance - - - - - - - - SoftwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/softwarerevision - - - Instance - - - - - - - - HardwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - Instance - - - - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Festo AG & Co. KG - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - langString - Ruiter Straße 82 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 73734 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Esslingen-Berkheim - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Baden-Württemberg - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - technikservice@festo.com - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.festo.com - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +49711347-3000 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - +49711 347-2190 - - - - false - false - - - - - CompanyLogo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/companylogo - - - Instance - - image/png - /aasx/assetIdentification/logo.png - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://pk.festo.com/3s7plfdrs35 - - - - - - DeviceDescriptionFiles - smart.festo.com/demo/sm/instance/1/1/13B7CCD9BF7A3F24 - - - http://admin-shell/sample/submodel/type/device-description-files - - - Instance - - - - - IODD - - - http://admin-shell.io/sample/conceptdescriptions/437857438753457473 - - - Instance - - application/general - /aasx/Software/Festo-SPAE-kPa-20171025-IODD1.1.zip - - - - - - - - ManufacturerName - 0173-1#02-AAO677#002 - - - - - - - - Herstellername - Manufacturer Name - - Manufacturer Name - - - - - Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist - 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 - - - - - - - GLNOfManufacturer - 0173-1#02-AAY812#001 - - - - - - - - GLN of manufacturer - GLN des Herstellers - - GLN of manufacturer - - - - - international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort - internationally unique identification number for the manufacturer of the device or the product and for the physical location - - - - - - - SupplierOfTheIdentifier - 0173-1#02-AAP796#004 - - - - - - - - Supplier of the identifier - Anbieter der Identifikationsnummer für Hersteller - - Supplier of the identifier - - - STRING_TRANSLATABLE - - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - - - - - - - MAN_PROD_NUM - - product article number of manufacturer - - 0173-1#02-AAO676#003 - - - - - - - - product article number of manufacturer - Herstellerartikelnummer - - MAN_PROD_NUM - - - STRING_TRANSLATABLE - - eindeutiger Bestellschlüssel des Herstellers - unique product identifier of the manufacturer - - - - - - - ManufacturerProductDesignation - 0173-1#02-AAW338#001 - - - - - - - - Manufacturer product designation - Herstellerproduktbezeichnung - - ManufacturerTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - ManufacturerProductDescription - 0173-1#02-AAU734#001 - - - - - - - - Manufacturer product description - Herstellerproduktbeschreibung - - Manufacturer product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - NameOfSupplier - 0173-1#02-AAO735#003 - - - - - - - - - - - - name of supplier - Lieferantenname - - name of supplier - - - - - Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt - name of supplier which provides the customer with a product or a service - - - - - - - GLNOfSupplier - 0173-1#02-AAY813#001 - - - - - - - - GLN of supplier - GLN des Lieferanten - - GLN of supplier - - - - - international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort - internationally unique identification number for the supplier of the device or the product and for the physical location - - - - - - - SupplierIdProvider - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - - - - - - SupplierIdProvider - Anbieter der Identifikationsnummer - - SupplierIdProvider - - - STRING_TRANSLATABLE - - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - - - - - - - SUP_PROD_NUM - 0173-1#02-AAO736#004 - - - - - - - - product article number of supplier - Lieferantenartikelnummer - - product article number of supplier - - - - - eindeutiger Bestellschlüssel des Lieferanten - unique product order identifier of the supplier - - - - - - - SupplierProductDesignation - 0173-1#02-AAM551#002 - - - - - - - - Supplier product designation - Lieferantenproduktbezeichnung - - SupplierTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - SupplierProductDescription - 0173-1#02-AAU730#001 - - - - - - - - Supplier product description - Lieferantenproduktbeschreibung - - Supplier product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - ManufacturerProductFamily - 0173-1#02-AAU731#001 - - - - - - - - Manufacturer product family - Herstellerproduktfamilie - - TypClass - - - - - 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie - 2nd level of a 3 level manufacturer specific product hierarchy - - - - - - - ClassificationSystem - 0173-1#02-AAO715#002 - - - - - - - - classification system - Klassifizierungssystem - - ClassificationSystem - - - - - Klassifizierungssystem - Classification System - - - - - - - SecondaryKeyTyp - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - - - - - - SecondaryKeyTyp - Typnummer des IT Systems - - SecondaryKeyTyp - - - - - Führende technische ID im IT System des Typs - SecondaryKeyTyp - - - - - - - TypThumbnail - https://www.hsu-hh.de/aut/aas/thumbnail - - - - - - - - TypThumbnail - Vorschaubild - - TypThumbnail - - - - - Darstellung des Produkttyps in kleinem Format - Small picture of the product type - - - - - - - AssetId - https://www.hsu-hh.de/aut/aas/assetid - - - - - - - - AssetId - Asset ID - - AssetId - - - - - Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. - Global unique ID of an asset, which can be read by both human and machine. - - - - - - - SerialNumber - 0173-1#02-AAM556#002 - - - - - - - - Serial number - Seriennummer - - InstanceId - - - - - eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist - unique combination of numbers and letters used to identify the device once it has been manufactured - - - - - - - BatchNumber - 0173-1#02-AAQ196#001 - - - - - - - - Batch number - Chargen-Nummer - - ChargeId - - - - - Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge - Number assigned by the manufacturer of a material to identify the manufacturer's batch - - - - - - - SecondaryKeyInstance - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - - - - - - SecondaryKeyInstance - Instanznummer des IT Systems - - SecondaryKeyInstance - - - - - Führende technische ID im IT System der Instanz - SecondaryKeyInstance - - - - - - - DateOfManufacture - 0173-1#02-AAR972#002 - - - - - - - - Date of manufacture - Herstellungsdatum - - Date of manufacture - - - DATE - - Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist - Date from which the production and / or development process is completed or from which a service is provided completely - - - - - - - DeviceRevision - https://www.hsu-hh.de/aut/aas/devicerevision - - - - - - - - DeviceRevision - DeviceRevision - - DeviceRevision - - - - - DeviceRevision - DeviceRevision - - - - - - - SoftwareRevision - https://www.hsu-hh.de/aut/aas/softwarerevision - - - - - - - - SoftwareRevision - SoftwareRevision - - SoftwareRevision - - - - - SoftwareRevision - SoftwareRevision - - - - - - - HardwareRevision - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - - - - - - HardwareRevision - HardwareRevision - - HardwareRevision - - - - - HardwareRevision - HardwareRevision - - - - - - - QrCode - https://www.hsu-hh.de/aut/aas/qrcode - - - - - - - - QrCode - QrCode - - QrCode - - - - - In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. - QrCode - - - - - - - OrganisationContactInfo - https://www.hsu-hh.de/aut/aas/contactinfo - - - - - - - - Contact Info - Kontakt Info - - OrganisationContactInfo - - - - - Sammlung für die allgemeinen Kontaktdaten - Collection for general contact data - - - - - - - PhysicalAddress - https://www.hsu-hh.de/aut/aas/physicaladdress - - - - - - - - PhysicalAddress - Physische Adresse - - PhysicalAddress - - - - - Sammlung für reale physische Adresse - Collection for real physical address - - - - - - - CountryCode - 0173-1#02-AAO730#001 - - - - - - - - - - - - Landeskennung - Country code - - Country code - - - - - Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes - agreed upon symbol for unambiguous identification of a country - - - - - - - Street - 0173-1#02-AAO128#001 - - - - - - - - Strasse - Street - - Street - - - - - Name der Strasse und Hausnummer - Street name and house number - - - - - - - Zip - 0173-1#02-AAO129#002 - - - - - - - - Zip - Postleitzahl - - PostalCode - - - - - ZIP code of address - Postleitzahl der Anschrift - - - - - - - CityTown - 0173-1#02-AAO132#001 - - - - - - - - Ort - City/town - - City/town - - - - - Town or city of the company - Ortsangabe - - - - - - - StateCounty - 0173-1#02-AAO133#002 - - - - - - - - state/county - Bundesland - - StateCounty - - - - - Bundesland - state/county - - - - - - - Email - https://www.hsu-hh.de/aut/aas/email - - - - - - - - Emailadresse - Email address - - Email - - - - - Emailadresse - Email address - - - - - - - TelephoneContact - https://www.hsu-hh.de/aut/aas/ContactInfo/TelephoneContact - - - - - - - - Telephone Contact - Telefonkontakt - - TelephoneContact - - - - - Sammlung für Kontaktdaten über Telefon - Collection for contact data via telephone - - - - - - - PhoneNumber - 0173-1#02-AAO136#002 - - - - - - - - Telefonnummer - telephone number - - Phone - - - - - vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist - complete telephone number to be called to reach a business partner - - - - - - - CompanyLogo - https://www.hsu-hh.de/aut/aas/companylogo - - - - - - - - Firmenlogo - CompanyLogo - - CompanyLogo - - - - - Firmenlogo - CompanyLogo - - - - - - - URL - 0173-1#02-AAO694#001 - - - - - - - - Internetadresse - Internet address - - URL - - - - - stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html - Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html - - - - - - - ProductCountryOfOrigin - 0173-1#02-AAO841#001 - - - - - - - - Produkt Ursprungsland - Product country of origin - - CountryOfOrigin - - - - - Land in dem das Produkt hergestellt wurde (Hersteller Land) - Country in which the product is manufactured (manufacturer country) - - - - - - - YearOfConstruction - 0173-1#02-AAP906#001 - - - - - - - - Year of construction - Baujahr - - YearOfConstruction - - - - - Jahreszahl als Datumsangabe für die Fertigstellung des Objektes - Year as completion date of object - - - - - - - File - 0173-1#02-AAD005#008 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Enthaltene Doku. Datei - Embedded Doc. file - - File - - - - - Verweis/ BLOB auf enthaltene Dokumentations-Datei. - Reference/ BLOB to embedded documentation file. - - - - - - - ProductMarking - https://www.hsu-hh.de/aut/aas/productmarking - - - - - - - - Produktkennzeichnung - Product Marking - - ProductMarking - - - - - Sammlungsdatei für Produktkennzeichnung - Collection file for product marking - - - - - - - CEQualificationPresent - 0173-1#02-BAF053#008 - - - - - - - - CE-Kennzeichnung vorhanden - CE- qualification present - - CEMarkingPresent - - - BOOLEAN - - whether CE- qualification is present - Angabe, ob CE-Kennzeichnung vorhanden ist - - - - - - - CRUUSLabelingPresent - 0173-1#02-AAR528#005 - - - - - - - - Kennzeichnung (RCM) vorhanden - RCM labeling present - - CRUUSLabelingPresent - - - BOOLEAN - - indication whether the product is equipped with a specified RCM labeling - Angabe, ob das Produkt mit einer spezifizierten RCM-Kennzeichnung ausgestattet ist - - - - - - - DocumentClassification_ClassId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - - - - Dokumentkategorie - Document category - - DocCategory - - - - - Dokumentkategorie nach VDI 2770:2018/10 - Document category after VDI 2770:2018/10 - - - - - - - DocumentId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - - - - - - DocumentId - Dokumenten-Nummer - - DocumentId - - - - - Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. - TBD - - - - - - - VDI2770_DomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - - - - - - Domain-Nummer - DomainId - - DomainId - - - - - Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. - TBD - - - - - - - VDI2770_IdType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - - - - - - Nummerntyp - IdType - - IdType - - - - - Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. - TBD - - - - - - - ValString - www.company.com/ids/cd/4490_8182_7091_6124 - - - - - - - - Wert - Value String - - ValString - - - - - Ausdruck für den Wert der übergeordneten Collection. - Value string for the collection value on the next superordinate level - - - - - - - DocumentationItem - 0173-1#02-AAD001#001 - - - - - - - - Dokumentationsgruppe - Documentation item - - DocumentationItem - - - - - Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. - Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. - - - - - - - DocumentIdDomain - www.company.com/ids/cd/6003_8182_7091_9350 - - - - - - - - DocumentIdDomain - DocumentIdDomain - - DocumentIdDomain - - - - - Angabe einer Liste von Domänen, in de-nen die DocumentIds des Dokuments eindeutig sind - TBD - - - - - - - DocumentDomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - - - - - - DocumentDomainId - DocumentDomainId - - DocumentDomainId - - - - - Kennung oder Kennzeichen einer Domäne - TBD - - - - - - - VDI2770_Party - www.company.com/ids/cd/3153_8182_7091_4327 - - - - - - - - Party - Party - - Party - - - - - Verweis auf eine Party (siehe VDI 2770 Anhang C1.17), die für diese Domäne verantwortlich ist - TBD - - - - - - - VDI2770_Role - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - - - - - - Rolle - Role - - Role - - - - - Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) - TBD - - - - - - - VDI2770_Organisation - www.company.com/ids/cd/9214_8182_7091_6391 - - - - - - - - Organisation - Organisation - - Organisation - - - - - Angabe einer Organisation - TBD - - - - - - - VDI2770_OrganisationId - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - - - - - - Organisation ID - Organisation ID - - OrganisationId - - - - - eindeutige ID für die Organisation - TBD - - - - - - - VDI2770_OrganisationName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - - - - - - OrganisationName - OrganisationName - - OrganisationName - - - - - gebräuchliche Bezeichnung für die Organisation - TBD - - - - - - - VDI2770_OrganisationOfficialName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - - - - - - Offizieller Name der Organisation - Organisation Official Name - - OrganisationOfficialName - - - - - offizieller Name der Organisation - TBD - - - - - - - DocumentPartId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - - - - - - Dokumenten-Teilnummer - DocumentPartId - - DocumentPartId - - - - - Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. - TBD - - - - - - - VDI2770_Description - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - - - - - - Beschreibung - Description - - Description - - - - - Beschreibung für die nächste übergeordnete Collection - TBD - - - - - - - VDI2770_ClassName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - - - - - - Klassenname - Class Name - - ClassName - - - - - Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. - TBD - - - - - - - DocumentVersion_LanguageCode - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - - - - - - Sprachenschlüssel - LanguageCode - - LanguageCode - - - - - Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 - TBD - - - - - - - VDI2770_ClassificationSystem - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - - - - - - Klassifizierungssystem - classification system - - ClassificationSystem - - - - - Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. - TBD - - - - - - - DocumentVersion - www.company.com/ids/cd/2580_0282_7091_6213 - - - - - - - - Dokumenten-Version - DocumentVersion - - DocumentVersion - - - - - Zu jedem Dokument muss eine Menge von mindestens einer Dokumentenversion existieren. Es können auch mehrere Dokumentenversionen ausgeliefert werden. - TBD - - - - - - - DocumentVersionId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - - - - - - Dokumenten-Versionsnummer - DocumentVersionId - - DocumentVersionId - - - - - Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. - TBD - - - - - - - VDI2770_Language - www.company.com/ids/cd/0231_0282_7091_5062 - - - - - - - - Sprache - Language - - Language - - - - - Liste der im Dokument verwendeten Sprachen - TBD - - - - - - - DocumentVersion_Description - www.company.com/ids/cd/9151_0282_7091_8032 - - - - - - - - Beschreibung zur DocumentVersion - DocumentVersion Description - - DocumentVersion_Description - - - - - Zusammenfassende Beschreibungen zur Dokumentenversion in ggf. unterschiedlichen Sprachen. - TBD - - - - - - - VDI2770_Title - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - - - - - - Titel - Title - - VDI2770_Title - - - - - sprachabhängiger Titel des Dokuments - TBD - - - - - - - VDI2770_Summary - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - - - - - - Zusammenfassung - Summary - - Summary - - - - - sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts - TBD - - - - - - - VDI2770_Keywords - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - - - - - - Schlagwörter - Keywords - - Keywords - - - - - sprachabhängige, durch Komma getrennte Liste von Schlagwörtern - TBD - - - - - - - VDI2770_LifeCycleStatus - www.company.com/ids/cd/0282_0282_7091_7878 - - - - - - - - Lebenszyklus Status - LifeCycleStatus - - LifeCycleStatus - - - - - Liste von Statusdefinitionen mit Bezug zum Dokumentenlebenszyklus inklusive der Angabe der Beteiligten und einem zugehörigen Zeitstempel - TBD - - - - - - - VDI2770_StatusValue - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - - - - - - Statuswert - StatusValue - - StatusValue - - - - - Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) - TBD - - - - - - - VDI2770_SetDate - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - - - - - - Erstellungsdatum - Set Date - - SetDate - - - - - Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). - TBD - - - - - - - VDI2770_Purpose - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - - - - - - Zweck - Purpose - - Purpose - - - - - Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. - TBD - - - - - - - VDI2770_BasedOnProcedure - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - - - - - - Prozedur - Procedure - - BasedOnProcedure - - - - - textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt - TBD - - - - - - - VDI2770_Comments - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - - - - - - Kommentar - Comments - - Comments - - - - - textuelle Bemerkungen und Anmerkungen zum Status - TBD - - - - - - - DocumentRelationship - www.company.com/ids/cd/1204_0282_7091_7896 - - - - - - - - Dokumenten-Beziehung - Document Relationship - - DocumentRelationship - - - - - Liste von Beziehungen zu anderen Dokumenten. Es ist möglich, auf einen Dokument, ein Dokument in einer spezifischen Dokumentenversion oder auch ein Teildokument zu verweisen. - TBD - - - - - - - DocumentRelationship_Type - www.company.com/ids/cd/5044_0282_7091_6924 - - - - - - - - Typ der Dokumenten-Beziehung - DocumentRelationship_Type - - DocumentRelationship_Type - - - - - Typisierung der Beziehung zwischen den beiden DocumentVersions. Folgende Beziehungsarten können verwendet werden: Affecting (hat Auswirkungen auf), ReferesTo (bezieht sich auf), BasedOn (basiert auf) - TBD - - - - - - - StoredDocumentRepresentation - www.company.com/ids/cd/3094_0282_7091_2090 - - - - - - - - StoredDocumentRepresentation - StoredDocumentRepresentation - - StoredDocumentRepresentation - - - - - Liste von digitalen Repräsentationen zur DocumentVersion - TBD - - - - - - - VDI2770_DigitalFile - www.company.com/ids/cd/2305_0282_7091_2077 - - - - - - - - Digitaler-File - DigitalFile - - DigitalFile - - - - - Datei, die die DocumentVersion (siehe VDI 2770:2018 Anhang C1.5) repräsentiert Neben der obligatorischen PDF/A-Datei können weitere Dateien angegeben werden. - TBD - - - - - - - VDI2770_FileId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - - - - - - ID der Datei - File ID - - FileId - - - - - eindeutige ID für die Datei - TBD - - - - - - - VDI2770_FileName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - - - - - - Dateiname - File name - - FileName - - - - - Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. - TBD - - - - - - - VDI2770_FileFormat - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - - - - - - Datei Format - File format - - FileFormat - - - - - Angabe eines Media Typs gemäß der Liste der IANA - TBD - - - - - - - DocumentType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - - - - - - Dokumententyp - Document Type - - DocumentType - - - - - Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) - TBD - - - - - - - VDI2770_ReferencedObject - www.company.com/ids/cd/2570_2282_7091_0055 - - - - - - - - ReferencedObject - ReferencedObject - - ReferencedObject - - - - - Liste von IDs für ein Objekt, auf das sich das Dokument bezieht - TBD - - - - - - - VDI2770_ReferencedObject_Type - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - - - - - - Typ - Type - - Type - - - - - Für Type des Objekts muss immer Product angegeben werden. - TBD - - - - - - - VDI2770_ReferencedObject_RefType - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - - - - - - RefType - RefType - - RefType - - - - - Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) - TBD - - - - - - - VDI2770_ReferencedObject_ObjectId - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - - - - - - ObjectId - ObjectId - - ObjectId - - - - - Angabe der Identifikationsnummer zum Objekt - TBD - - - - - - - ContactInfo_Role - https://www.hsu-hh.de/aut/aas/role - - - - - - - - Rolle - Role - - Role - - - - - Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt - Information to specify the role which the organisation of ContactInfo plays - - - - - - - Fax - https://www.hsu-hh.de/aut/aas/fax - - - - - - - - Fax - Fax - - Fax - - - - - Faxnummer - Fax number - - - - - - - 0173-1#02-AAO136#002 - - - - - DocGroup_01 - www.company.com/ids/cd/1420_0113_7091_0891 - - - - - - - - 01 Identifikation - 01 Identification - - DocGroup_01 - - - - - Der Gruppe „Identifikation“ werden alle Dokumente zugeordnet, die der Identifikation des Objekts dienen, zu dem die Herstellerdokumentation gehört. Sie enthält insbesondere Informationen, die die elektronische Datenverarbeitung unterstützen und die es dem Hersteller und dem Nutzer erlauben, das Objekt in ihren jeweiligen elektronischen Datenverarbeitungssystemen zu identifizieren. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocGroup_02 - www.company.com/ids/cd/4323_0113_7091_2591 - - - - - - - - 02 Technische Beschaffenheit - 02 Technical characteristics - - DocGroup_02 - - - - - Die Gruppe „Technische Beschaffenheit“ beinhaltet alle Dokumente, die die technischen Anforderungen, deren Erfüllung und die Bescheinigung der Eigenschaften eines Objekts betreffen. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocGroup_03 - www.company.com/ids/cd/5053_0113_7091_5741 - - - - - - - - 03 Tätigkeitsbezogene Dokumente - 03 Work-related documents - - DocGroup_03 - - - - - Die Gruppe „Tätigkeitsbezogene Dokumente“ beinhaltet alle Dokumente, die Anforderungen, Hinweise und Hilfestellungen für Tätigkeiten an und mit dem Objekt nach der Übergabe an den Nutzer betreffen. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocGroup_04 - www.company.com/ids/cd/5473_0113_7091_1588 - - - - - - - - 04 Vertragsunterlagen - 04 Contract documents - - DocGroup_04 - - - - - Der Gruppe „Vertragsunterlagen“ werden alle Dokumente zugeordnet, die im Zusammenhang mit der kaufmännischen Abwicklung eines Vertrages stehen, aber nicht selbst Gegenstand des Vertrags sind und lediglich zur Erfüllung des Vertrags dienen. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_01-01 - www.company.com/ids/cd/9593_0113_7091_2401 - - - - - - - - 01-01 Identifikation - 01-01 Identification - - DocCategory_01-01 - - - - - Der Kategorie „Identifikation“ werden alle Dokumente zugeordnet, die der Identifikation des Objekts dienen, zu dem die Herstellerdokumentation gehört. Sie enthält insbesondere Informationen, die die elektronische Datenverarbeitung unterstützen und die es dem Hersteller und dem Nutzer erlauben, das Objekt in ihren jeweiligen elektronischen Datenverarbeitungssystemen zu identifizieren. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_02-01 - www.company.com/ids/cd/5314_0113_7091_8640 - - - - - - - - 02-01 Techn. Spezifikation - 02-01 Technical specification - - DocCategory_02-01 - - - - - Der Kategorie „Technische Spezifikation“ werden alle Dokumente zugeordnet, die die Anforderungen an ein Objekt sowie dessen Eigenschaften beschreiben. Dazu gehören die Auslegungsdaten, Berechnungen (Verfahrenstechnik, Festigkeit usw.) sowie alle relevanten Eigenschaften des übergebenen Objekts. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_02-02 - www.company.com/ids/cd/5515_0113_7091_8581 - - - - - - - - 02-02 Zeichnungen, Pläne - 02-02 Drawings and diagrams - - DocCategory_02-02 - - - - - Der Kategorie „Zeichnungen, Pläne“ werden alle Dokumente zugeordnet, die Zeichnungscharakter haben, das heißt eine grafische Darstellung zur Übermittlung von Information nutzen. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_02-03 - www.company.com/ids/cd/0335_0113_7091_0312 - - - - - - - - 02-03 Bauteile - 02-03 Components - - DocCategory_02-03 - - - - - Der Kategorie „Bauteile“ werden alle Dokumente zugeordnet, die eine strukturierte Auflistung der Teile eines Objekts beinhalten. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_02-04 - www.company.com/ids/cd/2155_0113_7091_3955 - - - - - - - - 02-04 Zeugnisse, Zertifikate, Bescheinigungen - 02-04 Reports, Certificates, declarations - - DocCategory_02-04 - - - - - Der Kategorie „Zeugnisse, Zertifikate, Bescheinigungen“ werden alle Dokumente zugeordnet, die Urkundencharakter haben. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_03-01 - www.company.com/ids/cd/3565_0113_7091_2704 - - - - - - - - 03-01 Montage, Inbetriebnahme, Demontage - 03-01 Assembly, commissioning, disassembly - - DocCategory_03-01 - - - - - Der Kategorie „Montage, Demontage“ werden alle Dokumente zugeordnet, die Tätigkeiten und Maßnahmen beschreiben, die erforderlich sind, um ein Objekt: zu transportieren oder zu lagern, als Ganzes in ein übergeordnetes Objekt einzubauen, auszubauen oder an dieses anzuschließen, so weit vorzubereiten, dass es zur Inbetriebnahme bereitsteht, nach Abschluss der Nutzungsphase zu demontieren und zu entsorgen - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_03-02 - www.company.com/ids/cd/4290_1113_7091_7266 - - - - - - - - 03-02 Bedienung - 03-02 Operation - - DocCategory_03-02 - - - - - Der Kategorie „Bedienung“ werden Dokumente zur bestimmungsgemäßen Verwendung und sicheren Bedienung eines Objekts zugeordnet. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_03-03 - www.company.com/ids/cd/2211_1113_7091_3911 - - - - - - - - 03-03 Allgemeine Sicherheit - 03-03 Safety in general - - DocCategory_03-03 - - - - - Der Kategorie „Allgemeine Sicherheit“ werden Dokumente zugeordnet, die Sicherheitshinweise auf mögliche Gefährdungen bei der Verwendung des Objekts geben. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_03-04 - www.company.com/ids/cd/7521_1113_7091_4471 - - - - - - - - 03-04 Inspektion, Wartung, Prüfung - 03-04 Inspection, maintenance, test - - DocCategory_03-04 - - - - - Der Kategorie „Inspektion, Wartung, Prüfung“ werden alle Dokumente zugeordnet, die vom Hersteller vorgeschlagene wiederkehrende Maßnahmen zur Feststellung oder zum Erhalt des funktionsfähigen Zustands beschreiben. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_03-05 - www.company.com/ids/cd/5161_1113_7091_0458 - - - - - - - - 03-05 Instandsetzung - 03-05 Repair - - DocCategory_03-05 - - - - - Der Kategorie „Instandsetzung“ werden alle Dokumente zugeordnet, die Maßnahmen zur Wiederherstellung der Funktion eines Objekts betreffen. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_03-06 - www.company.com/ids/cd/2181_1113_7091_5948 - - - - - - - - 03-06 Ersatzteile - 03-06 Spare parts - - DocCategory_03-06 - - - - - Der Kategorie „Ersatzteile“ werden Dokumente zugeordnet, die Informationen zu Ersatzteilen und Hilfs- und Betriebsstoffen enthalten. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_04-01 - www.company.com/ids/cd/5391_1113_7091_8996 - - - - - - - - 04-01 Vertragsunterlagen - 04-01 Contract documents - - DocCategory_04-01 - - - - - Der Kategorie „Vertragsunterlagen“ werden alle Dokumente zugeordnet, die im Zusammenhang mit der kaufmännischen Abwicklung eines Vertrages stehen, aber nicht selbst Gegenstand des Vertrags sind und lediglich zur Erfüllung des Vertrags dienen. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/02_Bosch.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/02_Bosch.aasx.xml deleted file mode 100644 index 43b134291..000000000 --- a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/02_Bosch.aasx.xml +++ /dev/null @@ -1,6811 +0,0 @@ - - - - - Bosch_NexoPistolGripNutrunner - http://boschrexroth.com/shells/0608842005/917004878 - - - http://dc-qr.com?m=0608842005&s=917004878 - - - - - - http://boschrexroth.com/shells/0608842005/917004878/submodels/nameplate - - - - - http://boschrexroth.com/shells/0608842005/917004878/submodels/document - - - - - http://boschrexroth.com/shells/0608842005/917004878/submodels/service - - - - - http://boschrexroth.com/shells/0608842005/917004878/submodels/identification - - - - - - - - - M0608842005_S917004878 - http://dc-qr.com?m=0608842005&s=917004878 - Instance - - - - - Nameplate - http://boschrexroth.com/shells/0608842005/917004878/submodels/nameplate - - - https://www.hsu-hh.de/aut/aas/nameplate - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Bosch Rexroth AG - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - Nexo Wi-Fi Cordless Nutrunner - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Fornsbacher Straße 92 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 71540 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Murrhardt - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Baden-Württemberg - - - - false - false - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - string - Cordless Nutrunner - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 917004878 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - ProductCountryOfOrigin - PARAMETER - - - 0173-1#02-AAO841#001 - - - Instance - - string - DE - - - - - YearOfConstruction - PARAMETER - - - 0173-1#02-AAP906#001 - - - Instance - - string - xxxxxxxxxxxxxxxxxxxxxxx - - - - - Marking_CE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/marking_ce.png - - - - false - false - - - - - - Document - http://boschrexroth.com/shells/0608842005/917004878/submodels/document - - - https://www.hsu-hh.de/aut/aas/document - - - Instance - - - - - DeclarationCEMarking - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - DCTC-30434-002_KOE_M_NN_2019-01-01 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - 2019-01-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - EG-Konformitätserklärung - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - DCTC-30434-002_KOE_M_NN_2019-01-01.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/DCTC-30434-002_KOE_M_NN_2019-01-01.pdf - - - - false - false - - - - - EU_Declaration_of_Conformity - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - DCTC-30434-002:2019-01-01 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - 2019-01-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de/en/fr/es/pt/it/pl/cs/sk/hu/bg/da/et/fi/el/hr/lv/lt/nl/ro/sv/sl/ru/zh/ar/id/ja/ko/no/th/tr/vi - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - EU-Konformitätserklärung (DE) EU Declaration of Conformity (EN) - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - EU_Declaration_of_Conformity.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/EU_Declaration_of_Conformity.pdf - - - - false - false - - - - - Certificat_ISO_9001_2015 - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Zertifikat für Bosch Rexroth AG Normen ISO 9001:2015 - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - DCMC-01001-000_KOB_N_EN_2019-06-14.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/DCMC-01001-000_KOB_N_EN_2019-06-14.pdf - - - - false - false - - - - - 3608870EF2_OperatingInstructions - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - 3608870EF2 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung (DE) Operating Instructions (EN) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - AC / 01.2018 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en-US/​cs-CZ/​de-DE/​es-ES/​fr-FR/​hu-HU/​it-IT/​pl-PL/​pt-BR/​sl-SI/​ru-RU/​zh-CN - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - NXA, NXP, NXV012T - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - 3608870EF2_AC.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/3608870EF2_AC.pdf - - - - false - false - - - - - 3608870A47_ProjectPlanning_DE - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - 3 608 870 A47_DE - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - A47/05.2017 DE - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Rexroth Funk-Akkuschrauber Nexo - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - 3608870A47_AE_DE.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/3608870A47_AE_DE.pdf - - - - false - false - - - - - 3608870A47_ProjectPlanning_EN - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - 3 608 870 A47_EN - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Operating - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - A47/05.2017 EN - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Nexo cordless Wi-Fi nutrunner by Rexroth - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - 3608870A47_AE_EN.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/3608870A47_AE_EN.pdf - - - - false - false - - - - - 36088702_SafetyInstructions_DE - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - 3 608 870 2DE - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-03 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Allgemeine Sicherheit - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - AA/01.2010 DE - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Sicherheitshinweise für Rexroth Schraubsysteme - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - 36088702DE_AA.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/36088702DE_AA.pdf - - - - false - false - - - - - 36088702_SafetyInstructions_EN - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - 3 608 870 2EN - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-03 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - General Safety - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - AA/01.2010 EN - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Safety Instructions for Rexroth Tightening Systems - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - 36088702EN_AA.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/36088702EN_AA.pdf - - - - false - false - - - - - - Service - http://boschrexroth.com/shells/0608842005/917004878/submodels/service - - - https://www.hsu-hh.de/aut/aas/service - - - Instance - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Bosch Rexroth AG Service Tightening Systems - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Bgm.-Dr.-Nebel-Str. 8 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 97816 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Lohr - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Bayern - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - service@boschrexroth.de - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.boschrexroth.com/de/de/service/startseite-service - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +499352405060 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - - - - - false - false - - - - - - Identification - http://boschrexroth.com/shells/0608842005/917004878/submodels/identification - - - https://www.hsu-hh.de/aut/aas/identification - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Bosch Rexroth AG - - - - - GLNOfManufacturer - PARAMETER - - - 0173-1#02-AAY812#001 - - - Instance - - string - 4048118000006 - - - - - SupplierOfTheIdentifier - - - 0173-1#02-AAP796#004 - - - Instance - - string - GLN GS1 - - - - - MAN_PROD_NUM - - - 0173-1#02-AAO676#003 - - - Instance - - string - 0608842005 - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - NXP012QD-36V - - - - - ManufacturerProductDescription - PARAMETER - - - 0173-1#02-AAU734#001 - - - Instance - - langString - The most intelligent hand-held nutrunner in the world - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - string - Cordless Nutrunner - - - - - ClassificationSystem - PARAMETER - - - 0173-1#02-AAO715#002 - - - Instance - - string - eCl@ss - - - - - SecondaryKeyTyp - - - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - Instance - - - - - - - - TypThumbnail - PARAMETER - - - www.company.com/ids/cd/4401_1272_7091_3437 - - - Instance - - image/jpeg - /ST_Mittelgriffschrauber_NXP_Produktbild_V01_20160822_161306.jpg - - - - - AssetId - PARAMETER - - - https://www.hsu-hh.de/aut/aas/assetid - - - Instance - - string - http://dc-qr.com?m=0608842005&s=917004878 - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 917004878 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - SecondaryKeyInstance - PARAMETER - - - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - Instance - - - - - - - - DateOfManufacture - PARAMETER - - - 0173-1#02-AAR972#002 - - - Instance - - - 2019 - - - - - DeviceRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/devicerevision - - - Instance - - - - - - - - SoftwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/softwarerevision - - - Instance - - - - - - - - HardwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - Instance - - - - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Bosch Rexroth AG - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Zum Eisengießer 1 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 97816 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Lohr am Main - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Bayern - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - service@boschrexroth.de - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.boschrexroth.com/de/de/home/index - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +499352405060 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - - - - - false - false - - - - - CompanyLogo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/companylogo - - - Instance - - image/png - /aasx/Identification/logo.png - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - http://dc-qr.com?m=0608842005&s=917004878 - - - - - - - - ManufacturerName - 0173-1#02-AAO677#002 - - - - - - - - Herstellername - Manufacturer Name - - Manufacturer Name - - - - - Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist - 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 - - - - - - - ManufacturerProductDesignation - 0173-1#02-AAW338#001 - - - - - - - - Manufacturer product designation - Herstellerproduktbezeichnung - - ManufacturerTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - PhysicalAddress - https://www.hsu-hh.de/aut/aas/physicaladdress - - - - - - - - PhysicalAddress - Physische Adresse - - PhysicalAddress - - - - - Sammlung für reale physische Adresse - Collection for real physical address - - - - - - - CountryCode - 0173-1#02-AAO730#001 - - - - - - - - - - - - Landeskennung - Country code - - Country code - - - - - Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes - agreed upon symbol for unambiguous identification of a country - - - - - - - Street - 0173-1#02-AAO128#001 - - - - - - - - Strasse - Street - - Street - - - - - Name der Strasse und Hausnummer - Street name and house number - - - - - - - Zip - 0173-1#02-AAO129#002 - - - - - - - - Zip - Postleitzahl - - PostalCode - - - - - ZIP code of address - Postleitzahl der Anschrift - - - - - - - CityTown - 0173-1#02-AAO132#001 - - - - - - - - Ort - City/town - - City/town - - - - - Town or city of the company - Ortsangabe - - - - - - - StateCounty - 0173-1#02-AAO133#002 - - - - - - - - state/county - Bundesland - - StateCounty - - - - - Bundesland - state/county - - - - - - - ManufacturerProductFamily - 0173-1#02-AAU731#001 - - - - - - - - Manufacturer product family - Herstellerproduktfamilie - - TypClass - - - - - 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie - 2nd level of a 3 level manufacturer specific product hierarchy - - - - - - - SerialNumber - 0173-1#02-AAM556#002 - - - - - - - - Serial number - Seriennummer - - InstanceId - - - - - eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist - unique combination of numbers and letters used to identify the device once it has been manufactured - - - - - - - BatchNumber - 0173-1#02-AAQ196#001 - - - - - - - - Batch number - Chargen-Nummer - - ChargeId - - - - - Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge - Number assigned by the manufacturer of a material to identify the manufacturer's batch - - - - - - - ProductCountryOfOrigin - 0173-1#02-AAO841#001 - - - - - - - - Produkt Ursprungsland - Product country of origin - - CountryOfOrigin - - - - - Land in dem das Produkt hergestellt wurde (Hersteller Land) - Country in which the product is manufactured (manufacturer country) - - - - - - - YearOfConstruction - 0173-1#02-AAP906#001 - - - - - - - - Year of construction - Baujahr - - YearOfConstruction - - - - - Jahreszahl als Datumsangabe für die Fertigstellung des Objektes - Year as completion date of object - - - - - - - ProductMarking - https://www.hsu-hh.de/aut/aas/productmarking - - - - - - - - Produktkennzeichnung - Product Marking - - ProductMarking - - - - - Sammlungsdatei für Produktkennzeichnung - Collection file for product marking - - - - - - - CEQualificationPresent - 0173-1#02-BAF053#008 - - - - - - - - CE-Kennzeichnung vorhanden - CE- qualification present - - CEMarkingPresent - - - BOOLEAN - - whether CE- qualification is present - Angabe, ob CE-Kennzeichnung vorhanden ist - - - - - - - File - 0173-1#02-AAD005#008 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Enthaltene Doku. Datei - Embedded Doc. file - - File - - - - - Verweis/ BLOB auf enthaltene Dokumentations-Datei. - Reference/ BLOB to embedded documentation file. - - - - - - - DocumentationItem - 0173-1#02-AAD001#001 - - - - - - - - Dokumentationsgruppe - Documentation item - - DocumentationItem - - - - - Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. - Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. - - - - - - - DocumentType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - - - - - - Dokumententyp - Document Type - - DocumentType - - - - - Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) - TBD - - - - - - - VDI2770_DomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - - - - - - Domain-Nummer - DomainId - - DomainId - - - - - Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. - TBD - - - - - - - VDI2770_IdType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - - - - - - Nummerntyp - IdType - - IdType - - - - - Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. - TBD - - - - - - - DocumentId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - - - - - - DocumentId - Dokumenten-Nummer - - DocumentId - - - - - Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. - TBD - - - - - - - DocumentDomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - - - - - - DocumentDomainId - DocumentDomainId - - DocumentDomainId - - - - - Kennung oder Kennzeichen einer Domäne - TBD - - - - - - - VDI2770_Role - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - - - - - - Rolle - Role - - Role - - - - - Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) - TBD - - - - - - - VDI2770_OrganisationId - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - - - - - - Organisation ID - Organisation ID - - OrganisationId - - - - - eindeutige ID für die Organisation - TBD - - - - - - - VDI2770_OrganisationName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - - - - - - OrganisationName - OrganisationName - - OrganisationName - - - - - gebräuchliche Bezeichnung für die Organisation - TBD - - - - - - - VDI2770_OrganisationOfficialName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - - - - - - Offizieller Name der Organisation - Organisation Official Name - - OrganisationOfficialName - - - - - offizieller Name der Organisation - TBD - - - - - - - VDI2770_Description - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - - - - - - Beschreibung - Description - - Description - - - - - Beschreibung für die nächste übergeordnete Collection - TBD - - - - - - - DocumentPartId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - - - - - - Dokumenten-Teilnummer - DocumentPartId - - DocumentPartId - - - - - Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. - TBD - - - - - - - DocumentClassification_ClassId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - - - - Dokumentkategorie - Document category - - DocCategory - - - - - Dokumentkategorie nach VDI 2770:2018/10 - Document category after VDI 2770:2018/10 - - - - - - - VDI2770_ClassName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - - - - - - Klassenname - Class Name - - ClassName - - - - - Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. - TBD - - - - - - - VDI2770_ClassificationSystem - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - - - - - - Klassifizierungssystem - classification system - - ClassificationSystem - - - - - Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. - TBD - - - - - - - DocumentVersionId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - - - - - - Dokumenten-Versionsnummer - DocumentVersionId - - DocumentVersionId - - - - - Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. - TBD - - - - - - - DocumentVersion_LanguageCode - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - - - - - - Sprachenschlüssel - LanguageCode - - LanguageCode - - - - - Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 - TBD - - - - - - - VDI2770_Title - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - - - - - - Titel - Title - - VDI2770_Title - - - - - sprachabhängiger Titel des Dokuments - TBD - - - - - - - VDI2770_Summary - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - - - - - - Zusammenfassung - Summary - - Summary - - - - - sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts - TBD - - - - - - - VDI2770_Keywords - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - - - - - - Schlagwörter - Keywords - - Keywords - - - - - sprachabhängige, durch Komma getrennte Liste von Schlagwörtern - TBD - - - - - - - VDI2770_StatusValue - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - - - - - - Statuswert - StatusValue - - StatusValue - - - - - Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) - TBD - - - - - - - VDI2770_SetDate - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - - - - - - Erstellungsdatum - Set Date - - SetDate - - - - - Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). - TBD - - - - - - - VDI2770_Purpose - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - - - - - - Zweck - Purpose - - Purpose - - - - - Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. - TBD - - - - - - - VDI2770_BasedOnProcedure - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - - - - - - Prozedur - Procedure - - BasedOnProcedure - - - - - textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt - TBD - - - - - - - VDI2770_Comments - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - - - - - - Kommentar - Comments - - Comments - - - - - textuelle Bemerkungen und Anmerkungen zum Status - TBD - - - - - - - VDI2770_ReferencedObject_Type - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - - - - - - Typ - Type - - Type - - - - - Für Type des Objekts muss immer Product angegeben werden. - TBD - - - - - - - VDI2770_ReferencedObject_RefType - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - - - - - - RefType - RefType - - RefType - - - - - Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) - TBD - - - - - - - VDI2770_ReferencedObject_ObjectId - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - - - - - - ObjectId - ObjectId - - ObjectId - - - - - Angabe der Identifikationsnummer zum Objekt - TBD - - - - - - - VDI2770_FileId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - - - - - - ID der Datei - File ID - - FileId - - - - - eindeutige ID für die Datei - TBD - - - - - - - VDI2770_FileName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - - - - - - Dateiname - File name - - FileName - - - - - Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. - TBD - - - - - - - VDI2770_FileFormat - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - - - - - - Datei Format - File format - - FileFormat - - - - - Angabe eines Media Typs gemäß der Liste der IANA - TBD - - - - - - - OrganisationContactInfo - https://www.hsu-hh.de/aut/aas/contactinfo - - - - - - - - Contact Info - Kontakt Info - - OrganisationContactInfo - - - - - Sammlung für die allgemeinen Kontaktdaten - Collection for general contact data - - - - - - - NameOfSupplier - 0173-1#02-AAO735#003 - - - - - - - - - - - - name of supplier - Lieferantenname - - name of supplier - - - - - Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt - name of supplier which provides the customer with a product or a service - - - - - - - ContactInfo_Role - https://www.hsu-hh.de/aut/aas/role - - - - - - - - Rolle - Role - - Role - - - - - Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt - Information to specify the role which the organisation of ContactInfo plays - - - - - - - Email - https://www.hsu-hh.de/aut/aas/email - - - - - - - - Emailadresse - Email address - - Email - - - - - Emailadresse - Email address - - - - - - - URL - 0173-1#02-AAO694#001 - - - - - - - - Internetadresse - Internet address - - URL - - - - - stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html - Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html - - - - - - - PhoneNumber - 0173-1#02-AAO136#002 - - - - - - - - Telefonnummer - telephone number - - Phone - - - - - vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist - complete telephone number to be called to reach a business partner - - - - - - - Fax - https://www.hsu-hh.de/aut/aas/fax - - - - - - - - Fax - Fax - - Fax - - - - - Faxnummer - Fax number - - - - - - - 0173-1#02-AAO136#002 - - - - - GLNOfManufacturer - 0173-1#02-AAY812#001 - - - - - - - - GLN of manufacturer - GLN des Herstellers - - GLN of manufacturer - - - - - international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort - internationally unique identification number for the manufacturer of the device or the product and for the physical location - - - - - - - SupplierOfTheIdentifier - 0173-1#02-AAP796#004 - - - - - - - - Supplier of the identifier - Anbieter der Identifikationsnummer für Hersteller - - Supplier of the identifier - - - STRING_TRANSLATABLE - - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - - - - - - - MAN_PROD_NUM - - product article number of manufacturer - - 0173-1#02-AAO676#003 - - - - - - - - product article number of manufacturer - Herstellerartikelnummer - - MAN_PROD_NUM - - - STRING_TRANSLATABLE - - eindeutiger Bestellschlüssel des Herstellers - unique product identifier of the manufacturer - - - - - - - ManufacturerProductDescription - 0173-1#02-AAU734#001 - - - - - - - - Manufacturer product description - Herstellerproduktbeschreibung - - Manufacturer product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - GLNOfSupplier - 0173-1#02-AAY813#001 - - - - - - - - GLN of supplier - GLN des Lieferanten - - GLN of supplier - - - - - international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort - internationally unique identification number for the supplier of the device or the product and for the physical location - - - - - - - SupplierIdProvider - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - - - - - - SupplierIdProvider - Anbieter der Identifikationsnummer - - SupplierIdProvider - - - STRING_TRANSLATABLE - - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - - - - - - - SUP_PROD_NUM - 0173-1#02-AAO736#004 - - - - - - - - product article number of supplier - Lieferantenartikelnummer - - product article number of supplier - - - - - eindeutiger Bestellschlüssel des Lieferanten - unique product order identifier of the supplier - - - - - - - SupplierProductDesignation - 0173-1#02-AAM551#002 - - - - - - - - Supplier product designation - Lieferantenproduktbezeichnung - - SupplierTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - SupplierProductDescription - 0173-1#02-AAU730#001 - - - - - - - - Supplier product description - Lieferantenproduktbeschreibung - - Supplier product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - ClassificationSystem - 0173-1#02-AAO715#002 - - - - - - - - classification system - Klassifizierungssystem - - ClassificationSystem - - - - - Klassifizierungssystem - Classification System - - - - - - - SecondaryKeyTyp - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - - - - - - SecondaryKeyTyp - Typnummer des IT Systems - - SecondaryKeyTyp - - - - - Führende technische ID im IT System des Typs - SecondaryKeyTyp - - - - - - - TypThumbnail - www.company.com/ids/cd/4401_1272_7091_3437 - - - - - - - - TypThumbnail - Vorschaubild - - TypThumbnail - - - - - Darstellung des Produkttyps in kleinem Format - Small picture of the product type - - - - - - - AssetId - https://www.hsu-hh.de/aut/aas/assetid - - - - - - - - AssetId - Asset ID - - AssetId - - - - - Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. - Global unique ID of an asset, which can be read by both human and machine. - - - - - - - SecondaryKeyInstance - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - - - - - - SecondaryKeyInstance - Instanznummer des IT Systems - - SecondaryKeyInstance - - - - - Führende technische ID im IT System der Instanz - SecondaryKeyInstance - - - - - - - DateOfManufacture - 0173-1#02-AAR972#002 - - - - - - - - Date of manufacture - Herstellungsdatum - - Date of manufacture - - - DATE - - Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist - Date from which the production and / or development process is completed or from which a service is provided completely - - - - - - - DeviceRevision - https://www.hsu-hh.de/aut/aas/devicerevision - - - - - - - - DeviceRevision - DeviceRevision - - DeviceRevision - - - - - DeviceRevision - DeviceRevision - - - - - - - SoftwareRevision - https://www.hsu-hh.de/aut/aas/softwarerevision - - - - - - - - SoftwareRevision - SoftwareRevision - - SoftwareRevision - - - - - SoftwareRevision - SoftwareRevision - - - - - - - HardwareRevision - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - - - - - - HardwareRevision - HardwareRevision - - HardwareRevision - - - - - HardwareRevision - HardwareRevision - - - - - - - QrCode - https://www.hsu-hh.de/aut/aas/qrcode - - - - - - - - QrCode - QrCode - - QrCode - - - - - In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. - QrCode - - - - - - - CompanyLogo - https://www.hsu-hh.de/aut/aas/companylogo - - - - - - - - Firmenlogo - CompanyLogo - - CompanyLogo - - - - - Firmenlogo - CompanyLogo - - - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/03_Bosch.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/03_Bosch.aasx.xml deleted file mode 100644 index 59ae3d081..000000000 --- a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/03_Bosch.aasx.xml +++ /dev/null @@ -1,13753 +0,0 @@ - - - - - Bosch_R901509807_1201694127 - https://boschrexroth.com/ids/aas?p=p652370&m=R90150807&s=1201694127 - - - http://dc-qr.com?m=R901509807&s=1&f=1202044787 - - - - - - http://boschrexroth.com/ids/sm/4343_5072_7091_3242 - - - - - http://boschrexroth.com/ids/sm/2543_5072_7091_2660 - - - - - http://boschrexroth.com/ids/sm/6053_5072_7091_5102 - - - - - http://boschrexroth.com/ids/sm/6563_5072_7091_4267 - - - - - - - - - R901509807_1202044787 - http://dc-qr.com?m=R901509807&s=1&f=1202044787 - Instance - - - - - Nameplate - http://boschrexroth.com/ids/sm/4343_5072_7091_3242 - - - https://www.hsu-hh.de/aut/aas/nameplate - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Bosch Rexroth AG - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - 4WRPEH 6 C3 B40L-3X/M/24L1 - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Zum Eisengießer 1 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 97816 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Lohr am Main - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Bayern - - - - false - false - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - High-respones directional valve, direct operated - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 1201694127 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - ProductCountryOfOrigin - PARAMETER - - - 0173-1#02-AAO841#001 - - - Instance - - string - DE - - - - - YearOfConstruction - PARAMETER - - - 0173-1#02-AAP906#001 - - - Instance - - string - 2019 - - - - - Marking_CE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/marking_ce.png - - - - false - false - - - - - Marking_IO-Link - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - IO-LinkMarkingPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/Logo_IO-link.jpg - - - - false - false - - - - - Connector_IO-Link - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - IO-LinkConnectorPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/IO_Link_Steckerbelegung.png - - - - false - false - - - - - - Document - http://boschrexroth.com/ids/sm/2543_5072_7091_2660 - - - https://www.hsu-hh.de/aut/aas/document - - - Instance - - - - - DeclarationCEMarking - PARAMETER - - - www.company.com/ids/sm/2543_5072_7091_2660 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - DCTC-31003-003_KOE_N_DE_2016-07-20 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2016-07-20 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - EG-Konformitatserklarung - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - DCTC-31003-003_KOE_N_DE_2016-07-20.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/DCTC-31003-003_KOE_N_DE_2016-07-20.pdf - - - - false - false - - - - - Declaration_IO-Link - PARAMETER - - - www.company.com/ids/sm/2543_5072_7091_2660 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - DCTC-31000-136_HEK_N_EN_2019-09-18 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-09-18 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - HerstellererklärungIO-Link - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - DCTC-31000-136_HEK_N_EN_2019-09-18.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/DCTC-31000-136_HEK_N_EN_2019-09-18.pdf - - - - false - false - - - - - Certificat_DIN_EN_ISO_14001_2015 - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - string - Lohr_Bosch-Rexroth-AG_ISO_14001_BR_Matrix_en_20090723 - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Zertifikat für Bosch Rexroth AG Normen DIN EN ISO 14001:2015 - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - Lohr_Bosch-Rexroth-AG_ISO_14001_BR_Matrix_en_20090723 - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/Lohr_Bosch-Rexroth-AG_ISO_14001_BR_Matrix_en_20090723.pdf - - - - false - false - - - - - Datasheet_4WRPEH6-3x-EN - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - RE29131 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-01 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Technische Spezifikation - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-02 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Datasheet: Directional control valves, direct operated, with electrical position feedback and integrated electronics (OBE) - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - re29121_2019-02 - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/re29121_2019-02.pdf - - - - false - false - - - - - UserManual_4WRPEH6-3x_EN - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - RE07600 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-01 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Montage, Demontage - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - RE07600-B_web_01_2019 - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/RE07600-B_web_01_2019.pdf - - - - false - false - - - - - Parameter_IO-Link_EN - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - RE29400 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - string - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-01 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Technische Spezifikation - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Parameter description: High-response directional valves with electrical position feedback and IO-Link interface - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - RE29400_01-2019 - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/RE29400_01-2019.pdf - - - - false - false - - - - - UserManual_4WRPEH6-3x_DE - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - RD07600 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-01 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Montage, Demontage - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - RD07600-B_web_01_2019 - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/RD07600_web_01_2019.pdf - - - - false - false - - - - - UserManual_4WRPEH6-3x_RO - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - RU07600 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-01 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Montage, Demontage - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - ro - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - RU07600-B_web_01_2019 - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/RU07600-B_web_01_2019.pdf - - - - false - false - - - - - UserManual_4WRPEH6-3x_ES - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - RS07600 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-01 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Montage, Demontage - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - es - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - RS07600-B_web_01_2019 - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/RS07600-B_web_01_2019.pdf - - - - false - false - - - - - UserManual_4WRPEH6-3x_FI - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R-SF07600 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-01 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Montage, Demontage - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - fi - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - R-SF07600-B_web_01_2019 - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/R-SF07600_01_2019_web.pdf - - - - false - false - - - - - UserManual_4WRPEH6-3x_FR - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - RF07600 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-01 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Montage, Demontage - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - fr - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - RF07600-B_web_01_2019 - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/RF07600-B_web_01_2019.pdf - - - - false - false - - - - - UserManual_4WRPEH6-3x_NL - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R-NL07600 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-01 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Montage, Demontage - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - nl - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - R-NL07600-B_web_01_2019 - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/R-NL07600-B_web_01_2019.pdf - - - - false - false - - - - - UserManual_4WRPEH6-3x_PL - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R-PL07600 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-01 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Montage, Demontage - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - pl - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - R-PL07600-B_web_01_2019 - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/R-PL07600-B_web_01_2019 - - - - false - false - - - - - UserManual_4WRPEH6-3x_PT - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - RP07600 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-01 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Montage, Demontage - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - pt - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - RP07600-B_web_01_2019 - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/RP07600-B_web_01_2019.pdf - - - - false - false - - - - - UserManual_4WRPEH6-3x_RU - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R-RS07600 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-01 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Montage, Demontage - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - ru - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - R-RS07600-B_web_01_2019 - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/R-RS07600-B_web_30_03_2016.pdf - - - - false - false - - - - - UserManual_4WRPEH6-3x_SV - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R-SK07600 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-01 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Montage, Demontage - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - sv - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - R-SK07600-B_web_01_2019 - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/R-SK07600_web_B_01_2019.pdf - - - - false - false - - - - - UserManual_4WRPEH6-3x_TR - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - RT07600 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-01 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Montage, Demontage - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - tr - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - RT07600-B_web_01_2019 - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/RT07600_web_01_2019.pdf - - - - false - false - - - - - UserManual_4WRPEH6-3x_IT - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - RI07600 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-01 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Montage, Demontage - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - it - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - RI07600-B_web_01_2019 - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/RI07600-B_web_01_2019.pdf - - - - false - false - - - - - UserManual_4WRPEH6-3x_CS - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R-CZ07600 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-01 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Montage, Demontage - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - cs - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - User Manuel Hydraulic valves and hydroelectric pressure switches for industrial applications - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - R-CZ07600-B_web_01_2019 - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/R-CZ 07600-B_web_01_2019.pdf - - - - false - false - - - - - Datasheet_4WRPEH6-3x_DE - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - RD29131 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-01 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Technische Spezifikation - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-02 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Datasheet: Directional control valves, direct operated, with electrical position feedback and integrated electronics (OBE) - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - rd29121_2019-02 - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/rd29121_2019-02.pdf - - - - false - false - - - - - Datasheet_4WRPEH6-3x-zh - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - RC29131 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-01 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Technische Spezifikation - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-02 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - zh - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Datasheet: Directional control valves, direct operated, with electrical position feedback and integrated electronics (OBE) - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - rc29121_2019-02 - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/rc29121_2019-02.pdf - - - - false - false - - - - - Parameter_IO-Link-DE - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - RD29400 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - string - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-01 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Technische Spezifikation - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Parameter description: High-response directional valves with electrical position feedback and IO-Link interface - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - SerialId - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - 1201694127 - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - RD29400_01-2019 - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/RD29400_01_2019_web.pdf - - - - false - false - - - - - - Service - http://boschrexroth.com/ids/sm/6053_5072_7091_5102 - - - https://www.hsu-hh.de/aut/aas/service - - - Instance - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Bosch Rexroth AG - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Bgm.-Dr.-Nebel-Str. 8 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 97816 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Lohr - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Bayern - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - service@boschrexroth.de - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.boschrexroth.com/de/de/service/startseite-service - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +499352405060 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - - - - - false - false - - - - - - Identification - http://boschrexroth.com/ids/sm/6563_5072_7091_4267 - - - https://www.hsu-hh.de/aut/aas/identification - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Bosch Rexroth AG - - - - - GLNOfManufacturer - PARAMETER - - - 0173-1#02-AAY812#001 - - - Instance - - string - 4048118000006 - - - - - SupplierOfTheIdentifier - - - 0173-1#02-AAP796#004 - - - Instance - - string - GLN GS1 - - - - - MAN_PROD_NUM - - - 0173-1#02-AAO676#003 - - - Instance - - string - R901509807 - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - 4WRPEH 6 C3 B40L-3X/M/24L1 - - - - - ManufacturerProductDescription - PARAMETER - - - 0173-1#02-AAU734#001 - - - Instance - - langString - High-response directional valves, direct operated, with electrical position feedback and integrated electronics (OBE)“ oder auch „• Size 6 • Component series 3X • Maximum operating pressure 350 bar • Nominal flow 4 … 40 l/min • Digital interface IO-Link - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - string - Proportional directional control valve, spool design (hydraulics) - - - - - ClassificationSystem - PARAMETER - - - 0173-1#02-AAO715#002 - - - Instance - - string - eCl@ss - - - - - SecondaryKeyTyp - - - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - Instance - - - - - - - - TypThumbnail - PARAMETER - - - www.company.com/ids/cd/4401_1272_7091_3437 - - - Instance - - image/jpeg - /aasx/4WRPEH6_3X.png - - - - - AssetId - PARAMETER - - - https://www.hsu-hh.de/aut/aas/assetid - - - Instance - - string - http://dc-qr.com?m=R901509807&s=1&f=1202044787 - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 1202044787 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - SecondaryKeyInstance - PARAMETER - - - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - Instance - - - - - - - - DateOfManufacture - PARAMETER - - - 0173-1#02-AAR972#002 - - - Instance - - - 2018 - - - - - DeviceRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/devicerevision - - - Instance - - - 30 - - - - - SoftwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/softwarerevision - - - Instance - - string - 02V08 - - - - - HardwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - Instance - - string - P.017.0014 - - - - - QrCode - PARAMETER - - - https://www.hsu-hh.de/aut/aas/qrcode - - - Instance - - image/jpeg - /aasx/Identification/QR-Code.jpg - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Bosch Rexroth AG - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Zum Eisengießer 1 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 97816 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Lohr am Main - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Bayern - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - service@boschrexroth.de - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.boschrexroth.com/de/de/home/index - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +499352405060 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - - - - - false - false - - - - - CompanyLogo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/companylogo - - - Instance - - image/png - /aasx/Identification/Rexroth-Logo_RGB_M.jpg - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - http://dc-qr.com?m=R901509807&s=1&f=1202044787 - - - - - - - - ManufacturerName - 0173-1#02-AAO677#002 - - - - - - - - Herstellername - Manufacturer Name - - Manufacturer Name - - - - - Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist - 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 - - - - - - - ManufacturerProductDesignation - 0173-1#02-AAW338#001 - - - - - - - - Manufacturer product designation - Herstellerproduktbezeichnung - - ManufacturerTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - PhysicalAddress - https://www.hsu-hh.de/aut/aas/physicaladdress - - - - - - - - PhysicalAddress - Physische Adresse - - PhysicalAddress - - - - - Sammlung für reale physische Adresse - Collection for real physical address - - - - - - - CountryCode - 0173-1#02-AAO730#001 - - - - - - - - - - - - Landeskennung - Country code - - Country code - - - - - Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes - agreed upon symbol for unambiguous identification of a country - - - - - - - Street - 0173-1#02-AAO128#001 - - - - - - - - Strasse - Street - - Street - - - - - Name der Strasse und Hausnummer - Street name and house number - - - - - - - Zip - 0173-1#02-AAO129#002 - - - - - - - - Zip - Postleitzahl - - PostalCode - - - - - ZIP code of address - Postleitzahl der Anschrift - - - - - - - CityTown - 0173-1#02-AAO132#001 - - - - - - - - Ort - City/town - - City/town - - - - - Town or city of the company - Ortsangabe - - - - - - - StateCounty - 0173-1#02-AAO133#002 - - - - - - - - state/county - Bundesland - - StateCounty - - - - - Bundesland - state/county - - - - - - - ManufacturerProductFamily - 0173-1#02-AAU731#001 - - - - - - - - Manufacturer product family - Herstellerproduktfamilie - - TypClass - - - - - 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie - 2nd level of a 3 level manufacturer specific product hierarchy - - - - - - - SerialNumber - 0173-1#02-AAM556#002 - - - - - - - - Serial number - Seriennummer - - InstanceId - - - - - eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist - unique combination of numbers and letters used to identify the device once it has been manufactured - - - - - - - BatchNumber - 0173-1#02-AAQ196#001 - - - - - - - - Batch number - Chargen-Nummer - - ChargeId - - - - - Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge - Number assigned by the manufacturer of a material to identify the manufacturer's batch - - - - - - - ProductCountryOfOrigin - 0173-1#02-AAO841#001 - - - - - - - - Produkt Ursprungsland - Product country of origin - - CountryOfOrigin - - - - - Land in dem das Produkt hergestellt wurde (Hersteller Land) - Country in which the product is manufactured (manufacturer country) - - - - - - - YearOfConstruction - 0173-1#02-AAP906#001 - - - - - - - - Year of construction - Baujahr - - YearOfConstruction - - - - - Jahreszahl als Datumsangabe für die Fertigstellung des Objektes - Year as completion date of object - - - - - - - ProductMarking - https://www.hsu-hh.de/aut/aas/productmarking - - - - - - - - Produktkennzeichnung - Product Marking - - ProductMarking - - - - - Sammlungsdatei für Produktkennzeichnung - Collection file for product marking - - - - - - - CEQualificationPresent - 0173-1#02-BAF053#008 - - - - - - - - IO-Link-Kennzeichnung vorhanden - IO-Link marking present - - CEMarkingPresent - - - BOOLEAN - - whether CE- qualification is present - Angabe, ob CE-Kennzeichnung vorhanden ist - - - - - - - File - 0173-1#02-AAD005#008 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Enthaltene Doku. Datei - Embedded Doc. file - - File - - - - - Verweis/ BLOB auf enthaltene Dokumentations-Datei. - Reference/ BLOB to embedded documentation file. - - - - - - - DocumentationItem - - 0173-1#02-AAD001#001 - - - - - - - - Dokumentationsgruppe - Documentation item - - DocumentationItem - - - - - Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. - Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. - - - - - - - DocumentType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - - - - - - Dokumententyp - Document Type - - DocumentType - - - - - Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) - TBD - - - - - - - VDI2770_DomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - - - - - - Domain-Nummer - DomainId - - DomainId - - - - - Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. - TBD - - - - - - - VDI2770_IdType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - - - - - - Nummerntyp - IdType - - IdType - - - - - Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. - TBD - - - - - - - DocumentId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - - - - - - DocumentId - Dokumenten-Nummer - - DocumentId - - - - - Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. - TBD - - - - - - - DocumentDomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - - - - - - DocumentDomainId - DocumentDomainId - - DocumentDomainId - - - - - Kennung oder Kennzeichen einer Domäne - TBD - - - - - - - VDI2770_Role - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - - - - - - Rolle - Role - - Role - - - - - Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) - TBD - - - - - - - VDI2770_OrganisationId - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - - - - - - Organisation ID - Organisation ID - - OrganisationId - - - - - eindeutige ID für die Organisation - TBD - - - - - - - VDI2770_OrganisationName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - - - - - - OrganisationName - OrganisationName - - OrganisationName - - - - - gebräuchliche Bezeichnung für die Organisation - TBD - - - - - - - VDI2770_OrganisationOfficialName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - - - - - - Offizieller Name der Organisation - Organisation Official Name - - OrganisationOfficialName - - - - - offizieller Name der Organisation - TBD - - - - - - - VDI2770_Description - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - - - - - - Beschreibung - Description - - Description - - - - - Beschreibung für die nächste übergeordnete Collection - TBD - - - - - - - DocumentPartId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - - - - - - Dokumenten-Teilnummer - DocumentPartId - - DocumentPartId - - - - - Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. - TBD - - - - - - - DocumentClassification_ClassId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - - - - Dokumentkategorie - Document category - - DocCategory - - - - - Dokumentkategorie nach VDI 2770:2018/10 - Document category after VDI 2770:2018/10 - - - - - - - VDI2770_ClassName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - - - - - - Klassenname - Class Name - - ClassName - - - - - Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. - TBD - - - - - - - VDI2770_ClassificationSystem - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - - - - - - Klassifizierungssystem - classification system - - ClassificationSystem - - - - - Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. - TBD - - - - - - - DocumentVersionId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - - - - - - Dokumenten-Versionsnummer - DocumentVersionId - - DocumentVersionId - - - - - Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. - TBD - - - - - - - DocumentVersion_LanguageCode - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - - - - - - Sprachenschlüssel - LanguageCode - - LanguageCode - - - - - Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 - TBD - - - - - - - VDI2770_Title - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - - - - - - Titel - Title - - VDI2770_Title - - - - - sprachabhängiger Titel des Dokuments - TBD - - - - - - - VDI2770_Summary - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - - - - - - Zusammenfassung - Summary - - Summary - - - - - sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts - TBD - - - - - - - VDI2770_Keywords - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - - - - - - Schlagwörter - Keywords - - Keywords - - - - - sprachabhängige, durch Komma getrennte Liste von Schlagwörtern - TBD - - - - - - - VDI2770_StatusValue - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - - - - - - Statuswert - StatusValue - - StatusValue - - - - - Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) - TBD - - - - - - - VDI2770_SetDate - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - - - - - - Erstellungsdatum - Set Date - - SetDate - - - - - Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). - TBD - - - - - - - VDI2770_Purpose - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - - - - - - Zweck - Purpose - - Purpose - - - - - Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. - TBD - - - - - - - VDI2770_BasedOnProcedure - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - - - - - - Prozedur - Procedure - - BasedOnProcedure - - - - - textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt - TBD - - - - - - - VDI2770_Comments - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - - - - - - Kommentar - Comments - - Comments - - - - - textuelle Bemerkungen und Anmerkungen zum Status - TBD - - - - - - - VDI2770_ReferencedObject_Type - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - - - - - - Typ - Type - - Type - - - - - Für Type des Objekts muss immer Product angegeben werden. - TBD - - - - - - - VDI2770_ReferencedObject_RefType - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - - - - - - RefType - RefType - - RefType - - - - - Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) - TBD - - - - - - - VDI2770_ReferencedObject_ObjectId - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - - - - - - ObjectId - ObjectId - - ObjectId - - - - - Angabe der Identifikationsnummer zum Objekt - TBD - - - - - - - VDI2770_FileId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - - - - - - ID der Datei - File ID - - FileId - - - - - eindeutige ID für die Datei - TBD - - - - - - - VDI2770_FileName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - - - - - - Dateiname - File name - - FileName - - - - - Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. - TBD - - - - - - - VDI2770_FileFormat - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - - - - - - Datei Format - File format - - FileFormat - - - - - Angabe eines Media Typs gemäß der Liste der IANA - TBD - - - - - - - OrganisationContactInfo - https://www.hsu-hh.de/aut/aas/contactinfo - - - - - - - - Contact Info - Kontakt Info - - OrganisationContactInfo - - - - - Sammlung für die allgemeinen Kontaktdaten - Collection for general contact data - - - - - - - NameOfSupplier - 0173-1#02-AAO735#003 - - - - - - - - - - - - name of supplier - Lieferantenname - - name of supplier - - - - - Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt - name of supplier which provides the customer with a product or a service - - - - - - - ContactInfo_Role - https://www.hsu-hh.de/aut/aas/role - - - - - - - - Rolle - Role - - Role - - - - - Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt - Information to specify the role which the organisation of ContactInfo plays - - - - - - - Email - https://www.hsu-hh.de/aut/aas/email - - - - - - - - Emailadresse - Email address - - Email - - - - - Emailadresse - Email address - - - - - - - URL - 0173-1#02-AAO694#001 - - - - - - - - Internetadresse - Internet address - - URL - - - - - stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html - Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html - - - - - - - PhoneNumber - 0173-1#02-AAO136#002 - - - - - - - - Telefonnummer - telephone number - - Phone - - - - - vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist - complete telephone number to be called to reach a business partner - - - - - - - Fax - https://www.hsu-hh.de/aut/aas/fax - - - - - - - - Fax - Fax - - Fax - - - - - Faxnummer - Fax number - - - - - - - 0173-1#02-AAO136#002 - - - - - GLNOfManufacturer - 0173-1#02-AAY812#001 - - - - - - - - GLN of manufacturer - GLN des Herstellers - - GLN of manufacturer - - - - - international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort - internationally unique identification number for the manufacturer of the device or the product and for the physical location - - - - - - - SupplierOfTheIdentifier - 0173-1#02-AAP796#004 - - - - - - - - Supplier of the identifier - Anbieter der Identifikationsnummer für Hersteller - - Supplier of the identifier - - - STRING_TRANSLATABLE - - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - - - - - - - MAN_PROD_NUM - - product article number of manufacturer - - 0173-1#02-AAO676#003 - - - - - - - - product article number of manufacturer - Herstellerartikelnummer - - MAN_PROD_NUM - - - STRING_TRANSLATABLE - - eindeutiger Bestellschlüssel des Herstellers - unique product identifier of the manufacturer - - - - - - - ManufacturerProductDescription - 0173-1#02-AAU734#001 - - - - - - - - Manufacturer product description - Herstellerproduktbeschreibung - - Manufacturer product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - GLNOfSupplier - 0173-1#02-AAY813#001 - - - - - - - - GLN of supplier - GLN des Lieferanten - - GLN of supplier - - - - - international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort - internationally unique identification number for the supplier of the device or the product and for the physical location - - - - - - - SupplierIdProvider - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - - - - - - SupplierIdProvider - Anbieter der Identifikationsnummer - - SupplierIdProvider - - - STRING_TRANSLATABLE - - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - - - - - - - SUP_PROD_NUM - 0173-1#02-AAO736#004 - - - - - - - - product article number of supplier - Lieferantenartikelnummer - - product article number of supplier - - - - - eindeutiger Bestellschlüssel des Lieferanten - unique product order identifier of the supplier - - - - - - - SupplierProductDesignation - 0173-1#02-AAM551#002 - - - - - - - - Supplier product designation - Lieferantenproduktbezeichnung - - SupplierTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - SupplierProductDescription - 0173-1#02-AAU730#001 - - - - - - - - Supplier product description - Lieferantenproduktbeschreibung - - Supplier product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - ClassificationSystem - 0173-1#02-AAO715#002 - - - - - - - - classification system - Klassifizierungssystem - - ClassificationSystem - - - - - Klassifizierungssystem - Classification System - - - - - - - SecondaryKeyTyp - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - - - - - - SecondaryKeyTyp - Typnummer des IT Systems - - SecondaryKeyTyp - - - - - Führende technische ID im IT System des Typs - SecondaryKeyTyp - - - - - - - TypThumbnail - www.company.com/ids/cd/4401_1272_7091_3437 - - - - - - - - TypThumbnail - Vorschaubild - - TypThumbnail - - - - - Darstellung des Produkttyps in kleinem Format - Small picture of the product type - - - - - - - AssetId - https://www.hsu-hh.de/aut/aas/assetid - - - - - - - - AssetId - Asset ID - - AssetId - - - - - Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. - Global unique ID of an asset, which can be read by both human and machine. - - - - - - - SecondaryKeyInstance - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - - - - - - SecondaryKeyInstance - Instanznummer des IT Systems - - SecondaryKeyInstance - - - - - Führende technische ID im IT System der Instanz - SecondaryKeyInstance - - - - - - - DateOfManufacture - 0173-1#02-AAR972#002 - - - - - - - - Date of manufacture - Herstellungsdatum - - Date of manufacture - - - DATE - - Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist - Date from which the production and / or development process is completed or from which a service is provided completely - - - - - - - DeviceRevision - https://www.hsu-hh.de/aut/aas/devicerevision - - - - - - - - DeviceRevision - DeviceRevision - - DeviceRevision - - - - - DeviceRevision - DeviceRevision - - - - - - - SoftwareRevision - https://www.hsu-hh.de/aut/aas/softwarerevision - - - - - - - - SoftwareRevision - SoftwareRevision - - SoftwareRevision - - - - - SoftwareRevision - SoftwareRevision - - - - - - - HardwareRevision - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - - - - - - HardwareRevision - HardwareRevision - - HardwareRevision - - - - - HardwareRevision - HardwareRevision - - - - - - - QrCode - https://www.hsu-hh.de/aut/aas/qrcode - - - - - - - - QrCode - QrCode - - QrCode - - - - - In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. - QrCode - - - - - - - CompanyLogo - https://www.hsu-hh.de/aut/aas/companylogo - - - - - - - - Firmenlogo - CompanyLogo - - CompanyLogo - - - - - Firmenlogo - CompanyLogo - - - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/04_Bosch.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/04_Bosch.aasx.xml deleted file mode 100644 index eb7d7280c..000000000 --- a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/04_Bosch.aasx.xml +++ /dev/null @@ -1,6691 +0,0 @@ - - - - - Bosch_CompactModuleBallRailSystem - http://boschrexroth.com/shells/R036037000/1005625831090001 - - - http://dc-qr.com?m=R036037000&s=1005625831090001&vc=CKK-090-NN-1 - - - - - - http://boschrexroth.com/shells/R036037000/1005625831090001/submodels/nameplate/ - - - - - http://boschrexroth.com/shells/R036037000/1005625831090001/submodels/document/ - - - - - http://boschrexroth.com/shells/R036037000/1005625831090001/submodels/service/ - - - - - http://boschrexroth.com/shells/R036037000/1005625831090001/submodels/identification/ - - - - - http://boschrexroth.com/shells/R036037000/1005625831090001/submodels/technicalSpecification/ - - - - - - - - - MR036037000_S1005625831090001 - CONSTANT - http://dc-qr.com?m=R036037000&s=1005625831090001&vc=CKK-090-NN-1 - Instance - - - - - Nameplate - http://boschrexroth.com/shells/R036037000/1005625831090001/submodels/nameplate/ - - - https://www.hsu-hh.de/aut/aas/nameplate - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Bosch Rexroth AG - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - Compact Module with ball screw drive (CKK) - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Zum Eisengießer 1 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 97816 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Lohr am Main - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Bayern - - - - false - false - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - string - Compact module - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 1005625831090001 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - ProductCountryOfOrigin - PARAMETER - - - 0173-1#02-AAO841#001 - - - Instance - - string - DE - - - - - YearOfConstruction - PARAMETER - - - 0173-1#02-AAP906#001 - - - Instance - - string - 2019 - - - - - Marking_CE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/marking_ce.png - - - - false - false - - - - - - Document - http://boschrexroth.com/shells/R036037000/1005625831090001/submodels/document/ - - - https://www.hsu-hh.de/aut/aas/document - - - Instance - - - - - Doku_Schmierung_CKx_V01_R320103051_2017_03 - PARAMETER - - - - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - R320103051 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung (DE) Operating Instructions (EN) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - 2017-03 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de/en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Erweiterungsdokumentation Schmierung CKK und CRK (de) / Extension instructions lubrication of CKK and CKR (en) - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - Doku_Schmierung_CKx_V01_R320103051_2017_03.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/Doku_Schmierung_CKx_V01_R320103051_2017_03.pdf - - - - false - false - - - - - R320103141_2015_06_Einbauerklaerung_einachsig - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R320103141 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung (DE) Operating Instructions (EN) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2015-06 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de/en/es/fr/it/pt/bg/cs/da/et/el/fi/ga/hu/is/lt/lv/mt/nl/no/pl/ro/sk/sl/sv/tr - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Einbauerklärung für einachsige Linearsysteme - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - R320103141_2015_06_Einbauerklaerung_einachsig.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/R320103141_2015_06_Einbauerklaerung_einachsig.pdf - - - - false - false - - - - - R320103152_2015_01_DE_Safety_LS_Media_22_01_2015 - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R320103152 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-03 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Allgemeine Sicherheit (DE) General Security (EN) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2015-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Sicherheitshinweise für Linearsysteme - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - R320103152_2015_01_DE_Safety_LS_Media_22_01_2015.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/R320103152_2015_01_DE_Safety_LS_Media_22_01_2015.pdf - - - - false - false - - - - - R320103152_2015_01_EN_Safety_LS_22_01_2015_web - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R320103152 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-03 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Allgemeine Sicherheit (DE) General Security (EN) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2015-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Sicherheitshinweise für Linearsysteme - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - R320103152_2015_01_EN_Safety_LS_22_01_2015_web.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/R320103152_2015_01_EN_Safety_LS_22_01_2015_web.pdf - - - - false - false - - - - - R320103982_DE_EN_FR_IT_2015-05_CKK - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R320103982 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung (DE) Operating Instructions (EN) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2015-05 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de/en/fr/it - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Anleitung / Instructions / Instructions / Istruzioni - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - R320103982_DE_EN_FR_IT_(2015_05)_CKK.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/R320103982_DE_EN_FR_IT_(2015_05)_CKK.pdf - - - - false - false - - - - - R999000479_2019_03_DE_18_07_2019_CKx - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R999000479 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung (DE) Operating Instructions (EN) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-03 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Katalog CKK / CKR - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - R999000479_2019_03_DE_18_07_2019_CKx.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/R999000479_2019_03_DE_18_07_2019_CKx.pdf - - - - false - false - - - - - R999000499_2019_03_EN_18_07_2019_CKx - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R999000499 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung (DE) Operating Instructions (EN) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-03 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Catalog CKK / CKR - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - R999000499_2019_03_EN_18_07_2019_CKx.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/R999000499_2019_03_EN_18_07_2019_CKx.pdf - - - - false - false - - - - - - Service - http://boschrexroth.com/shells/R036037000/1005625831090001/submodels/service/ - - - https://www.hsu-hh.de/aut/aas/service - - - Instance - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Bosch Rexroth AG Linear Motion Technologies - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Röntgenstraße 5 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 97424 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Schweinfurt - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Bayern - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - service.lt@boschrexroth.de - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.boschrexroth.com/en/xc/products/product-groups/linear-motion-technology/service-linear-motion-technology - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +49 9721 937 8617 - - - - false - false - - - - - - Identification - http://boschrexroth.com/shells/R036037000/1005625831090001/submodels/identification/ - - - https://www.hsu-hh.de/aut/aas/identification - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Bosch Rexroth AG - - - - - GLNOfManufacturer - PARAMETER - - - 0173-1#02-AAY812#001 - - - Instance - - string - 4048118000006 - - - - - SupplierOfTheIdentifier - - - 0173-1#02-AAP796#004 - - - Instance - - string - GLN GS1 - - - - - MAN_PROD_NUM - - - 0173-1#02-AAO676#003 - - - Instance - - string - R036037000 - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - CKK-090-NN-1 - - - - - ManufacturerProductDescription - PARAMETER - - - 0173-1#02-AAU734#001 - - - Instance - - langString - Compact Module with ball screw drive (CKK) - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - string - Compact Module - - - - - ClassificationSystem - PARAMETER - - - 0173-1#02-AAO715#002 - - - Instance - - string - eCl@ss - - - - - SecondaryKeyTyp - - - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - Instance - - - - - - - - TypThumbnail - PARAMETER - - - www.company.com/ids/cd/4401_1272_7091_3437 - - - Instance - - image/jpeg - /CKK.jpg - - - - - AssetId - PARAMETER - - - https://www.hsu-hh.de/aut/aas/assetid - - - Instance - - string - http://dc-qr.com?m=R036037000&s=1005625831090001&vc=CKK-090-NN-1 - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 1005625831090001 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - SecondaryKeyInstance - PARAMETER - - - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - Instance - - - - - - - - DateOfManufacture - PARAMETER - - - 0173-1#02-AAR972#002 - - - Instance - - - 2019 - - - - - DeviceRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/devicerevision - - - Instance - - - - - - - - SoftwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/softwarerevision - - - Instance - - - - - - - - HardwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - Instance - - - - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Bosch Rexroth AG - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Zum Eisengießer 1 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 97816 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Lohr am Main - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Bayern - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - service@boschrexroth.de - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.boschrexroth.com/de/de/home/index - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +499352405060 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - - - - - false - false - - - - - CompanyLogo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/companylogo - - - Instance - - image/png - /aasx/Identification/logo.png - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - http://dc-qr.com?m=R036037000&s=1005625831090001&vc=CKK-090-NN-1 - - - - - - TechnicalSpecification - http://boschrexroth.com/shells/R036037000/1005625831090001/submodels/technicalSpecification/ - - - https://www.hsu-hh.de/aut/aas/technicalspecification - - - Instance - - - - - MaxTraversePath - PARAMETER - - - - http://boschrexroth.com/cds/lt/maxTraversePath - - - Instance - - float - 210 - - - - - FormFeedConstant - PARAMETER - - - - http://boschrexroth.com/cds/lt/formFeedConstant - - - Instance - - float - 10,00 - - - - - MaxPermissibleSpeed - PARAMETER - - - - http://boschrexroth.com/cds/lt/maxPermissibleSpeed - - - Instance - - float - 1,13 - - - - - MaxPermissibleAcceleration - PARAMETER - - - - http://boschrexroth.com/cds/lt/maxPermissibleAcceleration - - - Instance - - float - 50,00 - - - - - MaxPermissibleTorque - PARAMETER - - - - http://boschrexroth.com/cds/lt/maxPermissibleTorque - - - Instance - - float - 4,42 - - - - - RotationDirectionPositiveMovement - PARAMETER - - - - http://boschrexroth.com/cds/lt/RotationDirectionPositiveMovement - - - Instance - - string - CW - - - - - GearTransmissionRatio - PARAMETER - - - - http://boschrexroth.com/cds/lt/GearTransmissionRatio - - - Instance - - float - 1,00 - - - - - - - - ManufacturerName - 0173-1#02-AAO677#002 - - - - - - - - Herstellername - Manufacturer Name - - Manufacturer Name - - - - - Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist - 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 - - - - - - - ManufacturerProductDesignation - 0173-1#02-AAW338#001 - - - - - - - - Manufacturer product designation - Herstellerproduktbezeichnung - - ManufacturerTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - PhysicalAddress - https://www.hsu-hh.de/aut/aas/physicaladdress - - - - - - - - PhysicalAddress - Physische Adresse - - PhysicalAddress - - - - - Sammlung für reale physische Adresse - Collection for real physical address - - - - - - - CountryCode - 0173-1#02-AAO730#001 - - - - - - - - - - - - Landeskennung - Country code - - Country code - - - - - Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes - agreed upon symbol for unambiguous identification of a country - - - - - - - Street - 0173-1#02-AAO128#001 - - - - - - - - Strasse - Street - - Street - - - - - Name der Strasse und Hausnummer - Street name and house number - - - - - - - Zip - 0173-1#02-AAO129#002 - - - - - - - - Zip - Postleitzahl - - PostalCode - - - - - ZIP code of address - Postleitzahl der Anschrift - - - - - - - CityTown - 0173-1#02-AAO132#001 - - - - - - - - Ort - City/town - - City/town - - - - - Town or city of the company - Ortsangabe - - - - - - - StateCounty - 0173-1#02-AAO133#002 - - - - - - - - state/county - Bundesland - - StateCounty - - - - - Bundesland - state/county - - - - - - - ManufacturerProductFamily - 0173-1#02-AAU731#001 - - - - - - - - Manufacturer product family - Herstellerproduktfamilie - - TypClass - - - - - 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie - 2nd level of a 3 level manufacturer specific product hierarchy - - - - - - - SerialNumber - 0173-1#02-AAM556#002 - - - - - - - - Serial number - Seriennummer - - InstanceId - - - - - eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist - unique combination of numbers and letters used to identify the device once it has been manufactured - - - - - - - BatchNumber - 0173-1#02-AAQ196#001 - - - - - - - - Batch number - Chargen-Nummer - - ChargeId - - - - - Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge - Number assigned by the manufacturer of a material to identify the manufacturer's batch - - - - - - - ProductCountryOfOrigin - 0173-1#02-AAO841#001 - - - - - - - - Produkt Ursprungsland - Product country of origin - - CountryOfOrigin - - - - - Land in dem das Produkt hergestellt wurde (Hersteller Land) - Country in which the product is manufactured (manufacturer country) - - - - - - - YearOfConstruction - 0173-1#02-AAP906#001 - - - - - - - - Year of construction - Baujahr - - YearOfConstruction - - - - - Jahreszahl als Datumsangabe für die Fertigstellung des Objektes - Year as completion date of object - - - - - - - ProductMarking - https://www.hsu-hh.de/aut/aas/productmarking - - - - - - - - Produktkennzeichnung - Product Marking - - ProductMarking - - - - - Sammlungsdatei für Produktkennzeichnung - Collection file for product marking - - - - - - - CEQualificationPresent - 0173-1#02-BAF053#008 - - - - - - - - CE-Kennzeichnung vorhanden - CE- qualification present - - CEMarkingPresent - - - BOOLEAN - - whether CE- qualification is present - Angabe, ob CE-Kennzeichnung vorhanden ist - - - - - - - File - 0173-1#02-AAD005#008 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Enthaltene Doku. Datei - Embedded Doc. file - - File - - - - - Verweis/ BLOB auf enthaltene Dokumentations-Datei. - Reference/ BLOB to embedded documentation file. - - - - - - - DocumentationItem - 0173-1#02-AAD001#001 - - - - - - - - Dokumentationsgruppe - Documentation item - - DocumentationItem - - - - - Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. - Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. - - - - - - - DocumentType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - - - - - - Dokumententyp - Document Type - - DocumentType - - - - - Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) - TBD - - - - - - - VDI2770_DomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - - - - - - Domain-Nummer - DomainId - - DomainId - - - - - Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. - TBD - - - - - - - VDI2770_IdType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - - - - - - Nummerntyp - IdType - - IdType - - - - - Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. - TBD - - - - - - - DocumentId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - - - - - - DocumentId - Dokumenten-Nummer - - DocumentId - - - - - Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. - TBD - - - - - - - DocumentDomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - - - - - - DocumentDomainId - DocumentDomainId - - DocumentDomainId - - - - - Kennung oder Kennzeichen einer Domäne - TBD - - - - - - - VDI2770_Role - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - - - - - - Rolle - Role - - Role - - - - - Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) - TBD - - - - - - - VDI2770_OrganisationId - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - - - - - - Organisation ID - Organisation ID - - OrganisationId - - - - - eindeutige ID für die Organisation - TBD - - - - - - - VDI2770_OrganisationName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - - - - - - OrganisationName - OrganisationName - - OrganisationName - - - - - gebräuchliche Bezeichnung für die Organisation - TBD - - - - - - - VDI2770_OrganisationOfficialName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - - - - - - Offizieller Name der Organisation - Organisation Official Name - - OrganisationOfficialName - - - - - offizieller Name der Organisation - TBD - - - - - - - VDI2770_Description - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - - - - - - Beschreibung - Description - - Description - - - - - Beschreibung für die nächste übergeordnete Collection - TBD - - - - - - - DocumentPartId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - - - - - - Dokumenten-Teilnummer - DocumentPartId - - DocumentPartId - - - - - Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. - TBD - - - - - - - DocumentClassification_ClassId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - - - - Dokumentkategorie - Document category - - DocCategory - - - - - Dokumentkategorie nach VDI 2770:2018/10 - Document category after VDI 2770:2018/10 - - - - - - - VDI2770_ClassName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - - - - - - Klassenname - Class Name - - ClassName - - - - - Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. - TBD - - - - - - - VDI2770_ClassificationSystem - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - - - - - - Klassifizierungssystem - classification system - - ClassificationSystem - - - - - Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. - TBD - - - - - - - DocumentVersionId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - - - - - - Dokumenten-Versionsnummer - DocumentVersionId - - DocumentVersionId - - - - - Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. - TBD - - - - - - - DocumentVersion_LanguageCode - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - - - - - - Sprachenschlüssel - LanguageCode - - LanguageCode - - - - - Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 - TBD - - - - - - - VDI2770_Title - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - - - - - - Titel - Title - - VDI2770_Title - - - - - sprachabhängiger Titel des Dokuments - TBD - - - - - - - VDI2770_Summary - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - - - - - - Zusammenfassung - Summary - - Summary - - - - - sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts - TBD - - - - - - - VDI2770_Keywords - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - - - - - - Schlagwörter - Keywords - - Keywords - - - - - sprachabhängige, durch Komma getrennte Liste von Schlagwörtern - TBD - - - - - - - VDI2770_StatusValue - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - - - - - - Statuswert - StatusValue - - StatusValue - - - - - Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) - TBD - - - - - - - VDI2770_SetDate - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - - - - - - Erstellungsdatum - Set Date - - SetDate - - - - - Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). - TBD - - - - - - - VDI2770_Purpose - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - - - - - - Zweck - Purpose - - Purpose - - - - - Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. - TBD - - - - - - - VDI2770_BasedOnProcedure - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - - - - - - Prozedur - Procedure - - BasedOnProcedure - - - - - textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt - TBD - - - - - - - VDI2770_Comments - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - - - - - - Kommentar - Comments - - Comments - - - - - textuelle Bemerkungen und Anmerkungen zum Status - TBD - - - - - - - VDI2770_ReferencedObject_Type - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - - - - - - Typ - Type - - Type - - - - - Für Type des Objekts muss immer Product angegeben werden. - TBD - - - - - - - VDI2770_ReferencedObject_RefType - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - - - - - - RefType - RefType - - RefType - - - - - Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) - TBD - - - - - - - VDI2770_ReferencedObject_ObjectId - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - - - - - - ObjectId - ObjectId - - ObjectId - - - - - Angabe der Identifikationsnummer zum Objekt - TBD - - - - - - - VDI2770_FileId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - - - - - - ID der Datei - File ID - - FileId - - - - - eindeutige ID für die Datei - TBD - - - - - - - VDI2770_FileName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - - - - - - Dateiname - File name - - FileName - - - - - Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. - TBD - - - - - - - VDI2770_FileFormat - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - - - - - - Datei Format - File format - - FileFormat - - - - - Angabe eines Media Typs gemäß der Liste der IANA - TBD - - - - - - - OrganisationContactInfo - https://www.hsu-hh.de/aut/aas/contactinfo - - - - - - - - Contact Info - Kontakt Info - - OrganisationContactInfo - - - - - Sammlung für die allgemeinen Kontaktdaten - Collection for general contact data - - - - - - - NameOfSupplier - 0173-1#02-AAO735#003 - - - - - - - - - - - - name of supplier - Lieferantenname - - name of supplier - - - - - Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt - name of supplier which provides the customer with a product or a service - - - - - - - ContactInfo_Role - https://www.hsu-hh.de/aut/aas/role - - - - - - - - Rolle - Role - - Role - - - - - Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt - Information to specify the role which the organisation of ContactInfo plays - - - - - - - Email - https://www.hsu-hh.de/aut/aas/email - - - - - - - - Emailadresse - Email address - - Email - - - - - Emailadresse - Email address - - - - - - - URL - 0173-1#02-AAO694#001 - - - - - - - - Internetadresse - Internet address - - URL - - - - - stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html - Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html - - - - - - - PhoneNumber - 0173-1#02-AAO136#002 - - - - - - - - Telefonnummer - telephone number - - Phone - - - - - vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist - complete telephone number to be called to reach a business partner - - - - - - - Fax - https://www.hsu-hh.de/aut/aas/fax - - - - - - - - Fax - Fax - - Fax - - - - - Faxnummer - Fax number - - - - - - - 0173-1#02-AAO136#002 - - - - - GLNOfManufacturer - 0173-1#02-AAY812#001 - - - - - - - - GLN of manufacturer - GLN des Herstellers - - GLN of manufacturer - - - - - international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort - internationally unique identification number for the manufacturer of the device or the product and for the physical location - - - - - - - SupplierOfTheIdentifier - 0173-1#02-AAP796#004 - - - - - - - - Supplier of the identifier - Anbieter der Identifikationsnummer für Hersteller - - Supplier of the identifier - - - STRING_TRANSLATABLE - - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - - - - - - - MAN_PROD_NUM - - product article number of manufacturer - - 0173-1#02-AAO676#003 - - - - - - - - product article number of manufacturer - Herstellerartikelnummer - - MAN_PROD_NUM - - - STRING_TRANSLATABLE - - eindeutiger Bestellschlüssel des Herstellers - unique product identifier of the manufacturer - - - - - - - ManufacturerProductDescription - 0173-1#02-AAU734#001 - - - - - - - - Manufacturer product description - Herstellerproduktbeschreibung - - Manufacturer product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - GLNOfSupplier - 0173-1#02-AAY813#001 - - - - - - - - GLN of supplier - GLN des Lieferanten - - GLN of supplier - - - - - international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort - internationally unique identification number for the supplier of the device or the product and for the physical location - - - - - - - SupplierIdProvider - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - - - - - - SupplierIdProvider - Anbieter der Identifikationsnummer - - SupplierIdProvider - - - STRING_TRANSLATABLE - - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - - - - - - - SUP_PROD_NUM - 0173-1#02-AAO736#004 - - - - - - - - product article number of supplier - Lieferantenartikelnummer - - product article number of supplier - - - - - eindeutiger Bestellschlüssel des Lieferanten - unique product order identifier of the supplier - - - - - - - SupplierProductDesignation - 0173-1#02-AAM551#002 - - - - - - - - Supplier product designation - Lieferantenproduktbezeichnung - - SupplierTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - SupplierProductDescription - 0173-1#02-AAU730#001 - - - - - - - - Supplier product description - Lieferantenproduktbeschreibung - - Supplier product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - ClassificationSystem - 0173-1#02-AAO715#002 - - - - - - - - classification system - Klassifizierungssystem - - ClassificationSystem - - - - - Klassifizierungssystem - Classification System - - - - - - - SecondaryKeyTyp - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - - - - - - SecondaryKeyTyp - Typnummer des IT Systems - - SecondaryKeyTyp - - - - - Führende technische ID im IT System des Typs - SecondaryKeyTyp - - - - - - - TypThumbnail - www.company.com/ids/cd/4401_1272_7091_3437 - - - - - - - - TypThumbnail - Vorschaubild - - TypThumbnail - - - - - Darstellung des Produkttyps in kleinem Format - Small picture of the product type - - - - - - - AssetId - https://www.hsu-hh.de/aut/aas/assetid - - - - - - - - AssetId - Asset ID - - AssetId - - - - - Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. - Global unique ID of an asset, which can be read by both human and machine. - - - - - - - SecondaryKeyInstance - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - - - - - - SecondaryKeyInstance - Instanznummer des IT Systems - - SecondaryKeyInstance - - - - - Führende technische ID im IT System der Instanz - SecondaryKeyInstance - - - - - - - DateOfManufacture - 0173-1#02-AAR972#002 - - - - - - - - Date of manufacture - Herstellungsdatum - - Date of manufacture - - - DATE - - Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist - Date from which the production and / or development process is completed or from which a service is provided completely - - - - - - - DeviceRevision - https://www.hsu-hh.de/aut/aas/devicerevision - - - - - - - - DeviceRevision - DeviceRevision - - DeviceRevision - - - - - DeviceRevision - DeviceRevision - - - - - - - SoftwareRevision - https://www.hsu-hh.de/aut/aas/softwarerevision - - - - - - - - SoftwareRevision - SoftwareRevision - - SoftwareRevision - - - - - SoftwareRevision - SoftwareRevision - - - - - - - HardwareRevision - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - - - - - - HardwareRevision - HardwareRevision - - HardwareRevision - - - - - HardwareRevision - HardwareRevision - - - - - - - QrCode - https://www.hsu-hh.de/aut/aas/qrcode - - - - - - - - QrCode - QrCode - - QrCode - - - - - In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. - QrCode - - - - - - - CompanyLogo - https://www.hsu-hh.de/aut/aas/companylogo - - - - - - - - Firmenlogo - CompanyLogo - - CompanyLogo - - - - - Firmenlogo - CompanyLogo - - - - - - - MaxTraversePath - http://boschrexroth.com/cds/lt/MaxTraversePath - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Max. Verfahrweg (mm) - Max. traverse path (mm) - - MaxTraversePath - mm - - - 0173-1#05-AAA480#003 - - - - smax_mm - REAL_MEASURE - - - - - - - FormFeedConstant - http://boschrexroth.com/cds/lt/FormFeedConstant - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Vorschubkonstante (mm/U) - Form feed constant (mm/U) - - FormFeedConstant - mm/U - - - - - u_mmpU - REAL_MEASURE - - - - - - - MaxPermissibleSpeed - http://boschrexroth.com/cds/lt/MaxPermissibleSpeed - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Maximal zulässige Geschwindigkeit (m/s) - Maximum permissible speed (m/s) - - MaxPermissibleSpeed - m/s - - - 0173-1#05-AAA434#003 - - - - vmax_mps - REAL_MEASURE - - - - - - - MaxPermissibleAcceleration - http://boschrexroth.com/cds/lt/MaxPermissibleAcceleration - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Maximal zulässige Beschleunigung (m/s²) - Maximum permissible acceleration (m/s²) - - MaxPermissibleAcceleration - m/s² - - - 0173-1#05-AAA597#003 - - - - amax_mps2 - REAL_MEASURE - - - - - - - MaxPermissibleTorque - http://boschrexroth.com/cds/lt/MaxPermissibleTorque - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Maximal zulässiges Drehmoment (Nm) - Maximum permissible torque (Nm) - - MaxPermissibleTorque - Nm - - - - - M1max_Nm - REAL_MEASURE - - - - - - - RotationDirectionPositiveMovement - http://boschrexroth.com/cds/lt/RotationDirectionPositiveMovement - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Drehrichtung für positive Fahrrichtung (weg vom Motor) - Rotation direction for positive movement - - RotationDirectionPositiveMovement - - - - - - d - STRING - - - - - - - GearTransmissionRatio - http://boschrexroth.com/cds/lt/GearTransmissionRatio - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Getriebeübersetzung - Gear transmission ratio - - GearTransmissionRatio - - - - - - i - REAL_MEASURE - - - - - - - CEQualificationPresent - 0173-1#02-BAF053#008 - - - - - - - - CE-Kennzeichnung vorhanden - CE- qualification present - - CEMarkingPresent - - - BOOLEAN - - whether CE- qualification is present - Angabe, ob CE-Kennzeichnung vorhanden ist - - - - - - - ProductMarking - https://www.hsu-hh.de/aut/aas/productmarking - - - - - - - - Produktkennzeichnung - Product Marking - - ProductMarking - - - - - Sammlungsdatei für Produktkennzeichnung - Collection file for product marking - - - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/05_Bosch.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/05_Bosch.aasx.xml deleted file mode 100644 index ebf6a52ff..000000000 --- a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/05_Bosch.aasx.xml +++ /dev/null @@ -1,6177 +0,0 @@ - - - - - Bosch_CompactModuleToothedBeltDrive - http://boschrexroth.com/shells/R036447000/1005625831070001 - - - http://dc-qr.com?m=R036447000&s=1005625831070001 - - - - - - http://boschrexroth.com/shells/R036447000/1005625831070001/submodels/nameplate/ - - - - - http://boschrexroth.com/shells/R036447000/1005625831070001/submodels/document/ - - - - - http://boschrexroth.com/shells/R036447000/1005625831070001/submodels/service/ - - - - - http://boschrexroth.com/shells/R036447000/1005625831070001/submodels/identification/ - - - - - http://boschrexroth.com/shells/R036447000/1005625831070001/submodels/technicalSpecification/ - - - - - - - - - MR036447000_S1005625831070001 - http://dc-qr.com?m=R036447000&s=1005625831070001 - Instance - - - - - Nameplate - http://boschrexroth.com/shells/R036447000/1005625831070001/submodels/nameplate/ - - - https://www.hsu-hh.de/aut/aas/nameplate - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Bosch Rexroth AG - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - Compact Module with toothed belt drive (CKR) - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Zum Eisengießer 1 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 97816 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Lohr am Main - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Bayern - - - - false - false - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - string - Compact Module - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 1005625831070001 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - ProductCountryOfOrigin - PARAMETER - - - 0173-1#02-AAO841#001 - - - Instance - - string - DE - - - - - YearOfConstruction - PARAMETER - - - 0173-1#02-AAP906#001 - - - Instance - - string - 2019 - - - - - Marking_CE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/marking_ce.png - - - - false - false - - - - - - Service - http://boschrexroth.com/shells/R036447000/1005625831070001/submodels/service/ - - - https://www.hsu-hh.de/aut/aas/service - - - Instance - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Bosch Rexroth AG Linear Motion Technologies - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Röntgenstraße 5 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 97424 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Schweinfurt - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Bayern - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - service.lt@boschrexroth.de - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.boschrexroth.com/en/xc/products/product-groups/linear-motion-technology/service-linear-motion-technology - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +49 9721 937 8617 - - - - false - false - - - - - - Identification - http://boschrexroth.com/shells/R036447000/1005625831070001/submodels/identification/ - - - https://www.hsu-hh.de/aut/aas/identification - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Bosch Rexroth AG - - - - - GLNOfManufacturer - PARAMETER - - - 0173-1#02-AAY812#001 - - - Instance - - string - 4048118000006 - - - - - SupplierOfTheIdentifier - - - 0173-1#02-AAP796#004 - - - Instance - - string - GLN GS1 - - - - - MAN_PROD_NUM - - - 0173-1#02-AAO676#003 - - - Instance - - string - R036447000 - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - CKR-110-NN-1 - - - - - ManufacturerProductDescription - PARAMETER - - - 0173-1#02-AAU734#001 - - - Instance - - langString - Compact Modules with toothed belt drive (CKR) - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - string - Compact Module - - - - - ClassificationSystem - PARAMETER - - - 0173-1#02-AAO715#002 - - - Instance - - string - eCl@ss - - - - - SecondaryKeyTyp - - - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - Instance - - - - - - - - TypThumbnail - PARAMETER - - - www.company.com/ids/cd/4401_1272_7091_3437 - - - Instance - - image/jpeg - /CKR.jpg - - - - - AssetId - PARAMETER - - - https://www.hsu-hh.de/aut/aas/assetid - - - Instance - - string - http://dc-qr.com?m=R036447000&s=1005625831070001 - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 1005625831070001 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - SecondaryKeyInstance - PARAMETER - - - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - Instance - - - - - - - - DateOfManufacture - PARAMETER - - - 0173-1#02-AAR972#002 - - - Instance - - - 2019 - - - - - DeviceRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/devicerevision - - - Instance - - - - - - - - SoftwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/softwarerevision - - - Instance - - - - - - - - HardwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - Instance - - - - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Bosch Rexroth AG - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Zum Eisengießer 1 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 97816 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Lohr am Main - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Bayern - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - service@boschrexroth.de - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.boschrexroth.com/de/de/home/index - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +499352405060 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - - - - - false - false - - - - - CompanyLogo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/companylogo - - - Instance - - image/png - /aasx/Identification/logo.png - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - http://dc-qr.com?m=R036447000&s=1005625831070001 - - - - - - TechnicalSpecification - http://boschrexroth.com/shells/R036447000/1005625831070001/submodels/technicalSpecification/ - - - https://www.hsu-hh.de/aut/aas/technicalspecification - - - Instance - - - - - MaxTraversePath - PARAMETER - - - - http://boschrexroth.com/cds/lt/maxTraversePath - - - Instance - - float - 280 - - - - - FormFeedConstant - PARAMETER - - - - http://boschrexroth.com/cds/lt/formFeedConstant - - - Instance - - float - 120,00 - - - - - MaxPermissibleSpeed - PARAMETER - - - - http://boschrexroth.com/cds/lt/maxPermissibleSpeed - - - Instance - - float - 2,00 - - - - - MaxPermissibleAcceleration - PARAMETER - - - - http://boschrexroth.com/cds/lt/maxPermissibleAcceleration - - - Instance - - float - 50,00 - - - - - MaxPermissibleTorque - PARAMETER - - - - http://boschrexroth.com/cds/lt/maxPermissibleTorque - - - Instance - - float - 1,30 - - - - - RotationDirectionPositiveMovement - PARAMETER - - - - http://boschrexroth.com/cds/lt/RotationDirectionPositiveMovement - - - Instance - - string - CCW - - - - - GearTransmissionRatio - PARAMETER - - - - http://boschrexroth.com/cds/lt/GearTransmissionRatio - - - Instance - - float - 10,00 - - - - - - Document - http://boschrexroth.com/shells/R036447000/1005625831070001/submodels/document/ - - - https://www.hsu-hh.de/aut/aas/document - - - Instance - - - - - Doku_Schmierung_CKx_V01_R320103051_2017_03 - PARAMETER - - - - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - R320103051 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung (DE) Operating Instructions (EN) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - 2017-03 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de/en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Erweiterungsdokumentation Schmierung CKK und CRK (DE) / Extension instructions lubrication of CKK and CKR (EN) - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - Doku_Schmierung_CKx_V01_R320103051_2017_03.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/Doku_Schmierung_CKx_V01_R320103051_2017_03.pdf - - - - false - false - - - - - R320103141_2015_06_Einbauerklaerung_einachsig - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R320103141 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung (DE) Operating Instructions (EN) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2015-06 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de/en/es/fr/it/pt/bg/cs/da/et/el/fi/ga/hu/is/lt/lv/mt/nl/no/pl/ro/sk/sl/sv/tr - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Einbauerklärung für einachsige Linearsysteme - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - R320103141_2015_06_Einbauerklaerung_einachsig.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/R320103141_2015_06_Einbauerklaerung_einachsig.pdf - - - - false - false - - - - - R320103152_2015_01_DE_Safety_LS_Media_22_01_2015 - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R320103152 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-03 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Allgemeine Sicherheit (DE) General Security (EN) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2015-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Sicherheitshinweise für Linearsysteme - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - R320103152_2015_01_DE_Safety_LS_Media_22_01_2015.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/R320103152_2015_01_DE_Safety_LS_Media_22_01_2015.pdf - - - - false - false - - - - - R320103152_2015_01_EN_Safety_LS_22_01_2015_web - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R320103152 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-03 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Allgemeine Sicherheit (DE) General Security (EN) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2015-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Safety Instructions for Linear Motion Systems - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - R320103152_2015_01_EN_Safety_LS_22_01_2015_web.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/R320103152_2015_01_EN_Safety_LS_22_01_2015_web.pdf - - - - false - false - - - - - R999000479_2019_03_DE_18_07_2019_CKx - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R999000479 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung (DE) Operating Instructions (EN) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-03 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Compactmodule CKK / CKR - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - R999000479_2019_03_DE_18_07_2019_CKx.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/R999000479_2019_03_DE_18_07_2019_CKx.pdf - - - - false - false - - - - - R999000499_2019_03_EN_18_07_2019_CKx - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R999000499 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung (DE) Operating Instructions (EN) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2019-03 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Compact Modules CKK / CKR - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - R999000499_2019_03_EN_18_07_2019_CKx_(1).pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/R999000499_2019_03_EN_18_07_2019_CKx_(1).pdf - - - - false - false - - - - - - - - ManufacturerName - 0173-1#02-AAO677#002 - - - - - - - - Herstellername - Manufacturer Name - - Manufacturer Name - - - - - Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist - 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 - - - - - - - ManufacturerProductDesignation - 0173-1#02-AAW338#001 - - - - - - - - Manufacturer product designation - Herstellerproduktbezeichnung - - ManufacturerTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - PhysicalAddress - https://www.hsu-hh.de/aut/aas/physicaladdress - - - - - - - - PhysicalAddress - Physische Adresse - - PhysicalAddress - - - - - Sammlung für reale physische Adresse - Collection for real physical address - - - - - - - CountryCode - 0173-1#02-AAO730#001 - - - - - - - - - - - - Landeskennung - Country code - - Country code - - - - - Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes - agreed upon symbol for unambiguous identification of a country - - - - - - - Street - 0173-1#02-AAO128#001 - - - - - - - - Strasse - Street - - Street - - - - - Name der Strasse und Hausnummer - Street name and house number - - - - - - - Zip - 0173-1#02-AAO129#002 - - - - - - - - Zip - Postleitzahl - - PostalCode - - - - - ZIP code of address - Postleitzahl der Anschrift - - - - - - - CityTown - 0173-1#02-AAO132#001 - - - - - - - - Ort - City/town - - City/town - - - - - Town or city of the company - Ortsangabe - - - - - - - StateCounty - 0173-1#02-AAO133#002 - - - - - - - - state/county - Bundesland - - StateCounty - - - - - Bundesland - state/county - - - - - - - ManufacturerProductFamily - 0173-1#02-AAU731#001 - - - - - - - - Manufacturer product family - Herstellerproduktfamilie - - TypClass - - - - - 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie - 2nd level of a 3 level manufacturer specific product hierarchy - - - - - - - SerialNumber - 0173-1#02-AAM556#002 - - - - - - - - Serial number - Seriennummer - - InstanceId - - - - - eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist - unique combination of numbers and letters used to identify the device once it has been manufactured - - - - - - - BatchNumber - 0173-1#02-AAQ196#001 - - - - - - - - Batch number - Chargen-Nummer - - ChargeId - - - - - Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge - Number assigned by the manufacturer of a material to identify the manufacturer's batch - - - - - - - ProductCountryOfOrigin - 0173-1#02-AAO841#001 - - - - - - - - Produkt Ursprungsland - Product country of origin - - CountryOfOrigin - - - - - Land in dem das Produkt hergestellt wurde (Hersteller Land) - Country in which the product is manufactured (manufacturer country) - - - - - - - YearOfConstruction - 0173-1#02-AAP906#001 - - - - - - - - Year of construction - Baujahr - - YearOfConstruction - - - - - Jahreszahl als Datumsangabe für die Fertigstellung des Objektes - Year as completion date of object - - - - - - - ProductMarking - https://www.hsu-hh.de/aut/aas/productmarking - - - - - - - - Produktkennzeichnung - Product Marking - - ProductMarking - - - - - Sammlungsdatei für Produktkennzeichnung - Collection file for product marking - - - - - - - CEQualificationPresent - 0173-1#02-BAF053#008 - - - - - - - - CE-Kennzeichnung vorhanden - CE- qualification present - - CEMarkingPresent - - - BOOLEAN - - whether CE- qualification is present - Angabe, ob CE-Kennzeichnung vorhanden ist - - - - - - - File - 0173-1#02-AAD005#008 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Enthaltene Doku. Datei - Embedded Doc. file - - File - - - - - Verweis/ BLOB auf enthaltene Dokumentations-Datei. - Reference/ BLOB to embedded documentation file. - - - - - - - DocumentationItem - - - - - - - - - Dokumentationsgruppe - Documentation item - - DocumentationItem - - - - - Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. - Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. - - - - - - - DocumentType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - - - - - - Dokumententyp - Document Type - - DocumentType - - - - - Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) - TBD - - - - - - - VDI2770_DomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - - - - - - Domain-Nummer - DomainId - - DomainId - - - - - Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. - TBD - - - - - - - VDI2770_IdType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - - - - - - Nummerntyp - IdType - - IdType - - - - - Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. - TBD - - - - - - - DocumentId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - - - - - - DocumentId - Dokumenten-Nummer - - DocumentId - - - - - Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. - TBD - - - - - - - DocumentDomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - - - - - - DocumentDomainId - DocumentDomainId - - DocumentDomainId - - - - - Kennung oder Kennzeichen einer Domäne - TBD - - - - - - - VDI2770_Role - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - - - - - - Rolle - Role - - Role - - - - - Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) - TBD - - - - - - - VDI2770_OrganisationId - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - - - - - - Organisation ID - Organisation ID - - OrganisationId - - - - - eindeutige ID für die Organisation - TBD - - - - - - - VDI2770_OrganisationName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - - - - - - OrganisationName - OrganisationName - - OrganisationName - - - - - gebräuchliche Bezeichnung für die Organisation - TBD - - - - - - - VDI2770_OrganisationOfficialName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - - - - - - Offizieller Name der Organisation - Organisation Official Name - - OrganisationOfficialName - - - - - offizieller Name der Organisation - TBD - - - - - - - VDI2770_Description - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - - - - - - Beschreibung - Description - - Description - - - - - Beschreibung für die nächste übergeordnete Collection - TBD - - - - - - - DocumentPartId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - - - - - - Dokumenten-Teilnummer - DocumentPartId - - DocumentPartId - - - - - Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. - TBD - - - - - - - DocumentClassification_ClassId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - - - - Dokumentkategorie - Document category - - DocCategory - - - - - Dokumentkategorie nach VDI 2770:2018/10 - Document category after VDI 2770:2018/10 - - - - - - - VDI2770_ClassName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - - - - - - Klassenname - Class Name - - ClassName - - - - - Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. - TBD - - - - - - - VDI2770_ClassificationSystem - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - - - - - - Klassifizierungssystem - classification system - - ClassificationSystem - - - - - Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. - TBD - - - - - - - DocumentVersionId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - - - - - - Dokumenten-Versionsnummer - DocumentVersionId - - DocumentVersionId - - - - - Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. - TBD - - - - - - - DocumentVersion_LanguageCode - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - - - - - - Sprachenschlüssel - LanguageCode - - LanguageCode - - - - - Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 - TBD - - - - - - - VDI2770_Title - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - - - - - - Titel - Title - - VDI2770_Title - - - - - sprachabhängiger Titel des Dokuments - TBD - - - - - - - VDI2770_Summary - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - - - - - - Zusammenfassung - Summary - - Summary - - - - - sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts - TBD - - - - - - - VDI2770_Keywords - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - - - - - - Schlagwörter - Keywords - - Keywords - - - - - sprachabhängige, durch Komma getrennte Liste von Schlagwörtern - TBD - - - - - - - VDI2770_StatusValue - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - - - - - - Statuswert - StatusValue - - StatusValue - - - - - Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) - TBD - - - - - - - VDI2770_SetDate - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - - - - - - Erstellungsdatum - Set Date - - SetDate - - - - - Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). - TBD - - - - - - - VDI2770_Purpose - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - - - - - - Zweck - Purpose - - Purpose - - - - - Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. - TBD - - - - - - - VDI2770_BasedOnProcedure - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - - - - - - Prozedur - Procedure - - BasedOnProcedure - - - - - textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt - TBD - - - - - - - VDI2770_Comments - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - - - - - - Kommentar - Comments - - Comments - - - - - textuelle Bemerkungen und Anmerkungen zum Status - TBD - - - - - - - VDI2770_ReferencedObject_Type - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - - - - - - Typ - Type - - Type - - - - - Für Type des Objekts muss immer Product angegeben werden. - TBD - - - - - - - VDI2770_ReferencedObject_RefType - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - - - - - - RefType - RefType - - RefType - - - - - Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) - TBD - - - - - - - VDI2770_ReferencedObject_ObjectId - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - - - - - - ObjectId - ObjectId - - ObjectId - - - - - Angabe der Identifikationsnummer zum Objekt - TBD - - - - - - - VDI2770_FileId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - - - - - - ID der Datei - File ID - - FileId - - - - - eindeutige ID für die Datei - TBD - - - - - - - VDI2770_FileName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - - - - - - Dateiname - File name - - FileName - - - - - Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. - TBD - - - - - - - VDI2770_FileFormat - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - - - - - - Datei Format - File format - - FileFormat - - - - - Angabe eines Media Typs gemäß der Liste der IANA - TBD - - - - - - - OrganisationContactInfo - https://www.hsu-hh.de/aut/aas/contactinfo - - - - - - - - Contact Info - Kontakt Info - - OrganisationContactInfo - - - - - Sammlung für die allgemeinen Kontaktdaten - Collection for general contact data - - - - - - - NameOfSupplier - 0173-1#02-AAO735#003 - - - - - - - - - - - - name of supplier - Lieferantenname - - name of supplier - - - - - Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt - name of supplier which provides the customer with a product or a service - - - - - - - ContactInfo_Role - https://www.hsu-hh.de/aut/aas/role - - - - - - - - Rolle - Role - - Role - - - - - Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt - Information to specify the role which the organisation of ContactInfo plays - - - - - - - Email - https://www.hsu-hh.de/aut/aas/email - - - - - - - - Emailadresse - Email address - - Email - - - - - Emailadresse - Email address - - - - - - - URL - 0173-1#02-AAO694#001 - - - - - - - - Internetadresse - Internet address - - URL - - - - - stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html - Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html - - - - - - - PhoneNumber - 0173-1#02-AAO136#002 - - - - - - - - Telefonnummer - telephone number - - Phone - - - - - vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist - complete telephone number to be called to reach a business partner - - - - - - - Fax - https://www.hsu-hh.de/aut/aas/fax - - - - - - - - Fax - Fax - - Fax - - - - - Faxnummer - Fax number - - - - - - - 0173-1#02-AAO136#002 - - - - - GLNOfManufacturer - 0173-1#02-AAY812#001 - - - - - - - - GLN of manufacturer - GLN des Herstellers - - GLN of manufacturer - - - - - international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort - internationally unique identification number for the manufacturer of the device or the product and for the physical location - - - - - - - SupplierOfTheIdentifier - 0173-1#02-AAP796#004 - - - - - - - - Supplier of the identifier - Anbieter der Identifikationsnummer für Hersteller - - Supplier of the identifier - - - STRING_TRANSLATABLE - - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - - - - - - - MAN_PROD_NUM - - product article number of manufacturer - - 0173-1#02-AAO676#003 - - - - - - - - product article number of manufacturer - Herstellerartikelnummer - - MAN_PROD_NUM - - - STRING_TRANSLATABLE - - eindeutiger Bestellschlüssel des Herstellers - unique product identifier of the manufacturer - - - - - - - ManufacturerProductDescription - 0173-1#02-AAU734#001 - - - - - - - - Manufacturer product description - Herstellerproduktbeschreibung - - Manufacturer product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - GLNOfSupplier - 0173-1#02-AAY813#001 - - - - - - - - GLN of supplier - GLN des Lieferanten - - GLN of supplier - - - - - international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort - internationally unique identification number for the supplier of the device or the product and for the physical location - - - - - - - SupplierIdProvider - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - - - - - - SupplierIdProvider - Anbieter der Identifikationsnummer - - SupplierIdProvider - - - STRING_TRANSLATABLE - - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - - - - - - - SUP_PROD_NUM - 0173-1#02-AAO736#004 - - - - - - - - product article number of supplier - Lieferantenartikelnummer - - product article number of supplier - - - - - eindeutiger Bestellschlüssel des Lieferanten - unique product order identifier of the supplier - - - - - - - SupplierProductDesignation - 0173-1#02-AAM551#002 - - - - - - - - Supplier product designation - Lieferantenproduktbezeichnung - - SupplierTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - SupplierProductDescription - 0173-1#02-AAU730#001 - - - - - - - - Supplier product description - Lieferantenproduktbeschreibung - - Supplier product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - ClassificationSystem - 0173-1#02-AAO715#002 - - - - - - - - classification system - Klassifizierungssystem - - ClassificationSystem - - - - - Klassifizierungssystem - Classification System - - - - - - - SecondaryKeyTyp - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - - - - - - SecondaryKeyTyp - Typnummer des IT Systems - - SecondaryKeyTyp - - - - - Führende technische ID im IT System des Typs - SecondaryKeyTyp - - - - - - - TypThumbnail - www.company.com/ids/cd/4401_1272_7091_3437 - - - - - - - - TypThumbnail - Vorschaubild - - TypThumbnail - - - - - Darstellung des Produkttyps in kleinem Format - Small picture of the product type - - - - - - - AssetId - https://www.hsu-hh.de/aut/aas/assetid - - - - - - - - AssetId - Asset ID - - AssetId - - - - - Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. - Global unique ID of an asset, which can be read by both human and machine. - - - - - - - SecondaryKeyInstance - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - - - - - - SecondaryKeyInstance - Instanznummer des IT Systems - - SecondaryKeyInstance - - - - - Führende technische ID im IT System der Instanz - SecondaryKeyInstance - - - - - - - DateOfManufacture - 0173-1#02-AAR972#002 - - - - - - - - Date of manufacture - Herstellungsdatum - - Date of manufacture - - - DATE - - Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist - Date from which the production and / or development process is completed or from which a service is provided completely - - - - - - - DeviceRevision - https://www.hsu-hh.de/aut/aas/devicerevision - - - - - - - - DeviceRevision - DeviceRevision - - DeviceRevision - - - - - DeviceRevision - DeviceRevision - - - - - - - SoftwareRevision - https://www.hsu-hh.de/aut/aas/softwarerevision - - - - - - - - SoftwareRevision - SoftwareRevision - - SoftwareRevision - - - - - SoftwareRevision - SoftwareRevision - - - - - - - HardwareRevision - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - - - - - - HardwareRevision - HardwareRevision - - HardwareRevision - - - - - HardwareRevision - HardwareRevision - - - - - - - QrCode - https://www.hsu-hh.de/aut/aas/qrcode - - - - - - - - QrCode - QrCode - - QrCode - - - - - In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. - QrCode - - - - - - - CompanyLogo - https://www.hsu-hh.de/aut/aas/companylogo - - - - - - - - Firmenlogo - CompanyLogo - - CompanyLogo - - - - - Firmenlogo - CompanyLogo - - - - - - - MaxTraversePath - http://boschrexroth.com/cds/lt/MaxTraversePath - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Max. Verfahrweg (mm) - Max. traverse path (mm) - - MaxTraversePath - mm - - - 0173-1#05-AAA480#003 - - - - smax_mm - REAL_MEASURE - - - - - - - FormFeedConstant - http://boschrexroth.com/cds/lt/FormFeedConstant - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Vorschubkonstante (mm/U) - Form feed constant (mm/U) - - FormFeedConstant - mm/U - - - - - u_mmpU - REAL_MEASURE - - - - - - - MaxPermissibleSpeed - http://boschrexroth.com/cds/lt/MaxPermissibleSpeed - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Maximal zulässige Geschwindigkeit (m/s) - Maximum permissible speed (m/s) - - MaxPermissibleSpeed - m/s - - - 0173-1#05-AAA434#003 - - - - vmax_mps - REAL_MEASURE - - - - - - - MaxPermissibleAcceleration - http://boschrexroth.com/cds/lt/MaxPermissibleAcceleration - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Maximal zulässige Beschleunigung (m/s²) - Maximum permissible acceleration (m/s²) - - MaxPermissibleAcceleration - m/s² - - - 0173-1#05-AAA597#003 - - - - amax_mps2 - REAL_MEASURE - - - - - - - MaxPermissibleTorque - http://boschrexroth.com/cds/lt/MaxPermissibleTorque - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Maximal zulässiges Drehmoment (Nm) - Maximum permissible torque (Nm) - - MaxPermissibleTorque - Nm - - - - - M1max_Nm - REAL_MEASURE - - - - - - - RotationDirectionPositiveMovement - http://boschrexroth.com/cds/lt/RotationDirectionPositiveMovement - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Drehrichtung für positive Fahrrichtung (weg vom Motor) - Rotation direction for positive movement - - RotationDirectionPositiveMovement - - - - - - d - STRING - - - - - - - GearTransmissionRatio - http://boschrexroth.com/cds/lt/GearTransmissionRatio - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Getriebeübersetzung - Gear transmission ratio - - GearTransmissionRatio - - - - - - i - REAL_MEASURE - - - - - - - DocumentationItem - 0173-1#02-AAD001#001 - - - - - - - - Dokumentationsgruppe - Documentation item - - DocumentationItem - - - - - Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. - Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. - - - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/06_Bosch.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/06_Bosch.aasx.xml deleted file mode 100644 index 067ccce55..000000000 --- a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/06_Bosch.aasx.xml +++ /dev/null @@ -1,6640 +0,0 @@ - - - - - Bosch_PrecisionModulePSK - http://boschrexroth.com/shells/R055732577/1012160102010001 - - - http://dc-qr.com?m=R055732577&t=PSK-060-NN-1&s=1012160102010001 - - - - - - http://boschrexroth.com/shells/R055732577/1012160102010001/submodels/nameplate/ - - - - - http://boschrexroth.com/shells/R055732577/1012160102010001/submodels/document/ - - - - - http://boschrexroth.com/shells/R055732577/1012160102010001/submodels/service/ - - - - - http://boschrexroth.com/shells/R055732577/1012160102010001/submodels/identification/ - - - - - http://boschrexroth.com/shells/R055732577/1012160102010001/submodels/technicalSpecification/ - - - - - - - - - MR055732577_S1012160102010001 - http://dc-qr.com?m=R055732577&t=PSK-060-NN-1&s=1012160102010001 - Instance - - - - - Nameplate - http://boschrexroth.com/shells/R055732577/1012160102010001/submodels/nameplate/ - - - https://www.hsu-hh.de/aut/aas/nameplate - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Bosch Rexroth AG - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - Precision Module PSK - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Zum Eisengießer 1 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 97816 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Lohr am Main - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Bayern - - - - false - false - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - string - Precision Module PSK - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 1012160102010001 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - ProductCountryOfOrigin - PARAMETER - - - 0173-1#02-AAO841#001 - - - Instance - - string - DE - - - - - YearOfConstruction - PARAMETER - - - 0173-1#02-AAP906#001 - - - Instance - - string - 2019 - - - - - Marking_CE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/marking_ce.png - - - - false - false - - - - - - Service - http://boschrexroth.com/shells/R055732577/1012160102010001/submodels/service/ - - - https://www.hsu-hh.de/aut/aas/service - - - Instance - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Bosch Rexroth AG Service Linear Motion Technologies - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Röntgenstraße 5 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 97424 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Schweinfurt - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Bayern - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - service.lt@boschrexroth.de - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.boschrexroth.com/en/xc/products/product-groups/linear-motion-technology/service-linear-motion-technology - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +49 9721 937 8617 - - - - false - false - - - - - - Identification - http://boschrexroth.com/shells/R055732577/1012160102010001/submodels/identification/ - - - https://www.hsu-hh.de/aut/aas/identification - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Bosch Rexroth AG - - - - - GLNOfManufacturer - PARAMETER - - - 0173-1#02-AAY812#001 - - - Instance - - string - 4048118000006 - - - - - SupplierOfTheIdentifier - - - 0173-1#02-AAP796#004 - - - Instance - - string - GLN GS1 - - - - - MAN_PROD_NUM - - - 0173-1#02-AAO676#003 - - - Instance - - string - PSK-060-NN-1 - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - Precision Module - - - - - ManufacturerProductDescription - PARAMETER - - - 0173-1#02-AAU734#001 - - - Instance - - langString - Precision Module + Integrated Ball Rail System + Precision Ball Screw Assembly - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - string - Linear motion system - - - - - ClassificationSystem - PARAMETER - - - 0173-1#02-AAO715#002 - - - Instance - - string - eCl@ss - - - - - SecondaryKeyTyp - - - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - Instance - - - - - - - - TypThumbnail - PARAMETER - - - www.company.com/ids/cd/4401_1272_7091_3437 - - - Instance - - image/jpeg - /PSK.jpg - - - - - AssetId - PARAMETER - - - https://www.hsu-hh.de/aut/aas/assetid - - - Instance - - string - http://dc-qr.com?m=R055732577&s=1012160102010001&t=PSK-060-NN-1 - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 1012160102010001 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - SecondaryKeyInstance - PARAMETER - - - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - Instance - - - - - - - - DateOfManufacture - PARAMETER - - - 0173-1#02-AAR972#002 - - - Instance - - - 2019 - - - - - DeviceRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/devicerevision - - - Instance - - - - - - - - SoftwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/softwarerevision - - - Instance - - - - - - - - HardwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - Instance - - - - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Bosch Rexroth AG - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Zum Eisengießer 1 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 97816 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Lohr am Main - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Bayern - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - service@boschrexroth.de - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.boschrexroth.com/de/de/home/index - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +499352405060 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - - - - - false - false - - - - - CompanyLogo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/companylogo - - - Instance - - image/png - /aasx/Identification/logo.png - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - http://dc-qr.com?m=R055732577&s=1012160102010001 - - - - - - TechnicalSpecification - http://boschrexroth.com/shells/R055732577/1012160102010001/submodels/technicalSpecification/ - - - https://www.hsu-hh.de/aut/aas/technicalspecification - - - Instance - - - - - MaxTraversePath - PARAMETER - - - - http://boschrexroth.com/cds/lt/maxTraversePath - - - Instance - - float - 140,00 - - - - - FormFeedConstant - PARAMETER - - - - http://boschrexroth.com/cds/lt/formFeedConstant - - - Instance - - float - 10,00 - - - - - MaxPermissibleSpeed - PARAMETER - - - - http://boschrexroth.com/cds/lt/maxPermissibleSpeed - - - Instance - - float - 1,17 - - - - - MaxPermissibleAcceleration - PARAMETER - - - - http://boschrexroth.com/cds/lt/maxPermissibleAcceleration - - - Instance - - float - 50,00 - - - - - MaxPermissibleTorque - PARAMETER - - - - http://boschrexroth.com/cds/lt/maxPermissibleTorque - - - Instance - - float - 3,20 - - - - - RotationDirectionPositiveMovement - PARAMETER - - - - http://boschrexroth.com/cds/lt/RotationDirectionPositiveMovement - - - Instance - - string - CW - - - - - GearTransmissionRatio - PARAMETER - - - - http://boschrexroth.com/cds/lt/GearTransmissionRatio - - - Instance - - float - 1,00 - - - - - - Document - http://boschrexroth.com/shells/R055732577/1012160102010001/submodels/document/ - - - https://www.hsu-hh.de/aut/aas/document - - - Instance - - - - - EU_Declaration_of_Conformity - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - DCTC-30434-002:2019-01-01 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - 2019-01-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de/en/fr/es/pt/it/pl/cs/sk/hu/bg/da/et/fi/el/hr/lv/lt/nl/ro/sv/sl/ru/zh/ar/id/ja/ko/no/th/tr/vi - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - EU-Konformitätserklärung (DE) EU Declaration of Conformity (EN) - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - EU_Declaration_of_Conformity.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/EU_Declaration_of_Conformity.pdf - - - - false - false - - - - - Katalog-DE_R999000480_2015-12_PSK_24_10_2018_Gy - PARAMETER - - - - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - R999000480 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung (DE) Operating Instructions (EN) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - 2015-12 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Präzisionsmodule PSK - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - Katalog-DE_R999000480_2015-12_PSK_24_10_2018_Gy.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/Katalog-DE_R999000480_2015-12_PSK_24_10_2018_Gy.pdf - - - - false - false - - - - - Katalog-EN_R999000500_2015-12_PSK_24_10_2018_Gy - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R999000500 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung (DE) Operating Instructions (EN) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2015-12 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Precision Modules PSK - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - Katalog-EN_R999000500_2015-12_PSK_24_10_2018_Gy.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/Katalog-EN_R999000500_2015-12_PSK_24_10_2018_Gy.pdf - - - - false - false - - - - - Anleitung-R320103187_2006_09_2 - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R320103187 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung (DE) Operating Instructions (EN) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2006-09 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de/en/fr/it - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Anleitung Präzisionsmodule (EN) Instructions Precision Module PSK (EN) - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - Anleitung-R320103187_2006_09_2.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/Anleitung-R320103187_2006_09_2.pdf - - - - false - false - - - - - R320103141_2015_06_Einbauerklaerung_einachsig - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R320103141 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung (DE) Operating Instructions (EN) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2015-06 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de/en/es/fr/it/pt/bg/cs/da/et/el/fi/ga/hu/is/lt/lv/mt/nl/no/pl/ro/sk/sl/sv/tr - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Einbauerklärung für einachsige Linearsysteme (DE) Declaration of Incorporation for single axis Linear Motion Systems (EN) - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - R320103141_2015_06_Einbauerklaerung_einachsig.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/R320103141_2015_06_Einbauerklaerung_einachsig.pdf - - - - false - false - - - - - R320103152_2015_01_DE_Safety_LS_Media_22_01_2015 - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R320103152 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-03 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Allgemeine Sicherheit (DE) General Security (EN) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2015-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Sicherheitshinweise für Linearsysteme - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - R320103152_2015_01_DE_Safety_LS_Media_22_01_2015.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/R320103152_2015_01_DE_Safety_LS_Media_22_01_2015.pdf - - - - false - false - - - - - R320103152_2015_01_EN_Safety_LS_22_01_2015_web - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - Bosch Rexroth - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - R320103152 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Bosch Rexroth - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Bosch Rexroth AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-03 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Allgemeine Sicherheit (DE) General Security (EN) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - string - 2015-01 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Safety Instructions for Linear Motion Systems - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - R320103152_2015_01_EN_Safety_LS_22_01_2015_web.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/R320103152_2015_01_EN_Safety_LS_22_01_2015_web.pdf - - - - false - false - - - - - - - - ManufacturerName - 0173-1#02-AAO677#002 - - - - - - - - Herstellername - Manufacturer Name - - Manufacturer Name - - - - - Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist - 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 - - - - - - - ManufacturerProductDesignation - 0173-1#02-AAW338#001 - - - - - - - - Manufacturer product designation - Herstellerproduktbezeichnung - - ManufacturerTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - PhysicalAddress - https://www.hsu-hh.de/aut/aas/physicaladdress - - - - - - - - PhysicalAddress - Physische Adresse - - PhysicalAddress - - - - - Sammlung für reale physische Adresse - Collection for real physical address - - - - - - - CountryCode - 0173-1#02-AAO730#001 - - - - - - - - - - - - Landeskennung - Country code - - Country code - - - - - Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes - agreed upon symbol for unambiguous identification of a country - - - - - - - Street - 0173-1#02-AAO128#001 - - - - - - - - Strasse - Street - - Street - - - - - Name der Strasse und Hausnummer - Street name and house number - - - - - - - Zip - 0173-1#02-AAO129#002 - - - - - - - - Zip - Postleitzahl - - PostalCode - - - - - ZIP code of address - Postleitzahl der Anschrift - - - - - - - CityTown - 0173-1#02-AAO132#001 - - - - - - - - Ort - City/town - - City/town - - - - - Town or city of the company - Ortsangabe - - - - - - - StateCounty - 0173-1#02-AAO133#002 - - - - - - - - state/county - Bundesland - - StateCounty - - - - - Bundesland - state/county - - - - - - - ManufacturerProductFamily - 0173-1#02-AAU731#001 - - - - - - - - Manufacturer product family - Herstellerproduktfamilie - - TypClass - - - - - 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie - 2nd level of a 3 level manufacturer specific product hierarchy - - - - - - - SerialNumber - 0173-1#02-AAM556#002 - - - - - - - - Serial number - Seriennummer - - InstanceId - - - - - eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist - unique combination of numbers and letters used to identify the device once it has been manufactured - - - - - - - BatchNumber - 0173-1#02-AAQ196#001 - - - - - - - - Batch number - Chargen-Nummer - - ChargeId - - - - - Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge - Number assigned by the manufacturer of a material to identify the manufacturer's batch - - - - - - - ProductCountryOfOrigin - 0173-1#02-AAO841#001 - - - - - - - - Produkt Ursprungsland - Product country of origin - - CountryOfOrigin - - - - - Land in dem das Produkt hergestellt wurde (Hersteller Land) - Country in which the product is manufactured (manufacturer country) - - - - - - - YearOfConstruction - 0173-1#02-AAP906#001 - - - - - - - - Year of construction - Baujahr - - YearOfConstruction - - - - - Jahreszahl als Datumsangabe für die Fertigstellung des Objektes - Year as completion date of object - - - - - - - ProductMarking - https://www.hsu-hh.de/aut/aas/productmarking - - - - - - - - Produktkennzeichnung - Product Marking - - ProductMarking - - - - - Sammlungsdatei für Produktkennzeichnung - Collection file for product marking - - - - - - - CEQualificationPresent - 0173-1#02-BAF053#008 - - - - - - - - CE-Kennzeichnung vorhanden - CE- qualification present - - CEMarkingPresent - - - BOOLEAN - - whether CE- qualification is present - Angabe, ob CE-Kennzeichnung vorhanden ist - - - - - - - File - 0173-1#02-AAD005#008 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Enthaltene Doku. Datei - Embedded Doc. file - - File - - - - - Verweis/ BLOB auf enthaltene Dokumentations-Datei. - Reference/ BLOB to embedded documentation file. - - - - - - - DocumentationItem - 0173-1#02-AAD001#001 - - - - - - - - Dokumentationsgruppe - Documentation item - - DocumentationItem - - - - - Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. - Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. - - - - - - - DocumentType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - - - - - - Dokumententyp - Document Type - - DocumentType - - - - - Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) - TBD - - - - - - - VDI2770_DomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - - - - - - Domain-Nummer - DomainId - - DomainId - - - - - Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. - TBD - - - - - - - VDI2770_IdType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - - - - - - Nummerntyp - IdType - - IdType - - - - - Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. - TBD - - - - - - - DocumentId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - - - - - - DocumentId - Dokumenten-Nummer - - DocumentId - - - - - Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. - TBD - - - - - - - DocumentDomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - - - - - - DocumentDomainId - DocumentDomainId - - DocumentDomainId - - - - - Kennung oder Kennzeichen einer Domäne - TBD - - - - - - - VDI2770_Role - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - - - - - - Rolle - Role - - Role - - - - - Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) - TBD - - - - - - - VDI2770_OrganisationId - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - - - - - - Organisation ID - Organisation ID - - OrganisationId - - - - - eindeutige ID für die Organisation - TBD - - - - - - - VDI2770_OrganisationName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - - - - - - OrganisationName - OrganisationName - - OrganisationName - - - - - gebräuchliche Bezeichnung für die Organisation - TBD - - - - - - - VDI2770_OrganisationOfficialName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - - - - - - Offizieller Name der Organisation - Organisation Official Name - - OrganisationOfficialName - - - - - offizieller Name der Organisation - TBD - - - - - - - VDI2770_Description - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - - - - - - Beschreibung - Description - - Description - - - - - Beschreibung für die nächste übergeordnete Collection - TBD - - - - - - - DocumentPartId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - - - - - - Dokumenten-Teilnummer - DocumentPartId - - DocumentPartId - - - - - Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. - TBD - - - - - - - DocumentClassification_ClassId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - - - - Dokumentkategorie - Document category - - DocCategory - - - - - Dokumentkategorie nach VDI 2770:2018/10 - Document category after VDI 2770:2018/10 - - - - - - - VDI2770_ClassName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - - - - - - Klassenname - Class Name - - ClassName - - - - - Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. - TBD - - - - - - - VDI2770_ClassificationSystem - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - - - - - - Klassifizierungssystem - classification system - - ClassificationSystem - - - - - Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. - TBD - - - - - - - DocumentVersionId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - - - - - - Dokumenten-Versionsnummer - DocumentVersionId - - DocumentVersionId - - - - - Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. - TBD - - - - - - - DocumentVersion_LanguageCode - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - - - - - - Sprachenschlüssel - LanguageCode - - LanguageCode - - - - - Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 - TBD - - - - - - - VDI2770_Title - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - - - - - - Titel - Title - - VDI2770_Title - - - - - sprachabhängiger Titel des Dokuments - TBD - - - - - - - VDI2770_Summary - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - - - - - - Zusammenfassung - Summary - - Summary - - - - - sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts - TBD - - - - - - - VDI2770_Keywords - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - - - - - - Schlagwörter - Keywords - - Keywords - - - - - sprachabhängige, durch Komma getrennte Liste von Schlagwörtern - TBD - - - - - - - VDI2770_StatusValue - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - - - - - - Statuswert - StatusValue - - StatusValue - - - - - Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) - TBD - - - - - - - VDI2770_SetDate - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - - - - - - Erstellungsdatum - Set Date - - SetDate - - - - - Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). - TBD - - - - - - - VDI2770_Purpose - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - - - - - - Zweck - Purpose - - Purpose - - - - - Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. - TBD - - - - - - - VDI2770_BasedOnProcedure - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - - - - - - Prozedur - Procedure - - BasedOnProcedure - - - - - textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt - TBD - - - - - - - VDI2770_Comments - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - - - - - - Kommentar - Comments - - Comments - - - - - textuelle Bemerkungen und Anmerkungen zum Status - TBD - - - - - - - VDI2770_ReferencedObject_Type - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - - - - - - Typ - Type - - Type - - - - - Für Type des Objekts muss immer Product angegeben werden. - TBD - - - - - - - VDI2770_ReferencedObject_RefType - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - - - - - - RefType - RefType - - RefType - - - - - Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) - TBD - - - - - - - VDI2770_ReferencedObject_ObjectId - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - - - - - - ObjectId - ObjectId - - ObjectId - - - - - Angabe der Identifikationsnummer zum Objekt - TBD - - - - - - - VDI2770_FileId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - - - - - - ID der Datei - File ID - - FileId - - - - - eindeutige ID für die Datei - TBD - - - - - - - VDI2770_FileName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - - - - - - Dateiname - File name - - FileName - - - - - Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. - TBD - - - - - - - VDI2770_FileFormat - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - - - - - - Datei Format - File format - - FileFormat - - - - - Angabe eines Media Typs gemäß der Liste der IANA - TBD - - - - - - - OrganisationContactInfo - https://www.hsu-hh.de/aut/aas/contactinfo - - - - - - - - Contact Info - Kontakt Info - - OrganisationContactInfo - - - - - Sammlung für die allgemeinen Kontaktdaten - Collection for general contact data - - - - - - - NameOfSupplier - 0173-1#02-AAO735#003 - - - - - - - - - - - - name of supplier - Lieferantenname - - name of supplier - - - - - Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt - name of supplier which provides the customer with a product or a service - - - - - - - ContactInfo_Role - https://www.hsu-hh.de/aut/aas/role - - - - - - - - Rolle - Role - - Role - - - - - Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt - Information to specify the role which the organisation of ContactInfo plays - - - - - - - Email - https://www.hsu-hh.de/aut/aas/email - - - - - - - - Emailadresse - Email address - - Email - - - - - Emailadresse - Email address - - - - - - - URL - 0173-1#02-AAO694#001 - - - - - - - - Internetadresse - Internet address - - URL - - - - - stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html - Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html - - - - - - - PhoneNumber - 0173-1#02-AAO136#002 - - - - - - - - Telefonnummer - telephone number - - Phone - - - - - vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist - complete telephone number to be called to reach a business partner - - - - - - - Fax - https://www.hsu-hh.de/aut/aas/fax - - - - - - - - Fax - Fax - - Fax - - - - - Faxnummer - Fax number - - - - - - - 0173-1#02-AAO136#002 - - - - - GLNOfManufacturer - 0173-1#02-AAY812#001 - - - - - - - - GLN of manufacturer - GLN des Herstellers - - GLN of manufacturer - - - - - international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort - internationally unique identification number for the manufacturer of the device or the product and for the physical location - - - - - - - SupplierOfTheIdentifier - 0173-1#02-AAP796#004 - - - - - - - - Supplier of the identifier - Anbieter der Identifikationsnummer für Hersteller - - Supplier of the identifier - - - STRING_TRANSLATABLE - - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - - - - - - - MAN_PROD_NUM - - product article number of manufacturer - - 0173-1#02-AAO676#003 - - - - - - - - product article number of manufacturer - Herstellerartikelnummer - - MAN_PROD_NUM - - - STRING_TRANSLATABLE - - eindeutiger Bestellschlüssel des Herstellers - unique product identifier of the manufacturer - - - - - - - ManufacturerProductDescription - 0173-1#02-AAU734#001 - - - - - - - - Manufacturer product description - Herstellerproduktbeschreibung - - Manufacturer product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - GLNOfSupplier - 0173-1#02-AAY813#001 - - - - - - - - GLN of supplier - GLN des Lieferanten - - GLN of supplier - - - - - international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort - internationally unique identification number for the supplier of the device or the product and for the physical location - - - - - - - SupplierIdProvider - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - - - - - - SupplierIdProvider - Anbieter der Identifikationsnummer - - SupplierIdProvider - - - STRING_TRANSLATABLE - - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - - - - - - - SUP_PROD_NUM - 0173-1#02-AAO736#004 - - - - - - - - product article number of supplier - Lieferantenartikelnummer - - product article number of supplier - - - - - eindeutiger Bestellschlüssel des Lieferanten - unique product order identifier of the supplier - - - - - - - SupplierProductDesignation - 0173-1#02-AAM551#002 - - - - - - - - Supplier product designation - Lieferantenproduktbezeichnung - - SupplierTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - SupplierProductDescription - 0173-1#02-AAU730#001 - - - - - - - - Supplier product description - Lieferantenproduktbeschreibung - - Supplier product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - ClassificationSystem - 0173-1#02-AAO715#002 - - - - - - - - classification system - Klassifizierungssystem - - ClassificationSystem - - - - - Klassifizierungssystem - Classification System - - - - - - - SecondaryKeyTyp - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - - - - - - SecondaryKeyTyp - Typnummer des IT Systems - - SecondaryKeyTyp - - - - - Führende technische ID im IT System des Typs - SecondaryKeyTyp - - - - - - - TypThumbnail - www.company.com/ids/cd/4401_1272_7091_3437 - - - - - - - - TypThumbnail - Vorschaubild - - TypThumbnail - - - - - Darstellung des Produkttyps in kleinem Format - Small picture of the product type - - - - - - - AssetId - https://www.hsu-hh.de/aut/aas/assetid - - - - - - - - AssetId - Asset ID - - AssetId - - - - - Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. - Global unique ID of an asset, which can be read by both human and machine. - - - - - - - SecondaryKeyInstance - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - - - - - - SecondaryKeyInstance - Instanznummer des IT Systems - - SecondaryKeyInstance - - - - - Führende technische ID im IT System der Instanz - SecondaryKeyInstance - - - - - - - DateOfManufacture - 0173-1#02-AAR972#002 - - - - - - - - Date of manufacture - Herstellungsdatum - - Date of manufacture - - - DATE - - Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist - Date from which the production and / or development process is completed or from which a service is provided completely - - - - - - - DeviceRevision - https://www.hsu-hh.de/aut/aas/devicerevision - - - - - - - - DeviceRevision - DeviceRevision - - DeviceRevision - - - - - DeviceRevision - DeviceRevision - - - - - - - SoftwareRevision - https://www.hsu-hh.de/aut/aas/softwarerevision - - - - - - - - SoftwareRevision - SoftwareRevision - - SoftwareRevision - - - - - SoftwareRevision - SoftwareRevision - - - - - - - HardwareRevision - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - - - - - - HardwareRevision - HardwareRevision - - HardwareRevision - - - - - HardwareRevision - HardwareRevision - - - - - - - QrCode - https://www.hsu-hh.de/aut/aas/qrcode - - - - - - - - QrCode - QrCode - - QrCode - - - - - In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. - QrCode - - - - - - - CompanyLogo - https://www.hsu-hh.de/aut/aas/companylogo - - - - - - - - Firmenlogo - CompanyLogo - - CompanyLogo - - - - - Firmenlogo - CompanyLogo - - - - - - - MaxTraversePath - http://boschrexroth.com/cds/lt/MaxTraversePath - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Max. Verfahrweg (mm) - Max. traverse path (mm) - - MaxTraversePath - mm - - - 0173-1#05-AAA480#003 - - - - smax_mm - REAL_MEASURE - - - - - - - FormFeedConstant - http://boschrexroth.com/cds/lt/FormFeedConstant - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Vorschubkonstante (mm/U) - Form feed constant (mm/U) - - FormFeedConstant - mm/U - - - - - u_mmpU - REAL_MEASURE - - - - - - - MaxPermissibleSpeed - http://boschrexroth.com/cds/lt/MaxPermissibleSpeed - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Maximal zulässige Geschwindigkeit (m/s) - Maximum permissible speed (m/s) - - MaxPermissibleSpeed - m/s - - - 0173-1#05-AAA434#003 - - - - vmax_mps - REAL_MEASURE - - - - - - - MaxPermissibleAcceleration - http://boschrexroth.com/cds/lt/MaxPermissibleAcceleration - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Maximal zulässige Beschleunigung (m/s²) - Maximum permissible acceleration (m/s²) - - MaxPermissibleAcceleration - m/s² - - - 0173-1#05-AAA597#003 - - - - amax_mps2 - REAL_MEASURE - - - - - - - MaxPermissibleTorque - http://boschrexroth.com/cds/lt/MaxPermissibleTorque - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Maximal zulässiges Drehmoment (Nm) - Maximum permissible torque (Nm) - - MaxPermissibleTorque - Nm - - - - - M1max_Nm - REAL_MEASURE - - - - - - - RotationDirectionPositiveMovement - http://boschrexroth.com/cds/lt/RotationDirectionPositiveMovement - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Drehrichtung für positive Fahrrichtung (weg vom Motor) - Rotation direction for positive movement - - RotationDirectionPositiveMovement - - - - - - d - STRING - - - - - - - GearTransmissionRatio - http://boschrexroth.com/cds/lt/GearTransmissionRatio - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Getriebeübersetzung - Gear transmission ratio - - GearTransmissionRatio - - - - - - i - REAL_MEASURE - - - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/07_PhoenixContact.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/07_PhoenixContact.aasx.xml deleted file mode 100644 index b97555d7f..000000000 --- a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/07_PhoenixContact.aasx.xml +++ /dev/null @@ -1,3507 +0,0 @@ - - - - - PhoenixContact_R901278815_25 - CONSTANT - www.company.com/ids/aas/2520_6010_8091_1277 - - - www.company.com/ids/asset/8220_6010_8091_3593 - - - - - - www.company.com/ids/sm/4343_5072_7091_3242 - - - - - www.company.com/ids/sm/2543_5072_7091_2660 - - - - - www.company.com/ids/sm/6053_5072_7091_5102 - - - - - www.company.com/ids/sm/6563_5072_7091_4267 - - - - - - - - - R901278815_25 - www.company.com/ids/asset/8220_6010_8091_3593 - Instance - - - - - Nameplate - www.company.com/ids/sm/4343_5072_7091_3242 - - - https://www.hsu-hh.de/aut/aas/nameplate - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - PHOENIX CONTACT GmbH & Co. KG - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - QUINT4-PS/3AC/24DC/20 - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Flachsmarktstr. 8 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 32825 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Blomberg - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Nordrhein-Westfalen - - - - false - false - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 2904622001634T0008 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - ProductCountryOfOrigin - PARAMETER - - - 0173-1#02-AAO841#001 - - - Instance - - string - DE - - - - - YearOfConstruction - PARAMETER - - - 0173-1#02-AAP906#001 - - - Instance - - string - 2016 - - - - - Marking_CE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/marking_ce.png - - - - false - false - - - - - - Document - www.company.com/ids/sm/2543_5072_7091_2660 - - - https://www.hsu-hh.de/aut/aas/document - - - Instance - - - - - DeclarationCEMarking - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Phoenix Contact - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - PHOENIX CONTACT GmbH & Co. KG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en, de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - EU_Declaration_of_Conformity.pdf - - - - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - - - - Instance - - string - EU_Declaration_of_Conformity.pdf Nr. 2904622.CE.01 - - - - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/EU_Declaration_of_Conformity.pdf - - - - false - false - - - - - - Service - www.company.com/ids/sm/6053_5072_7091_5102 - - - https://www.hsu-hh.de/aut/aas/service - - - Instance - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - PHOENIX CONTACT GmbH & Co. KG - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Flachsmarktstraße 8 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 32825 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Blomberg - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Nordrhein-Westfalen - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - aftersales@phoenixcontact.com - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.phoenixcontact.com/online/portal/de?1dmy&urile=wcm:path:/dede/web/main/service_and_support/entry_page/entry_page - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +49 52 35/3-4 00 50 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - - - - - false - false - - - - - - Identification - www.company.com/ids/sm/6563_5072_7091_4267 - - - https://www.hsu-hh.de/aut/aas/identification - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - PHOENIX CONTACT GmbH & Co. KG - - - - - GLNOfManufacturer - PARAMETER - - - 0173-1#02-AAY812#001 - - - Instance - - string - - - - - - SupplierOfTheIdentifier - - - 0173-1#02-AAP796#004 - - - Instance - - - - - - - - MAN_PROD_NUM - - - 0173-1#02-AAO676#003 - - - Instance - - - - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - QUINT4-PS/3AC/24DC/20 - - - - - ManufacturerProductDescription - PARAMETER - - - 0173-1#02-AAU734#001 - - - Instance - - langString - Primary-switched QUINT POWER power supply with free choice of output characteristic curve, SFB (selective fuse breaking) technology, and NFC interface, input: 3-phase, output: 24 V DC/20 A - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - PHOENIX CONTACT GmbH & Co. KG - - - - - GLNOfSupplier - PARAMETER - - - 0173-1#02-AAY813#001 - - - Instance - - string - - - - - - SupplierIdProvider - PARAMETER - - - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - Instance - - - - - - - - SUP_PROD_NUM - PARAMETER - - - 0173-1#02-AAO736#004 - - - Instance - - - - - - - - SupplierProductDesignation - - - 0173-1#02-AAM551#002 - - - Instance - - string - QUINT4-PS/3AC/24DC/20 - - - - - SupplierProductDescription - PARAMETER - - - 0173-1#02-AAU730#001 - - - Instance - - langString - Primary-switched QUINT POWER power supply with free choice of output characteristic curve, SFB (selective fuse breaking) technology, and NFC interface, input: 3-phase, output: 24 V DC/20 A - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - - - - - - ClassificationSystem - PARAMETER - - - 0173-1#02-AAO715#002 - - - Instance - - string - eclass - - - - - SecondaryKeyTyp - - - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - Instance - - - - - - - - TypThumbnail - PARAMETER - - - - Instance - - image/jpeg - /aasx/2904622.jpeg - - - - - AssetId - PARAMETER - - - https://www.hsu-hh.de/aut/aas/assetid - - - Instance - - string - www.company.com/ids/asset/8220_6010_8091_3593 - - - - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 25 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - SecondaryKeyInstance - PARAMETER - - - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - Instance - - - - - - - - DateOfManufacture - PARAMETER - - - 0173-1#02-AAR972#002 - - - Instance - - - - - - - - DeviceRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/devicerevision - - - Instance - - - - - - - - SoftwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/softwarerevision - - - Instance - - - - - - - - HardwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - Instance - - - 02 - - - - - QrCode - PARAMETER - - - https://www.hsu-hh.de/aut/aas/qrcode - - - Instance - - image/jpeg - /aasx/2904622_QRCode.jpeg - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - PHOENIX CONTACT GmbH & Co. KG - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Flachsmarktstr. 8 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 32825 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Blomberg - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Nordrhein-Westfalen - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - info@phoenixcontact.de - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.phoenixcontact.com/online/portal/pc - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +49 52 35/3-1 20 00 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - - - - - false - false - - - - - CompanyLogo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/companylogo - - - Instance - - image/png - /aasx/PhoenixContact_Logo.png - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - http://phoenixcontact.net/qr/2904622 - - - - - - - - ManufacturerName - 0173-1#02-AAO677#002 - - - - - - - - Herstellername - Manufacturer Name - - Manufacturer Name - - - - - Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist - 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 - - - - - - - ManufacturerProductDesignation - 0173-1#02-AAW338#001 - - - - - - - - Manufacturer product designation - Herstellerproduktbezeichnung - - ManufacturerTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - PhysicalAddress - https://www.hsu-hh.de/aut/aas/physicaladdress - - - - - - - - PhysicalAddress - Physische Adresse - - PhysicalAddress - - - - - Sammlung für reale physische Adresse - Collection for real physical address - - - - - - - CountryCode - 0173-1#02-AAO730#001 - - - - - - - - - - - - Landeskennung - Country code - - Country code - - - - - Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes - agreed upon symbol for unambiguous identification of a country - - - - - - - Street - 0173-1#02-AAO128#001 - - - - - - - - Strasse - Street - - Street - - - - - Name der Strasse und Hausnummer - Street name and house number - - - - - - - Zip - 0173-1#02-AAO129#002 - - - - - - - - Zip - Postleitzahl - - PostalCode - - - - - ZIP code of address - Postleitzahl der Anschrift - - - - - - - CityTown - 0173-1#02-AAO132#001 - - - - - - - - Ort - City/town - - City/town - - - - - Town or city of the company - Ortsangabe - - - - - - - StateCounty - 0173-1#02-AAO133#002 - - - - - - - - state/county - Bundesland - - StateCounty - - - - - Bundesland - state/county - - - - - - - ManufacturerProductFamily - 0173-1#02-AAU731#001 - - - - - - - - Manufacturer product family - Herstellerproduktfamilie - - TypClass - - - - - 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie - 2nd level of a 3 level manufacturer specific product hierarchy - - - - - - - SerialNumber - 0173-1#02-AAM556#002 - - - - - - - - Serial number - Seriennummer - - InstanceId - - - - - eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist - unique combination of numbers and letters used to identify the device once it has been manufactured - - - - - - - BatchNumber - 0173-1#02-AAQ196#001 - - - - - - - - Batch number - Chargen-Nummer - - ChargeId - - - - - Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge - Number assigned by the manufacturer of a material to identify the manufacturer's batch - - - - - - - ProductCountryOfOrigin - 0173-1#02-AAO841#001 - - - - - - - - Produkt Ursprungsland - Product country of origin - - CountryOfOrigin - - - - - Land in dem das Produkt hergestellt wurde (Hersteller Land) - Country in which the product is manufactured (manufacturer country) - - - - - - - YearOfConstruction - 0173-1#02-AAP906#001 - - - - - - - - Year of construction - Baujahr - - YearOfConstruction - - - - - Jahreszahl als Datumsangabe für die Fertigstellung des Objektes - Year as completion date of object - - - - - - - ProductMarking - https://www.hsu-hh.de/aut/aas/productmarking - - - - - - - - Produktkennzeichnung - Product Marking - - ProductMarking - - - - - Sammlungsdatei für Produktkennzeichnung - Collection file for product marking - - - - - - - CEQualificationPresent - 0173-1#02-BAF053#008 - - - - - - - - CE-Kennzeichnung vorhanden - CE- qualification present - - CEMarkingPresent - - - BOOLEAN - - whether CE- qualification is present - Angabe, ob CE-Kennzeichnung vorhanden ist - - - - - - - File - 0173-1#02-AAD005#008 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Enthaltene Doku. Datei - Embedded Doc. file - - File - - - - - Verweis/ BLOB auf enthaltene Dokumentations-Datei. - Reference/ BLOB to embedded documentation file. - - - - - - - DocumentationItem - 0173-1#02-AAD001#001 - - - - - - - - Dokumentationsgruppe - Documentation item - - DocumentationItem - - - - - Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. - Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. - - - - - - - DocumentType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - - - - - - Dokumententyp - Document Type - - DocumentType - - - - - Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) - TBD - - - - - - - VDI2770_DomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - - - - - - Domain-Nummer - DomainId - - DomainId - - - - - Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. - TBD - - - - - - - VDI2770_IdType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - - - - - - Nummerntyp - IdType - - IdType - - - - - Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. - TBD - - - - - - - DocumentId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - - - - - - DocumentId - Dokumenten-Nummer - - DocumentId - - - - - Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. - TBD - - - - - - - DocumentDomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - - - - - - DocumentDomainId - DocumentDomainId - - DocumentDomainId - - - - - Kennung oder Kennzeichen einer Domäne - TBD - - - - - - - VDI2770_Role - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - - - - - - Rolle - Role - - Role - - - - - Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) - TBD - - - - - - - VDI2770_OrganisationId - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - - - - - - Organisation ID - Organisation ID - - OrganisationId - - - - - eindeutige ID für die Organisation - TBD - - - - - - - VDI2770_OrganisationName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - - - - - - OrganisationName - OrganisationName - - OrganisationName - - - - - gebräuchliche Bezeichnung für die Organisation - TBD - - - - - - - VDI2770_OrganisationOfficialName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - - - - - - Offizieller Name der Organisation - Organisation Official Name - - OrganisationOfficialName - - - - - offizieller Name der Organisation - TBD - - - - - - - VDI2770_Description - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - - - - - - Beschreibung - Description - - Description - - - - - Beschreibung für die nächste übergeordnete Collection - TBD - - - - - - - DocumentPartId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - - - - - - Dokumenten-Teilnummer - DocumentPartId - - DocumentPartId - - - - - Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. - TBD - - - - - - - DocumentClassification_ClassId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - - - - Dokumentkategorie - Document category - - DocCategory - - - - - Dokumentkategorie nach VDI 2770:2018/10 - Document category after VDI 2770:2018/10 - - - - - - - VDI2770_ClassName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - - - - - - Klassenname - Class Name - - ClassName - - - - - Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. - TBD - - - - - - - VDI2770_ClassificationSystem - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - - - - - - Klassifizierungssystem - classification system - - ClassificationSystem - - - - - Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. - TBD - - - - - - - DocumentVersionId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - - - - - - Dokumenten-Versionsnummer - DocumentVersionId - - DocumentVersionId - - - - - Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. - TBD - - - - - - - DocumentVersion_LanguageCode - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - - - - - - Sprachenschlüssel - LanguageCode - - LanguageCode - - - - - Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 - TBD - - - - - - - VDI2770_Title - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - - - - - - Titel - Title - - VDI2770_Title - - - - - sprachabhängiger Titel des Dokuments - TBD - - - - - - - VDI2770_Summary - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - - - - - - Zusammenfassung - Summary - - Summary - - - - - sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts - TBD - - - - - - - VDI2770_Keywords - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - - - - - - Schlagwörter - Keywords - - Keywords - - - - - sprachabhängige, durch Komma getrennte Liste von Schlagwörtern - TBD - - - - - - - VDI2770_StatusValue - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - - - - - - Statuswert - StatusValue - - StatusValue - - - - - Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) - TBD - - - - - - - VDI2770_SetDate - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - - - - - - Erstellungsdatum - Set Date - - SetDate - - - - - Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). - TBD - - - - - - - VDI2770_Purpose - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - - - - - - Zweck - Purpose - - Purpose - - - - - Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. - TBD - - - - - - - VDI2770_BasedOnProcedure - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - - - - - - Prozedur - Procedure - - BasedOnProcedure - - - - - textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt - TBD - - - - - - - VDI2770_Comments - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - - - - - - Kommentar - Comments - - Comments - - - - - textuelle Bemerkungen und Anmerkungen zum Status - TBD - - - - - - - VDI2770_ReferencedObject_Type - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - - - - - - Typ - Type - - Type - - - - - Für Type des Objekts muss immer Product angegeben werden. - TBD - - - - - - - VDI2770_ReferencedObject_RefType - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - - - - - - RefType - RefType - - RefType - - - - - Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) - TBD - - - - - - - VDI2770_ReferencedObject_ObjectId - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - - - - - - ObjectId - ObjectId - - ObjectId - - - - - Angabe der Identifikationsnummer zum Objekt - TBD - - - - - - - VDI2770_FileId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - - - - - - ID der Datei - File ID - - FileId - - - - - eindeutige ID für die Datei - TBD - - - - - - - VDI2770_FileName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - - - - - - Dateiname - File name - - FileName - - - - - Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. - TBD - - - - - - - VDI2770_FileFormat - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - - - - - - Datei Format - File format - - FileFormat - - - - - Angabe eines Media Typs gemäß der Liste der IANA - TBD - - - - - - - OrganisationContactInfo - https://www.hsu-hh.de/aut/aas/contactinfo - - - - - - - - Contact Info - Kontakt Info - - OrganisationContactInfo - - - - - Sammlung für die allgemeinen Kontaktdaten - Collection for general contact data - - - - - - - NameOfSupplier - 0173-1#02-AAO735#003 - - - - - - - - - - - - name of supplier - Lieferantenname - - name of supplier - - - - - Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt - name of supplier which provides the customer with a product or a service - - - - - - - ContactInfo_Role - https://www.hsu-hh.de/aut/aas/role - - - - - - - - Rolle - Role - - Role - - - - - Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt - Information to specify the role which the organisation of ContactInfo plays - - - - - - - Email - https://www.hsu-hh.de/aut/aas/email - - - - - - - - Emailadresse - Email address - - Email - - - - - Emailadresse - Email address - - - - - - - URL - 0173-1#02-AAO694#001 - - - - - - - - Internetadresse - Internet address - - URL - - - - - stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html - Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html - - - - - - - PhoneNumber - 0173-1#02-AAO136#002 - - - - - - - - Telefonnummer - telephone number - - Phone - - - - - vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist - complete telephone number to be called to reach a business partner - - - - - - - Fax - https://www.hsu-hh.de/aut/aas/fax - - - - - - - - Fax - Fax - - Fax - - - - - Faxnummer - Fax number - - - - - - - 0173-1#02-AAO136#002 - - - - - GLNOfManufacturer - 0173-1#02-AAY812#001 - - - - - - - - GLN of manufacturer - GLN des Herstellers - - GLN of manufacturer - - - - - international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort - internationally unique identification number for the manufacturer of the device or the product and for the physical location - - - - - - - SupplierOfTheIdentifier - 0173-1#02-AAP796#004 - - - - - - - - Supplier of the identifier - Anbieter der Identifikationsnummer für Hersteller - - Supplier of the identifier - - - STRING_TRANSLATABLE - - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - - - - - - - MAN_PROD_NUM - - product article number of manufacturer - - 0173-1#02-AAO676#003 - - - - - - - - product article number of manufacturer - Herstellerartikelnummer - - MAN_PROD_NUM - - - STRING_TRANSLATABLE - - eindeutiger Bestellschlüssel des Herstellers - unique product identifier of the manufacturer - - - - - - - ManufacturerProductDescription - 0173-1#02-AAU734#001 - - - - - - - - Manufacturer product description - Herstellerproduktbeschreibung - - Manufacturer product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - GLNOfSupplier - 0173-1#02-AAY813#001 - - - - - - - - GLN of supplier - GLN des Lieferanten - - GLN of supplier - - - - - international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort - internationally unique identification number for the supplier of the device or the product and for the physical location - - - - - - - SupplierIdProvider - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - - - - - - SupplierIdProvider - Anbieter der Identifikationsnummer - - SupplierIdProvider - - - STRING_TRANSLATABLE - - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - - - - - - - SUP_PROD_NUM - 0173-1#02-AAO736#004 - - - - - - - - product article number of supplier - Lieferantenartikelnummer - - product article number of supplier - - - - - eindeutiger Bestellschlüssel des Lieferanten - unique product order identifier of the supplier - - - - - - - SupplierProductDesignation - 0173-1#02-AAM551#002 - - - - - - - - Supplier product designation - Lieferantenproduktbezeichnung - - SupplierTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - SupplierProductDescription - 0173-1#02-AAU730#001 - - - - - - - - Supplier product description - Lieferantenproduktbeschreibung - - Supplier product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - ClassificationSystem - 0173-1#02-AAO715#002 - - - - - - - - classification system - Klassifizierungssystem - - ClassificationSystem - - - - - Klassifizierungssystem - Classification System - - - - - - - SecondaryKeyTyp - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - - - - - - SecondaryKeyTyp - Typnummer des IT Systems - - SecondaryKeyTyp - - - - - Führende technische ID im IT System des Typs - SecondaryKeyTyp - - - - - - - TypThumbnail - www.company.com/ids/cd/4401_1272_7091_3437 - - - - - - - - TypThumbnail - Vorschaubild - - TypThumbnail - - - - - Darstellung des Produkttyps in kleinem Format - Small picture of the product type - - - - - - - AssetId - https://www.hsu-hh.de/aut/aas/assetid - - - - - - - - AssetId - Asset ID - - AssetId - - - - - Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. - Global unique ID of an asset, which can be read by both human and machine. - - - - - - - SecondaryKeyInstance - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - - - - - - SecondaryKeyInstance - Instanznummer des IT Systems - - SecondaryKeyInstance - - - - - Führende technische ID im IT System der Instanz - SecondaryKeyInstance - - - - - - - DateOfManufacture - 0173-1#02-AAR972#002 - - - - - - - - Date of manufacture - Herstellungsdatum - - Date of manufacture - - - DATE - - Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist - Date from which the production and / or development process is completed or from which a service is provided completely - - - - - - - DeviceRevision - https://www.hsu-hh.de/aut/aas/devicerevision - - - - - - - - DeviceRevision - DeviceRevision - - DeviceRevision - - - - - DeviceRevision - DeviceRevision - - - - - - - SoftwareRevision - https://www.hsu-hh.de/aut/aas/softwarerevision - - - - - - - - SoftwareRevision - SoftwareRevision - - SoftwareRevision - - - - - SoftwareRevision - SoftwareRevision - - - - - - - HardwareRevision - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - - - - - - HardwareRevision - HardwareRevision - - HardwareRevision - - - - - HardwareRevision - HardwareRevision - - - - - - - QrCode - https://www.hsu-hh.de/aut/aas/qrcode - - - - - - - - QrCode - QrCode - - QrCode - - - - - In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. - QrCode - - - - - - - CompanyLogo - https://www.hsu-hh.de/aut/aas/companylogo - - - - - - - - Firmenlogo - CompanyLogo - - CompanyLogo - - - - - Firmenlogo - CompanyLogo - - - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/08_SchneiderElectric.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/08_SchneiderElectric.aasx.xml deleted file mode 100644 index b85815050..000000000 --- a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/08_SchneiderElectric.aasx.xml +++ /dev/null @@ -1,4570 +0,0 @@ - - - - - SE_Tesys_Island_Header - www.company.com/ids/aas/2520_6010_8091_1277 - - - www.company.com/ids/asset/8220_6010_8091_3593 - - - - - - www.company.com/ids/sm/4343_5072_7091_3242 - - - - - www.company.com/ids/sm/2543_5072_7091_2660 - - - - - www.company.com/ids/sm/6053_5072_7091_5102 - - - - - www.company.com/ids/sm/6563_5072_7091_4267 - - - - - - - - - SE_Tesys_Island_Header - www.company.com/ids/asset/8220_6010_8091_3593 - Instance - - - - - Nameplate - www.company.com/ids/sm/4343_5072_7091_3242 - - - https://www.hsu-hh.de/aut/aas/nameplate - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Schneider Electric - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - Bus coupler TeSys island, Ethernet switch (EtherNet IP / Modbus TCP) - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - FR - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Rue Joseph Monier - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 92506 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Rueil Malmaison - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Hauts de Seine - - - - false - false - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 1x14F4023C - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - ProductCountryOfOrigin - PARAMETER - - - 0173-1#02-AAO841#001 - - - Instance - - string - FR - - - - - YearOfConstruction - PARAMETER - - - 0173-1#02-AAP906#001 - - - Instance - - string - 2019 - - - - - Marking_CE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/marking_ce.png - - - - false - false - - - - - Marking_UL - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/UL.png - - - - false - false - - - - - Marking_WEEE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/Marking_WEEE.png - - - - false - false - - - - - - Document - www.company.com/ids/sm/2543_5072_7091_2660 - - - https://www.hsu-hh.de/aut/aas/document - - - Instance - - - - - DeclarationCEMarking - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Schneider Electric - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Schneider Electric SAS - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - SC19062501 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - EU - Declaration of conformity - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - EU - Declaration of conformity - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - string - Bus Coupler for TeSys Island offer - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - string - TPRBCEIP, TPRBCPFN, TPRBETC - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - CE_TPRBC_SC19062501.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/CE_TPRBC_SC19062501.pdf - - - - false - false - - - - - DeclarationULMarking - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Schneider Electric - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Schneider Electric Automation SAS - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - NRAQ.E3220218 - PROGRAMMABLE CONTROLLERS - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - string - 2019 - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - PROGRAMMABLE_CONTROLLERS___UL_Product_iQ.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/PROGRAMMABLE_CONTROLLERS___UL_Product_iQ.pdf - - - - false - false - - - - - Instruction Bulletin - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Technical Documentation - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Schneider Electric - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Schneider Electric SAS - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 8536IB1901EN - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - System Guide - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Instruction bulletin - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - string - This instruction bulletin introduces and describes the main functions of TeSys island. - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - string - TeSys Island - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - instal_EN.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/Instal_EN.pdf - - - - false - false - - - - - - Service - www.company.com/ids/sm/6053_5072_7091_5102 - - - https://www.hsu-hh.de/aut/aas/service - - - Instance - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Schneider Elcetric - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Schneider Platz - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 97816 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Marktheidenfeld - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.schneider-electric.com/en/work/support/ - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - - - - - false - false - - - - - - Identification - www.company.com/ids/sm/6563_5072_7091_4267 - - - https://www.hsu-hh.de/aut/aas/identification - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Schneider Electric - - - - - GLNOfManufacturer - PARAMETER - - - 0173-1#02-AAY812#001 - - - Instance - - string - TPRBCEIP - - - - - SupplierOfTheIdentifier - - - 0173-1#02-AAP796#004 - - - Instance - - - - - - - - MAN_PROD_NUM - - - 0173-1#02-AAO676#003 - - - Instance - - - - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - Bus coupler TeSys island, Ethernet switch (EtherNet IP / Modbus TCP) - - - - - ManufacturerProductDescription - PARAMETER - - - 0173-1#02-AAU734#001 - - - Instance - - langString - Bus coupler Ethernet IP / Modbus TCP, point of connection between a group of starters and an automation controller - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Schneider Electric - - - - - GLNOfSupplier - PARAMETER - - - 0173-1#02-AAY813#001 - - - Instance - - string - TPRBCEIP - - - - - SupplierIdProvider - PARAMETER - - - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - Instance - - - - - - - - SUP_PROD_NUM - PARAMETER - - - 0173-1#02-AAO736#004 - - - Instance - - - - - - - - SupplierProductDesignation - - - 0173-1#02-AAM551#002 - - - Instance - - string - Bus coupler TeSys island, Ethernet switch (EtherNet IP / Modbus TCP) - - - - - SupplierProductDescription - PARAMETER - - - 0173-1#02-AAU730#001 - - - Instance - - langString - Bus coupler Ethernet IP / Modbus TCP, point of connection between a group of starters and an automation controller - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - - - - - - ClassificationSystem - PARAMETER - - - 0173-1#02-AAO715#002 - - - Instance - - string - eclass - - - - - SecondaryKeyTyp - - - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - Instance - - - - - - - - TypThumbnail - PARAMETER - - - www.company.com/ids/cd/4401_1272_7091_3437 - - - Instance - - image/jpeg - /aasx/Identification/TPRBCEIP.PNG - - - - - AssetId - PARAMETER - - - https://www.hsu-hh.de/aut/aas/assetid - - - Instance - - string - www.company.com/ids/asset/8220_6010_8091_3593 - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 1x14F4023C - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - SecondaryKeyInstance - PARAMETER - - - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - Instance - - - - - - - - DateOfManufacture - PARAMETER - - - 0173-1#02-AAR972#002 - - - Instance - - - - - - - - DeviceRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/devicerevision - - - Instance - - - - - - - - SoftwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/softwarerevision - - - Instance - - - - - - - - HardwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - Instance - - - - - - - - QrCode - PARAMETER - - - https://www.hsu-hh.de/aut/aas/qrcode - - - Instance - - image/jpeg - /aasx/Identification/QRCode_Tesys_Island_Header.jpg - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Schneider Electric - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - FR - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Rue Joseph Monier - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 92506 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Rueil Malmaison - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Hauts de Seine - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.se.com/ww/en/ - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - - - - - false - false - - - - - CompanyLogo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/companylogo - - - Instance - - image/png - /aasx/Identification/logo_SE.png - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.schneider-electric.com/en/product-range-presentation/65746-tesys-island/?parent-category-id=3000&parent-subcategory-id=3080&filter=business-4-low-voltage-products-and-systems#tabs-top - - - - - - - - ManufacturerName - 0173-1#02-AAO677#002 - - - - - - - - Herstellername - Manufacturer Name - - Manufacturer Name - - - - - Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist - 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 - - - - - - - ManufacturerProductDesignation - 0173-1#02-AAW338#001 - - - - - - - - Manufacturer product designation - Herstellerproduktbezeichnung - - - ManufacturerTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - PhysicalAddress - https://www.hsu-hh.de/aut/aas/physicaladdress - - - - - - - - PhysicalAddress - Physische Adresse - - PhysicalAddress - - - - - Sammlung für reale physische Adresse - Collection for real physical address - - - - - - - CountryCode - 0173-1#02-AAO730#001 - - - - - - - - - - - - Landeskennung - Country code - - Country code - - - - - Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes - agreed upon symbol for unambiguous identification of a country - - - - - - - Street - 0173-1#02-AAO128#001 - - - - - - - - Strasse - Street - - Street - - - - - Name der Strasse und Hausnummer - Street name and house number - - - - - - - Zip - 0173-1#02-AAO129#002 - - - - - - - - Zip - Postleitzahl - - PostalCode - - - - - ZIP code of address - Postleitzahl der Anschrift - - - - - - - CityTown - 0173-1#02-AAO132#001 - - - - - - - - Ort - City/town - - City/town - - - - - Town or city of the company - Ortsangabe - - - - - - - StateCounty - 0173-1#02-AAO133#002 - - - - - - - - state/county - Bundesland - - StateCounty - - - - - Bundesland - state/county - - - - - - - ManufacturerProductFamily - 0173-1#02-AAU731#001 - - - - - - - - Manufacturer product family - Herstellerproduktfamilie - - TypClass - - - - - 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie - 2nd level of a 3 level manufacturer specific product hierarchy - - - - - - - SerialNumber - 0173-1#02-AAM556#002 - - - - - - - - Serial number - Seriennummer - - InstanceId - - - - - eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist - unique combination of numbers and letters used to identify the device once it has been manufactured - - - - - - - BatchNumber - 0173-1#02-AAQ196#001 - - - - - - - - Batch number - Chargen-Nummer - - ChargeId - - - - - Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge - Number assigned by the manufacturer of a material to identify the manufacturer's batch - - - - - - - ProductCountryOfOrigin - 0173-1#02-AAO841#001 - - - - - - - - Produkt Ursprungsland - Product country of origin - - CountryOfOrigin - - - - - Land in dem das Produkt hergestellt wurde (Hersteller Land) - Country in which the product is manufactured (manufacturer country) - - - - - - - YearOfConstruction - 0173-1#02-AAP906#001 - - - - - - - - Year of construction - Baujahr - - YearOfConstruction - - - - - Jahreszahl als Datumsangabe für die Fertigstellung des Objektes - Year as completion date of object - - - - - - - ProductMarking - https://www.hsu-hh.de/aut/aas/productmarking - - - - - - - - Produktkennzeichnung - Product Marking - - ProductMarking - - - - - Sammlungsdatei für Produktkennzeichnung - Collection file for product marking - - - - - - - CEQualificationPresent - 0173-1#02-BAF053#008 - - - - - - - - CE-Kennzeichnung vorhanden - CE- qualification present - - CEMarkingPresent - - - BOOLEAN - - whether CE- qualification is present - Angabe, ob CE-Kennzeichnung vorhanden ist - - - - - - - File - 0173-1#02-AAD005#008 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Enthaltene Doku. Datei - Embedded Doc. file - - File - - - - - Verweis/ BLOB auf enthaltene Dokumentations-Datei. - Reference/ BLOB to embedded documentation file. - - - - - - - DocumentationItem - 0173-1#02-AAD001#001 - - - - - - - - Dokumentationsgruppe - Documentation item - - DocumentationItem - - - - - Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. - Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. - - - - - - - DocumentType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - - - - - - Dokumententyp - Document Type - - DocumentType - - - - - Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) - TBD - - - - - - - VDI2770_DomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - - - - - - Domain-Nummer - DomainId - - DomainId - - - - - Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. - TBD - - - - - - - VDI2770_IdType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - - - - - - Nummerntyp - IdType - - IdType - - - - - Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. - TBD - - - - - - - DocumentId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - - - - - - DocumentId - Dokumenten-Nummer - - DocumentId - - - - - Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. - TBD - - - - - - - DocumentDomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - - - - - - DocumentDomainId - DocumentDomainId - - DocumentDomainId - - - - - Kennung oder Kennzeichen einer Domäne - TBD - - - - - - - VDI2770_Role - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - - - - - - Rolle - Role - - Role - - - - - Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) - TBD - - - - - - - VDI2770_OrganisationId - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - - - - - - Organisation ID - Organisation ID - - OrganisationId - - - - - eindeutige ID für die Organisation - TBD - - - - - - - VDI2770_OrganisationName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - - - - - - OrganisationName - OrganisationName - - OrganisationName - - - - - gebräuchliche Bezeichnung für die Organisation - TBD - - - - - - - VDI2770_OrganisationOfficialName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - - - - - - Offizieller Name der Organisation - Organisation Official Name - - OrganisationOfficialName - - - - - offizieller Name der Organisation - TBD - - - - - - - VDI2770_Description - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - - - - - - Beschreibung - Description - - Description - - - - - Beschreibung für die nächste übergeordnete Collection - TBD - - - - - - - DocumentPartId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - - - - - - Dokumenten-Teilnummer - DocumentPartId - - DocumentPartId - - - - - Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. - TBD - - - - - - - DocumentClassification_ClassId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - - - - Dokumentkategorie - Document category - - DocCategory - - - - - Dokumentkategorie nach VDI 2770:2018/10 - Document category after VDI 2770:2018/10 - - - - - - - VDI2770_ClassName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - - - - - - Klassenname - Class Name - - ClassName - - - - - Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. - TBD - - - - - - - VDI2770_ClassificationSystem - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - - - - - - Klassifizierungssystem - classification system - - ClassificationSystem - - - - - Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. - TBD - - - - - - - DocumentVersionId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - - - - - - Dokumenten-Versionsnummer - DocumentVersionId - - DocumentVersionId - - - - - Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. - TBD - - - - - - - DocumentVersion_LanguageCode - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - - - - - - Sprachenschlüssel - LanguageCode - - LanguageCode - - - - - Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 - TBD - - - - - - - VDI2770_Title - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - - - - - - Titel - Title - - VDI2770_Title - - - - - sprachabhängiger Titel des Dokuments - TBD - - - - - - - VDI2770_Summary - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - - - - - - Zusammenfassung - Summary - - Summary - - - - - sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts - TBD - - - - - - - VDI2770_Keywords - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - - - - - - Schlagwörter - Keywords - - Keywords - - - - - sprachabhängige, durch Komma getrennte Liste von Schlagwörtern - TBD - - - - - - - VDI2770_StatusValue - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - - - - - - Statuswert - StatusValue - - StatusValue - - - - - Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) - TBD - - - - - - - VDI2770_SetDate - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - - - - - - Erstellungsdatum - Set Date - - SetDate - - - - - Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). - TBD - - - - - - - VDI2770_Purpose - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - - - - - - Zweck - Purpose - - Purpose - - - - - Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. - TBD - - - - - - - VDI2770_BasedOnProcedure - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - - - - - - Prozedur - Procedure - - BasedOnProcedure - - - - - textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt - TBD - - - - - - - VDI2770_Comments - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - - - - - - Kommentar - Comments - - Comments - - - - - textuelle Bemerkungen und Anmerkungen zum Status - TBD - - - - - - - VDI2770_ReferencedObject_Type - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - - - - - - Typ - Type - - Type - - - - - Für Type des Objekts muss immer Product angegeben werden. - TBD - - - - - - - VDI2770_ReferencedObject_RefType - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - - - - - - RefType - RefType - - RefType - - - - - Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) - TBD - - - - - - - VDI2770_ReferencedObject_ObjectId - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - - - - - - ObjectId - ObjectId - - ObjectId - - - - - Angabe der Identifikationsnummer zum Objekt - TBD - - - - - - - VDI2770_FileId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - - - - - - ID der Datei - File ID - - FileId - - - - - eindeutige ID für die Datei - TBD - - - - - - - VDI2770_FileName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - - - - - - Dateiname - File name - - FileName - - - - - Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. - TBD - - - - - - - VDI2770_FileFormat - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - - - - - - Datei Format - File format - - FileFormat - - - - - Angabe eines Media Typs gemäß der Liste der IANA - TBD - - - - - - - OrganisationContactInfo - https://www.hsu-hh.de/aut/aas/contactinfo - - - - - - - - Contact Info - Kontakt Info - - OrganisationContactInfo - - - - - Sammlung für die allgemeinen Kontaktdaten - Collection for general contact data - - - - - - - NameOfSupplier - 0173-1#02-AAO735#003 - - - - - - - - - - - - name of supplier - Lieferantenname - - name of supplier - - - - - Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt - name of supplier which provides the customer with a product or a service - - - - - - - ContactInfo_Role - https://www.hsu-hh.de/aut/aas/role - - - - - - - - Rolle - Role - - Role - - - - - Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt - Information to specify the role which the organisation of ContactInfo plays - - - - - - - Email - https://www.hsu-hh.de/aut/aas/email - - - - - - - - Emailadresse - Email address - - Email - - - - - Emailadresse - Email address - - - - - - - URL - 0173-1#02-AAO694#001 - - - - - - - - Internetadresse - Internet address - - URL - - - - - stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html - Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html - - - - - - - PhoneNumber - 0173-1#02-AAO136#002 - - - - - - - - Telefonnummer - telephone number - - Phone - - - - - vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist - complete telephone number to be called to reach a business partner - - - - - - - Fax - https://www.hsu-hh.de/aut/aas/fax - - - - - - - - Fax - Fax - - Fax - - - - - Faxnummer - Fax number - - - - - - - 0173-1#02-AAO136#002 - - - - - GLNOfManufacturer - 0173-1#02-AAY812#001 - - - - - - - - GLN of manufacturer - GLN des Herstellers - - GLN of manufacturer - - - - - international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort - internationally unique identification number for the manufacturer of the device or the product and for the physical location - - - - - - - SupplierOfTheIdentifier - 0173-1#02-AAP796#004 - - - - - - - - Supplier of the identifier - Anbieter der Identifikationsnummer für Hersteller - - Supplier of the identifier - - - STRING_TRANSLATABLE - - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - - - - - - - MAN_PROD_NUM - - product article number of manufacturer - - 0173-1#02-AAO676#003 - - - - - - - - product article number of manufacturer - Herstellerartikelnummer - - MAN_PROD_NUM - - - STRING_TRANSLATABLE - - eindeutiger Bestellschlüssel des Herstellers - unique product identifier of the manufacturer - - - - - - - ManufacturerProductDescription - 0173-1#02-AAU734#001 - - - - - - - - Manufacturer product description - Herstellerproduktbeschreibung - - Manufacturer product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - GLNOfSupplier - 0173-1#02-AAY813#001 - - - - - - - - GLN of supplier - GLN des Lieferanten - - GLN of supplier - - - - - international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort - internationally unique identification number for the supplier of the device or the product and for the physical location - - - - - - - SupplierIdProvider - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - - - - - - SupplierIdProvider - Anbieter der Identifikationsnummer - - SupplierIdProvider - - - STRING_TRANSLATABLE - - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - - - - - - - SUP_PROD_NUM - 0173-1#02-AAO736#004 - - - - - - - - product article number of supplier - Lieferantenartikelnummer - - product article number of supplier - - - - - eindeutiger Bestellschlüssel des Lieferanten - unique product order identifier of the supplier - - - - - - - SupplierProductDesignation - 0173-1#02-AAM551#002 - - - - - - - - Supplier product designation - Lieferantenproduktbezeichnung - - SupplierTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - SupplierProductDescription - 0173-1#02-AAU730#001 - - - - - - - - Supplier product description - Lieferantenproduktbeschreibung - - Supplier product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - ClassificationSystem - 0173-1#02-AAO715#002 - - - - - - - - classification system - Klassifizierungssystem - - ClassificationSystem - - - - - Klassifizierungssystem - Classification System - - - - - - - SecondaryKeyTyp - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - - - - - - SecondaryKeyTyp - Typnummer des IT Systems - - SecondaryKeyTyp - - - - - Führende technische ID im IT System des Typs - SecondaryKeyTyp - - - - - - - TypThumbnail - www.company.com/ids/cd/6044_0150_1191_5121 - - - - - - - - TypThumbnail - Vorschaubild - - TypThumbnail - - - - - Darstellung des Produkttyps in kleinem Format - Small picture of the product type - - - - - - - AssetId - https://www.hsu-hh.de/aut/aas/assetid - - - - - - - - AssetId - Asset ID - - AssetId - - - - - Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. - Global unique ID of an asset, which can be read by both human and machine. - - - - - - - SecondaryKeyInstance - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - - - - - - SecondaryKeyInstance - Instanznummer des IT Systems - - SecondaryKeyInstance - - - - - Führende technische ID im IT System der Instanz - SecondaryKeyInstance - - - - - - - DateOfManufacture - 0173-1#02-AAR972#002 - - - - - - - - Date of manufacture - Herstellungsdatum - - Date of manufacture - - - DATE - - Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist - Date from which the production and / or development process is completed or from which a service is provided completely - - - - - - - DeviceRevision - https://www.hsu-hh.de/aut/aas/devicerevision - - - - - - - - DeviceRevision - DeviceRevision - - DeviceRevision - - - - - DeviceRevision - DeviceRevision - - - - - - - SoftwareRevision - https://www.hsu-hh.de/aut/aas/softwarerevision - - - - - - - - SoftwareRevision - SoftwareRevision - - SoftwareRevision - - - - - SoftwareRevision - SoftwareRevision - - - - - - - HardwareRevision - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - - - - - - HardwareRevision - HardwareRevision - - HardwareRevision - - - - - HardwareRevision - HardwareRevision - - - - - - - QrCode - https://www.hsu-hh.de/aut/aas/qrcode - - - - - - - - QrCode - QrCode - - QrCode - - - - - In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. - QrCode - - - - - - - CompanyLogo - https://www.hsu-hh.de/aut/aas/companylogo - - - - - - - - Firmenlogo - CompanyLogo - - CompanyLogo - - - - - Firmenlogo - CompanyLogo - - - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/09_SchneiderElectric.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/09_SchneiderElectric.aasx.xml deleted file mode 100644 index 89372c86b..000000000 --- a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/09_SchneiderElectric.aasx.xml +++ /dev/null @@ -1,4570 +0,0 @@ - - - - - SE_Tesys_Island_Power - www.company.com/ids/aas/2520_6010_8091_1277 - - - www.company.com/ids/asset/8220_6010_8091_3593 - - - - - - www.company.com/ids/sm/4343_5072_7091_3242 - - - - - www.company.com/ids/sm/2543_5072_7091_2660 - - - - - www.company.com/ids/sm/6053_5072_7091_5102 - - - - - www.company.com/ids/sm/6563_5072_7091_4267 - - - - - - - - - SE_Tesys_Island_Power - www.company.com/ids/asset/8220_6010_8091_3593 - Instance - - - - - Nameplate - www.company.com/ids/sm/4343_5072_7091_3242 - - - https://www.hsu-hh.de/aut/aas/nameplate - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Schneider Electric - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - Voltage interface Module, TeSys island - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - FR - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Rue Joseph Monier - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 92506 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Rueil Malmaison - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Hauts de Seine - - - - false - false - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 190730000777 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - ProductCountryOfOrigin - PARAMETER - - - 0173-1#02-AAO841#001 - - - Instance - - string - FR - - - - - YearOfConstruction - PARAMETER - - - 0173-1#02-AAP906#001 - - - Instance - - string - 2019 - - - - - Marking_CE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/marking_ce.png - - - - false - false - - - - - Marking_UL - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/UL.png - - - - false - false - - - - - Marking_WEEE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/Marking_WEEE.png - - - - false - false - - - - - - Document - www.company.com/ids/sm/2543_5072_7091_2660 - - - https://www.hsu-hh.de/aut/aas/document - - - Instance - - - - - DeclarationCEMarking - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Schneider Electric - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Schneider Electric SAS - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - SC19062503 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - EU - Declaration of conformity - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - EU - Declaration of conformity - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - string - Voltage Measurement Module for TeSys Island offer - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - string - TPRVM001 - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - CE_TPRVM_SC19062503.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/CE_TPRVM_SC19062503.pdf - - - - false - false - - - - - DeclarationULMarking - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Schneider Electric - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Schneider Electric Automation SAS - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - NRAQ.E3220218 - PROGRAMMABLE CONTROLLERS - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - string - 2019 - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - PROGRAMMABLE_CONTROLLERS___UL_Product_iQ.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/PROGRAMMABLE_CONTROLLERS___UL_Product_iQ.pdf - - - - false - false - - - - - Instruction Bulletin - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Technical Documentation - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Schneider Electric - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Schneider Electric SAS - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 8536IB1901EN - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - System Guide - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Instruction bulletin - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - string - This instruction bulletin introduces and describes the main functions of TeSys island. - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - string - TeSys Island - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - instal_EN.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/Instal_EN.pdf - - - - false - false - - - - - - Service - www.company.com/ids/sm/6053_5072_7091_5102 - - - https://www.hsu-hh.de/aut/aas/service - - - Instance - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Schneider Elcetric - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Schneider Platz - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 97816 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Marktheidenfeld - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.schneider-electric.com/en/work/support/ - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - - - - - false - false - - - - - - Identification - www.company.com/ids/sm/6563_5072_7091_4267 - - - https://www.hsu-hh.de/aut/aas/identification - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Schneider Electric - - - - - GLNOfManufacturer - PARAMETER - - - 0173-1#02-AAY812#001 - - - Instance - - string - TPRVM001 - - - - - SupplierOfTheIdentifier - - - 0173-1#02-AAP796#004 - - - Instance - - - - - - - - MAN_PROD_NUM - - - 0173-1#02-AAO676#003 - - - Instance - - - - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - Voltage interface Module, TeSys island - - - - - ManufacturerProductDescription - PARAMETER - - - 0173-1#02-AAU734#001 - - - Instance - - langString - Monitoring of the mains voltage powering the island and Reporting of the voltage to the bus coupler to enable power & energy monitoring - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Schneider Electric - - - - - GLNOfSupplier - PARAMETER - - - 0173-1#02-AAY813#001 - - - Instance - - string - TPRVM001 - - - - - SupplierIdProvider - PARAMETER - - - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - Instance - - - - - - - - SUP_PROD_NUM - PARAMETER - - - 0173-1#02-AAO736#004 - - - Instance - - - - - - - - SupplierProductDesignation - - - 0173-1#02-AAM551#002 - - - Instance - - string - Voltage interface Module, TeSys island - - - - - SupplierProductDescription - PARAMETER - - - 0173-1#02-AAU730#001 - - - Instance - - langString - Monitoring of the mains voltage powering the island and Reporting of the voltage to the bus coupler to enable power & energy monitoring - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - - - - - - ClassificationSystem - PARAMETER - - - 0173-1#02-AAO715#002 - - - Instance - - string - eclass - - - - - SecondaryKeyTyp - - - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - Instance - - - - - - - - TypThumbnail - PARAMETER - - - www.company.com/ids/cd/4401_1272_7091_3437 - - - Instance - - image/jpeg - /aasx/Identification/TPRVM001.PNG - - - - - AssetId - PARAMETER - - - https://www.hsu-hh.de/aut/aas/assetid - - - Instance - - string - www.company.com/ids/asset/8220_6010_8091_3593 - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 190730000777 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - SecondaryKeyInstance - PARAMETER - - - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - Instance - - - - - - - - DateOfManufacture - PARAMETER - - - 0173-1#02-AAR972#002 - - - Instance - - - - - - - - DeviceRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/devicerevision - - - Instance - - - - - - - - SoftwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/softwarerevision - - - Instance - - - - - - - - HardwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - Instance - - - - - - - - QrCode - PARAMETER - - - https://www.hsu-hh.de/aut/aas/qrcode - - - Instance - - image/jpeg - /aasx/Identification/QRCode_Tesys_Island_Power.jpg - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Schneider Electric - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - FR - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Rue Joseph Monier - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 92506 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Rueil Malmaison - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Hauts de Seine - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.schneider-electric.com/en/ - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - - - - - false - false - - - - - CompanyLogo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/companylogo - - - Instance - - image/png - /aasx/Identification/logo_SE.png - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.schneider-electric.com/en/product-range-presentation/65746-tesys-island/?parent-category-id=3000&parent-subcategory-id=3080&filter=business-4-low-voltage-products-and-systems#tabs-top - - - - - - - - ManufacturerName - 0173-1#02-AAO677#002 - - - - - - - - Herstellername - Manufacturer Name - - Manufacturer Name - - - - - Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist - 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 - - - - - - - ManufacturerProductDesignation - 0173-1#02-AAW338#001 - - - - - - - - Manufacturer product designation - Herstellerproduktbezeichnung - - - ManufacturerTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - PhysicalAddress - https://www.hsu-hh.de/aut/aas/physicaladdress - - - - - - - - PhysicalAddress - Physische Adresse - - PhysicalAddress - - - - - Sammlung für reale physische Adresse - Collection for real physical address - - - - - - - CountryCode - 0173-1#02-AAO730#001 - - - - - - - - - - - - Landeskennung - Country code - - Country code - - - - - Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes - agreed upon symbol for unambiguous identification of a country - - - - - - - Street - 0173-1#02-AAO128#001 - - - - - - - - Strasse - Street - - Street - - - - - Name der Strasse und Hausnummer - Street name and house number - - - - - - - Zip - 0173-1#02-AAO129#002 - - - - - - - - Zip - Postleitzahl - - PostalCode - - - - - ZIP code of address - Postleitzahl der Anschrift - - - - - - - CityTown - 0173-1#02-AAO132#001 - - - - - - - - Ort - City/town - - City/town - - - - - Town or city of the company - Ortsangabe - - - - - - - StateCounty - 0173-1#02-AAO133#002 - - - - - - - - state/county - Bundesland - - StateCounty - - - - - Bundesland - state/county - - - - - - - ManufacturerProductFamily - 0173-1#02-AAU731#001 - - - - - - - - Manufacturer product family - Herstellerproduktfamilie - - TypClass - - - - - 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie - 2nd level of a 3 level manufacturer specific product hierarchy - - - - - - - SerialNumber - 0173-1#02-AAM556#002 - - - - - - - - Serial number - Seriennummer - - InstanceId - - - - - eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist - unique combination of numbers and letters used to identify the device once it has been manufactured - - - - - - - BatchNumber - 0173-1#02-AAQ196#001 - - - - - - - - Batch number - Chargen-Nummer - - ChargeId - - - - - Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge - Number assigned by the manufacturer of a material to identify the manufacturer's batch - - - - - - - ProductCountryOfOrigin - 0173-1#02-AAO841#001 - - - - - - - - Produkt Ursprungsland - Product country of origin - - CountryOfOrigin - - - - - Land in dem das Produkt hergestellt wurde (Hersteller Land) - Country in which the product is manufactured (manufacturer country) - - - - - - - YearOfConstruction - 0173-1#02-AAP906#001 - - - - - - - - Year of construction - Baujahr - - YearOfConstruction - - - - - Jahreszahl als Datumsangabe für die Fertigstellung des Objektes - Year as completion date of object - - - - - - - ProductMarking - https://www.hsu-hh.de/aut/aas/productmarking - - - - - - - - Produktkennzeichnung - Product Marking - - ProductMarking - - - - - Sammlungsdatei für Produktkennzeichnung - Collection file for product marking - - - - - - - CEQualificationPresent - 0173-1#02-BAF053#008 - - - - - - - - CE-Kennzeichnung vorhanden - CE- qualification present - - CEMarkingPresent - - - BOOLEAN - - whether CE- qualification is present - Angabe, ob CE-Kennzeichnung vorhanden ist - - - - - - - File - 0173-1#02-AAD005#008 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Enthaltene Doku. Datei - Embedded Doc. file - - File - - - - - Verweis/ BLOB auf enthaltene Dokumentations-Datei. - Reference/ BLOB to embedded documentation file. - - - - - - - DocumentationItem - 0173-1#02-AAD001#001 - - - - - - - - Dokumentationsgruppe - Documentation item - - DocumentationItem - - - - - Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. - Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. - - - - - - - DocumentType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - - - - - - Dokumententyp - Document Type - - DocumentType - - - - - Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) - TBD - - - - - - - VDI2770_DomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - - - - - - Domain-Nummer - DomainId - - DomainId - - - - - Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. - TBD - - - - - - - VDI2770_IdType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - - - - - - Nummerntyp - IdType - - IdType - - - - - Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. - TBD - - - - - - - DocumentId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - - - - - - DocumentId - Dokumenten-Nummer - - DocumentId - - - - - Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. - TBD - - - - - - - DocumentDomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - - - - - - DocumentDomainId - DocumentDomainId - - DocumentDomainId - - - - - Kennung oder Kennzeichen einer Domäne - TBD - - - - - - - VDI2770_Role - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - - - - - - Rolle - Role - - Role - - - - - Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) - TBD - - - - - - - VDI2770_OrganisationId - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - - - - - - Organisation ID - Organisation ID - - OrganisationId - - - - - eindeutige ID für die Organisation - TBD - - - - - - - VDI2770_OrganisationName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - - - - - - OrganisationName - OrganisationName - - OrganisationName - - - - - gebräuchliche Bezeichnung für die Organisation - TBD - - - - - - - VDI2770_OrganisationOfficialName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - - - - - - Offizieller Name der Organisation - Organisation Official Name - - OrganisationOfficialName - - - - - offizieller Name der Organisation - TBD - - - - - - - VDI2770_Description - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - - - - - - Beschreibung - Description - - Description - - - - - Beschreibung für die nächste übergeordnete Collection - TBD - - - - - - - DocumentPartId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - - - - - - Dokumenten-Teilnummer - DocumentPartId - - DocumentPartId - - - - - Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. - TBD - - - - - - - DocumentClassification_ClassId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - - - - Dokumentkategorie - Document category - - DocCategory - - - - - Dokumentkategorie nach VDI 2770:2018/10 - Document category after VDI 2770:2018/10 - - - - - - - VDI2770_ClassName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - - - - - - Klassenname - Class Name - - ClassName - - - - - Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. - TBD - - - - - - - VDI2770_ClassificationSystem - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - - - - - - Klassifizierungssystem - classification system - - ClassificationSystem - - - - - Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. - TBD - - - - - - - DocumentVersionId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - - - - - - Dokumenten-Versionsnummer - DocumentVersionId - - DocumentVersionId - - - - - Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. - TBD - - - - - - - DocumentVersion_LanguageCode - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - - - - - - Sprachenschlüssel - LanguageCode - - LanguageCode - - - - - Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 - TBD - - - - - - - VDI2770_Title - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - - - - - - Titel - Title - - VDI2770_Title - - - - - sprachabhängiger Titel des Dokuments - TBD - - - - - - - VDI2770_Summary - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - - - - - - Zusammenfassung - Summary - - Summary - - - - - sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts - TBD - - - - - - - VDI2770_Keywords - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - - - - - - Schlagwörter - Keywords - - Keywords - - - - - sprachabhängige, durch Komma getrennte Liste von Schlagwörtern - TBD - - - - - - - VDI2770_StatusValue - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - - - - - - Statuswert - StatusValue - - StatusValue - - - - - Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) - TBD - - - - - - - VDI2770_SetDate - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - - - - - - Erstellungsdatum - Set Date - - SetDate - - - - - Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). - TBD - - - - - - - VDI2770_Purpose - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - - - - - - Zweck - Purpose - - Purpose - - - - - Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. - TBD - - - - - - - VDI2770_BasedOnProcedure - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - - - - - - Prozedur - Procedure - - BasedOnProcedure - - - - - textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt - TBD - - - - - - - VDI2770_Comments - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - - - - - - Kommentar - Comments - - Comments - - - - - textuelle Bemerkungen und Anmerkungen zum Status - TBD - - - - - - - VDI2770_ReferencedObject_Type - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - - - - - - Typ - Type - - Type - - - - - Für Type des Objekts muss immer Product angegeben werden. - TBD - - - - - - - VDI2770_ReferencedObject_RefType - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - - - - - - RefType - RefType - - RefType - - - - - Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) - TBD - - - - - - - VDI2770_ReferencedObject_ObjectId - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - - - - - - ObjectId - ObjectId - - ObjectId - - - - - Angabe der Identifikationsnummer zum Objekt - TBD - - - - - - - VDI2770_FileId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - - - - - - ID der Datei - File ID - - FileId - - - - - eindeutige ID für die Datei - TBD - - - - - - - VDI2770_FileName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - - - - - - Dateiname - File name - - FileName - - - - - Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. - TBD - - - - - - - VDI2770_FileFormat - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - - - - - - Datei Format - File format - - FileFormat - - - - - Angabe eines Media Typs gemäß der Liste der IANA - TBD - - - - - - - OrganisationContactInfo - https://www.hsu-hh.de/aut/aas/contactinfo - - - - - - - - Contact Info - Kontakt Info - - OrganisationContactInfo - - - - - Sammlung für die allgemeinen Kontaktdaten - Collection for general contact data - - - - - - - NameOfSupplier - 0173-1#02-AAO735#003 - - - - - - - - - - - - name of supplier - Lieferantenname - - name of supplier - - - - - Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt - name of supplier which provides the customer with a product or a service - - - - - - - ContactInfo_Role - https://www.hsu-hh.de/aut/aas/role - - - - - - - - Rolle - Role - - Role - - - - - Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt - Information to specify the role which the organisation of ContactInfo plays - - - - - - - Email - https://www.hsu-hh.de/aut/aas/email - - - - - - - - Emailadresse - Email address - - Email - - - - - Emailadresse - Email address - - - - - - - URL - 0173-1#02-AAO694#001 - - - - - - - - Internetadresse - Internet address - - URL - - - - - stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html - Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html - - - - - - - PhoneNumber - 0173-1#02-AAO136#002 - - - - - - - - Telefonnummer - telephone number - - Phone - - - - - vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist - complete telephone number to be called to reach a business partner - - - - - - - Fax - https://www.hsu-hh.de/aut/aas/fax - - - - - - - - Fax - Fax - - Fax - - - - - Faxnummer - Fax number - - - - - - - 0173-1#02-AAO136#002 - - - - - GLNOfManufacturer - 0173-1#02-AAY812#001 - - - - - - - - GLN of manufacturer - GLN des Herstellers - - GLN of manufacturer - - - - - international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort - internationally unique identification number for the manufacturer of the device or the product and for the physical location - - - - - - - SupplierOfTheIdentifier - 0173-1#02-AAP796#004 - - - - - - - - Supplier of the identifier - Anbieter der Identifikationsnummer für Hersteller - - Supplier of the identifier - - - STRING_TRANSLATABLE - - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - - - - - - - MAN_PROD_NUM - - product article number of manufacturer - - 0173-1#02-AAO676#003 - - - - - - - - product article number of manufacturer - Herstellerartikelnummer - - MAN_PROD_NUM - - - STRING_TRANSLATABLE - - eindeutiger Bestellschlüssel des Herstellers - unique product identifier of the manufacturer - - - - - - - ManufacturerProductDescription - 0173-1#02-AAU734#001 - - - - - - - - Manufacturer product description - Herstellerproduktbeschreibung - - Manufacturer product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - GLNOfSupplier - 0173-1#02-AAY813#001 - - - - - - - - GLN of supplier - GLN des Lieferanten - - GLN of supplier - - - - - international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort - internationally unique identification number for the supplier of the device or the product and for the physical location - - - - - - - SupplierIdProvider - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - - - - - - SupplierIdProvider - Anbieter der Identifikationsnummer - - SupplierIdProvider - - - STRING_TRANSLATABLE - - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - - - - - - - SUP_PROD_NUM - 0173-1#02-AAO736#004 - - - - - - - - product article number of supplier - Lieferantenartikelnummer - - product article number of supplier - - - - - eindeutiger Bestellschlüssel des Lieferanten - unique product order identifier of the supplier - - - - - - - SupplierProductDesignation - 0173-1#02-AAM551#002 - - - - - - - - Supplier product designation - Lieferantenproduktbezeichnung - - SupplierTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - SupplierProductDescription - 0173-1#02-AAU730#001 - - - - - - - - Supplier product description - Lieferantenproduktbeschreibung - - Supplier product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - ClassificationSystem - 0173-1#02-AAO715#002 - - - - - - - - classification system - Klassifizierungssystem - - ClassificationSystem - - - - - Klassifizierungssystem - Classification System - - - - - - - SecondaryKeyTyp - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - - - - - - SecondaryKeyTyp - Typnummer des IT Systems - - SecondaryKeyTyp - - - - - Führende technische ID im IT System des Typs - SecondaryKeyTyp - - - - - - - TypThumbnail - www.company.com/ids/cd/6044_0150_1191_5121 - - - - - - - - TypThumbnail - Vorschaubild - - TypThumbnail - - - - - Darstellung des Produkttyps in kleinem Format - Small picture of the product type - - - - - - - AssetId - https://www.hsu-hh.de/aut/aas/assetid - - - - - - - - AssetId - Asset ID - - AssetId - - - - - Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. - Global unique ID of an asset, which can be read by both human and machine. - - - - - - - SecondaryKeyInstance - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - - - - - - SecondaryKeyInstance - Instanznummer des IT Systems - - SecondaryKeyInstance - - - - - Führende technische ID im IT System der Instanz - SecondaryKeyInstance - - - - - - - DateOfManufacture - 0173-1#02-AAR972#002 - - - - - - - - Date of manufacture - Herstellungsdatum - - Date of manufacture - - - DATE - - Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist - Date from which the production and / or development process is completed or from which a service is provided completely - - - - - - - DeviceRevision - https://www.hsu-hh.de/aut/aas/devicerevision - - - - - - - - DeviceRevision - DeviceRevision - - DeviceRevision - - - - - DeviceRevision - DeviceRevision - - - - - - - SoftwareRevision - https://www.hsu-hh.de/aut/aas/softwarerevision - - - - - - - - SoftwareRevision - SoftwareRevision - - SoftwareRevision - - - - - SoftwareRevision - SoftwareRevision - - - - - - - HardwareRevision - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - - - - - - HardwareRevision - HardwareRevision - - HardwareRevision - - - - - HardwareRevision - HardwareRevision - - - - - - - QrCode - https://www.hsu-hh.de/aut/aas/qrcode - - - - - - - - QrCode - QrCode - - QrCode - - - - - In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. - QrCode - - - - - - - CompanyLogo - https://www.hsu-hh.de/aut/aas/companylogo - - - - - - - - Firmenlogo - CompanyLogo - - CompanyLogo - - - - - Firmenlogo - CompanyLogo - - - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/10_SchneiderElectric.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/10_SchneiderElectric.aasx.xml deleted file mode 100644 index 90a9a45d2..000000000 --- a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/10_SchneiderElectric.aasx.xml +++ /dev/null @@ -1,4570 +0,0 @@ - - - - - SE_Tesys_Island_Starter - www.company.com/ids/aas/2520_6010_8091_1277 - - - www.company.com/ids/asset/8220_6010_8091_3593 - - - - - - www.company.com/ids/sm/4343_5072_7091_3242 - - - - - www.company.com/ids/sm/2543_5072_7091_2660 - - - - - www.company.com/ids/sm/6053_5072_7091_5102 - - - - - www.company.com/ids/sm/6563_5072_7091_4267 - - - - - - - - - SE_Tesys_Island_Starter - www.company.com/ids/asset/8220_6010_8091_3593 - Instance - - - - - Nameplate - www.company.com/ids/sm/4343_5072_7091_3242 - - - https://www.hsu-hh.de/aut/aas/nameplate - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Schneider Electric - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - Motor Starter, TeSys island - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - FR - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Rue Joseph Monier - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 92506 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Rueil Malmaison - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Hauts de Seine - - - - false - false - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 2F184031001 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - ProductCountryOfOrigin - PARAMETER - - - 0173-1#02-AAO841#001 - - - Instance - - string - FR - - - - - YearOfConstruction - PARAMETER - - - 0173-1#02-AAP906#001 - - - Instance - - string - 2019 - - - - - Marking_CE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/marking_ce.png - - - - false - false - - - - - Marking_UL - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/UL.png - - - - false - false - - - - - Marking_WEEE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/Marking_WEEE.png - - - - false - false - - - - - - Document - www.company.com/ids/sm/2543_5072_7091_2660 - - - https://www.hsu-hh.de/aut/aas/document - - - Instance - - - - - DeclarationCEMarking - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Schneider Electric - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Schneider Electric SAS - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - SC19062505 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - EU - Declaration of conformity - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - EU - Declaration of conformity - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - string - Motor Starters for TeSys Island offer - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - string - TPRSx009, TPRSx025, TPRSx038, TPRSx065, TPRSx080, *where x can be T or S - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - CE_TPRSx_SC19062505.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/CE_TPRSx_SC19062505.pdf - - - - false - false - - - - - DeclarationULMarking - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Schneider Electric - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Schneider Electric Automation SAS - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - NRAQ.E3220218 - PROGRAMMABLE CONTROLLERS - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - string - 2019 - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - PROGRAMMABLE_CONTROLLERS___UL_Product_iQ.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/PROGRAMMABLE_CONTROLLERS___UL_Product_iQ.pdf - - - - false - false - - - - - Instruction Bulletin - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Technical Documentation - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Schneider Electric - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Schneider Electric SAS - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 8536IB1901EN - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - System Guide - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Instruction bulletin - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - string - This instruction bulletin introduces and describes the main functions of TeSys island. - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - string - TeSys Island - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - instal_EN.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/Instal_EN.pdf - - - - false - false - - - - - - Service - www.company.com/ids/sm/6053_5072_7091_5102 - - - https://www.hsu-hh.de/aut/aas/service - - - Instance - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Schneider Elcetric - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Schneider Platz - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 97816 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Marktheidenfeld - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.schneider-electric.com/en/work/support/ - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - - - - - false - false - - - - - - Identification - www.company.com/ids/sm/6563_5072_7091_4267 - - - https://www.hsu-hh.de/aut/aas/identification - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Schneider Electric - - - - - GLNOfManufacturer - PARAMETER - - - 0173-1#02-AAY812#001 - - - Instance - - string - TPRST009 - - - - - SupplierOfTheIdentifier - - - 0173-1#02-AAP796#004 - - - Instance - - - - - - - - MAN_PROD_NUM - - - 0173-1#02-AAO676#003 - - - Instance - - - - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - Motor Starter, TeSys island - - - - - ManufacturerProductDescription - PARAMETER - - - 0173-1#02-AAU734#001 - - - Instance - - langString - Direct starter connected to an automation controller through a bus coupler, Operational only when connected to a bus coupler - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Schneider Electric - - - - - GLNOfSupplier - PARAMETER - - - 0173-1#02-AAY813#001 - - - Instance - - string - TPRST009 - - - - - SupplierIdProvider - PARAMETER - - - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - Instance - - - - - - - - SUP_PROD_NUM - PARAMETER - - - 0173-1#02-AAO736#004 - - - Instance - - - - - - - - SupplierProductDesignation - - - 0173-1#02-AAM551#002 - - - Instance - - string - Motor Starter, TeSys island - - - - - SupplierProductDescription - PARAMETER - - - 0173-1#02-AAU730#001 - - - Instance - - langString - Direct starter connected to an automation controller through a bus coupler, Operational only when connected to a bus coupler - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - - - - - - ClassificationSystem - PARAMETER - - - 0173-1#02-AAO715#002 - - - Instance - - string - eclass - - - - - SecondaryKeyTyp - - - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - Instance - - - - - - - - TypThumbnail - PARAMETER - - - www.company.com/ids/cd/4401_1272_7091_3437 - - - Instance - - image/jpeg - /TPRST009.PNG - - - - - AssetId - PARAMETER - - - https://www.hsu-hh.de/aut/aas/assetid - - - Instance - - string - www.company.com/ids/asset/8220_6010_8091_3593 - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 2F184031001 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - SecondaryKeyInstance - PARAMETER - - - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - Instance - - - - - - - - DateOfManufacture - PARAMETER - - - 0173-1#02-AAR972#002 - - - Instance - - string - 2019 - - - - - DeviceRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/devicerevision - - - Instance - - - - - - - - SoftwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/softwarerevision - - - Instance - - - - - - - - HardwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - Instance - - - - - - - - QrCode - PARAMETER - - - https://www.hsu-hh.de/aut/aas/qrcode - - - Instance - - image/jpeg - /aasx/Identification/QRCode_Tesys_Island_Starter.jpg - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Schneider Electric - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - FR - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Rue Joseph Monier - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 92506 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Rueil Malmaison - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Hauts de Seine - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.schneider-electric.com/en/ - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - - - - - false - false - - - - - CompanyLogo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/companylogo - - - Instance - - image/png - /aasx/Identification/logo_SE.png - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.schneider-electric.com/en/product-range-presentation/65746-tesys-island/?parent-category-id=3000&parent-subcategory-id=3080&filter=business-4-low-voltage-products-and-systems#tabs-top - - - - - - - - ManufacturerName - 0173-1#02-AAO677#002 - - - - - - - - Herstellername - Manufacturer Name - - Manufacturer Name - - - - - Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist - 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 - - - - - - - ManufacturerProductDesignation - 0173-1#02-AAW338#001 - - - - - - - - Manufacturer product designation - Herstellerproduktbezeichnung - - - ManufacturerTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - PhysicalAddress - https://www.hsu-hh.de/aut/aas/physicaladdress - - - - - - - - PhysicalAddress - Physische Adresse - - PhysicalAddress - - - - - Sammlung für reale physische Adresse - Collection for real physical address - - - - - - - CountryCode - 0173-1#02-AAO730#001 - - - - - - - - - - - - Landeskennung - Country code - - Country code - - - - - Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes - agreed upon symbol for unambiguous identification of a country - - - - - - - Street - 0173-1#02-AAO128#001 - - - - - - - - Strasse - Street - - Street - - - - - Name der Strasse und Hausnummer - Street name and house number - - - - - - - Zip - 0173-1#02-AAO129#002 - - - - - - - - Zip - Postleitzahl - - PostalCode - - - - - ZIP code of address - Postleitzahl der Anschrift - - - - - - - CityTown - 0173-1#02-AAO132#001 - - - - - - - - Ort - City/town - - City/town - - - - - Town or city of the company - Ortsangabe - - - - - - - StateCounty - 0173-1#02-AAO133#002 - - - - - - - - state/county - Bundesland - - StateCounty - - - - - Bundesland - state/county - - - - - - - ManufacturerProductFamily - 0173-1#02-AAU731#001 - - - - - - - - Manufacturer product family - Herstellerproduktfamilie - - TypClass - - - - - 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie - 2nd level of a 3 level manufacturer specific product hierarchy - - - - - - - SerialNumber - 0173-1#02-AAM556#002 - - - - - - - - Serial number - Seriennummer - - InstanceId - - - - - eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist - unique combination of numbers and letters used to identify the device once it has been manufactured - - - - - - - BatchNumber - 0173-1#02-AAQ196#001 - - - - - - - - Batch number - Chargen-Nummer - - ChargeId - - - - - Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge - Number assigned by the manufacturer of a material to identify the manufacturer's batch - - - - - - - ProductCountryOfOrigin - 0173-1#02-AAO841#001 - - - - - - - - Produkt Ursprungsland - Product country of origin - - CountryOfOrigin - - - - - Land in dem das Produkt hergestellt wurde (Hersteller Land) - Country in which the product is manufactured (manufacturer country) - - - - - - - YearOfConstruction - 0173-1#02-AAP906#001 - - - - - - - - Year of construction - Baujahr - - YearOfConstruction - - - - - Jahreszahl als Datumsangabe für die Fertigstellung des Objektes - Year as completion date of object - - - - - - - ProductMarking - https://www.hsu-hh.de/aut/aas/productmarking - - - - - - - - Produktkennzeichnung - Product Marking - - ProductMarking - - - - - Sammlungsdatei für Produktkennzeichnung - Collection file for product marking - - - - - - - CEQualificationPresent - 0173-1#02-BAF053#008 - - - - - - - - CE-Kennzeichnung vorhanden - CE- qualification present - - CEMarkingPresent - - - BOOLEAN - - whether CE- qualification is present - Angabe, ob CE-Kennzeichnung vorhanden ist - - - - - - - File - 0173-1#02-AAD005#008 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Enthaltene Doku. Datei - Embedded Doc. file - - File - - - - - Verweis/ BLOB auf enthaltene Dokumentations-Datei. - Reference/ BLOB to embedded documentation file. - - - - - - - DocumentationItem - 0173-1#02-AAD001#001 - - - - - - - - Dokumentationsgruppe - Documentation item - - DocumentationItem - - - - - Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. - Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. - - - - - - - DocumentType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - - - - - - Dokumententyp - Document Type - - DocumentType - - - - - Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) - TBD - - - - - - - VDI2770_DomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - - - - - - Domain-Nummer - DomainId - - DomainId - - - - - Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. - TBD - - - - - - - VDI2770_IdType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - - - - - - Nummerntyp - IdType - - IdType - - - - - Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. - TBD - - - - - - - DocumentId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - - - - - - DocumentId - Dokumenten-Nummer - - DocumentId - - - - - Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. - TBD - - - - - - - DocumentDomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - - - - - - DocumentDomainId - DocumentDomainId - - DocumentDomainId - - - - - Kennung oder Kennzeichen einer Domäne - TBD - - - - - - - VDI2770_Role - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - - - - - - Rolle - Role - - Role - - - - - Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) - TBD - - - - - - - VDI2770_OrganisationId - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - - - - - - Organisation ID - Organisation ID - - OrganisationId - - - - - eindeutige ID für die Organisation - TBD - - - - - - - VDI2770_OrganisationName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - - - - - - OrganisationName - OrganisationName - - OrganisationName - - - - - gebräuchliche Bezeichnung für die Organisation - TBD - - - - - - - VDI2770_OrganisationOfficialName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - - - - - - Offizieller Name der Organisation - Organisation Official Name - - OrganisationOfficialName - - - - - offizieller Name der Organisation - TBD - - - - - - - VDI2770_Description - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - - - - - - Beschreibung - Description - - Description - - - - - Beschreibung für die nächste übergeordnete Collection - TBD - - - - - - - DocumentPartId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - - - - - - Dokumenten-Teilnummer - DocumentPartId - - DocumentPartId - - - - - Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. - TBD - - - - - - - DocumentClassification_ClassId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - - - - Dokumentkategorie - Document category - - DocCategory - - - - - Dokumentkategorie nach VDI 2770:2018/10 - Document category after VDI 2770:2018/10 - - - - - - - VDI2770_ClassName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - - - - - - Klassenname - Class Name - - ClassName - - - - - Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. - TBD - - - - - - - VDI2770_ClassificationSystem - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - - - - - - Klassifizierungssystem - classification system - - ClassificationSystem - - - - - Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. - TBD - - - - - - - DocumentVersionId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - - - - - - Dokumenten-Versionsnummer - DocumentVersionId - - DocumentVersionId - - - - - Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. - TBD - - - - - - - DocumentVersion_LanguageCode - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - - - - - - Sprachenschlüssel - LanguageCode - - LanguageCode - - - - - Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 - TBD - - - - - - - VDI2770_Title - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - - - - - - Titel - Title - - VDI2770_Title - - - - - sprachabhängiger Titel des Dokuments - TBD - - - - - - - VDI2770_Summary - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - - - - - - Zusammenfassung - Summary - - Summary - - - - - sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts - TBD - - - - - - - VDI2770_Keywords - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - - - - - - Schlagwörter - Keywords - - Keywords - - - - - sprachabhängige, durch Komma getrennte Liste von Schlagwörtern - TBD - - - - - - - VDI2770_StatusValue - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - - - - - - Statuswert - StatusValue - - StatusValue - - - - - Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) - TBD - - - - - - - VDI2770_SetDate - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - - - - - - Erstellungsdatum - Set Date - - SetDate - - - - - Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). - TBD - - - - - - - VDI2770_Purpose - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - - - - - - Zweck - Purpose - - Purpose - - - - - Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. - TBD - - - - - - - VDI2770_BasedOnProcedure - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - - - - - - Prozedur - Procedure - - BasedOnProcedure - - - - - textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt - TBD - - - - - - - VDI2770_Comments - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - - - - - - Kommentar - Comments - - Comments - - - - - textuelle Bemerkungen und Anmerkungen zum Status - TBD - - - - - - - VDI2770_ReferencedObject_Type - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - - - - - - Typ - Type - - Type - - - - - Für Type des Objekts muss immer Product angegeben werden. - TBD - - - - - - - VDI2770_ReferencedObject_RefType - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - - - - - - RefType - RefType - - RefType - - - - - Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) - TBD - - - - - - - VDI2770_ReferencedObject_ObjectId - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - - - - - - ObjectId - ObjectId - - ObjectId - - - - - Angabe der Identifikationsnummer zum Objekt - TBD - - - - - - - VDI2770_FileId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - - - - - - ID der Datei - File ID - - FileId - - - - - eindeutige ID für die Datei - TBD - - - - - - - VDI2770_FileName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - - - - - - Dateiname - File name - - FileName - - - - - Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. - TBD - - - - - - - VDI2770_FileFormat - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - - - - - - Datei Format - File format - - FileFormat - - - - - Angabe eines Media Typs gemäß der Liste der IANA - TBD - - - - - - - OrganisationContactInfo - https://www.hsu-hh.de/aut/aas/contactinfo - - - - - - - - Contact Info - Kontakt Info - - OrganisationContactInfo - - - - - Sammlung für die allgemeinen Kontaktdaten - Collection for general contact data - - - - - - - NameOfSupplier - 0173-1#02-AAO735#003 - - - - - - - - - - - - name of supplier - Lieferantenname - - name of supplier - - - - - Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt - name of supplier which provides the customer with a product or a service - - - - - - - ContactInfo_Role - https://www.hsu-hh.de/aut/aas/role - - - - - - - - Rolle - Role - - Role - - - - - Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt - Information to specify the role which the organisation of ContactInfo plays - - - - - - - Email - https://www.hsu-hh.de/aut/aas/email - - - - - - - - Emailadresse - Email address - - Email - - - - - Emailadresse - Email address - - - - - - - URL - 0173-1#02-AAO694#001 - - - - - - - - Internetadresse - Internet address - - URL - - - - - stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html - Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html - - - - - - - PhoneNumber - 0173-1#02-AAO136#002 - - - - - - - - Telefonnummer - telephone number - - Phone - - - - - vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist - complete telephone number to be called to reach a business partner - - - - - - - Fax - https://www.hsu-hh.de/aut/aas/fax - - - - - - - - Fax - Fax - - Fax - - - - - Faxnummer - Fax number - - - - - - - 0173-1#02-AAO136#002 - - - - - GLNOfManufacturer - 0173-1#02-AAY812#001 - - - - - - - - GLN of manufacturer - GLN des Herstellers - - GLN of manufacturer - - - - - international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort - internationally unique identification number for the manufacturer of the device or the product and for the physical location - - - - - - - SupplierOfTheIdentifier - 0173-1#02-AAP796#004 - - - - - - - - Supplier of the identifier - Anbieter der Identifikationsnummer für Hersteller - - Supplier of the identifier - - - STRING_TRANSLATABLE - - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - - - - - - - MAN_PROD_NUM - - product article number of manufacturer - - 0173-1#02-AAO676#003 - - - - - - - - product article number of manufacturer - Herstellerartikelnummer - - MAN_PROD_NUM - - - STRING_TRANSLATABLE - - eindeutiger Bestellschlüssel des Herstellers - unique product identifier of the manufacturer - - - - - - - ManufacturerProductDescription - 0173-1#02-AAU734#001 - - - - - - - - Manufacturer product description - Herstellerproduktbeschreibung - - Manufacturer product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - GLNOfSupplier - 0173-1#02-AAY813#001 - - - - - - - - GLN of supplier - GLN des Lieferanten - - GLN of supplier - - - - - international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort - internationally unique identification number for the supplier of the device or the product and for the physical location - - - - - - - SupplierIdProvider - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - - - - - - SupplierIdProvider - Anbieter der Identifikationsnummer - - SupplierIdProvider - - - STRING_TRANSLATABLE - - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - - - - - - - SUP_PROD_NUM - 0173-1#02-AAO736#004 - - - - - - - - product article number of supplier - Lieferantenartikelnummer - - product article number of supplier - - - - - eindeutiger Bestellschlüssel des Lieferanten - unique product order identifier of the supplier - - - - - - - SupplierProductDesignation - 0173-1#02-AAM551#002 - - - - - - - - Supplier product designation - Lieferantenproduktbezeichnung - - SupplierTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - SupplierProductDescription - 0173-1#02-AAU730#001 - - - - - - - - Supplier product description - Lieferantenproduktbeschreibung - - Supplier product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - ClassificationSystem - 0173-1#02-AAO715#002 - - - - - - - - classification system - Klassifizierungssystem - - ClassificationSystem - - - - - Klassifizierungssystem - Classification System - - - - - - - SecondaryKeyTyp - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - - - - - - SecondaryKeyTyp - Typnummer des IT Systems - - SecondaryKeyTyp - - - - - Führende technische ID im IT System des Typs - SecondaryKeyTyp - - - - - - - TypThumbnail - www.company.com/ids/cd/6044_0150_1191_5121 - - - - - - - - TypThumbnail - Vorschaubild - - TypThumbnail - - - - - Darstellung des Produkttyps in kleinem Format - Small picture of the product type - - - - - - - AssetId - https://www.hsu-hh.de/aut/aas/assetid - - - - - - - - AssetId - Asset ID - - AssetId - - - - - Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. - Global unique ID of an asset, which can be read by both human and machine. - - - - - - - SecondaryKeyInstance - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - - - - - - SecondaryKeyInstance - Instanznummer des IT Systems - - SecondaryKeyInstance - - - - - Führende technische ID im IT System der Instanz - SecondaryKeyInstance - - - - - - - DateOfManufacture - 0173-1#02-AAR972#002 - - - - - - - - Date of manufacture - Herstellungsdatum - - Date of manufacture - - - DATE - - Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist - Date from which the production and / or development process is completed or from which a service is provided completely - - - - - - - DeviceRevision - https://www.hsu-hh.de/aut/aas/devicerevision - - - - - - - - DeviceRevision - DeviceRevision - - DeviceRevision - - - - - DeviceRevision - DeviceRevision - - - - - - - SoftwareRevision - https://www.hsu-hh.de/aut/aas/softwarerevision - - - - - - - - SoftwareRevision - SoftwareRevision - - SoftwareRevision - - - - - SoftwareRevision - SoftwareRevision - - - - - - - HardwareRevision - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - - - - - - HardwareRevision - HardwareRevision - - HardwareRevision - - - - - HardwareRevision - HardwareRevision - - - - - - - QrCode - https://www.hsu-hh.de/aut/aas/qrcode - - - - - - - - QrCode - QrCode - - QrCode - - - - - In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. - QrCode - - - - - - - CompanyLogo - https://www.hsu-hh.de/aut/aas/companylogo - - - - - - - - Firmenlogo - CompanyLogo - - CompanyLogo - - - - - Firmenlogo - CompanyLogo - - - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/11_SchneiderElectric.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/11_SchneiderElectric.aasx.xml deleted file mode 100644 index 8912f73c0..000000000 --- a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/11_SchneiderElectric.aasx.xml +++ /dev/null @@ -1,4570 +0,0 @@ - - - - - SE_Modicon_M262 - www.company.com/ids/aas/2520_6010_8091_1277 - - - www.company.com/ids/asset/8220_6010_8091_3593 - - - - - - www.company.com/ids/sm/4343_5072_7091_3242 - - - - - www.company.com/ids/sm/2543_5072_7091_2660 - - - - - www.company.com/ids/sm/6053_5072_7091_5102 - - - - - www.company.com/ids/sm/6563_5072_7091_4267 - - - - - - - - - SE_Modicon_M262 - www.company.com/ids/asset/8220_6010_8091_3593 - Instance - - - - - Nameplate - www.company.com/ids/sm/4343_5072_7091_3242 - - - https://www.hsu-hh.de/aut/aas/nameplate - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Schneider Electric - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - IIOT ready Logic and Motion Controller - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - FR - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Rue Joseph Monier - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 92506 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Rueil Malmaison - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Hauts de Seine - - - - false - false - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - string - Logic/Motion controller - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 8B192700462 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - ProductCountryOfOrigin - PARAMETER - - - 0173-1#02-AAO841#001 - - - Instance - - string - FR - - - - - YearOfConstruction - PARAMETER - - - 0173-1#02-AAP906#001 - - - Instance - - string - 2019 - - - - - Marking_CE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/marking_ce.png - - - - false - false - - - - - Marking_UL - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/UL.png - - - - false - false - - - - - Marking_WEEE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/Marking_WEEE.png - - - - false - false - - - - - - Document - www.company.com/ids/sm/2543_5072_7091_2660 - - - https://www.hsu-hh.de/aut/aas/document - - - Instance - - - - - DeclarationCEMarking - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Schneider Electric SE - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Schneider Electric Automation GmbH - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02.00 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - EU - Declaration of conformity - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - MOD2019002.00_DeclarationOfConformity_TM262_TMS_TM3XHSC_signed.pdf - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - MOD2019002.00_DeclarationOfConformity_TM262_TMS_TM3XHSC_signed.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/MOD2019002.00_DeclarationOfConformity_TM262_TMS_TM3XHSC_signed.pdf - - - - false - false - - - - - DeclarationULMarking - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Schneider Electric SE - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Schneider Electric Automation GmbH - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Notice of Completion and autorization to apply the UL mark - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - M262_20190513_Notice of Authorization.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/M262_20190513_Notice_of_Authorization.pdf - - - - false - false - - - - - InstructionSheet - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - QGH5583101 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Schneider Electric SE - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Schneider Electric Automation GmbH - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Instruction Sheet - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - IS_M262.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/IS_M262.pdf - - - - false - false - - - - - - Service - www.company.com/ids/sm/6053_5072_7091_5102 - - - https://www.hsu-hh.de/aut/aas/service - - - Instance - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Schneider Elcetric - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Schneider Platz - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 97816 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Marktheidenfeld - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.schneider-electric.com/en/work/support/ - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - - - - - false - false - - - - - - Identification - www.company.com/ids/sm/6563_5072_7091_4267 - - - https://www.hsu-hh.de/aut/aas/identification - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Schneider Electric - - - - - GLNOfManufacturer - PARAMETER - - - 0173-1#02-AAY812#001 - - - Instance - - string - TM262L20MESE8T - - - - - SupplierOfTheIdentifier - - - 0173-1#02-AAP796#004 - - - Instance - - - - - - - - MAN_PROD_NUM - - - 0173-1#02-AAO676#003 - - - Instance - - - - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - IIOT Ready Logic and Motion Controller - - - - - ManufacturerProductDescription - PARAMETER - - - 0173-1#02-AAU734#001 - - - Instance - - langString - Logic/Motion controller Modicon M262 IIoT-ready logic & motion controller for performance machines. Modicon M262 controllers embed Industrial Internet of Things (IIoT) protocols and encryption to provide direct cloud connectivity & digital services. - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Schneider Electric - - - - - GLNOfSupplier - PARAMETER - - - 0173-1#02-AAY813#001 - - - Instance - - string - TM262L20MESE8T - - - - - SupplierIdProvider - PARAMETER - - - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - Instance - - - - - - - - SUP_PROD_NUM - PARAMETER - - - 0173-1#02-AAO736#004 - - - Instance - - - - - - - - SupplierProductDesignation - - - 0173-1#02-AAM551#002 - - - Instance - - string - IIOT Ready Logic and Motion Controller - - - - - SupplierProductDescription - PARAMETER - - - 0173-1#02-AAU730#001 - - - Instance - - langString - Logic/Motion controller Modicon M262 IIoT-ready logic & motion controller for performance machines. Modicon M262 controllers embed Industrial Internet of Things (IIoT) protocols and encryption to provide direct cloud connectivity & digital services. - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - string - Logic/Motion controller - - - - - ClassificationSystem - PARAMETER - - - 0173-1#02-AAO715#002 - - - Instance - - string - - - - - - SecondaryKeyTyp - - - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - Instance - - - - - - - - TypThumbnail - PARAMETER - - - www.company.com/ids/cd/4401_1272_7091_3437 - - - Instance - - image/jpeg - /aasx/Identification/M262.PNG - - - - - AssetId - PARAMETER - - - https://www.hsu-hh.de/aut/aas/assetid - - - Instance - - string - www.company.com/ids/asset/8220_6010_8091_3593 - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 8B192700462 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - SecondaryKeyInstance - PARAMETER - - - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - Instance - - - - - - - - DateOfManufacture - PARAMETER - - - 0173-1#02-AAR972#002 - - - Instance - - - - - - - - DeviceRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/devicerevision - - - Instance - - - - - - - - SoftwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/softwarerevision - - - Instance - - - - - - - - HardwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - Instance - - - - - - - - QrCode - PARAMETER - - - https://www.hsu-hh.de/aut/aas/qrcode - - - Instance - - image/jpeg - /aasx/Identification/QRCode_M262.JPG - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Schneider Electric - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - FR - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Rue Joseph Monier - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 92506 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Rueil Malmaison - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Hauts de Seine - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.schneider-electric.com/en/ - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - - - - - false - false - - - - - CompanyLogo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/companylogo - - - Instance - - image/png - /aasx/Identification/logo_SE.png - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.schneider-electric.com/en/product-range-presentation/65771-logic-motion-controller-modicon-m262/?filter=business-1-industrial-automation-and-control#tabs-top - - - - - - - - ManufacturerName - 0173-1#02-AAO677#002 - - - - - - - - Herstellername - Manufacturer Name - - Manufacturer Name - - - - - Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist - 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 - - - - - - - ManufacturerProductDesignation - 0173-1#02-AAW338#001 - - - - - - - - Manufacturer product designation - Herstellerproduktbezeichnung - - - ManufacturerTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - PhysicalAddress - https://www.hsu-hh.de/aut/aas/physicaladdress - - - - - - - - PhysicalAddress - Physische Adresse - - PhysicalAddress - - - - - Sammlung für reale physische Adresse - Collection for real physical address - - - - - - - CountryCode - 0173-1#02-AAO730#001 - - - - - - - - - - - - Landeskennung - Country code - - Country code - - - - - Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes - agreed upon symbol for unambiguous identification of a country - - - - - - - Street - 0173-1#02-AAO128#001 - - - - - - - - Strasse - Street - - Street - - - - - Name der Strasse und Hausnummer - Street name and house number - - - - - - - Zip - 0173-1#02-AAO129#002 - - - - - - - - Zip - Postleitzahl - - PostalCode - - - - - ZIP code of address - Postleitzahl der Anschrift - - - - - - - CityTown - 0173-1#02-AAO132#001 - - - - - - - - Ort - City/town - - City/town - - - - - Town or city of the company - Ortsangabe - - - - - - - StateCounty - 0173-1#02-AAO133#002 - - - - - - - - state/county - Bundesland - - StateCounty - - - - - Bundesland - state/county - - - - - - - ManufacturerProductFamily - 0173-1#02-AAU731#001 - - - - - - - - Manufacturer product family - Herstellerproduktfamilie - - TypClass - - - - - 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie - 2nd level of a 3 level manufacturer specific product hierarchy - - - - - - - SerialNumber - 0173-1#02-AAM556#002 - - - - - - - - Serial number - Seriennummer - - InstanceId - - - - - eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist - unique combination of numbers and letters used to identify the device once it has been manufactured - - - - - - - BatchNumber - 0173-1#02-AAQ196#001 - - - - - - - - Batch number - Chargen-Nummer - - ChargeId - - - - - Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge - Number assigned by the manufacturer of a material to identify the manufacturer's batch - - - - - - - ProductCountryOfOrigin - 0173-1#02-AAO841#001 - - - - - - - - Produkt Ursprungsland - Product country of origin - - CountryOfOrigin - - - - - Land in dem das Produkt hergestellt wurde (Hersteller Land) - Country in which the product is manufactured (manufacturer country) - - - - - - - YearOfConstruction - 0173-1#02-AAP906#001 - - - - - - - - Year of construction - Baujahr - - YearOfConstruction - - - - - Jahreszahl als Datumsangabe für die Fertigstellung des Objektes - Year as completion date of object - - - - - - - ProductMarking - https://www.hsu-hh.de/aut/aas/productmarking - - - - - - - - Produktkennzeichnung - Product Marking - - ProductMarking - - - - - Sammlungsdatei für Produktkennzeichnung - Collection file for product marking - - - - - - - CEQualificationPresent - 0173-1#02-BAF053#008 - - - - - - - - CE-Kennzeichnung vorhanden - CE- qualification present - - CEMarkingPresent - - - BOOLEAN - - whether CE- qualification is present - Angabe, ob CE-Kennzeichnung vorhanden ist - - - - - - - File - 0173-1#02-AAD005#008 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Enthaltene Doku. Datei - Embedded Doc. file - - File - - - - - Verweis/ BLOB auf enthaltene Dokumentations-Datei. - Reference/ BLOB to embedded documentation file. - - - - - - - DocumentationItem - 0173-1#02-AAD001#001 - - - - - - - - Dokumentationsgruppe - Documentation item - - DocumentationItem - - - - - Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. - Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. - - - - - - - DocumentType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - - - - - - Dokumententyp - Document Type - - DocumentType - - - - - Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) - TBD - - - - - - - VDI2770_DomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - - - - - - Domain-Nummer - DomainId - - DomainId - - - - - Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. - TBD - - - - - - - VDI2770_IdType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - - - - - - Nummerntyp - IdType - - IdType - - - - - Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. - TBD - - - - - - - DocumentId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - - - - - - DocumentId - Dokumenten-Nummer - - DocumentId - - - - - Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. - TBD - - - - - - - DocumentDomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - - - - - - DocumentDomainId - DocumentDomainId - - DocumentDomainId - - - - - Kennung oder Kennzeichen einer Domäne - TBD - - - - - - - VDI2770_Role - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - - - - - - Rolle - Role - - Role - - - - - Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) - TBD - - - - - - - VDI2770_OrganisationId - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - - - - - - Organisation ID - Organisation ID - - OrganisationId - - - - - eindeutige ID für die Organisation - TBD - - - - - - - VDI2770_OrganisationName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - - - - - - OrganisationName - OrganisationName - - OrganisationName - - - - - gebräuchliche Bezeichnung für die Organisation - TBD - - - - - - - VDI2770_OrganisationOfficialName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - - - - - - Offizieller Name der Organisation - Organisation Official Name - - OrganisationOfficialName - - - - - offizieller Name der Organisation - TBD - - - - - - - VDI2770_Description - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - - - - - - Beschreibung - Description - - Description - - - - - Beschreibung für die nächste übergeordnete Collection - TBD - - - - - - - DocumentPartId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - - - - - - Dokumenten-Teilnummer - DocumentPartId - - DocumentPartId - - - - - Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. - TBD - - - - - - - DocumentClassification_ClassId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - - - - Dokumentkategorie - Document category - - DocCategory - - - - - Dokumentkategorie nach VDI 2770:2018/10 - Document category after VDI 2770:2018/10 - - - - - - - VDI2770_ClassName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - - - - - - Klassenname - Class Name - - ClassName - - - - - Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. - TBD - - - - - - - VDI2770_ClassificationSystem - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - - - - - - Klassifizierungssystem - classification system - - ClassificationSystem - - - - - Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. - TBD - - - - - - - DocumentVersionId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - - - - - - Dokumenten-Versionsnummer - DocumentVersionId - - DocumentVersionId - - - - - Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. - TBD - - - - - - - DocumentVersion_LanguageCode - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - - - - - - Sprachenschlüssel - LanguageCode - - LanguageCode - - - - - Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 - TBD - - - - - - - VDI2770_Title - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - - - - - - Titel - Title - - VDI2770_Title - - - - - sprachabhängiger Titel des Dokuments - TBD - - - - - - - VDI2770_Summary - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - - - - - - Zusammenfassung - Summary - - Summary - - - - - sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts - TBD - - - - - - - VDI2770_Keywords - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - - - - - - Schlagwörter - Keywords - - Keywords - - - - - sprachabhängige, durch Komma getrennte Liste von Schlagwörtern - TBD - - - - - - - VDI2770_StatusValue - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - - - - - - Statuswert - StatusValue - - StatusValue - - - - - Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) - TBD - - - - - - - VDI2770_SetDate - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - - - - - - Erstellungsdatum - Set Date - - SetDate - - - - - Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). - TBD - - - - - - - VDI2770_Purpose - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - - - - - - Zweck - Purpose - - Purpose - - - - - Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. - TBD - - - - - - - VDI2770_BasedOnProcedure - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - - - - - - Prozedur - Procedure - - BasedOnProcedure - - - - - textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt - TBD - - - - - - - VDI2770_Comments - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - - - - - - Kommentar - Comments - - Comments - - - - - textuelle Bemerkungen und Anmerkungen zum Status - TBD - - - - - - - VDI2770_ReferencedObject_Type - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - - - - - - Typ - Type - - Type - - - - - Für Type des Objekts muss immer Product angegeben werden. - TBD - - - - - - - VDI2770_ReferencedObject_RefType - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - - - - - - RefType - RefType - - RefType - - - - - Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) - TBD - - - - - - - VDI2770_ReferencedObject_ObjectId - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - - - - - - ObjectId - ObjectId - - ObjectId - - - - - Angabe der Identifikationsnummer zum Objekt - TBD - - - - - - - VDI2770_FileId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - - - - - - ID der Datei - File ID - - FileId - - - - - eindeutige ID für die Datei - TBD - - - - - - - VDI2770_FileName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - - - - - - Dateiname - File name - - FileName - - - - - Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. - TBD - - - - - - - VDI2770_FileFormat - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - - - - - - Datei Format - File format - - FileFormat - - - - - Angabe eines Media Typs gemäß der Liste der IANA - TBD - - - - - - - OrganisationContactInfo - https://www.hsu-hh.de/aut/aas/contactinfo - - - - - - - - Contact Info - Kontakt Info - - OrganisationContactInfo - - - - - Sammlung für die allgemeinen Kontaktdaten - Collection for general contact data - - - - - - - NameOfSupplier - 0173-1#02-AAO735#003 - - - - - - - - - - - - name of supplier - Lieferantenname - - name of supplier - - - - - Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt - name of supplier which provides the customer with a product or a service - - - - - - - ContactInfo_Role - https://www.hsu-hh.de/aut/aas/role - - - - - - - - Rolle - Role - - Role - - - - - Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt - Information to specify the role which the organisation of ContactInfo plays - - - - - - - Email - https://www.hsu-hh.de/aut/aas/email - - - - - - - - Emailadresse - Email address - - Email - - - - - Emailadresse - Email address - - - - - - - URL - 0173-1#02-AAO694#001 - - - - - - - - Internetadresse - Internet address - - URL - - - - - stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html - Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html - - - - - - - PhoneNumber - 0173-1#02-AAO136#002 - - - - - - - - Telefonnummer - telephone number - - Phone - - - - - vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist - complete telephone number to be called to reach a business partner - - - - - - - Fax - https://www.hsu-hh.de/aut/aas/fax - - - - - - - - Fax - Fax - - Fax - - - - - Faxnummer - Fax number - - - - - - - 0173-1#02-AAO136#002 - - - - - GLNOfManufacturer - 0173-1#02-AAY812#001 - - - - - - - - GLN of manufacturer - GLN des Herstellers - - GLN of manufacturer - - - - - international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort - internationally unique identification number for the manufacturer of the device or the product and for the physical location - - - - - - - SupplierOfTheIdentifier - 0173-1#02-AAP796#004 - - - - - - - - Supplier of the identifier - Anbieter der Identifikationsnummer für Hersteller - - Supplier of the identifier - - - STRING_TRANSLATABLE - - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - - - - - - - MAN_PROD_NUM - - product article number of manufacturer - - 0173-1#02-AAO676#003 - - - - - - - - product article number of manufacturer - Herstellerartikelnummer - - MAN_PROD_NUM - - - STRING_TRANSLATABLE - - eindeutiger Bestellschlüssel des Herstellers - unique product identifier of the manufacturer - - - - - - - ManufacturerProductDescription - 0173-1#02-AAU734#001 - - - - - - - - Manufacturer product description - Herstellerproduktbeschreibung - - Manufacturer product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - GLNOfSupplier - 0173-1#02-AAY813#001 - - - - - - - - GLN of supplier - GLN des Lieferanten - - GLN of supplier - - - - - international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort - internationally unique identification number for the supplier of the device or the product and for the physical location - - - - - - - SupplierIdProvider - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - - - - - - SupplierIdProvider - Anbieter der Identifikationsnummer - - SupplierIdProvider - - - STRING_TRANSLATABLE - - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - - - - - - - SUP_PROD_NUM - 0173-1#02-AAO736#004 - - - - - - - - product article number of supplier - Lieferantenartikelnummer - - product article number of supplier - - - - - eindeutiger Bestellschlüssel des Lieferanten - unique product order identifier of the supplier - - - - - - - SupplierProductDesignation - 0173-1#02-AAM551#002 - - - - - - - - Supplier product designation - Lieferantenproduktbezeichnung - - SupplierTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - SupplierProductDescription - 0173-1#02-AAU730#001 - - - - - - - - Supplier product description - Lieferantenproduktbeschreibung - - Supplier product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - ClassificationSystem - 0173-1#02-AAO715#002 - - - - - - - - classification system - Klassifizierungssystem - - ClassificationSystem - - - - - Klassifizierungssystem - Classification System - - - - - - - SecondaryKeyTyp - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - - - - - - SecondaryKeyTyp - Typnummer des IT Systems - - SecondaryKeyTyp - - - - - Führende technische ID im IT System des Typs - SecondaryKeyTyp - - - - - - - TypThumbnail - www.company.com/ids/cd/4401_1272_7091_3437 - - - - - - - - TypThumbnail - Vorschaubild - - TypThumbnail - - - - - Darstellung des Produkttyps in kleinem Format - Small picture of the product type - - - - - - - AssetId - https://www.hsu-hh.de/aut/aas/assetid - - - - - - - - AssetId - Asset ID - - AssetId - - - - - Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. - Global unique ID of an asset, which can be read by both human and machine. - - - - - - - SecondaryKeyInstance - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - - - - - - SecondaryKeyInstance - Instanznummer des IT Systems - - SecondaryKeyInstance - - - - - Führende technische ID im IT System der Instanz - SecondaryKeyInstance - - - - - - - DateOfManufacture - 0173-1#02-AAR972#002 - - - - - - - - Date of manufacture - Herstellungsdatum - - Date of manufacture - - - DATE - - Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist - Date from which the production and / or development process is completed or from which a service is provided completely - - - - - - - DeviceRevision - https://www.hsu-hh.de/aut/aas/devicerevision - - - - - - - - DeviceRevision - DeviceRevision - - DeviceRevision - - - - - DeviceRevision - DeviceRevision - - - - - - - SoftwareRevision - https://www.hsu-hh.de/aut/aas/softwarerevision - - - - - - - - SoftwareRevision - SoftwareRevision - - SoftwareRevision - - - - - SoftwareRevision - SoftwareRevision - - - - - - - HardwareRevision - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - - - - - - HardwareRevision - HardwareRevision - - HardwareRevision - - - - - HardwareRevision - HardwareRevision - - - - - - - QrCode - https://www.hsu-hh.de/aut/aas/qrcode - - - - - - - - QrCode - QrCode - - QrCode - - - - - In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. - QrCode - - - - - - - CompanyLogo - https://www.hsu-hh.de/aut/aas/companylogo - - - - - - - - Firmenlogo - CompanyLogo - - CompanyLogo - - - - - Firmenlogo - CompanyLogo - - - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/12_Pepperl+Fuchs.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/12_Pepperl+Fuchs.aasx.xml deleted file mode 100644 index b11a4a11a..000000000 --- a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/12_Pepperl+Fuchs.aasx.xml +++ /dev/null @@ -1,3973 +0,0 @@ - - - - - PeFu_267075_100078 - www.company.com/ids/aas/8403_3140_0191_8844 - - - www.company.com/ids/asset/1595_3140_0191_3961 - - - - - - www.company.com/ids/sm/4343_5072_7091_3242 - - - - - www.company.com/ids/sm/2543_5072_7091_2660 - - - - - www.company.com/ids/sm/6053_5072_7091_5102 - - - - - www.company.com/ids/sm/6563_5072_7091_4267 - - - - - - - - - 267075_100078 - CONSTANT - www.company.com/ids/asset/1595_3140_0191_3961 - Instance - - - - - Nameplate - www.company.com/ids/sm/4343_5072_7091_3242 - - - https://www.hsu-hh.de/aut/aas/nameplate - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Pepperl+Fuchs - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - Distance Sensor - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Lilienthalstr. 200 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 68307 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Mannheim - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Baden-Wuertemberg - - - - false - false - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 40000089327054 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - ProductCountryOfOrigin - PARAMETER - - - 0173-1#02-AAO841#001 - - - Instance - - string - DE - - - - - YearOfConstruction - PARAMETER - - - 0173-1#02-AAP906#001 - - - Instance - - string - 2018 - - - - - Marking_CE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/marking_ce.png - - - - false - false - - - - - - Document - www.company.com/ids/sm/2543_5072_7091_2660 - - - https://www.hsu-hh.de/aut/aas/document - - - Instance - - - - - DeclarationCEMarking - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Pepperl+Fuchs - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Pepperl+Fuchs - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - EU-Konformitätserklärung - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - EU-Konformitaetserklaerung.pdf.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/EU-Konformitaetserklaerung.pdf - - - - false - false - - - - - Certificat_DIN_EN_ISO_14001_2015 - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Pepperl+Fuchs - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Pepperl+Fuchs - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Data Sheet OMT100-R100-2EP-IO-V31 - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - 267075-100078_eng.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/267075-100078_eng.pdf - - - - false - false - - - - - - Service - www.company.com/ids/sm/6053_5072_7091_5102 - - - https://www.hsu-hh.de/aut/aas/service - - - Instance - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Pepperl+Fuchs - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Lilienthalstr. 200 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 68307 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Mannheim - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Baden-Würtemberg - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - info@pepperl-fuchs.com - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.pepperl-fuchs.com - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +496217760 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - - - - - - false - false - - - - - - Identification - www.company.com/ids/sm/6563_5072_7091_4267 - - - https://www.hsu-hh.de/aut/aas/identification - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Pepperl+Fuchs - - - - - GLNOfManufacturer - PARAMETER - - - 0173-1#02-AAY812#001 - - - Instance - - - - - - - - SupplierOfTheIdentifier - - - 0173-1#02-AAP796#004 - - - Instance - - - - - - - - MAN_PROD_NUM - - - 0173-1#02-AAO676#003 - - - Instance - - string - 267075-100078 - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - OMT100-R100-2EP-IO-V31 - - - - - ManufacturerProductDescription - PARAMETER - - - 0173-1#02-AAU734#001 - - - Instance - - string - Distance Sensor, Measurement to object, 100 mm detection range, red light, measured value via IO-Link, 2 x push-pull output, M8 plug - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Pepperl+Fuchs - - - - - GLNOfSupplier - PARAMETER - - - 0173-1#02-AAY813#001 - - - Instance - - - - - - - - SupplierIdProvider - PARAMETER - - - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - Instance - - - - - - - - SUP_PROD_NUM - PARAMETER - - - 0173-1#02-AAO736#004 - - - Instance - - string - 267075-100078 - - - - - SupplierProductDesignation - - - 0173-1#02-AAM551#002 - - - Instance - - string - OMT100-R100-2EP-IO-V31 - - - - - SupplierProductDescription - PARAMETER - - - 0173-1#02-AAU730#001 - - - Instance - - string - Distance Sensor - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - - - - - - ClassificationSystem - PARAMETER - - - 0173-1#02-AAO715#002 - - - Instance - - string - eclass - - - - - SecondaryKeyTyp - - - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - Instance - - - - - - - - TypThumbnail - PARAMETER - - - www.company.com/ids/cd/4401_1272_7091_3437 - - - Instance - - image/jpeg - /MAC0007059_rgb.jpg - - - - - AssetId - PARAMETER - - - https://www.hsu-hh.de/aut/aas/assetid - - - Instance - - string - www.company.com/ids/asset/1595_3140_0191_3961 - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 40000089327054 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - SecondaryKeyInstance - PARAMETER - - - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - Instance - - - - - - - - DateOfManufacture - PARAMETER - - - 0173-1#02-AAR972#002 - - - Instance - - - - - - - - DeviceRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/devicerevision - - - Instance - - - - - - - - SoftwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/softwarerevision - - - Instance - - - - - - - - HardwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - Instance - - - - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Pepperl+Fuchs - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Lilienthalstr. 200 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 68307 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Mannheim - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Baden-Würtemberg - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - info@pepperl-fuchs.com - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.pepperl-fuchs.com - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +496217760 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - - - - - - false - false - - - - - CompanyLogo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/companylogo - - - Instance - - image/png - /aasx/Identification/PF_Logo_RGB.jpg - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.pepperl-fuchs.com/usa/en/classid_53.htm?view=productdetails&prodid=66664 - - - - - - - - ManufacturerName - 0173-1#02-AAO677#002 - - - - - - - - Herstellername - Manufacturer Name - - Manufacturer Name - - - - - Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist - 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 - - - - - - - ManufacturerProductDesignation - 0173-1#02-AAW338#001 - - - - - - - - Manufacturer product designation - Herstellerproduktbezeichnung - - ManufacturerTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - PhysicalAddress - https://www.hsu-hh.de/aut/aas/physicaladdress - - - - - - - - PhysicalAddress - Physische Adresse - - PhysicalAddress - - - - - Sammlung für reale physische Adresse - Collection for real physical address - - - - - - - CountryCode - 0173-1#02-AAO730#001 - - - - - - - - - - - - Landeskennung - Country code - - Country code - - - - - Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes - agreed upon symbol for unambiguous identification of a country - - - - - - - Street - 0173-1#02-AAO128#001 - - - - - - - - Strasse - Street - - Street - - - - - Name der Strasse und Hausnummer - Street name and house number - - - - - - - Zip - 0173-1#02-AAO129#002 - - - - - - - - Zip - Postleitzahl - - PostalCode - - - - - ZIP code of address - Postleitzahl der Anschrift - - - - - - - CityTown - 0173-1#02-AAO132#001 - - - - - - - - Ort - City/town - - City/town - - - - - Town or city of the company - Ortsangabe - - - - - - - StateCounty - 0173-1#02-AAO133#002 - - - - - - - - state/county - Bundesland - - StateCounty - - - - - Bundesland - state/county - - - - - - - ManufacturerProductFamily - 0173-1#02-AAU731#001 - - - - - - - - Manufacturer product family - Herstellerproduktfamilie - - TypClass - - - - - 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie - 2nd level of a 3 level manufacturer specific product hierarchy - - - - - - - SerialNumber - 0173-1#02-AAM556#002 - - - - - - - - Serial number - Seriennummer - - InstanceId - - - - - eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist - unique combination of numbers and letters used to identify the device once it has been manufactured - - - - - - - BatchNumber - 0173-1#02-AAQ196#001 - - - - - - - - Batch number - Chargen-Nummer - - ChargeId - - - - - Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge - Number assigned by the manufacturer of a material to identify the manufacturer's batch - - - - - - - ProductCountryOfOrigin - 0173-1#02-AAO841#001 - - - - - - - - Produkt Ursprungsland - Product country of origin - - CountryOfOrigin - - - - - Land in dem das Produkt hergestellt wurde (Hersteller Land) - Country in which the product is manufactured (manufacturer country) - - - - - - - YearOfConstruction - 0173-1#02-AAP906#001 - - - - - - - - Year of construction - Baujahr - - YearOfConstruction - - - - - Jahreszahl als Datumsangabe für die Fertigstellung des Objektes - Year as completion date of object - - - - - - - ProductMarking - https://www.hsu-hh.de/aut/aas/productmarking - - - - - - - - Produktkennzeichnung - Product Marking - - ProductMarking - - - - - Sammlungsdatei für Produktkennzeichnung - Collection file for product marking - - - - - - - CEQualificationPresent - 0173-1#02-BAF053#008 - - - - - - - - CE-Kennzeichnung vorhanden - CE- qualification present - - CEMarkingPresent - - - BOOLEAN - - whether CE- qualification is present - Angabe, ob CE-Kennzeichnung vorhanden ist - - - - - - - File - 0173-1#02-AAD005#008 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Enthaltene Doku. Datei - Embedded Doc. file - - File - - - - - Verweis/ BLOB auf enthaltene Dokumentations-Datei. - Reference/ BLOB to embedded documentation file. - - - - - - - DocumentationItem - 0173-1#02-AAD001#001 - - - - - - - - Dokumentationsgruppe - Documentation item - - DocumentationItem - - - - - Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. - Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. - - - - - - - DocumentType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - - - - - - Dokumententyp - Document Type - - DocumentType - - - - - Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) - TBD - - - - - - - VDI2770_DomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - - - - - - Domain-Nummer - DomainId - - DomainId - - - - - Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. - TBD - - - - - - - VDI2770_IdType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - - - - - - Nummerntyp - IdType - - IdType - - - - - Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. - TBD - - - - - - - DocumentId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - - - - - - DocumentId - Dokumenten-Nummer - - DocumentId - - - - - Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. - TBD - - - - - - - DocumentDomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - - - - - - DocumentDomainId - DocumentDomainId - - DocumentDomainId - - - - - Kennung oder Kennzeichen einer Domäne - TBD - - - - - - - VDI2770_Role - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - - - - - - Rolle - Role - - Role - - - - - Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) - TBD - - - - - - - VDI2770_OrganisationId - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - - - - - - Organisation ID - Organisation ID - - OrganisationId - - - - - eindeutige ID für die Organisation - TBD - - - - - - - VDI2770_OrganisationName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - - - - - - OrganisationName - OrganisationName - - OrganisationName - - - - - gebräuchliche Bezeichnung für die Organisation - TBD - - - - - - - VDI2770_OrganisationOfficialName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - - - - - - Offizieller Name der Organisation - Organisation Official Name - - OrganisationOfficialName - - - - - offizieller Name der Organisation - TBD - - - - - - - VDI2770_Description - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - - - - - - Beschreibung - Description - - Description - - - - - Beschreibung für die nächste übergeordnete Collection - TBD - - - - - - - DocumentPartId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - - - - - - Dokumenten-Teilnummer - DocumentPartId - - DocumentPartId - - - - - Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. - TBD - - - - - - - DocumentClassification_ClassId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - - - - Dokumentkategorie - Document category - - DocCategory - - - - - Dokumentkategorie nach VDI 2770:2018/10 - Document category after VDI 2770:2018/10 - - - - - - - VDI2770_ClassName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - - - - - - Klassenname - Class Name - - ClassName - - - - - Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. - TBD - - - - - - - VDI2770_ClassificationSystem - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - - - - - - Klassifizierungssystem - classification system - - ClassificationSystem - - - - - Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. - TBD - - - - - - - DocumentVersionId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - - - - - - Dokumenten-Versionsnummer - DocumentVersionId - - DocumentVersionId - - - - - Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. - TBD - - - - - - - DocumentVersion_LanguageCode - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - - - - - - Sprachenschlüssel - LanguageCode - - LanguageCode - - - - - Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 - TBD - - - - - - - VDI2770_Title - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - - - - - - Titel - Title - - VDI2770_Title - - - - - sprachabhängiger Titel des Dokuments - TBD - - - - - - - VDI2770_Summary - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - - - - - - Zusammenfassung - Summary - - Summary - - - - - sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts - TBD - - - - - - - VDI2770_Keywords - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - - - - - - Schlagwörter - Keywords - - Keywords - - - - - sprachabhängige, durch Komma getrennte Liste von Schlagwörtern - TBD - - - - - - - VDI2770_StatusValue - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - - - - - - Statuswert - StatusValue - - StatusValue - - - - - Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) - TBD - - - - - - - VDI2770_SetDate - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - - - - - - Erstellungsdatum - Set Date - - SetDate - - - - - Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). - TBD - - - - - - - VDI2770_Purpose - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - - - - - - Zweck - Purpose - - Purpose - - - - - Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. - TBD - - - - - - - VDI2770_BasedOnProcedure - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - - - - - - Prozedur - Procedure - - BasedOnProcedure - - - - - textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt - TBD - - - - - - - VDI2770_Comments - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - - - - - - Kommentar - Comments - - Comments - - - - - textuelle Bemerkungen und Anmerkungen zum Status - TBD - - - - - - - VDI2770_ReferencedObject_Type - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - - - - - - Typ - Type - - Type - - - - - Für Type des Objekts muss immer Product angegeben werden. - TBD - - - - - - - VDI2770_ReferencedObject_RefType - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - - - - - - RefType - RefType - - RefType - - - - - Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) - TBD - - - - - - - VDI2770_ReferencedObject_ObjectId - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - - - - - - ObjectId - ObjectId - - ObjectId - - - - - Angabe der Identifikationsnummer zum Objekt - TBD - - - - - - - VDI2770_FileId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - - - - - - ID der Datei - File ID - - FileId - - - - - eindeutige ID für die Datei - TBD - - - - - - - VDI2770_FileName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - - - - - - Dateiname - File name - - FileName - - - - - Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. - TBD - - - - - - - VDI2770_FileFormat - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - - - - - - Datei Format - File format - - FileFormat - - - - - Angabe eines Media Typs gemäß der Liste der IANA - TBD - - - - - - - OrganisationContactInfo - https://www.hsu-hh.de/aut/aas/contactinfo - - - - - - - - Contact Info - Kontakt Info - - OrganisationContactInfo - - - - - Sammlung für die allgemeinen Kontaktdaten - Collection for general contact data - - - - - - - NameOfSupplier - 0173-1#02-AAO735#003 - - - - - - - - - - - - name of supplier - Lieferantenname - - name of supplier - - - - - Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt - name of supplier which provides the customer with a product or a service - - - - - - - ContactInfo_Role - https://www.hsu-hh.de/aut/aas/role - - - - - - - - Rolle - Role - - Role - - - - - Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt - Information to specify the role which the organisation of ContactInfo plays - - - - - - - Email - https://www.hsu-hh.de/aut/aas/email - - - - - - - - Emailadresse - Email address - - Email - - - - - Emailadresse - Email address - - - - - - - URL - 0173-1#02-AAO694#001 - - - - - - - - Internetadresse - Internet address - - URL - - - - - stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html - Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html - - - - - - - PhoneNumber - 0173-1#02-AAO136#002 - - - - - - - - Telefonnummer - telephone number - - Phone - - - - - vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist - complete telephone number to be called to reach a business partner - - - - - - - Fax - https://www.hsu-hh.de/aut/aas/fax - - - - - - - - Fax - Fax - - Fax - - - - - Faxnummer - Fax number - - - - - - - 0173-1#02-AAO136#002 - - - - - GLNOfManufacturer - 0173-1#02-AAY812#001 - - - - - - - - GLN of manufacturer - GLN des Herstellers - - GLN of manufacturer - - - - - international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort - internationally unique identification number for the manufacturer of the device or the product and for the physical location - - - - - - - SupplierOfTheIdentifier - 0173-1#02-AAP796#004 - - - - - - - - Supplier of the identifier - Anbieter der Identifikationsnummer für Hersteller - - Supplier of the identifier - - - STRING_TRANSLATABLE - - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - - - - - - - MAN_PROD_NUM - - product article number of manufacturer - - 0173-1#02-AAO676#003 - - - - - - - - product article number of manufacturer - Herstellerartikelnummer - - MAN_PROD_NUM - - - STRING_TRANSLATABLE - - eindeutiger Bestellschlüssel des Herstellers - unique product identifier of the manufacturer - - - - - - - ManufacturerProductDescription - 0173-1#02-AAU734#001 - - - - - - - - Manufacturer product description - Herstellerproduktbeschreibung - - Manufacturer product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - GLNOfSupplier - 0173-1#02-AAY813#001 - - - - - - - - GLN of supplier - GLN des Lieferanten - - GLN of supplier - - - - - international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort - internationally unique identification number for the supplier of the device or the product and for the physical location - - - - - - - SupplierIdProvider - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - - - - - - SupplierIdProvider - Anbieter der Identifikationsnummer - - SupplierIdProvider - - - STRING_TRANSLATABLE - - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - - - - - - - SUP_PROD_NUM - 0173-1#02-AAO736#004 - - - - - - - - product article number of supplier - Lieferantenartikelnummer - - product article number of supplier - - - - - eindeutiger Bestellschlüssel des Lieferanten - unique product order identifier of the supplier - - - - - - - SupplierProductDesignation - 0173-1#02-AAM551#002 - - - - - - - - Supplier product designation - Lieferantenproduktbezeichnung - - SupplierTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - SupplierProductDescription - 0173-1#02-AAU730#001 - - - - - - - - Supplier product description - Lieferantenproduktbeschreibung - - Supplier product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - ClassificationSystem - 0173-1#02-AAO715#002 - - - - - - - - classification system - Klassifizierungssystem - - ClassificationSystem - - - - - Klassifizierungssystem - Classification System - - - - - - - SecondaryKeyTyp - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - - - - - - SecondaryKeyTyp - Typnummer des IT Systems - - SecondaryKeyTyp - - - - - Führende technische ID im IT System des Typs - SecondaryKeyTyp - - - - - - - TypThumbnail - www.company.com/ids/cd/4401_1272_7091_3437 - - - - - - - - TypThumbnail - Vorschaubild - - TypThumbnail - - - - - Darstellung des Produkttyps in kleinem Format - Small picture of the product type - - - - - - - AssetId - https://www.hsu-hh.de/aut/aas/assetid - - - - - - - - AssetId - Asset ID - - AssetId - - - - - Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. - Global unique ID of an asset, which can be read by both human and machine. - - - - - - - SecondaryKeyInstance - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - - - - - - SecondaryKeyInstance - Instanznummer des IT Systems - - SecondaryKeyInstance - - - - - Führende technische ID im IT System der Instanz - SecondaryKeyInstance - - - - - - - DateOfManufacture - 0173-1#02-AAR972#002 - - - - - - - - Date of manufacture - Herstellungsdatum - - Date of manufacture - - - DATE - - Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist - Date from which the production and / or development process is completed or from which a service is provided completely - - - - - - - DeviceRevision - https://www.hsu-hh.de/aut/aas/devicerevision - - - - - - - - DeviceRevision - DeviceRevision - - DeviceRevision - - - - - DeviceRevision - DeviceRevision - - - - - - - SoftwareRevision - https://www.hsu-hh.de/aut/aas/softwarerevision - - - - - - - - SoftwareRevision - SoftwareRevision - - SoftwareRevision - - - - - SoftwareRevision - SoftwareRevision - - - - - - - HardwareRevision - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - - - - - - HardwareRevision - HardwareRevision - - HardwareRevision - - - - - HardwareRevision - HardwareRevision - - - - - - - QrCode - https://www.hsu-hh.de/aut/aas/qrcode - - - - - - - - QrCode - QrCode - - QrCode - - - - - In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. - QrCode - - - - - - - CompanyLogo - https://www.hsu-hh.de/aut/aas/companylogo - - - - - - - - Firmenlogo - CompanyLogo - - CompanyLogo - - - - - Firmenlogo - CompanyLogo - - - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/13_DKE.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/13_DKE.aasx.xml deleted file mode 100644 index 9c4ff996e..000000000 --- a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/13_DKE.aasx.xml +++ /dev/null @@ -1,4210 +0,0 @@ - - - - - dkeNamePlate - www.dke.de/digitales-typenschild - - - - - - - www.company.com/ids/sm/4343_5072_7091_3242 - - - - - www.company.com/ids/sm/6053_5072_7091_5102 - - - - - www.company.com/ids/sm/6563_5072_7091_4267 - - - - - www.company.com/ids/sm/5171_3150_1191_6645 - - - - - www.company.com/ids/sm/7543_3150_1191_1022 - - - - - - - - - DKE1234 - - DKE peppermint dragees - DEK Pfefferminzdragees - - www.company.com/ids/asset/3240_1162_7091_2878 - Instance - - - - - Nameplate - www.company.com/ids/sm/4343_5072_7091_3242 - - - https://www.hsu-hh.de/aut/aas/nameplate - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - DKE Deutsche Kommission Elektrotechnik Elektronik Informationstechnik in DIN und VDE - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - Pfefferminzdragees - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Stresemannallee 15 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 60596 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Frankfurt - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Hessen - - - - false - false - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 123456 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - ProductCountryOfOrigin - PARAMETER - - - 0173-1#02-AAO841#001 - - - Instance - - string - DE - - - - - YearOfConstruction - PARAMETER - - - 0173-1#02-AAP906#001 - - - Instance - - integer - 2019 - - - - - - Service - www.company.com/ids/sm/6053_5072_7091_5102 - - - https://www.hsu-hh.de/aut/aas/service - - - Instance - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - DKE Deutsche Kommission Elektrotechnik Elektronik Informationstechnik in DIN und VDE - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Distributor - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Stresemannallee 15 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 60596 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Frankfurt - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Hessen - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - dke@vde.com - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - string - https://www.dke.de/digitales-typenschild - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +49 69 6308-0 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - +49 69 6308-9863 - - - - false - false - - - - - - Identification - www.company.com/ids/sm/6563_5072_7091_4267 - - - https://www.hsu-hh.de/aut/aas/identification - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Deutsche Kommission Elektrotechnik Elektronik Informationstechnik in DIN und VDE - - - - - GLNOfManufacturer - PARAMETER - - - 0173-1#02-AAY812#001 - - - Instance - - string - DKE123456 - - - - - SupplierOfTheIdentifier - - - 0173-1#02-AAP796#004 - - - Instance - - - - - - - - MAN_PROD_NUM - - - 0173-1#02-AAO676#003 - - - Instance - - - - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - Pfefferminzdragees - - - - - ManufacturerProductDescription - PARAMETER - - - 0173-1#02-AAU734#001 - - - Instance - - langString - Pfefferminzdragees in Blechdose - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - DKE Deutsche Kommission Elektrotechnik Elektronik Informationstechnik in DIN und VDE - - - - - GLNOfSupplier - PARAMETER - - - 0173-1#02-AAY813#001 - - - Instance - - string - DKE123456 - - - - - SupplierIdProvider - PARAMETER - - - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - Instance - - - - - - - - SUP_PROD_NUM - PARAMETER - - - 0173-1#02-AAO736#004 - - - Instance - - - - - - - - SupplierProductDesignation - - - 0173-1#02-AAM551#002 - - - Instance - - string - Pfefferminzdragees - - - - - SupplierProductDescription - PARAMETER - - - 0173-1#02-AAU730#001 - - - Instance - - langString - Pfefferminzdragees in Blechdose - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - - - - - - ClassificationSystem - PARAMETER - - - 0173-1#02-AAO715#002 - - - Instance - - string - eclass - - - - - SecondaryKeyTyp - - - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - Instance - - - - - - - - TypThumbnail - PARAMETER - - - www.company.com/ids/cd/4401_1272_7091_3437 - - - Instance - - image/jpeg - /dke-dose.jpg - - - - - AssetId - PARAMETER - - - https://www.hsu-hh.de/aut/aas/assetid - - - Instance - - anyURI - www.dke.de/digitales-typenschild - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - DKE123456 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - SecondaryKeyInstance - PARAMETER - - - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - Instance - - - - - - - - DateOfManufacture - PARAMETER - - - 0173-1#02-AAR972#002 - - - Instance - - date - 2019 - - - - - DeviceRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/devicerevision - - - Instance - - - - - - - - SoftwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/softwarerevision - - - Instance - - - - - - - - HardwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - Instance - - - - - - - - QrCode - PARAMETER - - - https://www.hsu-hh.de/aut/aas/qrcode - - - Instance - - image/png - /aasx/dke-qr.png - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - DKE Deutsche Kommission Elektrotechnik Elektronik Informationstechnik in DIN und VDE - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Distributor - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - langString - Stresemannallee 15 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 60596 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Frankfurt - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Hessen - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - dke@vde.com - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.dke.de/digitales-typenschild - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +49 69 6308-0 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - +49 69 6308-9863 - - - - false - false - - - - - CompanyLogo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/companylogo - - - Instance - - image/jpeg - /aasx/dke-logo.jpg - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.dke.de/digitales-typenschild - - - - - LOT - CONSTANT - - Lot - Lot - - - - - - - - Instance - - string - 696.240 - - - - - best_before - - Mindesthaltbarkeit - best before - - - - - - - Instance - - date - 11/2020 - - - - - weight - CONSTANT - - Inhalt, g - content, g - - - - - - - Instance - - decimal - 18.0 - - - - - content - - Inhalt - CONTENT - - - - - - - - - - - - Instance - - string - Pfefferminzdragees - - - - - - nutrition_facts - PARAMETER - - Nährwertangaben - Nutrition Facts - - www.company.com/ids/sm/5171_3150_1191_6645 - - - - - - - https://www.hsu-hh.de/aut/aas/nutrition-facts - - - Instance - - - - - nutrition_value - CONSTANT - - Nährwert, kJ/100g - nutrition value, kJ/100g - - - - - - - - Instance - - decimal - 1604 - - - - - fat - - Fett, g - Fat, g - - - - - - - Instance - - decimal - 0.4 - - - - - saturated_fat - - gesättigte Fette, g - saturated fats, g - - - - - - - Instance - - decimal - 0.1 - - - - - carbohydrates - - Kohlenhydrate, g - Carbohydrates,g - - - - - - - Instance - - decimal - 93.2 - - - - - sugar - CONSTANT - - Zucker, g - Sugar, g - - - - - - - Instance - - decimal - 92.6 - - - - - protein - CONSTANT - - Eiweiß, g - Protein, g - - - - - - - - Instance - - long - 0.2 - - - - - salt - CONSTANT - - Salz, g - Salt, g - - - - - - - Instance - - string - < 0.005 - - - - - - ingredients - PARAMETER - - Inhaltsstoffe - Ingredients - - www.company.com/ids/sm/7543_3150_1191_1022 - - - https://www.hsu-hh.de/aut/aas/ingredients - - - Instance - - - - - igrendient_1 - - Inhaltsstoff 1 - Ingredient 1 - - - - - - - Instance - - string - sugar - - - - - ingredient_2 - - Inhaltsstoff 2 - Ingredient 2 - - - - - - - Instance - - string - dextrose - - - - - ingredient_3 - - Inhaltsstoff 3 - Ingredient 3 - - - - - - - Instance - - string - E470b - - - - - ingredient_4 - - Inhaltsstoff 4 - Ingredient 4 - - - - - - - Instance - - string - flavour - - - - - ingredient_5 - - Inhaltsstoff 5 - Ingredient 5 - - - - - - - Instance - - string - glucose - - - - - ingredient_6 - - Inhaltsstoff 6 - Ingredient 6 - - - - - - - Instance - - string - E171 - - - - - ingredient_7 - - Inhaltsstoff 7 - Ingredient 7 - - - - - - - Instance - - - carnauba wax - - - - - ingredient_8 - CONSTANT - - Inhaltsstoff 8 - Ingredient 8 - - - - - - - Instance - - string - gummi arabicum - - - - - - - - ManufacturerName - 0173-1#02-AAO677#002 - - - - - - - - Herstellername - Manufacturer Name - - Manufacturer Name - - - - - Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist - 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 - - - - - - - GLNOfManufacturer - 0173-1#02-AAY812#001 - - - - - - - - GLN of manufacturer - GLN des Herstellers - - GLN of manufacturer - - - - - international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort - internationally unique identification number for the manufacturer of the device or the product and for the physical location - - - - - - - SupplierOfTheIdentifier - 0173-1#02-AAP796#004 - - - - - - - - Supplier of the identifier - Anbieter der Identifikationsnummer für Hersteller - - Supplier of the identifier - - - STRING_TRANSLATABLE - - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - - - - - - - MAN_PROD_NUM - - product article number of manufacturer - - 0173-1#02-AAO676#003 - - - - - - - - product article number of manufacturer - Herstellerartikelnummer - - MAN_PROD_NUM - - - STRING_TRANSLATABLE - - eindeutiger Bestellschlüssel des Herstellers - unique product identifier of the manufacturer - - - - - - - ManufacturerProductDesignation - 0173-1#02-AAW338#001 - - - - - - - - Manufacturer product designation - Herstellerproduktbezeichnung - - ManufacturerTypName - - - STRING_TRANSLATABLE - - Pfefferminzdragees - peppermint dragees - - - - - - - ManufacturerProductDescription - 0173-1#02-AAU734#001 - - - - - - - - Manufacturer product description - Herstellerproduktbeschreibung - - Manufacturer product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - NameOfSupplier - 0173-1#02-AAO735#003 - - - - - - - - - - - - name of supplier - Lieferantenname - - name of supplier - - - - - Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt - name of supplier which provides the customer with a product or a service - - - - - - - GLNOfSupplier - 0173-1#02-AAY813#001 - - - - - - - - GLN of supplier - GLN des Lieferanten - - GLN of supplier - - - - - international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort - internationally unique identification number for the supplier of the device or the product and for the physical location - - - - - - - SupplierIdProvider - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - - - - - - SupplierIdProvider - Anbieter der Identifikationsnummer - - SupplierIdProvider - - - STRING_TRANSLATABLE - - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - - - - - - - SUP_PROD_NUM - 0173-1#02-AAO736#004 - - - - - - - - product article number of supplier - Lieferantenartikelnummer - - product article number of supplier - - - - - eindeutiger Bestellschlüssel des Lieferanten - unique product order identifier of the supplier - - - - - - - SupplierProductDesignation - 0173-1#02-AAM551#002 - - - - - - - - Supplier product designation - Lieferantenproduktbezeichnung - - SupplierTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - SupplierProductDescription - 0173-1#02-AAU730#001 - - - - - - - - Supplier product description - Lieferantenproduktbeschreibung - - Supplier product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - ManufacturerProductFamily - 0173-1#02-AAU731#001 - - - - - - - - Manufacturer product family - Herstellerproduktfamilie - - TypClass - - - - - 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie - 2nd level of a 3 level manufacturer specific product hierarchy - - - - - - - ClassificationSystem - 0173-1#02-AAO715#002 - - - - - - - - classification system - Klassifizierungssystem - - ClassificationSystem - - - - - Klassifizierungssystem - Classification System - - - - - - - SecondaryKeyTyp - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - - - - - - SecondaryKeyTyp - Typnummer des IT Systems - - SecondaryKeyTyp - - - - - Führende technische ID im IT System des Typs - SecondaryKeyTyp - - - - - - - TypThumbnail - www.company.com/ids/cd/4401_1272_7091_3437 - - - - - - - - TypThumbnail - Vorschaubild - - TypThumbnail - - - - - Darstellung des Produkttyps in kleinem Format - Small picture of the product type - - - - - - - AssetId - https://www.hsu-hh.de/aut/aas/assetid - - - - - - - - AssetId - Asset ID - - AssetId - - - - - Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. - Global unique ID of an asset, which can be read by both human and machine. - - - - - - - SerialNumber - 0173-1#02-AAM556#002 - - - - - - - - Serial number - Seriennummer - - InstanceId - - - - - eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist - unique combination of numbers and letters used to identify the device once it has been manufactured - - - - - - - BatchNumber - 0173-1#02-AAQ196#001 - - - - - - - - Batch number - Chargen-Nummer - - ChargeId - - - - - Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge - Number assigned by the manufacturer of a material to identify the manufacturer's batch - - - - - - - SecondaryKeyInstance - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - - - - - - SecondaryKeyInstance - Instanznummer des IT Systems - - SecondaryKeyInstance - - - - - Führende technische ID im IT System der Instanz - SecondaryKeyInstance - - - - - - - DateOfManufacture - 0173-1#02-AAR972#002 - - - - - - - - Date of manufacture - Herstellungsdatum - - Date of manufacture - - - DATE - - Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist - Date from which the production and / or development process is completed or from which a service is provided completely - - - - - - - DeviceRevision - https://www.hsu-hh.de/aut/aas/devicerevision - - - - - - - - DeviceRevision - DeviceRevision - - DeviceRevision - - - - - DeviceRevision - DeviceRevision - - - - - - - SoftwareRevision - https://www.hsu-hh.de/aut/aas/softwarerevision - - - - - - - - SoftwareRevision - SoftwareRevision - - SoftwareRevision - - - - - SoftwareRevision - SoftwareRevision - - - - - - - HardwareRevision - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - - - - - - HardwareRevision - HardwareRevision - - HardwareRevision - - - - - HardwareRevision - HardwareRevision - - - - - - - QrCode - https://www.hsu-hh.de/aut/aas/qrcode - - - - - - - - QrCode - QrCode - - QrCode - - - - - In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. - QrCode - - - - - - - OrganisationContactInfo - https://www.hsu-hh.de/aut/aas/contactinfo - - - - - - - - Contact Info - Kontakt Info - - OrganisationContactInfo - - - - - Sammlung für die allgemeinen Kontaktdaten - Collection for general contact data - - - - - - - PhysicalAddress - https://www.hsu-hh.de/aut/aas/physicaladdress - - - - - - - - PhysicalAddress - Physische Adresse - - PhysicalAddress - - - - - Sammlung für reale physische Adresse - Collection for real physical address - - - - - - - CountryCode - 0173-1#02-AAO730#001 - - - - - - - - - - - - Landeskennung - Country code - - Country code - - - - - Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes - agreed upon symbol for unambiguous identification of a country - - - - - - - Street - 0173-1#02-AAO128#001 - - - - - - - - Strasse - Street - - Street - - - - - Name der Strasse und Hausnummer - Street name and house number - - - - - - - Zip - 0173-1#02-AAO129#002 - - - - - - - - Zip - Postleitzahl - - PostalCode - - - - - ZIP code of address - Postleitzahl der Anschrift - - - - - - - CityTown - 0173-1#02-AAO132#001 - - - - - - - - Ort - City/town - - City/town - - - - - Town or city of the company - Ortsangabe - - - - - - - StateCounty - 0173-1#02-AAO133#002 - - - - - - - - state/county - Bundesland - - StateCounty - - - - - Bundesland - state/county - - - - - - - Email - https://www.hsu-hh.de/aut/aas/email - - - - - - - - Emailadresse - Email address - - Email - - - - - Emailadresse - Email address - - - - - - - TelephoneContact - https://www.hsu-hh.de/aut/aas/ContactInfo/TelephoneContact - - - - - - - - Telephone Contact - Telefonkontakt - - TelephoneContact - - - - - Sammlung für Kontaktdaten über Telefon - Collection for contact data via telephone - - - - - - - PhoneNumber - 0173-1#02-AAO136#002 - - - - - - - - Telefonnummer - telephone number - - Phone - - - - - vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist - complete telephone number to be called to reach a business partner - - - - - - - CompanyLogo - https://www.hsu-hh.de/aut/aas/companylogo - - - - - - - - Firmenlogo - CompanyLogo - - CompanyLogo - - - - - Firmenlogo - CompanyLogo - - - - - - - URL - 0173-1#02-AAO694#001 - - - - - - - - Internetadresse - Internet address - - URL - - - - - stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html - Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html - - - - - - - ProductCountryOfOrigin - 0173-1#02-AAO841#001 - - - - - - - - Produkt Ursprungsland - Product country of origin - - CountryOfOrigin - - - - - Land in dem das Produkt hergestellt wurde (Hersteller Land) - Country in which the product is manufactured (manufacturer country) - - - - - - - YearOfConstruction - 0173-1#02-AAP906#001 - - - - - - - - Year of construction - Baujahr - - YearOfConstruction - - - - - Jahreszahl als Datumsangabe für die Fertigstellung des Objektes - Year as completion date of object - - - - - - - File - 0173-1#02-AAD005#008 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Enthaltene Doku. Datei - Embedded Doc. file - - File - - - - - Verweis/ BLOB auf enthaltene Dokumentations-Datei. - Reference/ BLOB to embedded documentation file. - - - - - - - ProductMarking - https://www.hsu-hh.de/aut/aas/productmarking - - - - - - - - Produktkennzeichnung - Product Marking - - ProductMarking - - - - - Sammlungsdatei für Produktkennzeichnung - Collection file for product marking - - - - - - - CEQualificationPresent - 0173-1#02-BAF053#008 - - - - - - - - CE-Kennzeichnung vorhanden - CE- qualification present - - CEMarkingPresent - - - BOOLEAN - - whether CE- qualification is present - Angabe, ob CE-Kennzeichnung vorhanden ist - - - - - - - WEEELabelingPresent - 0173-1#02-AAR528#005 - - - - - - - - Kennzeichnung (WEEE) vorhanden - WEEE labeling present - - WEEELabelingPresent - - - BOOLEAN - - indication whether the product is equipped with a specified WEEE labeling - Angabe, ob das Produkt mit einer spezifizierten WEEE-Kennzeichnung ausgestattet ist - - - - - - - DocumentClassification_ClassId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - - - - Dokumentkategorie - Document category - - DocCategory - - - - - Dokumentkategorie nach VDI 2770:2018/10 - Document category after VDI 2770:2018/10 - - - - - - - DocumentId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - - - - - - DocumentId - Dokumenten-Nummer - - DocumentId - - - - - Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. - TBD - - - - - - - VDI2770_DomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - - - - - - Domain-Nummer - DomainId - - DomainId - - - - - Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. - TBD - - - - - - - VDI2770_IdType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - - - - - - Nummerntyp - IdType - - IdType - - - - - Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. - TBD - - - - - - - ValString - www.company.com/ids/cd/4490_8182_7091_6124 - - - - - - - - Wert - Value String - - ValString - - - - - Ausdruck für den Wert der übergeordneten Collection. - Value string for the collection value on the next superordinate level - - - - - - - DocumentationItem - 0173-1#02-AAD001#001 - - - - - - - - Dokumentationsgruppe - Documentation item - - DocumentationItem - - - - - Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. - Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. - - - - - - - DocumentIdDomain - www.company.com/ids/cd/6003_8182_7091_9350 - - - - - - - - DocumentIdDomain - DocumentIdDomain - - DocumentIdDomain - - - - - Angabe einer Liste von Domänen, in de-nen die DocumentIds des Dokuments eindeutig sind - TBD - - - - - - - DocumentDomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - - - - - - DocumentDomainId - DocumentDomainId - - DocumentDomainId - - - - - Kennung oder Kennzeichen einer Domäne - TBD - - - - - - - VDI2770_Party - www.company.com/ids/cd/3153_8182_7091_4327 - - - - - - - - Party - Party - - Party - - - - - Verweis auf eine Party (siehe VDI 2770 Anhang C1.17), die für diese Domäne verantwortlich ist - TBD - - - - - - - VDI2770_Role - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - - - - - - Rolle - Role - - Role - - - - - Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) - TBD - - - - - - - VDI2770_Organisation - www.company.com/ids/cd/9214_8182_7091_6391 - - - - - - - - Organisation - Organisation - - Organisation - - - - - Angabe einer Organisation - TBD - - - - - - - VDI2770_OrganisationId - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - - - - - - Organisation ID - Organisation ID - - OrganisationId - - - - - eindeutige ID für die Organisation - TBD - - - - - - - VDI2770_OrganisationName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - - - - - - OrganisationName - OrganisationName - - OrganisationName - - - - - gebräuchliche Bezeichnung für die Organisation - TBD - - - - - - - VDI2770_OrganisationOfficialName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - - - - - - Offizieller Name der Organisation - Organisation Official Name - - OrganisationOfficialName - - - - - offizieller Name der Organisation - TBD - - - - - - - DocumentPartId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - - - - - - Dokumenten-Teilnummer - DocumentPartId - - DocumentPartId - - - - - Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. - TBD - - - - - - - VDI2770_Description - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - - - - - - Beschreibung - Description - - Description - - - - - Beschreibung für die nächste übergeordnete Collection - TBD - - - - - - - VDI2770_ClassName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - - - - - - Klassenname - Class Name - - ClassName - - - - - Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. - TBD - - - - - - - DocumentVersion_LanguageCode - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - - - - - - Sprachenschlüssel - LanguageCode - - LanguageCode - - - - - Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 - TBD - - - - - - - VDI2770_ClassificationSystem - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - - - - - - Klassifizierungssystem - classification system - - ClassificationSystem - - - - - Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. - TBD - - - - - - - DocumentVersion - www.company.com/ids/cd/2580_0282_7091_6213 - - - - - - - - Dokumenten-Version - DocumentVersion - - DocumentVersion - - - - - Zu jedem Dokument muss eine Menge von mindestens einer Dokumentenversion existieren. Es können auch mehrere Dokumentenversionen ausgeliefert werden. - TBD - - - - - - - DocumentVersionId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - - - - - - Dokumenten-Versionsnummer - DocumentVersionId - - DocumentVersionId - - - - - Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. - TBD - - - - - - - VDI2770_Language - www.company.com/ids/cd/0231_0282_7091_5062 - - - - - - - - Sprache - Language - - Language - - - - - Liste der im Dokument verwendeten Sprachen - TBD - - - - - - - DocumentVersion_Description - www.company.com/ids/cd/9151_0282_7091_8032 - - - - - - - - Beschreibung zur DocumentVersion - DocumentVersion Description - - DocumentVersion_Description - - - - - Zusammenfassende Beschreibungen zur Dokumentenversion in ggf. unterschiedlichen Sprachen. - TBD - - - - - - - VDI2770_Title - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - - - - - - Titel - Title - - VDI2770_Title - - - - - sprachabhängiger Titel des Dokuments - TBD - - - - - - - VDI2770_Summary - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - - - - - - Zusammenfassung - Summary - - Summary - - - - - sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts - TBD - - - - - - - VDI2770_Keywords - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - - - - - - Schlagwörter - Keywords - - Keywords - - - - - sprachabhängige, durch Komma getrennte Liste von Schlagwörtern - TBD - - - - - - - VDI2770_LifeCycleStatus - www.company.com/ids/cd/0282_0282_7091_7878 - - - - - - - - Lebenszyklus Status - LifeCycleStatus - - LifeCycleStatus - - - - - Liste von Statusdefinitionen mit Bezug zum Dokumentenlebenszyklus inklusive der Angabe der Beteiligten und einem zugehörigen Zeitstempel - TBD - - - - - - - VDI2770_StatusValue - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - - - - - - Statuswert - StatusValue - - StatusValue - - - - - Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) - TBD - - - - - - - VDI2770_SetDate - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - - - - - - Erstellungsdatum - Set Date - - SetDate - - - - - Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). - TBD - - - - - - - VDI2770_Purpose - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - - - - - - Zweck - Purpose - - Purpose - - - - - Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. - TBD - - - - - - - VDI2770_BasedOnProcedure - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - - - - - - Prozedur - Procedure - - BasedOnProcedure - - - - - textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt - TBD - - - - - - - VDI2770_Comments - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - - - - - - Kommentar - Comments - - Comments - - - - - textuelle Bemerkungen und Anmerkungen zum Status - TBD - - - - - - - DocumentRelationship - www.company.com/ids/cd/1204_0282_7091_7896 - - - - - - - - Dokumenten-Beziehung - Document Relationship - - DocumentRelationship - - - - - Liste von Beziehungen zu anderen Dokumenten. Es ist möglich, auf einen Dokument, ein Dokument in einer spezifischen Dokumentenversion oder auch ein Teildokument zu verweisen. - TBD - - - - - - - DocumentRelationship_Type - www.company.com/ids/cd/5044_0282_7091_6924 - - - - - - - - Typ der Dokumenten-Beziehung - DocumentRelationship_Type - - DocumentRelationship_Type - - - - - Typisierung der Beziehung zwischen den beiden DocumentVersions. Folgende Beziehungsarten können verwendet werden: Affecting (hat Auswirkungen auf), ReferesTo (bezieht sich auf), BasedOn (basiert auf) - TBD - - - - - - - StoredDocumentRepresentation - www.company.com/ids/cd/3094_0282_7091_2090 - - - - - - - - StoredDocumentRepresentation - StoredDocumentRepresentation - - StoredDocumentRepresentation - - - - - Liste von digitalen Repräsentationen zur DocumentVersion - TBD - - - - - - - VDI2770_DigitalFile - www.company.com/ids/cd/2305_0282_7091_2077 - - - - - - - - Digitaler-File - DigitalFile - - DigitalFile - - - - - Datei, die die DocumentVersion (siehe VDI 2770:2018 Anhang C1.5) repräsentiert Neben der obligatorischen PDF/A-Datei können weitere Dateien angegeben werden. - TBD - - - - - - - VDI2770_FileId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - - - - - - ID der Datei - File ID - - FileId - - - - - eindeutige ID für die Datei - TBD - - - - - - - VDI2770_FileName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - - - - - - Dateiname - File name - - FileName - - - - - Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. - TBD - - - - - - - VDI2770_FileFormat - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - - - - - - Datei Format - File format - - FileFormat - - - - - Angabe eines Media Typs gemäß der Liste der IANA - TBD - - - - - - - DocumentType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - - - - - - Dokumententyp - Document Type - - DocumentType - - - - - Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) - TBD - - - - - - - VDI2770_ReferencedObject - www.company.com/ids/cd/2570_2282_7091_0055 - - - - - - - - ReferencedObject - ReferencedObject - - ReferencedObject - - - - - Liste von IDs für ein Objekt, auf das sich das Dokument bezieht - TBD - - - - - - - VDI2770_ReferencedObject_Type - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - - - - - - Typ - Type - - Type - - - - - Für Type des Objekts muss immer Product angegeben werden. - TBD - - - - - - - VDI2770_ReferencedObject_RefType - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - - - - - - RefType - RefType - - RefType - - - - - Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) - TBD - - - - - - - VDI2770_ReferencedObject_ObjectId - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - - - - - - ObjectId - ObjectId - - ObjectId - - - - - Angabe der Identifikationsnummer zum Objekt - TBD - - - - - - - ContactInfo_Role - https://www.hsu-hh.de/aut/aas/role - - - - - - - - Rolle - Role - - Role - - - - - Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt - Information to specify the role which the organisation of ContactInfo plays - - - - - - - Fax - https://www.hsu-hh.de/aut/aas/fax - - - - - - - - Fax - Fax - - Fax - - - - - Faxnummer - Fax number - - - - - - - 0173-1#02-AAO136#002 - - - - - DocGroup_01 - www.company.com/ids/cd/1420_0113_7091_0891 - - - - - - - - 01 Identifikation - 01 Identification - - DocGroup_01 - - - - - Der Gruppe „Identifikation“ werden alle Dokumente zugeordnet, die der Identifikation des Objekts dienen, zu dem die Herstellerdokumentation gehört. Sie enthält insbesondere Informationen, die die elektronische Datenverarbeitung unterstützen und die es dem Hersteller und dem Nutzer erlauben, das Objekt in ihren jeweiligen elektronischen Datenverarbeitungssystemen zu identifizieren. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocGroup_02 - www.company.com/ids/cd/4323_0113_7091_2591 - - - - - - - - 02 Technische Beschaffenheit - 02 Technical characteristics - - DocGroup_02 - - - - - Die Gruppe „Technische Beschaffenheit“ beinhaltet alle Dokumente, die die technischen Anforderungen, deren Erfüllung und die Bescheinigung der Eigenschaften eines Objekts betreffen. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocGroup_03 - www.company.com/ids/cd/5053_0113_7091_5741 - - - - - - - - 03 Tätigkeitsbezogene Dokumente - 03 Work-related documents - - DocGroup_03 - - - - - Die Gruppe „Tätigkeitsbezogene Dokumente“ beinhaltet alle Dokumente, die Anforderungen, Hinweise und Hilfestellungen für Tätigkeiten an und mit dem Objekt nach der Übergabe an den Nutzer betreffen. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocGroup_04 - www.company.com/ids/cd/5473_0113_7091_1588 - - - - - - - - 04 Vertragsunterlagen - 04 Contract documents - - DocGroup_04 - - - - - Der Gruppe „Vertragsunterlagen“ werden alle Dokumente zugeordnet, die im Zusammenhang mit der kaufmännischen Abwicklung eines Vertrages stehen, aber nicht selbst Gegenstand des Vertrags sind und lediglich zur Erfüllung des Vertrags dienen. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_01-01 - www.company.com/ids/cd/9593_0113_7091_2401 - - - - - - - - 01-01 Identifikation - 01-01 Identification - - DocCategory_01-01 - - - - - Der Kategorie „Identifikation“ werden alle Dokumente zugeordnet, die der Identifikation des Objekts dienen, zu dem die Herstellerdokumentation gehört. Sie enthält insbesondere Informationen, die die elektronische Datenverarbeitung unterstützen und die es dem Hersteller und dem Nutzer erlauben, das Objekt in ihren jeweiligen elektronischen Datenverarbeitungssystemen zu identifizieren. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_02-01 - www.company.com/ids/cd/5314_0113_7091_8640 - - - - - - - - 02-01 Techn. Spezifikation - 02-01 Technical specification - - DocCategory_02-01 - - - - - Der Kategorie „Technische Spezifikation“ werden alle Dokumente zugeordnet, die die Anforderungen an ein Objekt sowie dessen Eigenschaften beschreiben. Dazu gehören die Auslegungsdaten, Berechnungen (Verfahrenstechnik, Festigkeit usw.) sowie alle relevanten Eigenschaften des übergebenen Objekts. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_02-02 - www.company.com/ids/cd/5515_0113_7091_8581 - - - - - - - - 02-02 Zeichnungen, Pläne - 02-02 Drawings and diagrams - - DocCategory_02-02 - - - - - Der Kategorie „Zeichnungen, Pläne“ werden alle Dokumente zugeordnet, die Zeichnungscharakter haben, das heißt eine grafische Darstellung zur Übermittlung von Information nutzen. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_02-03 - www.company.com/ids/cd/0335_0113_7091_0312 - - - - - - - - 02-03 Bauteile - 02-03 Components - - DocCategory_02-03 - - - - - Der Kategorie „Bauteile“ werden alle Dokumente zugeordnet, die eine strukturierte Auflistung der Teile eines Objekts beinhalten. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_02-04 - www.company.com/ids/cd/2155_0113_7091_3955 - - - - - - - - 02-04 Zeugnisse, Zertifikate, Bescheinigungen - 02-04 Reports, Certificates, declarations - - DocCategory_02-04 - - - - - Der Kategorie „Zeugnisse, Zertifikate, Bescheinigungen“ werden alle Dokumente zugeordnet, die Urkundencharakter haben. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_03-01 - www.company.com/ids/cd/3565_0113_7091_2704 - - - - - - - - 03-01 Montage, Inbetriebnahme, Demontage - 03-01 Assembly, commissioning, disassembly - - DocCategory_03-01 - - - - - Der Kategorie „Montage, Demontage“ werden alle Dokumente zugeordnet, die Tätigkeiten und Maßnahmen beschreiben, die erforderlich sind, um ein Objekt: zu transportieren oder zu lagern, als Ganzes in ein übergeordnetes Objekt einzubauen, auszubauen oder an dieses anzuschließen, so weit vorzubereiten, dass es zur Inbetriebnahme bereitsteht, nach Abschluss der Nutzungsphase zu demontieren und zu entsorgen - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_03-02 - www.company.com/ids/cd/4290_1113_7091_7266 - - - - - - - - 03-02 Bedienung - 03-02 Operation - - DocCategory_03-02 - - - - - Der Kategorie „Bedienung“ werden Dokumente zur bestimmungsgemäßen Verwendung und sicheren Bedienung eines Objekts zugeordnet. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_03-03 - www.company.com/ids/cd/2211_1113_7091_3911 - - - - - - - - 03-03 Allgemeine Sicherheit - 03-03 Safety in general - - DocCategory_03-03 - - - - - Der Kategorie „Allgemeine Sicherheit“ werden Dokumente zugeordnet, die Sicherheitshinweise auf mögliche Gefährdungen bei der Verwendung des Objekts geben. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_03-04 - www.company.com/ids/cd/7521_1113_7091_4471 - - - - - - - - 03-04 Inspektion, Wartung, Prüfung - 03-04 Inspection, maintenance, test - - DocCategory_03-04 - - - - - Der Kategorie „Inspektion, Wartung, Prüfung“ werden alle Dokumente zugeordnet, die vom Hersteller vorgeschlagene wiederkehrende Maßnahmen zur Feststellung oder zum Erhalt des funktionsfähigen Zustands beschreiben. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_03-05 - www.company.com/ids/cd/5161_1113_7091_0458 - - - - - - - - 03-05 Instandsetzung - 03-05 Repair - - DocCategory_03-05 - - - - - Der Kategorie „Instandsetzung“ werden alle Dokumente zugeordnet, die Maßnahmen zur Wiederherstellung der Funktion eines Objekts betreffen. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_03-06 - www.company.com/ids/cd/2181_1113_7091_5948 - - - - - - - - 03-06 Ersatzteile - 03-06 Spare parts - - DocCategory_03-06 - - - - - Der Kategorie „Ersatzteile“ werden Dokumente zugeordnet, die Informationen zu Ersatzteilen und Hilfs- und Betriebsstoffen enthalten. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_04-01 - www.company.com/ids/cd/5391_1113_7091_8996 - - - - - - - - 04-01 Vertragsunterlagen - 04-01 Contract documents - - DocCategory_04-01 - - - - - Der Kategorie „Vertragsunterlagen“ werden alle Dokumente zugeordnet, die im Zusammenhang mit der kaufmännischen Abwicklung eines Vertrages stehen, aber nicht selbst Gegenstand des Vertrags sind und lediglich zur Erfüllung des Vertrags dienen. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/14_Siemens.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/14_Siemens.aasx.xml deleted file mode 100644 index 4f696a0d6..000000000 --- a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/14_Siemens.aasx.xml +++ /dev/null @@ -1,6015 +0,0 @@ - - - - - SITRANS_P320 - www.company.com/ids/aas/9460_8042_0191_4407 - - - http://siemens.com/pimobile?1P=7MF0300-1QU01-5BF2-Z&S=N1L22110101185 - - - - - - www.company.com/demo/sm/instance/F9CC779860FC1039 - - - - - www.company.com/demo/sm/instance/204F677FF7D40E79 - - - - - www.company.com/demo/sm/instance/1D77CEFC25CEC482 - - - - - www.company.com/demo/sm/instance/4F44B8B32822E483 - - - - - - - - - P320 - - SITRANS P320 für Relativdruck, HART (4 ... 20 mA) - SITRANS P320 for gauge pressure, HART (4 ... 20 mA) - - http://siemens.com/pimobile?1P=7MF0300-1QU01-5BF2-Z&S=N1L22110101185 - Instance - - - - - Nameplate - www.company.com/demo/sm/instance/F9CC779860FC1039 - - - https://www.hsu-hh.de/aut/aas/nameplate - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Siemens AG - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - SITRANS P320 für Relativdruck, HART (4 ... 20 mA) - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 76181 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Karlsruhe - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Baden-Württemberg - - - - false - false - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - Druckmessumformer - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - N1L22110101185 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - ProductCountryOfOrigin - PARAMETER - - - 0173-1#02-AAO841#001 - - - Instance - - string - DE - - - - - YearOfConstruction - PARAMETER - - - 0173-1#02-AAP906#001 - - - Instance - - string - 2019 - - - - - Marking_CE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - 0173-1#07-CAA016#001 - - - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/marking_ce.png - - - - false - false - - - - - - Identification - www.company.com/demo/sm/instance/4F44B8B32822E483 - - - https://www.hsu-hh.de/aut/aas/identification - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Siemens AG - - - - - GLNOfManufacturer - PARAMETER - - - 0173-1#02-AAY812#001 - - - Instance - - - 4016001000006 - - - - - SupplierOfTheIdentifier - - - 0173-1#02-AAP796#004 - - - Instance - - - - - - - - MAN_PROD_NUM - - - 0173-1#02-AAO676#003 - - - Instance - - - 7MF0300-1QU01-5BF2-Z B11+C20+D42+E20+Y01+Y17+Y21 - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - SITRANS P320 for gauge pressure, HART (4 ... 20 mA) - - - - - - - - ManufacturerProductDescription - PARAMETER - - - 0173-1#02-AAU734#001 - - - Instance - - string - Gauge Pressure Transmitter - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Siemens AG - - - - - GLNOfSupplier - PARAMETER - - - 0173-1#02-AAY813#001 - - - Instance - - - 4016001000006 - - - - - SupplierIdProvider - PARAMETER - - - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - Instance - - - - - - - - SUP_PROD_NUM - PARAMETER - - - 0173-1#02-AAO736#004 - - - Instance - - - 7MF0300-1QU01-5BF2-Z B11+C20+D42+E20+Y01+Y17+Y21 - - - - - SupplierProductDesignation - - - 0173-1#02-AAM551#002 - - - Instance - - string - SITRANS P320 for gauge pressure, HART (4 ... 20 mA) - - - - - SupplierProductDescription - PARAMETER - - - 0173-1#02-AAU730#001 - - - Instance - - string - Gauge Pressure Transmitter - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - - - - - - ClassificationSystem - PARAMETER - - - 0173-1#02-AAO715#002 - - - Instance - - string - eclass - - - - - SecondaryKeyTyp - - - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - Instance - - - - - - - - TypThumbnail - PARAMETER - - - www.company.com/ids/cd/4401_1272_7091_3437 - - - Instance - - image/jpeg - /P_FI01_XX_05457I.jpg - - - - - AssetId - PARAMETER - - - https://www.hsu-hh.de/aut/aas/assetid - - - Instance - - string - http://siemens.com/pimobile?1P=7MF0300-1QU01-5BF2-Z&S=N1L22110101185 - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - N1L22110101185 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - SecondaryKeyInstance - PARAMETER - - - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - Instance - - - - - - - - DateOfManufacture - PARAMETER - - - 0173-1#02-AAR972#002 - - - Instance - - date - 15.04.2019 - - - - - DeviceRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/devicerevision - - - Instance - - string - - - - - - SoftwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/softwarerevision - - - Instance - - - - - - - - HardwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - Instance - - - 12.34.56 - - - - - QrCode - PARAMETER - - - https://www.hsu-hh.de/aut/aas/qrcode - - - Instance - - image/jpeg - /aasx/Identification/qrcode_P320.png - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Siemens AG - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 76181 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Karlsruhe - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Baden-Württemberg - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.siemens.com/processinstrumentation - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - - - - - - false - false - - - - - CompanyLogo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/companylogo - - - Instance - - image/png - /aasx/Identification/sie-logo-layer-petrol-rgb.jpg - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - http://siemens.com/pimobile?1P=7MF0300-1QU01-5BF2-Z&S=N1L22110101185 - - - - - - Service - www.company.com/demo/sm/instance/1D77CEFC25CEC482 - - - https://www.hsu-hh.de/aut/aas/service - - - Instance - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Siemens AG - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 76181 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Karlsruhe - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Baden-Württemberg - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://support.industry.siemens.com/ - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - - - - - - false - false - - - - - - Document - www.company.com/demo/sm/instance/204F677FF7D40E79 - - - https://www.hsu-hh.de/aut/aas/document - - - Instance - - - - - DeclarationCEMarking - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Siemens AG - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Siemens AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - EU-Konformitätserklärung - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - EU Declaration of Conformity.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/cert_EU-DoC_SitP320_P420_A5E44320812A_002.pdf - - - - false - false - - - - - Certificat_DIN_EN_ISO_14001_2015 - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - BVS 18 ATEX E049X - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Siemens AG - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Siemens AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - EN - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - ATEX-EC-Type-Examination-Certificate - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - cert__SIP320_P420_Exi_Exd_de_en_BVS_18_ATEX_E049X.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/cert__SIP320_P420_Exi_Exd_de_en_BVS_18_ATEX_E049X.pdf - - - - false - false - - - - - Betriebsanleitung - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - A5E41285171-AB - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Siemens AG - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Siemens AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Betriebsanleitung - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - date - 01.09.2018 - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - A5E41285171-ABde_P320P420_HART_OI_de-DE.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/A5E41285171-ABde_P320P420_HART_OI_de-DE.pdf - - - - false - false - - - - - OperatingInstruction - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - A5E44852162-AB - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Siemens AG - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Siemens AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Operating Instructions - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - date - 01.09.2018 - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - A5E44852162-ABen_P320P420_HART_OI_en-US.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/A5E44852162-ABen_P320P420_HART_OI_en-US.pdf - - - - false - false - - - - - Kompaktbetriebsanleitung - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - A5E38874562-AB - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Siemens AG - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Siemens AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Kompaktbetriebsanleitung - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - date - 01.09.2018 - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - A5E38874562-ABde_P320P420_COI_de-DE.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/A5E38874562-ABde_P320P420_COI_de-DE.pdf - - - - false - false - - - - - CompactOperatingInstructions - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - A5E38874562-AB - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Siemens AG - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Siemens AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Compact Operating Instructions - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - date - 01.09.2018 - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - A5E38874562-ABen_P320P420_COI_en-US.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/A5E38874562-ABen_P320P420_COI_en-US.pdf - - - - false - false - - - - - - - - ManufacturerName - 0173-1#02-AAO677#002 - - - - - - - - Herstellername - Manufacturer Name - - Manufacturer Name - - - - - Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist - 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 - - - - - - - ManufacturerProductDesignation - 0173-1#02-AAW338#001 - - - - - - - - Manufacturer product designation - Herstellerproduktbezeichnung - - ManufacturerTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - PhysicalAddress - https://www.hsu-hh.de/aut/aas/physicaladdress - - - - - - - - PhysicalAddress - Physische Adresse - - PhysicalAddress - - - - - Sammlung für reale physische Adresse - Collection for real physical address - - - - - - - CountryCode - 0173-1#02-AAO730#001 - - - - - - - - - - - - Landeskennung - Country code - - Country code - - - - - Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes - agreed upon symbol for unambiguous identification of a country - - - - - - - Street - 0173-1#02-AAO128#001 - - - - - - - - Strasse - Street - - Street - - - - - Name der Strasse und Hausnummer - Street name and house number - - - - - - - Zip - 0173-1#02-AAO129#002 - - - - - - - - Zip - Postleitzahl - - PostalCode - - - - - ZIP code of address - Postleitzahl der Anschrift - - - - - - - CityTown - 0173-1#02-AAO132#001 - - - - - - - - Ort - City/town - - City/town - - - - - Town or city of the company - Ortsangabe - - - - - - - StateCounty - 0173-1#02-AAO133#002 - - - - - - - - state/county - Bundesland - - StateCounty - - - - - Bundesland - state/county - - - - - - - ManufacturerProductFamily - 0173-1#02-AAU731#001 - - - - - - - - Manufacturer product family - Herstellerproduktfamilie - - TypClass - - - - - 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie - 2nd level of a 3 level manufacturer specific product hierarchy - - - - - - - SerialNumber - 0173-1#02-AAM556#002 - - - - - - - - Serial number - Seriennummer - - InstanceId - - - - - eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist - unique combination of numbers and letters used to identify the device once it has been manufactured - - - - - - - BatchNumber - 0173-1#02-AAQ196#001 - - - - - - - - Batch number - Chargen-Nummer - - ChargeId - - - - - Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge - Number assigned by the manufacturer of a material to identify the manufacturer's batch - - - - - - - ProductCountryOfOrigin - 0173-1#02-AAO841#001 - - - - - - - - Produkt Ursprungsland - Product country of origin - - CountryOfOrigin - - - - - Land in dem das Produkt hergestellt wurde (Hersteller Land) - Country in which the product is manufactured (manufacturer country) - - - - - - - YearOfConstruction - 0173-1#02-AAP906#001 - - - - - - - - Year of construction - Baujahr - - YearOfConstruction - - - - - Jahreszahl als Datumsangabe für die Fertigstellung des Objektes - Year as completion date of object - - - - - - - ProductMarking - https://www.hsu-hh.de/aut/aas/productmarking - - - - - - - - Produktkennzeichnung - Product Marking - - ProductMarking - - - - - Sammlungsdatei für Produktkennzeichnung - Collection file for product marking - - - - - - - CEQualificationPresent - 0173-1#02-BAF053#008 - - - - - - - - CE-Kennzeichnung vorhanden - CE- qualification present - - CEMarkingPresent - - - BOOLEAN - - whether CE- qualification is present - Angabe, ob CE-Kennzeichnung vorhanden ist - - - - - - - File - 0173-1#02-AAD005#008 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Enthaltene Doku. Datei - Embedded Doc. file - - File - - - - - Verweis/ BLOB auf enthaltene Dokumentations-Datei. - Reference/ BLOB to embedded documentation file. - - - - - - - GLNOfManufacturer - 0173-1#02-AAY812#001 - - - - - - - - GLN of manufacturer - GLN des Herstellers - - GLN of manufacturer - - - - - international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort - internationally unique identification number for the manufacturer of the device or the product and for the physical location - - - - - - - SupplierOfTheIdentifier - 0173-1#02-AAP796#004 - - - - - - - - Supplier of the identifier - Anbieter der Identifikationsnummer für Hersteller - - Supplier of the identifier - - - STRING_TRANSLATABLE - - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - - - - - - - MAN_PROD_NUM - - product article number of manufacturer - - 0173-1#02-AAO676#003 - - - - - - - - product article number of manufacturer - Herstellerartikelnummer - - MAN_PROD_NUM - - - STRING_TRANSLATABLE - - eindeutiger Bestellschlüssel des Herstellers - unique product identifier of the manufacturer - - - - - - - ManufacturerProductDescription - 0173-1#02-AAU734#001 - - - - - - - - Manufacturer product description - Herstellerproduktbeschreibung - - Manufacturer product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - NameOfSupplier - 0173-1#02-AAO735#003 - - - - - - - - - - - - name of supplier - Lieferantenname - - name of supplier - - - - - Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt - name of supplier which provides the customer with a product or a service - - - - - - - GLNOfSupplier - 0173-1#02-AAY813#001 - - - - - - - - GLN of supplier - GLN des Lieferanten - - GLN of supplier - - - - - international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort - internationally unique identification number for the supplier of the device or the product and for the physical location - - - - - - - SupplierIdProvider - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - - - - - - SupplierIdProvider - Anbieter der Identifikationsnummer - - SupplierIdProvider - - - STRING_TRANSLATABLE - - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - - - - - - - SUP_PROD_NUM - 0173-1#02-AAO736#004 - - - - - - - - product article number of supplier - Lieferantenartikelnummer - - product article number of supplier - - - - - eindeutiger Bestellschlüssel des Lieferanten - unique product order identifier of the supplier - - - - - - - SupplierProductDesignation - 0173-1#02-AAM551#002 - - - - - - - - Supplier product designation - Lieferantenproduktbezeichnung - - SupplierTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - SupplierProductDescription - 0173-1#02-AAU730#001 - - - - - - - - Supplier product description - Lieferantenproduktbeschreibung - - Supplier product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - ClassificationSystem - 0173-1#02-AAO715#002 - - - - - - - - classification system - Klassifizierungssystem - - ClassificationSystem - - - - - Klassifizierungssystem - Classification System - - - - - - - SecondaryKeyTyp - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - - - - - - SecondaryKeyTyp - Typnummer des IT Systems - - SecondaryKeyTyp - - - - - Führende technische ID im IT System des Typs - SecondaryKeyTyp - - - - - - - TypThumbnail - www.company.com/ids/cd/4401_1272_7091_3437 - - - - - - - - TypThumbnail - Vorschaubild - - TypThumbnail - - - - - Darstellung des Produkttyps in kleinem Format - Small picture of the product type - - - - - - - AssetId - https://www.hsu-hh.de/aut/aas/assetid - - - - - - - - AssetId - Asset ID - - AssetId - - - - - Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. - Global unique ID of an asset, which can be read by both human and machine. - - - - - - - SecondaryKeyInstance - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - - - - - - SecondaryKeyInstance - Instanznummer des IT Systems - - SecondaryKeyInstance - - - - - Führende technische ID im IT System der Instanz - SecondaryKeyInstance - - - - - - - DateOfManufacture - 0173-1#02-AAR972#002 - - - - - - - - Date of manufacture - Herstellungsdatum - - Date of manufacture - - - DATE - - Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist - Date from which the production and / or development process is completed or from which a service is provided completely - - - - - - - DeviceRevision - https://www.hsu-hh.de/aut/aas/devicerevision - - - - - - - - DeviceRevision - DeviceRevision - - DeviceRevision - - - - - DeviceRevision - DeviceRevision - - - - - - - SoftwareRevision - https://www.hsu-hh.de/aut/aas/softwarerevision - - - - - - - - SoftwareRevision - SoftwareRevision - - SoftwareRevision - - - - - SoftwareRevision - SoftwareRevision - - - - - - - HardwareRevision - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - - - - - - HardwareRevision - HardwareRevision - - HardwareRevision - - - - - HardwareRevision - HardwareRevision - - - - - - - QrCode - https://www.hsu-hh.de/aut/aas/qrcode - - - - - - - - QrCode - QrCode - - QrCode - - - - - In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. - QrCode - - - - - - - OrganisationContactInfo - www.company.com/demo/cd/1DEEF3CC9CF46C80 - - - - - - - - Contact Info - Kontakt Info - - OrganisationContactInfo - - - - - Sammlung für die allgemeinen Kontaktdaten - Collection for general contact data - - - - - - - ContactInfo_Role - https://www.hsu-hh.de/aut/aas/role - - - - - - - - Rolle - Role - - Role - - - - - Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt - Information to specify the role which the organisation of ContactInfo plays - - - - - - - Email - https://www.hsu-hh.de/aut/aas/email - - - - - - - - Emailadresse - Email address - - Email - - - - - Emailadresse - Email address - - - - - - - URL - 0173-1#02-AAO694#001 - - - - - - - - Internetadresse - Internet address - - URL - - - - - stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html - Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html - - - - - - - PhoneNumber - 0173-1#02-AAO136#002 - - - - - - - - Telefonnummer - telephone number - - Phone - - - - - vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist - complete telephone number to be called to reach a business partner - - - - - - - Fax - https://www.hsu-hh.de/aut/aas/fax - - - - - - - - Fax - Fax - - Fax - - - - - Faxnummer - Fax number - - - - - - - 0173-1#02-AAO136#002 - - - - - CompanyLogo - www.company.com/ids/cd/3132_1142_0191_9159 - - - - - - - - Firmenlogo - CompanyLogo - - CompanyLogo - - - - - Firmenlogo - CompanyLogo - - - - - - - DocumentationItem - - 0173-1#02-AAD001#001 - - - - - - - - Dokumentationsgruppe - Documentation item - - DocumentationItem - - - - - Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. - Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. - - - - - - - DocumentType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - - - - - - Dokumententyp - Document Type - - DocumentType - - - - - Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) - TBD - - - - - - - VDI2770_DomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - - - - - - Domain-Nummer - DomainId - - DomainId - - - - - Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. - TBD - - - - - - - VDI2770_IdType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - - - - - - Nummerntyp - IdType - - IdType - - - - - Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. - TBD - - - - - - - DocumentId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - - - - - - DocumentId - Dokumenten-Nummer - - DocumentId - - - - - Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. - TBD - - - - - - - DocumentDomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - - - - - - DocumentDomainId - DocumentDomainId - - DocumentDomainId - - - - - Kennung oder Kennzeichen einer Domäne - TBD - - - - - - - VDI2770_Role - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - - - - - - Rolle - Role - - Role - - - - - Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) - TBD - - - - - - - VDI2770_OrganisationId - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - - - - - - Organisation ID - Organisation ID - - OrganisationId - - - - - eindeutige ID für die Organisation - TBD - - - - - - - VDI2770_OrganisationName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - - - - - - OrganisationName - OrganisationName - - OrganisationName - - - - - gebräuchliche Bezeichnung für die Organisation - TBD - - - - - - - VDI2770_OrganisationOfficialName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - - - - - - Offizieller Name der Organisation - Organisation Official Name - - OrganisationOfficialName - - - - - offizieller Name der Organisation - TBD - - - - - - - VDI2770_Description - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - - - - - - Beschreibung - Description - - Description - - - - - Beschreibung für die nächste übergeordnete Collection - TBD - - - - - - - DocumentPartId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - - - - - - Dokumenten-Teilnummer - DocumentPartId - - DocumentPartId - - - - - Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. - TBD - - - - - - - DocumentClassification_ClassId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - - - - Dokumentkategorie - Document category - - DocCategory - - - - - Dokumentkategorie nach VDI 2770:2018/10 - Document category after VDI 2770:2018/10 - - - - - - - VDI2770_ClassName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - - - - - - Klassenname - Class Name - - ClassName - - - - - Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. - TBD - - - - - - - VDI2770_ClassificationSystem - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - - - - - - Klassifizierungssystem - classification system - - ClassificationSystem - - - - - Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. - TBD - - - - - - - DocumentVersionId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - - - - - - Dokumenten-Versionsnummer - DocumentVersionId - - DocumentVersionId - - - - - Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. - TBD - - - - - - - DocumentVersion_LanguageCode - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - - - - - - Sprachenschlüssel - LanguageCode - - LanguageCode - - - - - Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 - TBD - - - - - - - VDI2770_Title - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - - - - - - Titel - Title - - VDI2770_Title - - - - - sprachabhängiger Titel des Dokuments - TBD - - - - - - - VDI2770_Summary - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - - - - - - Zusammenfassung - Summary - - Summary - - - - - sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts - TBD - - - - - - - VDI2770_Keywords - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - - - - - - Schlagwörter - Keywords - - Keywords - - - - - sprachabhängige, durch Komma getrennte Liste von Schlagwörtern - TBD - - - - - - - VDI2770_StatusValue - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - - - - - - Statuswert - StatusValue - - StatusValue - - - - - Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) - TBD - - - - - - - VDI2770_SetDate - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - - - - - - Erstellungsdatum - Set Date - - SetDate - - - - - Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). - TBD - - - - - - - VDI2770_Purpose - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - - - - - - Zweck - Purpose - - Purpose - - - - - Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. - TBD - - - - - - - VDI2770_BasedOnProcedure - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - - - - - - Prozedur - Procedure - - BasedOnProcedure - - - - - textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt - TBD - - - - - - - VDI2770_Comments - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - - - - - - Kommentar - Comments - - Comments - - - - - textuelle Bemerkungen und Anmerkungen zum Status - TBD - - - - - - - VDI2770_ReferencedObject_Type - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - - - - - - Typ - Type - - Type - - - - - Für Type des Objekts muss immer Product angegeben werden. - TBD - - - - - - - VDI2770_ReferencedObject_RefType - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - - - - - - RefType - RefType - - RefType - - - - - Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) - TBD - - - - - - - VDI2770_ReferencedObject_ObjectId - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - - - - - - ObjectId - ObjectId - - ObjectId - - - - - Angabe der Identifikationsnummer zum Objekt - TBD - - - - - - - VDI2770_FileId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - - - - - - ID der Datei - File ID - - FileId - - - - - eindeutige ID für die Datei - TBD - - - - - - - VDI2770_FileName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - - - - - - Dateiname - File name - - FileName - - - - - Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. - TBD - - - - - - - VDI2770_FileFormat - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - - - - - - Datei Format - File format - - FileFormat - - - - - Angabe eines Media Typs gemäß der Liste der IANA - TBD - - - - - - - Her - 0173-1#02-AAO055#001 - - - 1 - - - - - - - - - Herstellername - - Her - - - STRING - - ist die Bezeichnung des Produzenten - - - - - - - 0173-1#02-AAO055#001 - - - - - 0173-1#02-AAM552#002 - - - 1 - - - - - - - - - Herstellerartikelbezeichnung - - Her - - - STRING - - vom Hersteller (oder Vertrieb) festgelegter Markenname für ein Produkt, wobei Produkt synonym für Objekt, Gegenstand oder Dienstleistung steht - - - - - - - 0173-1#02-AAM552#002 - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/15_Siemens.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/15_Siemens.aasx.xml deleted file mode 100644 index 4afa75765..000000000 --- a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/15_Siemens.aasx.xml +++ /dev/null @@ -1,5044 +0,0 @@ - - - - - S7_CPU1515 - CONSTANT - www.company.com/demo/aas/1234554842136874684321 - - 1 - 0 - - - - www.siemens.com/ids/asset/MLFB=6ES7515-2FM00-0AB0&SN=C-E9S35353 - - - - - - www.company.com/demo/sm/instance/F9CC779860FC10391 - - - - - www.company.com/demo/sm/instance/4F44B8B32822E483 - - - - - www.company.com/demo/sm/instance/1D77CEFC25CEC482 - - - - - www.company.com/demo/sm/instance/204F677FF7D40E79 - - - - - - - - - S7_1515F_2PN - - - SIMATIC S7-1500F, CPU 1515F-2 PN, Zentralbaugruppe mit Arbeitsspeicher 750 KB für Programm und 3MByte für Daten, 1. Schnittstelle, PROFINET IRT mit 2 Port Switch, 2. Schnittstelle, Ethernet, 30 NS Bit-Performance, SIMATIC Memory Card notwendig - SIMATIC S7-1500F, CPU 1515F-2 PN, Central processing unit with work memory 750 KB for Program and 3 MB for data, 1st interface, PROFINET IRT with 2-port switch, 2nd interface, Ethernet, 30 ns bit performance, SIMATIC Memory Card required - - www.siemens.com/ids/asset/MLFB=6ES7515-2FM00-0AB0&SN=C-E9S35353 - Instance - - - - - Nameplate - www.company.com/demo/sm/instance/F9CC779860FC10391 - - - https://www.hsu-hh.de/aut/aas/nameplate - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Siemens AG - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - CPU 1515F-2 PN - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 90475 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Nuremberg - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Bayern - - - - false - false - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - Programmable logic control (SPS) - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - C-E9S35353 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - ProductCountryOfOrigin - PARAMETER - - - 0173-1#02-AAO841#001 - - - Instance - - string - DE - - - - - YearOfConstruction - PARAMETER - - - 0173-1#02-AAP906#001 - - - Instance - - string - 2014 - - - - - Marking_CE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/marking_ce.png - - - - false - false - - - - - Marking_UL - PARAMETER - - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - ULMarkingPresent - PARAMETER - - - 0173-1#02-AAW723#001 - - - Instance - - boolean - 1 - - - - - - - - File - PARAMETER - - - - - Instance - - - /aasx/Nameplate/marking_UL.jpg - - - - false - false - - - - - - Identification - www.company.com/demo/sm/instance/4F44B8B32822E483 - - - https://www.hsu-hh.de/aut/aas/identification - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Siemens AG - - - - - GLNOfManufacturer - PARAMETER - - - 0173-1#02-AAY812#001 - - - Instance - - string - 4047623000006 - - - - - SupplierOfTheIdentifier - - - 0173-1#02-AAP796#004 - - - Instance - - string - GS1 - - - - - MAN_PROD_NUM - - - 0173-1#02-AAO676#003 - - - Instance - - string - 6ES7515-2FM00-0AB0 - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - CPU 1515F-2 PN, 750KB Prog., 3MB Daten - - - - - ManufacturerProductDescription - PARAMETER - - - 0173-1#02-AAU734#001 - - - Instance - - string - SIMATIC S7-1500F, CPU 1515F-2 PN, Central processing unit with work memory 750 KB for Program and 3 MB for data, 1st interface, PROFINET IRT with 2-port switch, 2nd interface, Ethernet, 30 ns bit performance, - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Siemens AG - - - - - GLNOfSupplier - PARAMETER - - - 0173-1#02-AAY813#001 - - - Instance - - string - 4047623000006 - - - - - SupplierIdProvider - PARAMETER - - - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - Instance - - string - GS1 - - - - - SUP_PROD_NUM - PARAMETER - - - 0173-1#02-AAO736#004 - - - Instance - - string - 6ES7515-2FM00-0AB0 - - - - - SupplierProductDesignation - - - 0173-1#02-AAM551#002 - - - Instance - - string - CPU 1515F-2 PN, 750KB Prog., 3MB Daten - - - - - SupplierProductDescription - PARAMETER - - - 0173-1#02-AAU730#001 - - - Instance - - string - SIMATIC S7-1500F, CPU 1515F-2 PN, Central processing unit with work memory 750 KB for Program and 3 MB for data, 1st interface, PROFINET IRT with 2-port switch, 2nd interface, Ethernet, 30 ns bit performance, - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - string - Programmable logic control (SPS) - - - - - ClassificationSystem - PARAMETER - - - 0173-1#02-AAO715#002 - - - Instance - - string - eclass - - - - - SecondaryKeyTyp - - - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - Instance - - - - - - - - TypThumbnail - PARAMETER - - - www.company.com/ids/cd/4401_1272_7091_3437 - - - Instance - - image/jpeg - /P_ST70_XX_06800J.jpg - - - - - AssetId - PARAMETER - - - https://www.hsu-hh.de/aut/aas/assetid - - - Instance - - string - www.siemens.com/ids/asset/MLFB=6ES7515-2FM00-0AB0&SN=C-E9S35353 - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - C-E9S35353 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - SecondaryKeyInstance - PARAMETER - - - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - Instance - - - - - - - - DateOfManufacture - PARAMETER - - - 0173-1#02-AAR972#002 - - - Instance - - date - 2014 - - - - - DeviceRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/devicerevision - - - Instance - - string - 01 - - - - - SoftwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/softwarerevision - - - Instance - - string - V1.8.5 - - - - - HardwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - Instance - - string - 01 - - - - - QrCode - PARAMETER - - - https://www.hsu-hh.de/aut/aas/qrcode - - - Instance - - image/jpeg - /aasx/Identification/dmc.gif - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Siemens AG - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Gleiwitzer Str. 555 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 90475 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Nuremberg - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Bavaria - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - markus.kempf@siemens.com - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.siemens.com/automation - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - - - - - - false - false - - - - - CompanyLogo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/companylogo - - - Instance - - image/png - /aasx/Identification/sie-logo-layer-petrol-rgb.jpg - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://support.industry.siemens.com/cs/pd/86475?pdti=pi&dl=en&lc=en-WW - - - - - - Service - www.company.com/demo/sm/instance/1D77CEFC25CEC482 - - - https://www.hsu-hh.de/aut/aas/service - - - Instance - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Siemens AG - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Gleiwitzer Str. 555 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 90475 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Nuremburg - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - bavaria - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://support.industry.siemens.com/ - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - - - - - - false - false - - - - - - Document - www.company.com/demo/sm/instance/204F677FF7D40E79 - - - https://www.hsu-hh.de/aut/aas/document - - - Instance - - - - - DeclarationCEMarking - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Manufacturer - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Siemens AG - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Siemens AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - EU-Konformitätserklärung - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - 106_CE_S7_1500_general_A3_10_2019_d_e.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/106_CE_S7_1500_general_A3_10_2019_d_e.pdf - - - - false - false - - - - - DeclarationULMarking - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Manufacturer - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Siemens AG - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Siemens AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Certificate of compliance - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - S7-1500_Vol.9_Sec.1_E222109.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/S7-1500_Vol.9_Sec.1_E222109.pdf - - - - false - false - - - - - Produktinformation - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - A5E35635424-AG - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - string - Handbuch - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Manufacturer - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Siemens AG - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Siemens AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-03 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Allgemeine Sicherheit - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - DE, EN, FR, SP, IT, CH - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - SIMATIC S7-1200/S7-1500 F-CPUs Produktinformation - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - string - 11/18 - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - s71200_1500_f_cpus_product_information_x_de-DE.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/s71200_1500_f_cpus_product_information_x_de-DE.pdf - - - - false - false - - - - - Programming and Operating Manual - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - string - A5E02714440-AH - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Manufacturer - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Siemens AG - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Siemens AG - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - SIMATIC Industrial Software SIMATIC Safety - Configuring and Programming - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - date - 09.26.2018 - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - ProgFAILenUS_en-US.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/ProgFAILenUS_en-US.pdf - - - - false - false - - - - - - - - ManufacturerName - 0173-1#02-AAO677#002 - - - - - - - - Herstellername - Manufacturer Name - - Manufacturer Name - - - - - Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist - 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 - - - - - - - ManufacturerProductDesignation - 0173-1#02-AAW338#001 - - - - - - - - Manufacturer product designation - Herstellerproduktbezeichnung - - ManufacturerTypName - - - STRING_TRANSLATABLE - - SIMATIC S7-1500F, CPU 1515F-2 PN, Zentralbaugruppe mit Arbeitsspeicher 750 KB für Programm und 3MByte für Daten, 1. Schnittstelle, PROFINET IRT mit 2 Port Switch, 2. Schnittstelle, Ethernet, 30 NS Bit-Performance - SIMATIC S7-1500F, CPU 1515F-2 PN, Central processing unit with work memory 750 KB for Program and 3 MB for data, 1st interface, PROFINET IRT with 2-port switch, 2nd interface, Ethernet, 30 ns bit performance - - - - - - - PhysicalAddress - https://www.hsu-hh.de/aut/aas/physicaladdress - - - - - - - - PhysicalAddress - Physische Adresse - - PhysicalAddress - - - - - Sammlung für reale physische Adresse - Collection for real physical address - - - - - - - CountryCode - 0173-1#02-AAO730#001 - - - - - - - - - - - - Landeskennung - Country code - - Country code - - - - - Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes - agreed upon symbol for unambiguous identification of a country - - - - - - - Zip - 0173-1#02-AAO129#002 - - - - - - - - Zip - Postleitzahl der Anschrift - - PostalCode - - - - - ZIP code of address - Postleitzahl der Anschrift - - - - - - - CityTown - 0173-1#02-AAO132#001 - - - - - - - - Ort - City/town - - City/town - - - - - Town or city of the company - Ortsangabe - - - - - - - StateCounty - 0173-1#02-AAO133#002 - - - - - - - - state/county - Bundesland - - StateCounty - - - - - Bundesland - state/county - - - - - - - ManufacturerProductFamily - 0173-1#02-AAU731#001 - - - - - - - - Manufacturer product family - Herstellerproduktfamilie - - TypClass - - - - - 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie - 2nd level of a 3 level manufacturer specific product hierarchy - - - - - - - SerialNumber - 0173-1#02-AAM556#002 - - - - - - - - Serial number - Seriennummer - - InstanceId - - - - - eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist - unique combination of numbers and letters used to identify the device once it has been manufactured - - - - - - - BatchNumber - 0173-1#02-AAQ196#001 - - - - - - - - Batch number - Chargen-Nummer - - ChargeId - - - - - Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge - Number assigned by the manufacturer of a material to identify the manufacturer's batch - - - - - - - ProductCountryOfOrigin - 0173-1#02-AAO841#001 - - - - - - - - Produkt Ursprungsland - Product country of origin - - CountryOfOrigin - - - - - Land in dem das Produkt hergestellt wurde (Hersteller Land) - Country in which the product is manufactured (manufacturer country) - - - - - - - YearOfConstruction - 0173-1#02-AAP906#001 - - - - - - - - Year of construction - Baujahr - - YearOfConstruction - - - - - Jahreszahl als Datumsangabe für die Fertigstellung des Objektes - Year as completion date of object - - - - - - - ProductMarking - PARAMETER - https://www.hsu-hh.de/aut/aas/productmarking - - - - - - - - Produktkennzeichnung - Product Marking - - ProductMarking - - - - - Sammlungsdatei für Produktkennzeichnung - Collection file for product marking - - - - - - - CEQualificationPresent - 0173-1#02-BAF053#008 - - - - - - - - CE-Kennzeichnung vorhanden - CE- qualification present - - CEMarkingPresent - - - BOOLEAN - - whether CE- qualification is present - Angabe, ob CE-Kennzeichnung vorhanden ist - - - - - - - File - 0173-1#02-AAD005#008 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Enthaltene Doku. Datei - Embedded Doc. file - - File - - - - - Verweis/ BLOB auf enthaltene Dokumentations-Datei. - Reference/ BLOB to embedded documentation file. - - - - - - - GLNOfManufacturer - 0173-1#02-AAY812#001 - - - - - - - - GLN of manufacturer - GLN des Herstellers - - GLN of manufacturer - - - - - international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort - internationally unique identification number for the manufacturer of the device or the product and for the physical location - - - - - - - SupplierOfTheIdentifier - 0173-1#02-AAP796#004 - - - - - - - - Supplier of the identifier - Anbieter der Identifikationsnummer für Hersteller - - Supplier of the identifier - - - STRING_TRANSLATABLE - - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - - - - - - - MAN_PROD_NUM - - product article number of manufacturer - - 0173-1#02-AAO676#003 - - - - - - - - product article number of manufacturer - Herstellerartikelnummer - - MAN_PROD_NUM - - - STRING_TRANSLATABLE - - eindeutiger Bestellschlüssel des Herstellers - unique product identifier of the manufacturer - - - - - - - ManufacturerProductDescription - 0173-1#02-AAU734#001 - - - - - - - - Manufacturer product description - Herstellerproduktbeschreibung - - Manufacturer product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - NameOfSupplier - 0173-1#02-AAO735#003 - - - - - - - - - - - - name of supplier - Lieferantenname - - name of supplier - - - - - Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt - name of supplier which provides the customer with a product or a service - - - - - - - GLNOfSupplier - 0173-1#02-AAY813#001 - - - - - - - - GLN of supplier - GLN des Lieferanten - - GLN of supplier - - - - - international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort - internationally unique identification number for the supplier of the device or the product and for the physical location - - - - - - - SupplierIdProvider - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - - - - - - SupplierIdProvider - Anbieter der Identifikationsnummer - - SupplierIdProvider - - - STRING_TRANSLATABLE - - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - - - - - - - SUP_PROD_NUM - 0173-1#02-AAO736#004 - - - - - - - - product article number of supplier - Lieferantenartikelnummer - - product article number of supplier - - - - - eindeutiger Bestellschlüssel des Lieferanten - unique product order identifier of the supplier - - - - - - - SupplierProductDesignation - 0173-1#02-AAM551#002 - - - - - - - - Supplier product designation - Lieferantenproduktbezeichnung - - SupplierTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - SupplierProductDescription - 0173-1#02-AAU730#001 - - - - - - - - Supplier product description - Lieferantenproduktbeschreibung - - Supplier product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - ClassificationSystem - 0173-1#02-AAO715#002 - - - - - - - - classification system - Klassifizierungssystem - - ClassificationSystem - - - - - Klassifizierungssystem - Classification System - - - - - - - SecondaryKeyTyp - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - - - - - - SecondaryKeyTyp - Typnummer des IT Systems - - SecondaryKeyTyp - - - - - Führende technische ID im IT System des Typs - SecondaryKeyTyp - - - - - - - TypThumbnail - www.company.com/ids/cd/4401_1272_7091_3437 - - - - - - - - TypThumbnail - Vorschaubild - - TypThumbnail - - - - - Darstellung des Produkttyps in kleinem Format - Small picture of the product type - - - - - - - AssetId - https://www.hsu-hh.de/aut/aas/assetid - - - - - - - - AssetId - Asset ID - - AssetId - - - - - Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. - Global unique ID of an asset, which can be read by both human and machine. - - - - - - - SecondaryKeyInstance - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - - - - - - SecondaryKeyInstance - Instanznummer des IT Systems - - SecondaryKeyInstance - - - - - Führende technische ID im IT System der Instanz - SecondaryKeyInstance - - - - - - - DateOfManufacture - 0173-1#02-AAR972#002 - - - - - - - - Date of manufacture - Herstellungsdatum - - Date of manufacture - - - DATE - - Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist - Date from which the production and / or development process is completed or from which a service is provided completely - - - - - - - DeviceRevision - https://www.hsu-hh.de/aut/aas/devicerevision - - - - - - - - DeviceRevision - DeviceRevision - - DeviceRevision - - - - - DeviceRevision - DeviceRevision - - - - - - - SoftwareRevision - https://www.hsu-hh.de/aut/aas/softwarerevision - - - - - - - - SoftwareRevision - SoftwareRevision - - SoftwareRevision - - - - - SoftwareRevision - SoftwareRevision - - - - - - - HardwareRevision - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - - - - - - HardwareRevision - HardwareRevision - - HardwareRevision - - - - - HardwareRevision - HardwareRevision - - - - - - - QrCode - https://www.hsu-hh.de/aut/aas/qrcode - - - - - - - - QrCode - QrCode - - QrCode - - - - - In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. - QrCode - - - - - - - URL - 0173-1#02-AAO694#001 - - - - - - - - Internetadresse - Internet address - - URL - - - - - stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html - Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html - - - - - - - DocumentationItem - - 0173-1#02-AAD001#001 - - - - - - - - Dokumentationsgruppe - Documentation item - - DocumentationItem - - - - - Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. - Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. - - - - - - - DocumentType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - - - - - - Dokumententyp - Document Type - - DocumentType - - - - - Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) - TBD - - - - - - - VDI2770_DomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - - - - - - Domain-Nummer - DomainId - - DomainId - - - - - Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. - TBD - - - - - - - VDI2770_IdType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - - - - - - Nummerntyp - IdType - - IdType - - - - - Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. - TBD - - - - - - - DocumentId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - - - - - - DocumentId - Dokumenten-Nummer - - DocumentId - - - - - Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. - TBD - - - - - - - DocumentDomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - - - - - - DocumentDomainId - DocumentDomainId - - DocumentDomainId - - - - - Kennung oder Kennzeichen einer Domäne - TBD - - - - - - - VDI2770_Role - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - - - - - - Rolle - Role - - Role - - - - - Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) - TBD - - - - - - - VDI2770_OrganisationId - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - - - - - - Organisation ID - Organisation ID - - OrganisationId - - - - - eindeutige ID für die Organisation - TBD - - - - - - - VDI2770_OrganisationName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - - - - - - OrganisationName - OrganisationName - - OrganisationName - - - - - gebräuchliche Bezeichnung für die Organisation - TBD - - - - - - - VDI2770_OrganisationOfficialName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - - - - - - Offizieller Name der Organisation - Organisation Official Name - - OrganisationOfficialName - - - - - offizieller Name der Organisation - TBD - - - - - - - VDI2770_Description - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - - - - - - Beschreibung - Description - - Description - - - - - Beschreibung für die nächste übergeordnete Collection - TBD - - - - - - - DocumentPartId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - - - - - - Dokumenten-Teilnummer - DocumentPartId - - DocumentPartId - - - - - Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. - TBD - - - - - - - DocumentClassification_ClassId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - - - - Dokumentkategorie - Document category - - DocCategory - - - - - Dokumentkategorie nach VDI 2770:2018/10 - Document category after VDI 2770:2018/10 - - - - - - - VDI2770_ClassName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - - - - - - Klassenname - Class Name - - ClassName - - - - - Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. - TBD - - - - - - - VDI2770_ClassificationSystem - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - - - - - - Klassifizierungssystem - classification system - - ClassificationSystem - - - - - Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. - TBD - - - - - - - DocumentVersionId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - - - - - - Dokumenten-Versionsnummer - DocumentVersionId - - DocumentVersionId - - - - - Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. - TBD - - - - - - - DocumentVersion_LanguageCode - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - - - - - - Sprachenschlüssel - LanguageCode - - LanguageCode - - - - - Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 - TBD - - - - - - - VDI2770_Title - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - - - - - - Titel - Title - - VDI2770_Title - - - - - sprachabhängiger Titel des Dokuments - TBD - - - - - - - VDI2770_Summary - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - - - - - - Zusammenfassung - Summary - - Summary - - - - - sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts - TBD - - - - - - - VDI2770_Keywords - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - - - - - - Schlagwörter - Keywords - - Keywords - - - - - sprachabhängige, durch Komma getrennte Liste von Schlagwörtern - TBD - - - - - - - VDI2770_StatusValue - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - - - - - - Statuswert - StatusValue - - StatusValue - - - - - Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) - TBD - - - - - - - VDI2770_SetDate - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - - - - - - Erstellungsdatum - Set Date - - SetDate - - - - - Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). - TBD - - - - - - - VDI2770_Purpose - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - - - - - - Zweck - Purpose - - Purpose - - - - - Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. - TBD - - - - - - - VDI2770_BasedOnProcedure - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - - - - - - Prozedur - Procedure - - BasedOnProcedure - - - - - textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt - TBD - - - - - - - VDI2770_Comments - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - - - - - - Kommentar - Comments - - Comments - - - - - textuelle Bemerkungen und Anmerkungen zum Status - TBD - - - - - - - VDI2770_ReferencedObject_Type - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - - - - - - Typ - Type - - Type - - - - - Für Type des Objekts muss immer Product angegeben werden. - TBD - - - - - - - VDI2770_ReferencedObject_RefType - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - - - - - - RefType - RefType - - RefType - - - - - Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) - TBD - - - - - - - VDI2770_ReferencedObject_ObjectId - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - - - - - - ObjectId - ObjectId - - ObjectId - - - - - Angabe der Identifikationsnummer zum Objekt - TBD - - - - - - - VDI2770_FileId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - - - - - - ID der Datei - File ID - - FileId - - - - - eindeutige ID für die Datei - TBD - - - - - - - VDI2770_FileName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - - - - - - Dateiname - File name - - FileName - - - - - Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. - Filename - - - - - - - VDI2770_FileFormat - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - - - - - - Datei Format - File format - - FileFormat - - - - - Angabe eines Media Typs gemäß der Liste der IANA - TBD - - - - - - - ULMarkingPresent - 0173-1#02-AAW723#001 - - - 1 - - - - - - - - - UL-Listing vorhanden - UL listing present - - UlLisPre - - - BOOLEAN - - Indiz und Bestätigung für das Vorhandensein von erforderlichen, zweckentsprechenden Eigenschaften (z. B. in Form einer Plakette, einer (Konformitäts-)Bescheinigung, eines Zertifikats, eines Prüfprotokolls für Bauartprüfung, etc.) / Zulassung und Zertifizierung durch Underwriter's Laboratories (alphabetische Kennzeichnung von Herstellern und Lieferanten innerhalb bestimmter Produktgruppen), dass Produkte spezifischen UL-Vorschriften (UL-Style für Material und Produkteigenschaften, NEC-Type für Flammtest und Einsatzbereich) entsprechen - Indication and acknowledgment of the existence of necessary, appropriate characteristics (eg in the form of a plaque, a (conformity) certificate, a certificate, a test report for type examination, etc.) / Approval and certification by Underwriter's Laboratories (alphabetical identification of Manufacturers and suppliers within certain product groups) that products conform to specific UL regulations (UL style for material and product characteristics, NEC type for flame test and application) - - - - - - - 0173-1#02-AAW723#001 - - - - - Email - https://www.hsu-hh.de/aut/aas/email - - - - - - - - Emailadresse - Email address - - Email - - - - - Emailadresse - Email address - - - - - - - PhoneNumber - 0173-1#02-AAO136#002 - - - - - - - - Telefonnummer - telephone number - - Phone - - - - - vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist - complete telephone number to be called to reach a business partner - - - - - - - Fax - https://www.hsu-hh.de/aut/aas/fax - - - - - - - - Fax - Fax - - Fax - - - - - Faxnummer - Fax number - - - - - - - 0173-1#02-AAO136#002 - - - - - ContactInfo_Role - https://www.hsu-hh.de/aut/aas/role - - - - - - - - Rolle - Role - - Role - - - - - Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt - Information to specify the role which the organisation of ContactInfo plays - - - - - - - Street - 0173-1#02-AAO128#001 - - - - - - - - Strasse - Street - - Street - - - - - Name der Strasse und Hausnummer - Street name and house number - - - - - - - OrganisationContactInfo - https://www.hsu-hh.de/aut/aas/contactinfo - - - - - - - - Contact Info - Kontakt Info - - OrganisationContactInfo - - - - - Sammlung für die allgemeinen Kontaktdaten - Collection for general contact data - - - - - - - CompanyLogo - https://www.hsu-hh.de/aut/aas/companylogo - - - - - - - - Firmenlogo - CompanyLogo - - CompanyLogo - - - - - Firmenlogo - CompanyLogo - - - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/16_Lenze.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/16_Lenze.aasx.xml deleted file mode 100644 index 1b7e52fd8..000000000 --- a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/16_Lenze.aasx.xml +++ /dev/null @@ -1,4017 +0,0 @@ - - - - - Lenze_i950 - http://digital.lenze.com/aas/1/1/1616441908732837000002 - - - http://digital.lenze.com/asset/YVSBRHHZADF - - - - - - www.company.com/ids/sm/4343_5072_7091_3242 - - - - - www.company.com/ids/sm/2543_5072_7091_2660 - - - - - www.company.com/ids/sm/6053_5072_7091_5102 - - - - - www.company.com/ids/sm/6563_5072_7091_4267 - - - - - - - - - i950 - http://digital.lenze.com/asset/YVSBRHHZADF - Instance - - - - - Nameplate - www.company.com/ids/sm/4343_5072_7091_3242 - - - https://www.hsu-hh.de/aut/aas/nameplate - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Lenze Automation GmbH - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - i950 Inverter - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Hans-Lenze-Strasse 1 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 31855 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Aerzen - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Niedersachsen - - - - false - false - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 1616441908732837000002 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - ProductCountryOfOrigin - PARAMETER - - - 0173-1#02-AAO841#001 - - - Instance - - string - DE - - - - - YearOfConstruction - PARAMETER - - - 0173-1#02-AAP906#001 - - - Instance - - string - 2019 - - - - - Marking_CE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/marking_ce.png - - - - false - false - - - - - Marking_UL - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/UL_Mark.png - - - - false - false - - - - - - Document - www.company.com/ids/sm/2543_5072_7091_2660 - - - https://www.hsu-hh.de/aut/aas/document - - - Instance - - - - - DeclarationCEMarking - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Lenze - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Lenze Automation GmbH - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - EU-Konformitätserklärung - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - EU_Declaration_of_Conformity.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/EU_Declaration_of_Conformity.pdf - - - - false - false - - - - - DeclarationULMarking - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Lenze - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Lenze Automation GmbH - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - UL-Approbation - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - UL-Approbation_Servoumrichter_i950_xx.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/UL-Approbation_Servoumrichter_i950_xx.pdf - - - - false - false - - - - - - Service - www.company.com/ids/sm/6053_5072_7091_5102 - - - https://www.hsu-hh.de/aut/aas/service - - - Instance - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Lenze Service GmbH - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Breslauer Strasse 3 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 32699 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Extertal - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - NRW - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - service.de@lenze.com - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.lenze.com/de-de/service/ - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +49 515482-3000 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - - - - - - false - false - - - - - - Identification - www.company.com/ids/sm/6563_5072_7091_4267 - - - https://www.hsu-hh.de/aut/aas/identification - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Lenze Automation GmbH - - - - - GLNOfManufacturer - PARAMETER - - - 0173-1#02-AAY812#001 - - - Instance - - - - - - - - SupplierOfTheIdentifier - - - 0173-1#02-AAP796#004 - - - Instance - - - - - - - - MAN_PROD_NUM - - - 0173-1#02-AAO676#003 - - - Instance - - - - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - Servoumrichter i950 - - - - - ManufacturerProductDescription - PARAMETER - - - 0173-1#02-AAU734#001 - - - Instance - - string - Servoumrichter - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - - - - - - GLNOfSupplier - PARAMETER - - - 0173-1#02-AAY813#001 - - - Instance - - - - - - - - SupplierIdProvider - PARAMETER - - - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - Instance - - - - - - - - SUP_PROD_NUM - PARAMETER - - - 0173-1#02-AAO736#004 - - - Instance - - - - - - - - SupplierProductDesignation - - - 0173-1#02-AAM551#002 - - - Instance - - string - - - - - - SupplierProductDescription - PARAMETER - - - 0173-1#02-AAU730#001 - - - Instance - - string - - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - - - - - - ClassificationSystem - PARAMETER - - - 0173-1#02-AAO715#002 - - - Instance - - string - eclass - - - - - SecondaryKeyTyp - - - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - Instance - - - - - - - - TypThumbnail - PARAMETER - - - www.company.com/ids/cd/4401_1272_7091_3437 - - - Instance - - image/jpeg - /aasx/Identification/thumbnail.jpeg - - - - - AssetId - PARAMETER - - - https://www.hsu-hh.de/aut/aas/assetid - - - Instance - - string - http://digital.lenze.com/asset/YVSBRHHZADF - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 1616441908732837000002 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - SecondaryKeyInstance - PARAMETER - - - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - Instance - - - - - - - - DateOfManufacture - PARAMETER - - - 0173-1#02-AAR972#002 - - - Instance - - - - - - - - DeviceRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/devicerevision - - - Instance - - - - - - - - SoftwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/softwarerevision - - - Instance - - - - - - - - HardwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - Instance - - - - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Lenze Automation GmbH - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Hans-Lenze-Strasse 1 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 31855 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Aerzen - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Niedersachsen - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - service.de@lenze.com - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.lenze.com - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +49 515482-3000 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - - - - - - false - false - - - - - CompanyLogo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/companylogo - - - Instance - - image/png - /aasx/Identification/logo.png - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.lenze.com/de-de/produkte/umrichter/schaltschrankeinbau/servoumrichter-i950/ - - - - - - - - ManufacturerName - 0173-1#02-AAO677#002 - - - - - - - - Herstellername - Manufacturer Name - - Manufacturer Name - - - - - Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist - 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 - - - - - - - ManufacturerProductDesignation - 0173-1#02-AAW338#001 - - - - - - - - Manufacturer product designation - Herstellerproduktbezeichnung - - ManufacturerTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - PhysicalAddress - https://www.hsu-hh.de/aut/aas/physicaladdress - - - - - - - - PhysicalAddress - Physische Adresse - - PhysicalAddress - - - - - Sammlung für reale physische Adresse - Collection for real physical address - - - - - - - CountryCode - 0173-1#02-AAO730#001 - - - - - - - - - - - - Landeskennung - Country code - - Country code - - - - - Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes - agreed upon symbol for unambiguous identification of a country - - - - - - - Street - 0173-1#02-AAO128#001 - - - - - - - - Strasse - Street - - Street - - - - - Name der Strasse und Hausnummer - Street name and house number - - - - - - - Zip - 0173-1#02-AAO129#002 - - - - - - - - Zip - Postleitzahl - - PostalCode - - - - - ZIP code of address - Postleitzahl der Anschrift - - - - - - - CityTown - 0173-1#02-AAO132#001 - - - - - - - - Ort - City/town - - City/town - - - - - Town or city of the company - Ortsangabe - - - - - - - StateCounty - 0173-1#02-AAO133#002 - - - - - - - - state/county - Bundesland - - StateCounty - - - - - Bundesland - state/county - - - - - - - ManufacturerProductFamily - 0173-1#02-AAU731#001 - - - - - - - - Manufacturer product family - Herstellerproduktfamilie - - TypClass - - - - - 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie - 2nd level of a 3 level manufacturer specific product hierarchy - - - - - - - SerialNumber - 0173-1#02-AAM556#002 - - - - - - - - Serial number - Seriennummer - - InstanceId - - - - - eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist - unique combination of numbers and letters used to identify the device once it has been manufactured - - - - - - - BatchNumber - 0173-1#02-AAQ196#001 - - - - - - - - Batch number - Chargen-Nummer - - ChargeId - - - - - Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge - Number assigned by the manufacturer of a material to identify the manufacturer's batch - - - - - - - ProductCountryOfOrigin - 0173-1#02-AAO841#001 - - - - - - - - Produkt Ursprungsland - Product country of origin - - CountryOfOrigin - - - - - Land in dem das Produkt hergestellt wurde (Hersteller Land) - Country in which the product is manufactured (manufacturer country) - - - - - - - YearOfConstruction - 0173-1#02-AAP906#001 - - - - - - - - Year of construction - Baujahr - - YearOfConstruction - - - - - Jahreszahl als Datumsangabe für die Fertigstellung des Objektes - Year as completion date of object - - - - - - - ProductMarking - https://www.hsu-hh.de/aut/aas/productmarking - - - - - - - - Produktkennzeichnung - Product Marking - - ProductMarking - - - - - Sammlungsdatei für Produktkennzeichnung - Collection file for product marking - - - - - - - CEQualificationPresent - 0173-1#02-BAF053#008 - - - - - - - - CE-Kennzeichnung vorhanden - CE- qualification present - - CEMarkingPresent - - - BOOLEAN - - whether CE- qualification is present - Angabe, ob CE-Kennzeichnung vorhanden ist - - - - - - - File - 0173-1#02-AAD005#008 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Enthaltene Doku. Datei - Embedded Doc. file - - File - - - - - Verweis/ BLOB auf enthaltene Dokumentations-Datei. - Reference/ BLOB to embedded documentation file. - - - - - - - DocumentationItem - 0173-1#02-AAD001#001 - - - - - - - - Dokumentationsgruppe - Documentation item - - DocumentationItem - - - - - Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. - Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. - - - - - - - DocumentType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - - - - - - Dokumententyp - Document Type - - DocumentType - - - - - Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) - TBD - - - - - - - VDI2770_DomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - - - - - - Domain-Nummer - DomainId - - DomainId - - - - - Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. - TBD - - - - - - - VDI2770_IdType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - - - - - - Nummerntyp - IdType - - IdType - - - - - Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. - TBD - - - - - - - DocumentId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - - - - - - DocumentId - Dokumenten-Nummer - - DocumentId - - - - - Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. - TBD - - - - - - - DocumentDomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - - - - - - DocumentDomainId - DocumentDomainId - - DocumentDomainId - - - - - Kennung oder Kennzeichen einer Domäne - TBD - - - - - - - VDI2770_Role - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - - - - - - Rolle - Role - - Role - - - - - Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) - TBD - - - - - - - VDI2770_OrganisationId - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - - - - - - Organisation ID - Organisation ID - - OrganisationId - - - - - eindeutige ID für die Organisation - TBD - - - - - - - VDI2770_OrganisationName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - - - - - - OrganisationName - OrganisationName - - OrganisationName - - - - - gebräuchliche Bezeichnung für die Organisation - TBD - - - - - - - VDI2770_OrganisationOfficialName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - - - - - - Offizieller Name der Organisation - Organisation Official Name - - OrganisationOfficialName - - - - - offizieller Name der Organisation - TBD - - - - - - - VDI2770_Description - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - - - - - - Beschreibung - Description - - Description - - - - - Beschreibung für die nächste übergeordnete Collection - TBD - - - - - - - DocumentPartId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - - - - - - Dokumenten-Teilnummer - DocumentPartId - - DocumentPartId - - - - - Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. - TBD - - - - - - - DocumentClassification_ClassId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - - - - Dokumentkategorie - Document category - - DocCategory - - - - - Dokumentkategorie nach VDI 2770:2018/10 - Document category after VDI 2770:2018/10 - - - - - - - VDI2770_ClassName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - - - - - - Klassenname - Class Name - - ClassName - - - - - Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. - TBD - - - - - - - VDI2770_ClassificationSystem - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - - - - - - Klassifizierungssystem - classification system - - ClassificationSystem - - - - - Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. - TBD - - - - - - - DocumentVersionId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - - - - - - Dokumenten-Versionsnummer - DocumentVersionId - - DocumentVersionId - - - - - Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. - TBD - - - - - - - DocumentVersion_LanguageCode - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - - - - - - Sprachenschlüssel - LanguageCode - - LanguageCode - - - - - Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 - TBD - - - - - - - VDI2770_Title - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - - - - - - Titel - Title - - VDI2770_Title - - - - - sprachabhängiger Titel des Dokuments - TBD - - - - - - - VDI2770_Summary - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - - - - - - Zusammenfassung - Summary - - Summary - - - - - sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts - TBD - - - - - - - VDI2770_Keywords - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - - - - - - Schlagwörter - Keywords - - Keywords - - - - - sprachabhängige, durch Komma getrennte Liste von Schlagwörtern - TBD - - - - - - - VDI2770_StatusValue - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - - - - - - Statuswert - StatusValue - - StatusValue - - - - - Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) - TBD - - - - - - - VDI2770_SetDate - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - - - - - - Erstellungsdatum - Set Date - - SetDate - - - - - Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). - TBD - - - - - - - VDI2770_Purpose - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - - - - - - Zweck - Purpose - - Purpose - - - - - Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. - TBD - - - - - - - VDI2770_BasedOnProcedure - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - - - - - - Prozedur - Procedure - - BasedOnProcedure - - - - - textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt - TBD - - - - - - - VDI2770_Comments - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - - - - - - Kommentar - Comments - - Comments - - - - - textuelle Bemerkungen und Anmerkungen zum Status - TBD - - - - - - - VDI2770_ReferencedObject_Type - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - - - - - - Typ - Type - - Type - - - - - Für Type des Objekts muss immer Product angegeben werden. - TBD - - - - - - - VDI2770_ReferencedObject_RefType - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - - - - - - RefType - RefType - - RefType - - - - - Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) - TBD - - - - - - - VDI2770_ReferencedObject_ObjectId - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - - - - - - ObjectId - ObjectId - - ObjectId - - - - - Angabe der Identifikationsnummer zum Objekt - TBD - - - - - - - VDI2770_FileId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - - - - - - ID der Datei - File ID - - FileId - - - - - eindeutige ID für die Datei - TBD - - - - - - - VDI2770_FileName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - - - - - - Dateiname - File name - - FileName - - - - - Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. - TBD - - - - - - - VDI2770_FileFormat - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - - - - - - Datei Format - File format - - FileFormat - - - - - Angabe eines Media Typs gemäß der Liste der IANA - TBD - - - - - - - OrganisationContactInfo - https://www.hsu-hh.de/aut/aas/contactinfo - - - - - - - - Contact Info - Kontakt Info - - OrganisationContactInfo - - - - - Sammlung für die allgemeinen Kontaktdaten - Collection for general contact data - - - - - - - NameOfSupplier - 0173-1#02-AAO735#003 - - - - - - - - - - - - name of supplier - Lieferantenname - - name of supplier - - - - - Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt - name of supplier which provides the customer with a product or a service - - - - - - - ContactInfo_Role - https://www.hsu-hh.de/aut/aas/role - - - - - - - - Rolle - Role - - Role - - - - - Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt - Information to specify the role which the organisation of ContactInfo plays - - - - - - - Email - https://www.hsu-hh.de/aut/aas/email - - - - - - - - Emailadresse - Email address - - Email - - - - - Emailadresse - Email address - - - - - - - URL - 0173-1#02-AAO694#001 - - - - - - - - Internetadresse - Internet address - - URL - - - - - stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html - Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html - - - - - - - PhoneNumber - 0173-1#02-AAO136#002 - - - - - - - - Telefonnummer - telephone number - - Phone - - - - - vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist - complete telephone number to be called to reach a business partner - - - - - - - Fax - https://www.hsu-hh.de/aut/aas/fax - - - - - - - - Fax - Fax - - Fax - - - - - Faxnummer - Fax number - - - - - - - 0173-1#02-AAO136#002 - - - - - GLNOfManufacturer - 0173-1#02-AAY812#001 - - - - - - - - GLN of manufacturer - GLN des Herstellers - - GLN of manufacturer - - - - - international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort - internationally unique identification number for the manufacturer of the device or the product and for the physical location - - - - - - - SupplierOfTheIdentifier - 0173-1#02-AAP796#004 - - - - - - - - Supplier of the identifier - Anbieter der Identifikationsnummer für Hersteller - - Supplier of the identifier - - - STRING_TRANSLATABLE - - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - - - - - - - MAN_PROD_NUM - - product article number of manufacturer - - 0173-1#02-AAO676#003 - - - - - - - - product article number of manufacturer - Herstellerartikelnummer - - MAN_PROD_NUM - - - STRING_TRANSLATABLE - - eindeutiger Bestellschlüssel des Herstellers - unique product identifier of the manufacturer - - - - - - - ManufacturerProductDescription - 0173-1#02-AAU734#001 - - - - - - - - Manufacturer product description - Herstellerproduktbeschreibung - - Manufacturer product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - GLNOfSupplier - 0173-1#02-AAY813#001 - - - - - - - - GLN of supplier - GLN des Lieferanten - - GLN of supplier - - - - - international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort - internationally unique identification number for the supplier of the device or the product and for the physical location - - - - - - - SupplierIdProvider - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - - - - - - SupplierIdProvider - Anbieter der Identifikationsnummer - - SupplierIdProvider - - - STRING_TRANSLATABLE - - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - - - - - - - SUP_PROD_NUM - 0173-1#02-AAO736#004 - - - - - - - - product article number of supplier - Lieferantenartikelnummer - - product article number of supplier - - - - - eindeutiger Bestellschlüssel des Lieferanten - unique product order identifier of the supplier - - - - - - - SupplierProductDesignation - 0173-1#02-AAM551#002 - - - - - - - - Supplier product designation - Lieferantenproduktbezeichnung - - SupplierTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - SupplierProductDescription - 0173-1#02-AAU730#001 - - - - - - - - Supplier product description - Lieferantenproduktbeschreibung - - Supplier product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - ClassificationSystem - 0173-1#02-AAO715#002 - - - - - - - - classification system - Klassifizierungssystem - - ClassificationSystem - - - - - Klassifizierungssystem - Classification System - - - - - - - SecondaryKeyTyp - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - - - - - - SecondaryKeyTyp - Typnummer des IT Systems - - SecondaryKeyTyp - - - - - Führende technische ID im IT System des Typs - SecondaryKeyTyp - - - - - - - TypThumbnail - www.company.com/ids/cd/4401_1272_7091_3437 - - - - - - - - TypThumbnail - Vorschaubild - - TypThumbnail - - - - - Darstellung des Produkttyps in kleinem Format - Small picture of the product type - - - - - - - AssetId - https://www.hsu-hh.de/aut/aas/assetid - - - - - - - - AssetId - Asset ID - - AssetId - - - - - Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. - Global unique ID of an asset, which can be read by both human and machine. - - - - - - - SecondaryKeyInstance - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - - - - - - SecondaryKeyInstance - Instanznummer des IT Systems - - SecondaryKeyInstance - - - - - Führende technische ID im IT System der Instanz - SecondaryKeyInstance - - - - - - - DateOfManufacture - 0173-1#02-AAR972#002 - - - - - - - - Date of manufacture - Herstellungsdatum - - Date of manufacture - - - DATE - - Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist - Date from which the production and / or development process is completed or from which a service is provided completely - - - - - - - DeviceRevision - https://www.hsu-hh.de/aut/aas/devicerevision - - - - - - - - DeviceRevision - DeviceRevision - - DeviceRevision - - - - - DeviceRevision - DeviceRevision - - - - - - - SoftwareRevision - https://www.hsu-hh.de/aut/aas/softwarerevision - - - - - - - - SoftwareRevision - SoftwareRevision - - SoftwareRevision - - - - - SoftwareRevision - SoftwareRevision - - - - - - - HardwareRevision - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - - - - - - HardwareRevision - HardwareRevision - - HardwareRevision - - - - - HardwareRevision - HardwareRevision - - - - - - - QrCode - https://www.hsu-hh.de/aut/aas/qrcode - - - - - - - - QrCode - QrCode - - QrCode - - - - - In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. - QrCode - - - - - - - CompanyLogo - https://www.hsu-hh.de/aut/aas/companylogo - - - - - - - - Firmenlogo - CompanyLogo - - CompanyLogo - - - - - Firmenlogo - CompanyLogo - - - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/17_ABB.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/17_ABB.aasx.xml deleted file mode 100644 index cba1293c8..000000000 --- a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/17_ABB.aasx.xml +++ /dev/null @@ -1,4777 +0,0 @@ - - - - - ABB_TTF_300 - www.abb.com/8055_9070_1191_2593 - - - www.abb.com/8055_9070_1191_2593 - - - - - https://productid.abb.com/9AAC129110?sn=3K650000548505 - - - - - - www.abb.com/ids/4834_5472_7091_3242 - - - - - www.company.com/ids/sm/2543_5072_7091_2660 - - - - - www.company.com/ids/sm/6053_5072_7091_5102 - - - - - www.company.com/ids/sm/6563_5072_7091_4267 - - - - - www.abb.com/ids/6113_5160_1191_8063 - - - - - www.abb.com/ids/0212_0171_1391_2237 - - - - - www.abb.com/ids/3213_0170_1192_3931 - - - - - - - - - instanceAsset - https://productid.abb.com/9AAC129110?sn=3K650000548505 - Instance - - - www.abb.com/sm/1433_0170_1191_4089 - - - - - - - Nameplate - www.abb.com/ids/4834_5472_7091_3242 - - - https://www.hsu-hh.de/aut/aas/nameplate - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - ABB Automation Products GmbH - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - TTF 300 - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Stierstadterstrasse 5 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 60488 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Frankfurt - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Hessen - - - - false - false - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - Temperature transmitter - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 3K650000548505 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - ProductCountryOfOrigin - PARAMETER - - - 0173-1#02-AAO841#001 - - - Instance - - string - DE - - - - - YearOfConstruction - PARAMETER - - - 0173-1#02-AAP906#001 - - - Instance - - integer - 2019 - - - - - Marking_CE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/marking_ce.png - - - - false - false - - - - - - Document - www.company.com/ids/sm/2543_5072_7091_2660 - - - https://www.hsu-hh.de/aut/aas/document - - - Instance - - - - - DeclarationCEMarking - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - CE_TTX300_TTX200_ATEX_2016X - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - ABB - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - ABB Automation Products GmbH - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - EU-Konformitätserklärung - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - CE_TTX300_TTX200_ATEX_2016X-DE.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/CE_TTX300_TTX200_ATEX_2016X-DE.pdf - - - - false - false - - - - - ManualDE - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - OI/TTF300 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - ABB - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - ABB Automation Products GmbH - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Operation (EN) Bedienung (DE) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - G - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Betriebsanleitung - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - OI_TTF300_DE_G01.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/OI_TTF300_DE_G01.pdf - - - - false - false - - - - - ManualEN - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - OI/TTF300 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - ABB - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - ABB Automation Products GmbH - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Operation (EN) Bedienung (DE) - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - G - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Manual - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - OI_TTF300_EN_G01.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/OI_TTF300_EN_G01.pdf - - - - false - false - - - - - - Service - www.company.com/ids/sm/6053_5072_7091_5102 - - - https://www.hsu-hh.de/aut/aas/service - - - Instance - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - ABB AG - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Schillerstr. 72 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 32423 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Minden - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Nordrhein-Westfalen - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - contact.center@de.abb.com - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - string - https://new.abb.com/service - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +496213813333 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - - - - - false - false - - - - - - Identification - www.company.com/ids/sm/6563_5072_7091_4267 - - - https://www.hsu-hh.de/aut/aas/identification - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - ABB Automation Products GmbH - - - - - GLNOfManufacturer - PARAMETER - - - 0173-1#02-AAY812#001 - - - Instance - - string - - - - - - SupplierOfTheIdentifier - - - 0173-1#02-AAP796#004 - - - Instance - - - - - - - - MAN_PROD_NUM - - - 0173-1#02-AAO676#003 - - - Instance - - - - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - Field mounted temperature transmitters - - - - - ManufacturerProductDescription - PARAMETER - - - 0173-1#02-AAU734#001 - - - Instance - - langString - For enhanced (e.g. redundancy) field mounting application with 4 to 20 mA HART, PROFIBUS and FOUNDATION Fieldbus communication. With and without LCD display including device configurability. Also available with Ex-approvals and SIL declaration of conformity. - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - ABB Automation Products GmbH - - - - - GLNOfSupplier - PARAMETER - - - 0173-1#02-AAY813#001 - - - Instance - - string - - - - - - SupplierIdProvider - PARAMETER - - - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - Instance - - - - - - - - SUP_PROD_NUM - PARAMETER - - - 0173-1#02-AAO736#004 - - - Instance - - - TTF300.Y0C4F - - - - - SupplierProductDesignation - - - 0173-1#02-AAM551#002 - - - Instance - - string - Field mounted temperature transmitters - - - - - SupplierProductDescription - PARAMETER - - - 0173-1#02-AAU730#001 - - - Instance - - langString - For enhanced (e.g. redundancy) field mounting application with 4 to 20 mA HART, PROFIBUS and FOUNDATION Fieldbus communication. With and without LCD display including device configurability. Also available with Ex-approvals and SIL declaration of conformity. - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - string - Temperature transmitter - - - - - ClassificationSystem - PARAMETER - - - 0173-1#02-AAO715#002 - - - Instance - - string - eclass - - - - - SecondaryKeyTyp - - - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - Instance - - - - - - - - TypThumbnail - PARAMETER - - - https://www.hsu-hh.de/aut/aas/thumbnail - - - Instance - - image/jpeg - /thumbnail.jpg - - - - - AssetId - PARAMETER - - - https://www.hsu-hh.de/aut/aas/assetid - - - Instance - - anyURI - www.company.com/ids/asset/8220_6010_8091_3593 - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 3K650000548505 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - - - - - - SecondaryKeyInstance - PARAMETER - - - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - Instance - - - - - - - - DateOfManufacture - PARAMETER - - - 0173-1#02-AAR972#002 - - - Instance - - date - 2018-12-20 - - - - - DeviceRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/devicerevision - - - Instance - - - - - - - - SoftwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/softwarerevision - - - Instance - - - 01.01.05 - - - - - HardwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - Instance - - - 01.00.02 - - - - - QrCode - PARAMETER - - - https://www.hsu-hh.de/aut/aas/qrcode - - - Instance - - image/jpeg - /aasx/QR_9AAC129110_3K650000548505.png - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - ABB Automation Products GmbH - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - langString - Wallstadter Straße 59 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 68526 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Ladenburg - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Baden-Württemberg - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - contact.center@de.abb.com - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://www.abb.com - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +49 621 381 3333 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - - - - - false - false - - - - - CompanyLogo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/companylogo - - - Instance - - image/png - /aasx/ABB_Logo_320.png - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://productid.abb.com/9AAC129110?sn=3K650000548505 - - - - - - AssetIdentification - www.abb.com/ids/6113_5160_1191_8063 - - - https://www.hsu-hh.de/aut/aas/assetidentification - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - ABB Automation Products GmbH - - - - - Brand - CONSTANT - - - 0173-1#02-AAO742#002 - - - Instance - - string - TTF300 - - - - - SUP_PROD_NUM - PARAMETER - - - 0173-1#02-AAO736#004 - - - Instance - - - TTF300.Y0C4F - - - - - EclassClassification - CONSTANT - - - - https://www.eclasscontent.com/index.php?action=det&id=27200208 - - - Instance - - - 27-20-02-08 - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 3K650000548505 - - - - - InstallationID - - - - https://www.abb.com/servIS/installationID - - - Instance - - - 9AAK619994K8957 - - - - - DeliveryDate - - - - https://www.abb.com/servIS/deliveryDate - - - Instance - - - 2018-12-20 - - - - - - CertificatesAndDeclarations - - www.abb.com/ids/0212_0171_1391_2237 - - - https://www.hsu-hh.de/aut/aas/certificatesanddeclarations - - - Instance - - - - - AdditionalLinkAddress - - - 0173-1#02-AAE670#003 - - - Instance - - anyURI - https://share.library.abb.com/api/v4?cid=9AAC129110&dk=Certificate - - - - - - TechnicalData - - www.abb.com/ids/3213_0170_1192_3931 - - - https://www.hsu-hh.de/aut/aas/technicaldata - - - Instance - - - - - Weight - - - - 0173-1#02-AAB713#005 - - - Instance - - - 1.2 - - - - - - - - ManufacturerName - 0173-1#02-AAO677#002 - - - - - - - - Herstellername - Manufacturer Name - - Manufacturer Name - - - - - Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist - 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 - - - - - - - ManufacturerProductDesignation - 0173-1#02-AAW338#001 - - - - - - - - Manufacturer product designation - Herstellerproduktbezeichnung - - ManufacturerTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - PhysicalAddress - https://www.hsu-hh.de/aut/aas/physicaladdress - - - - - - - - PhysicalAddress - Physische Adresse - - PhysicalAddress - - - - - Sammlung für reale physische Adresse - Collection for real physical address - - - - - - - CountryCode - 0173-1#02-AAO730#001 - - - - - - - - - - - - Landeskennung - Country code - - Country code - - - - - Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes - agreed upon symbol for unambiguous identification of a country - - - - - - - Street - 0173-1#02-AAO128#001 - - - - - - - - Strasse - Street - - Street - - - - - Name der Strasse und Hausnummer - Street name and house number - - - - - - - Zip - 0173-1#02-AAO129#002 - - - - - - - - Zip - Postleitzahl der Anschrift - - PostalCode - - - - - ZIP code of address - Postleitzahl der Anschrift - - - - - - - CityTown - 0173-1#02-AAO132#001 - - - - - - - - Ort - City/town - - City/town - - - - - Town or city of the company - Ortsangabe - - - - - - - StateCounty - 0173-1#02-AAO133#002 - - - - - - - - state/county - Bundesland - - StateCounty - - - - - Bundesland - state/county - - - - - - - ManufacturerProductFamily - 0173-1#02-AAU731#001 - - - - - - - - Manufacturer product family - Herstellerproduktfamilie - - TypClass - - - - - 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie - 2nd level of a 3 level manufacturer specific product hierarchy - - - - - - - SerialNumber - 0173-1#02-AAM556#002 - - - - - - - - Serial number - Seriennummer - - InstanceId - - - - - eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist - unique combination of numbers and letters used to identify the device once it has been manufactured - - - - - - - BatchNumber - 0173-1#02-AAQ196#001 - - - - - - - - Batch number - Chargen-Nummer - - ChargeId - - - - - Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge - Number assigned by the manufacturer of a material to identify the manufacturer's batch - - - - - - - ProductCountryOfOrigin - 0173-1#02-AAO841#001 - - - - - - - - Produkt Ursprungsland - Product country of origin - - CountryOfOrigin - - - - - Land in dem das Produkt hergestellt wurde (Hersteller Land) - Country in which the product is manufactured (manufacturer country) - - - - - - - YearOfConstruction - 0173-1#02-AAP906#001 - - - - - - - - Year of construction - Baujahr - - YearOfConstruction - - - - - Jahreszahl als Datumsangabe für die Fertigstellung des Objektes - Year as completion date of object - - - - - - - ProductMarking - https://www.hsu-hh.de/aut/aas/productmarking - - - - - - - - Produktkennzeichnung - Product Marking - - ProductMarking - - - - - Sammlungsdatei für Produktkennzeichnung - Collection file for product marking - - - - - - - CEQualificationPresent - 0173-1#02-BAF053#008 - - - - - - - - CE-Kennzeichnung vorhanden - CE- qualification present - - CEMarkingPresent - - - BOOLEAN - - whether CE- qualification is present - Angabe, ob CE-Kennzeichnung vorhanden ist - - - - - - - File - 0173-1#02-AAD005#008 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Enthaltene Doku. Datei - Embedded Doc. file - - File - - - - - Verweis/ BLOB auf enthaltene Dokumentations-Datei. - Reference/ BLOB to embedded documentation file. - - - - - - - DocumentationItem - 0173-1#02-AAD001#001 - - - - - - - - Dokumentationsgruppe - Documentation item - - DocumentationItem - - - - - Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. - Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. - - - - - - - DocumentType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - - - - - - Dokumententyp - Document Type - - DocumentType - - - - - Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) - TBD - - - - - - - VDI2770_DomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - - - - - - Domain-Nummer - DomainId - - DomainId - - - - - Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. - TBD - - - - - - - VDI2770_IdType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - - - - - - Nummerntyp - IdType - - IdType - - - - - Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. - TBD - - - - - - - DocumentId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - - - - - - DocumentId - Dokumenten-Nummer - - DocumentId - - - - - Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. - TBD - - - - - - - DocumentDomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - - - - - - DocumentDomainId - DocumentDomainId - - DocumentDomainId - - - - - Kennung oder Kennzeichen einer Domäne - TBD - - - - - - - VDI2770_Role - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - - - - - - Rolle - Role - - Role - - - - - Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) - TBD - - - - - - - VDI2770_OrganisationId - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - - - - - - Organisation ID - Organisation ID - - OrganisationId - - - - - eindeutige ID für die Organisation - TBD - - - - - - - VDI2770_OrganisationName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - - - - - - OrganisationName - OrganisationName - - OrganisationName - - - - - gebräuchliche Bezeichnung für die Organisation - TBD - - - - - - - VDI2770_OrganisationOfficialName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - - - - - - Offizieller Name der Organisation - Organisation Official Name - - OrganisationOfficialName - - - - - offizieller Name der Organisation - TBD - - - - - - - VDI2770_Description - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - - - - - - Beschreibung - Description - - Description - - - - - Beschreibung für die nächste übergeordnete Collection - TBD - - - - - - - DocumentPartId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - - - - - - Dokumenten-Teilnummer - DocumentPartId - - DocumentPartId - - - - - Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. - TBD - - - - - - - DocumentClassification_ClassId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - - - - Dokumentkategorie - Document category - - DocCategory - - - - - Dokumentkategorie nach VDI 2770:2018/10 - Document category after VDI 2770:2018/10 - - - - - - - VDI2770_ClassName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - - - - - - Klassenname - Class Name - - ClassName - - - - - Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. - TBD - - - - - - - VDI2770_ClassificationSystem - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - - - - - - Klassifizierungssystem - classification system - - ClassificationSystem - - - - - Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. - TBD - - - - - - - DocumentVersionId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - - - - - - Dokumenten-Versionsnummer - DocumentVersionId - - DocumentVersionId - - - - - Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. - TBD - - - - - - - DocumentVersion_LanguageCode - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - - - - - - Sprachenschlüssel - LanguageCode - - LanguageCode - - - - - Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 - TBD - - - - - - - VDI2770_Title - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - - - - - - Titel - Title - - VDI2770_Title - - - - - sprachabhängiger Titel des Dokuments - TBD - - - - - - - VDI2770_Summary - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - - - - - - Zusammenfassung - Summary - - Summary - - - - - sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts - TBD - - - - - - - VDI2770_Keywords - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - - - - - - Schlagwörter - Keywords - - Keywords - - - - - sprachabhängige, durch Komma getrennte Liste von Schlagwörtern - TBD - - - - - - - VDI2770_StatusValue - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - - - - - - Statuswert - StatusValue - - StatusValue - - - - - Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) - TBD - - - - - - - VDI2770_SetDate - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - - - - - - Erstellungsdatum - Set Date - - SetDate - - - - - Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). - TBD - - - - - - - VDI2770_Purpose - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - - - - - - Zweck - Purpose - - Purpose - - - - - Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. - TBD - - - - - - - VDI2770_BasedOnProcedure - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - - - - - - Prozedur - Procedure - - BasedOnProcedure - - - - - textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt - TBD - - - - - - - VDI2770_Comments - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - - - - - - Kommentar - Comments - - Comments - - - - - textuelle Bemerkungen und Anmerkungen zum Status - TBD - - - - - - - VDI2770_ReferencedObject_Type - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - - - - - - Typ - Type - - Type - - - - - Für Type des Objekts muss immer Product angegeben werden. - TBD - - - - - - - VDI2770_ReferencedObject_RefType - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - - - - - - RefType - RefType - - RefType - - - - - Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) - TBD - - - - - - - VDI2770_ReferencedObject_ObjectId - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - - - - - - ObjectId - ObjectId - - ObjectId - - - - - Angabe der Identifikationsnummer zum Objekt - TBD - - - - - - - VDI2770_FileId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - - - - - - ID der Datei - File ID - - FileId - - - - - eindeutige ID für die Datei - TBD - - - - - - - VDI2770_FileName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - - - - - - Dateiname - File name - - FileName - - - - - Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. - TBD - - - - - - - VDI2770_FileFormat - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - - - - - - Datei Format - File format - - FileFormat - - - - - Angabe eines Media Typs gemäß der Liste der IANA - TBD - - - - - - - OrganisationContactInfo - https://www.hsu-hh.de/aut/aas/contactinfo - - - - - - - - Contact Info - Kontakt Info - - OrganisationContactInfo - - - - - Sammlung für die allgemeinen Kontaktdaten - Collection for general contact data - - - - - - - NameOfSupplier - 0173-1#02-AAO735#003 - - - - - - - - - - - - name of supplier - Lieferantenname - - name of supplier - - - - - Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt - name of supplier which provides the customer with a product or a service - - - - - - - ContactInfo_Role - https://www.hsu-hh.de/aut/aas/role - - - - - - - - Rolle - Role - - Role - - - - - Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt - Information to specify the role which the organisation of ContactInfo plays - - - - - - - Email - https://www.hsu-hh.de/aut/aas/email - - - - - - - - Emailadresse - Email address - - Email - - - - - Emailadresse - Email address - - - - - - - URL - 0173-1#02-AAO694#001 - - - - - - - - Internetadresse - Internet address - - URL - - - - - stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html - Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html - - - - - - - PhoneNumber - 0173-1#02-AAO136#002 - - - - - - - - Telefonnummer - telephone number - - Phone - - - - - vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist - complete telephone number to be called to reach a business partner - - - - - - - Fax - https://www.hsu-hh.de/aut/aas/fax - - - - - - - - Fax - Fax - - Fax - - - - - Faxnummer - Fax number - - - - - - - 0173-1#02-AAO136#002 - - - - - GLNOfManufacturer - 0173-1#02-AAY812#001 - - - - - - - - GLN of manufacturer - GLN des Herstellers - - GLN of manufacturer - - - - - international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort - internationally unique identification number for the manufacturer of the device or the product and for the physical location - - - - - - - SupplierOfTheIdentifier - 0173-1#02-AAP796#004 - - - - - - - - Supplier of the identifier - Anbieter der Identifikationsnummer für Hersteller - - Supplier of the identifier - - - STRING_TRANSLATABLE - - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - - - - - - - MAN_PROD_NUM - - product article number of manufacturer - - 0173-1#02-AAO676#003 - - - - - - - - product article number of manufacturer - Herstellerartikelnummer - - MAN_PROD_NUM - - - STRING_TRANSLATABLE - - eindeutiger Bestellschlüssel des Herstellers - unique product identifier of the manufacturer - - - - - - - ManufacturerProductDescription - 0173-1#02-AAU734#001 - - - - - - - - Manufacturer product description - Herstellerproduktbeschreibung - - Manufacturer product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - GLNOfSupplier - 0173-1#02-AAY813#001 - - - - - - - - GLN of supplier - GLN des Lieferanten - - GLN of supplier - - - - - international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort - internationally unique identification number for the supplier of the device or the product and for the physical location - - - - - - - SupplierIdProvider - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - - - - - - SupplierIdProvider - Anbieter der Identifikationsnummer - - SupplierIdProvider - - - STRING_TRANSLATABLE - - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - - - - - - - SUP_PROD_NUM - 0173-1#02-AAO736#004 - - - - - - - - product article number of supplier - Lieferantenartikelnummer - - product article number of supplier - - - - - eindeutiger Bestellschlüssel des Lieferanten - unique product order identifier of the supplier - - - - - - - SupplierProductDesignation - 0173-1#02-AAM551#002 - - - - - - - - Supplier product designation - Lieferantenproduktbezeichnung - - SupplierTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - SupplierProductDescription - 0173-1#02-AAU730#001 - - - - - - - - Supplier product description - Lieferantenproduktbeschreibung - - Supplier product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - ClassificationSystem - 0173-1#02-AAO715#002 - - - - - - - - classification system - Klassifizierungssystem - - ClassificationSystem - - - - - Klassifizierungssystem - Classification System - - - - - - - SecondaryKeyTyp - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - - - - - - SecondaryKeyTyp - Typnummer des IT Systems - - SecondaryKeyTyp - - - - - Führende technische ID im IT System des Typs - SecondaryKeyTyp - - - - - - - TypThumbnail - https://www.hsu-hh.de/aut/aas/thumbnail - - - - - - - - TypThumbnail - Vorschaubild - - TypThumbnail - - - - - Darstellung des Produkttyps in kleinem Format - Small picture of the product type - - - - - - - AssetId - https://www.hsu-hh.de/aut/aas/assetid - - - - - - - - AssetId - Asset ID - - AssetId - - - - - Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. - Global unique ID of an asset, which can be read by both human and machine. - - - - - - - SecondaryKeyInstance - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - - - - - - SecondaryKeyInstance - Instanznummer des IT Systems - - SecondaryKeyInstance - - - - - Führende technische ID im IT System der Instanz - SecondaryKeyInstance - - - - - - - DateOfManufacture - 0173-1#02-AAR972#002 - - - - - - - - Date of manufacture - Herstellungsdatum - - Date of manufacture - - - DATE - - Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist - Date from which the production and / or development process is completed or from which a service is provided completely - - - - - - - DeviceRevision - https://www.hsu-hh.de/aut/aas/devicerevision - - - - - - - - DeviceRevision - DeviceRevision - - DeviceRevision - - - - - DeviceRevision - DeviceRevision - - - - - - - SoftwareRevision - https://www.hsu-hh.de/aut/aas/softwarerevision - - - - - - - - SoftwareRevision - SoftwareRevision - - SoftwareRevision - - - - - SoftwareRevision - SoftwareRevision - - - - - - - HardwareRevision - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - - - - - - HardwareRevision - HardwareRevision - - HardwareRevision - - - - - HardwareRevision - HardwareRevision - - - - - - - CompanyLogo - https://www.hsu-hh.de/aut/aas/companylogo - - - - - - - - Firmenlogo - CompanyLogo - - CompanyLogo - - - - - Firmenlogo - CompanyLogo - - - - - - - QrCode - https://www.hsu-hh.de/aut/aas/qrcode - - - - - - - - QrCode - QrCode - - QrCode - - - - - In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. - QrCode - - - - - - - Brand - 0173-1#02-AAO742#002 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Brand - Makre - - BRAND - - - - - - - - - - EclassClasification - CONSTANT - https://www.eclasscontent.com/index.php?action=det&id=27200208 - - - - - - - - - - - - - Temperaturmessung elektrisch komplett - Temperature measuring electr. complete - - - - - - - AdditionalLinkAddress - 0173-1#02-AAE670#003 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - zusätzlicher Online-Verweis - additional link address - - - - - STRING_TRANSLATABLE - - site address where you can view information about the product or to communicate - Angabe einer Web-Adresse, die zusätzliche Informationen zum Produkt oder Kontaktdaten enthält - - - - - - - Weight - 0173-1#02-AAB713#005 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Weight - Gewicht - - Weight - kg - - REAL_MEASURE - - Masse des Wägegutes ohne Verpackung und ohne Transportgerät - Mass of weight without packaging and transport unit - - - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/18_Hitachi_HX_DigTyp40.aasx.xml b/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/18_Hitachi_HX_DigTyp40.aasx.xml deleted file mode 100644 index 39324b5b9..000000000 --- a/src/AasxCsharpLibrary.Tests/TestResources/AasxCsharpLibrary.Tests/XmlValidation/expectedOk/18_Hitachi_HX_DigTyp40.aasx.xml +++ /dev/null @@ -1,6872 +0,0 @@ - - - - - 000000001 - https://admin-shell.hitachi-industrial.eu/aas/1/1/000000001 - - - https://admin-shell.hitachi-industrial.eu/asset/000000001 - - - - - - www.company.com/ids/sm/4343_5072_7091_3242 - - - - - www.company.com/ids/sm/2543_5072_7091_2660 - - - - - www.company.com/ids/sm/6053_5072_7091_5102 - - - - - www.company.com/ids/sm/6563_5072_7091_4267 - - - - - https://automation.hitachi-industrial.eu/_Resources/Static/Packages/Moon.HitachiEurope/Downloads/automation/[2]%20Software/[5]%20Configuration%20Files/[1]%20Device%20Descriptions/Device%20files.zip - - - - - - - - - Hitachi_000000001 - - Hitachi HX PLC - Hitachi HX SPS - - https://admin-shell.hitachi-industrial.eu/asset/000000001 - Instance - - - - - Nameplate - www.company.com/ids/sm/4343_5072_7091_3242 - - - https://www.hsu-hh.de/aut/aas/nameplate - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Hitachi Industrial Equipment Systems Co.,Ltd. - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - HX-CP1H16 - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - JP - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - AKS Bldg, 3 Kanda Neribei-cho - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 101-0022 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Chiyoda-ku, Tokyo - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - Tokyo - - - - false - false - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - - PAC IoT Controller HX Series - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - HX-CP1H16 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - string - N/A - - - - - ProductCountryOfOrigin - PARAMETER - - - 0173-1#02-AAO841#001 - - - Instance - - string - JP - - - - - YearOfConstruction - PARAMETER - - - 0173-1#02-AAP906#001 - - - Instance - - integer - 2018 - - - - - Marking_CE - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CEQualificationPresent - PARAMETER - - - 0173-1#02-BAF053#008 - - - Instance - - boolean - 1 - - - 0173-1#07-CAA016#001 - - - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/marking_ce.png - - - - false - false - - - - - Marking_CRUUS - PARAMETER - - - https://www.hsu-hh.de/aut/aas/productmarking - - - Instance - - - - - CRUUSLabelingPresent - PARAMETER - - - 0173-1#02-AAR528#005 - - - Instance - - boolean - 1 - - - 0173-1#07-CAA016#001 - - - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - image/png - /aasx/Nameplate/marking_cruus.jpg - - - - false - false - - - - - - Document - www.company.com/ids/sm/2543_5072_7091_2660 - - - https://www.hsu-hh.de/aut/aas/document - - - Instance - - - - - DeclarationCEMarking - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Hitachi - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Hitachi Industrial Equipment Systems Co.,Ltd. - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - HX CE declaration - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - CE_DLR_EH-150_REV17.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/CE_DLR_EH-150_REV17.pdf - - - - false - false - - - - - DeclarationRoHS - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Hitachi - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Hitachi Industrial Equipment Systems Co.,Ltd. - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 02-04 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Zeugnisse, Zertifikate, Bescheinigungen - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - RoHS 2011/65/EU Declaration of conformity - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - CE_DLR_EH-150_REV17.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/CE_DLR_EH-150_REV17.pdf - - - - false - false - - - - - EN_Manual_Hitachi_HX_Hardware - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - NJI-637(X) - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Hitachi - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Hitachi Industrial Equipment Systems Co.,Ltd. - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - 2016.11 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - HX Series Application Manual (Hardware) - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - This application manual informs about the hardware of HX series which is a high-performance PAC system suitable for IoT. The contents relevant to programming has been separated as an application manual (software) and a command reference manual. - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - NJI-637A(X)_HX-CPU_Hardware_Rev_01.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/NJI-637A(X)_HX-CPU_Hardware_Rev_01.pdf - - - - false - false - - - - - EN_Manual_Hitachi_HX_Software - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - NJI-638(X) - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Hitachi - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Hitachi Industrial Equipment Systems Co.,Ltd. - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - 2016.12 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - HX Series Application Manual (Software) - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - This application manual informs about the software of HX series which is a high-performance PAC system suitable for IoT. The contents relevant to installation has been separated as an hardware manual. - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - NJI-638X_HX-CPU_Software.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/NJI-638X_HX-CPU_Software.pdf - - - - false - false - - - - - DE_CODESYS_V3_Installation_und_Erste_Schritte - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - 0000000 - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - 3S-Smart Software Solutions GmbH - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - 3S-Smart Software Solutions GmbH - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - 20XX - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - de - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - CODESYS V3, Installation und Erste Schritte - Anwenderdokumentation - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - CODESYS_Installation_und_Erste_Schritte_20V11.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/CODESYS_Installation_und_Erste_Schritte_V11.pdf - - - - false - false - - - - - EN_Datasheet_IoT_PAC_Controller_HX_Series - PARAMETER - - - 0173-1#02-AAD001#001 - - - Instance - - - - - DocumentType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - Instance - - string - Single - - - - - VDI2770_DomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - Instance - - - - - - - - VDI2770_IdType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - Instance - - string - Primary - - - - - DocumentId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - Instance - - - - - - - - DocumentDomainId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - Instance - - - - - - - - VDI2770_Role - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - Instance - - string - Responsible - - - - - VDI2770_OrganisationId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - Instance - - - - - - - - VDI2770_OrganisationName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - Instance - - string - Hitachi - - - - - VDI2770_OrganisationOfficialName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - Instance - - string - Hitachi Europe GmbH - - - - - VDI2770_Description - PARAMETER - - Eine Beschreibung zur Dokumententeile ID. Da eine Sprachangabe nicht möglich ist, sollte die Sprache für dieses Metadatum vor der Lieferung abgestimmt werden. - - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - Instance - - - The new Hitachi HX series PAC Controller combines powerful features and efficiency to meet the demands of a global supply chain in manufacturing industries. In addition, HX series is already prepared for the next generation requirements in automation thanks to its IoT capabilities. Manufacturing & service innovations can be achieved with integrated functions and seamless connectivity from field machine level to cloud services. - - - - - DocumentPartId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - Instance - - - - - - - - DocumentClassification_ClassId - PARAMETER - - eindeutige ID der Klasse in einer Klassifikation - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - Instance - - string - 03-02 - - - - - VDI2770_ClassName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - Instance - - string - Bedienung - - - - - ClassificationSystem - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - Instance - - string - VDI2770:2018 - - - - - DocumentVersionId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - Instance - - - 1.10 - - - - - DocumentVersion_LanguageCode - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - Instance - - string - en - - - - - VDI2770_Title - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - Instance - - string - Datasheet: IoT PAC Controller HX Series - Next generation industrial controller. - - - - - VDI2770_Summary - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - Instance - - - - - - - - VDI2770_Keywords - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - Instance - - - - - - - - VDI2770_StatusValue - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - Instance - - string - Released - - - - - VDI2770_SetDate - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - Instance - - - 2017.03 - - - - - VDI2770_Purpose - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - Instance - - - - - - - - VDI2770_BasedOnProcedure - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - Instance - - - - - - - - VDI2770_Comments - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - Instance - - - - - - - - VDI2770_ReferencedObject_Type - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - Instance - - string - Product - - - - - VDI2770_ReferencedObject_RefType - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - Instance - - - - - - - - VDI2770_ReferencedObject_ObjectId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - Instance - - - - - - - - VDI2770_FileId - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - Instance - - - - - - - - VDI2770_FileName - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - Instance - - string - HX%20Datasheet.pdf - - - - - VDI2770_FileFormat - PARAMETER - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - Instance - - string - application/pdf - - - - - File - PARAMETER - - - 0173-1#02-AAD005#008 - - - Instance - - application/pdf - /aasx/Document/HX_Datasheet.pdf - - - - false - false - - - - - - Service - www.company.com/ids/sm/6053_5072_7091_5102 - - - https://www.hsu-hh.de/aut/aas/service - - - Instance - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Hitachi Europe GmbH - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Sales organization - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - string - Niederkasseler Lohweg 191 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 40547 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Düsseldorf - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - North Rhine-Westphalia - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - automation.industrial@hitachi-eu.com - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - string - https://automation.hitachi-industrial.eu/ - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +49-211-5283-0 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - +49-211-2049-049 - - - - false - false - - - - - - Identification - www.company.com/ids/sm/6563_5072_7091_4267 - - - https://www.hsu-hh.de/aut/aas/identification - - - Instance - - - - - ManufacturerName - PARAMETER - - - 0173-1#02-AAO677#002 - - - Instance - - string - Hitachi Industrial Equipment Systems Co.,Ltd. - - - - - GLNOfManufacturer - PARAMETER - - - 0173-1#02-AAY812#001 - - - Instance - - string - N/A - - - - - SupplierOfTheIdentifier - - - 0173-1#02-AAP796#004 - - - Instance - - - N/A - - - - - MAN_PROD_NUM - - - 0173-1#02-AAO676#003 - - - Type - - - 1696-0702 - - - - - ManufacturerProductDesignation - PARAMETER - - - 0173-1#02-AAW338#001 - - - Instance - - string - HX-CP1H16 - - - - - ManufacturerProductDescription - PARAMETER - - - 0173-1#02-AAU734#001 - - - Instance - - langString - PLC Based PAC System for IoT Applications - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Hitachi Europe GmbH - - - - - GLNOfSupplier - PARAMETER - - - 0173-1#02-AAY813#001 - - - Instance - - string - N/A - - - - - SupplierIdProvider - PARAMETER - - - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - Instance - - - 316033943 - - - - - SUP_PROD_NUM - PARAMETER - - - 0173-1#02-AAO736#004 - - - Type - - - 1696-0702 - - - - - SupplierProductDesignation - - - 0173-1#02-AAM551#002 - - - Instance - - string - HX-CP1H16 - - - - - SupplierProductDescription - PARAMETER - - - 0173-1#02-AAU730#001 - - - Instance - - langString - Programmable automation controller (PAC) System for IoT Applications - - - - - ManufacturerProductFamily - PARAMETER - - - 0173-1#02-AAU731#001 - - - Instance - - string - PAC IoT Controller HX Series - - - - - ClassificationSystem - PARAMETER - - - 0173-1#02-AAO715#002 - - - Instance - - string - eclass - - - - - SecondaryKeyTyp - - - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - Instance - - - - - - - - TypThumbnail - PARAMETER - - - https://www.hsu-hh.de/aut/aas/thumbnail - - - Instance - - image/png - /HX_200432.png - - - - - AssetId - PARAMETER - - - https://www.hsu-hh.de/aut/aas/assetid - - - Instance - - anyURI - https://automation.hitachi-industrial.eu/demo/asset/0000_0000_0000_0000_0000 - - - - - SerialNumber - PARAMETER - - - 0173-1#02-AAM556#002 - - - Instance - - string - 1696-0702 - - - - - BatchNumber - PARAMETER - - - 0173-1#02-AAQ196#001 - - - Instance - - - N/A - - - - - SecondaryKeyInstance - PARAMETER - - - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - Instance - - - - - - - - DateOfManufacture - PARAMETER - - - 0173-1#02-AAR972#002 - - - Instance - - date - N/A - - - - - DeviceRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/devicerevision - - - Instance - - - N/A - - - - - SoftwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/softwarerevision - - - Instance - - - 3.5.13.40 - - - - - HardwareRevision - PARAMETER - - - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - Instance - - - N/A - - - - - ContactInfo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/contactinfo - - - Instance - - - - - NameOfSupplier - PARAMETER - - - 0173-1#02-AAO735#003 - - - Instance - - string - Hitachi Europe GmbH - - - - - ContactInfo_Role - PARAMETER - - - https://www.hsu-hh.de/aut/aas/role - - - Instance - - string - Manufacturer - - - - - PhysicalAddress - PARAMETER - - - https://www.hsu-hh.de/aut/aas/physicaladdress - - - Instance - - - - - CountryCode - PARAMETER - - - 0173-1#02-AAO730#001 - - - Instance - - string - DE - - - - - Street - PARAMETER - - - 0173-1#02-AAO128#001 - - - Instance - - langString - Niederkasseler Lohweg 191 - - - - - Zip - PARAMETER - - - 0173-1#02-AAO129#002 - - - Instance - - string - 40547 - - - - - CityTown - PARAMETER - - - 0173-1#02-AAO132#001 - - - Instance - - string - Düsseldorf - - - - - StateCounty - PARAMETER - - - 0173-1#02-AAO133#002 - - - Instance - - string - North Rhine-Westphalia - - - - false - false - - - - - Email - PARAMETER - - - https://www.hsu-hh.de/aut/aas/email - - - Instance - - string - automation.industrial@hitachi-eu.com - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://automation.hitachi-industrial.eu/ - - - - - PhoneNumber - PARAMETER - - - 0173-1#02-AAO136#002 - - - Instance - - string - +49-211-5283-0 - - - - - Fax - PARAMETER - - - https://www.hsu-hh.de/aut/aas/fax - - - Instance - - string - +49-211-2049-049 - - - - false - false - - - - - CompanyLogo - PARAMETER - - - https://www.hsu-hh.de/aut/aas/companylogo - - - Instance - - image/png - /aasx/assetIdentification/Hitachi_logo.png - - - - - URL - PARAMETER - - - 0173-1#02-AAO694#001 - - - Instance - - anyURI - https://automation.hitachi-industrial.eu/demo/0000_0000_0000_0000_0000 - - - - - - DeviceDescriptionFiles - https://automation.hitachi-industrial.eu/_Resources/Static/Packages/Moon.HitachiEurope/Downloads/automation/[2]%20Software/[5]%20Configuration%20Files/[1]%20Device%20Descriptions/Device%20files.zip - - - https://automation.hitachi-industrial.eu/en/products/software/configuration-files/device-descriptions - - - Instance - - - - - CodeSysDD - - - http://admin-shell.io/sample/conceptdescriptions/437857438753457473 - - - Instance - - application/general - /aasx/Document/Device_files.zip - - - - - - - - ManufacturerName - 0173-1#02-AAO677#002 - - - - - - - - Herstellername - Manufacturer Name - - Manufacturer Name - - - - - Bezeichnung für eine natürliche oder juristische Person, die für die Auslegung, Herstellung und Verpackung sowie die Etikettierung eines Produkts im Hinblick auf das 'Inverkehrbringen' im eigenen Namen verantwortlich ist - 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 - - - - - - - GLNOfManufacturer - 0173-1#02-AAY812#001 - - - - - - - - GLN of manufacturer - GLN des Herstellers - - GLN of manufacturer - - - - - international eindeutige Nummer für den Geräte- oder Produkthersteller sowie für den Standort - internationally unique identification number for the manufacturer of the device or the product and for the physical location - - - - - - - SupplierOfTheIdentifier - 0173-1#02-AAP796#004 - - - - - - - - Supplier of the identifier - Anbieter der Identifikationsnummer für Hersteller - - Supplier of the identifier - - - STRING_TRANSLATABLE - - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - - - - - - - MAN_PROD_NUM - - product article number of manufacturer - - 0173-1#02-AAO676#003 - - - - - - - - product article number of manufacturer - Herstellerartikelnummer - - MAN_PROD_NUM - - - STRING_TRANSLATABLE - - eindeutiger Bestellschlüssel des Herstellers - unique product identifier of the manufacturer - - - - - - - ManufacturerProductDesignation - 0173-1#02-AAW338#001 - - - - - - - - Manufacturer product designation - Herstellerproduktbezeichnung - - ManufacturerTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - ManufacturerProductDescription - 0173-1#02-AAU734#001 - - - - - - - - Manufacturer product description - Herstellerproduktbeschreibung - - Manufacturer product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - NameOfSupplier - 0173-1#02-AAO735#003 - - - - - - - - - - - - name of supplier - Lieferantenname - - name of supplier - - - - - Name des Lieferanten, welcher dem Kunden ein Produkt oder eine Dienstleistung bereitstellt - name of supplier which provides the customer with a product or a service - - - - - - - GLNOfSupplier - 0173-1#02-AAY813#001 - - - - - - - - GLN of supplier - GLN des Lieferanten - - GLN of supplier - - - - - international eindeutige Nummer für den Geräte- oder Produktlieferanten sowie für den Standort - internationally unique identification number for the supplier of the device or the product and for the physical location - - - - - - - SupplierIdProvider - https://www.hsu-hh.de/aut/aas/supplieridprovider - - - - - - - - SupplierIdProvider - Anbieter der Identifikationsnummer - - SupplierIdProvider - - - STRING_TRANSLATABLE - - DUNS-Nr., Lieferantennummer oder andere Nummer zur Identifikation eines Anbieters bzw. Lieferanten der Identifikationsnummer - DUNS-no., supplier number, or other number as identifier of an offeror or supplier of the identification - - - - - - - SUP_PROD_NUM - 0173-1#02-AAO736#004 - - - - - - - - product article number of supplier - Lieferantenartikelnummer - - product article number of supplier - - - - - eindeutiger Bestellschlüssel des Lieferanten - unique product order identifier of the supplier - - - - - - - SupplierProductDesignation - 0173-1#02-AAM551#002 - - - - - - - - Supplier product designation - Lieferantenproduktbezeichnung - - SupplierTypName - - - STRING_TRANSLATABLE - - Kurze Beschreibung des Produktes (Kurztext) - Short description of the product (short text) - - - - - - - SupplierProductDescription - 0173-1#02-AAU730#001 - - - - - - - - Supplier product description - Lieferantenproduktbeschreibung - - Supplier product description - - - - - Beschreibung des Produktes, seiner technischen Eigenschaften und ggf. seiner Anwendung (Langtext) - Description of the product, it's technical features and implementation if needed (long text) - - - - - - - ManufacturerProductFamily - 0173-1#02-AAU731#001 - - - - - - - - Manufacturer product family - Herstellerproduktfamilie - - TypClass - - - - - 2. Ebene einer 3 stufigen herstellerspezifischen Produkthierarchie - 2nd level of a 3 level manufacturer specific product hierarchy - - - - - - - ClassificationSystem - 0173-1#02-AAO715#002 - - - - - - - - classification system - Klassifizierungssystem - - ClassificationSystem - - - - - Klassifizierungssystem - Classification System - - - - - - - SecondaryKeyTyp - https://www.hsu-hh.de/aut/aas/secondarykeytyp - - - - - - - - SecondaryKeyTyp - Typnummer des IT Systems - - SecondaryKeyTyp - - - - - Führende technische ID im IT System des Typs - SecondaryKeyTyp - - - - - - - TypThumbnail - https://www.hsu-hh.de/aut/aas/thumbnail - - - - - - - - TypThumbnail - Vorschaubild - - TypThumbnail - - - - - Darstellung des Produkttyps in kleinem Format - Small picture of the product type - - - - - - - AssetId - https://www.hsu-hh.de/aut/aas/assetid - - - - - - - - AssetId - Asset ID - - AssetId - - - - - Global eindeutige ID eines Asset, die machienenlesbar oder durch Menschen lesbar ist. - Global unique ID of an asset, which can be read by both human and machine. - - - - - - - SerialNumber - 0173-1#02-AAM556#002 - - - - - - - - Serial number - Seriennummer - - InstanceId - - - - - eindeutige Zahlen- und Buchstabenkombination mit der das Gerät nach seiner Herstellung identifiziert ist - unique combination of numbers and letters used to identify the device once it has been manufactured - - - - - - - BatchNumber - 0173-1#02-AAQ196#001 - - - - - - - - Batch number - Chargen-Nummer - - ChargeId - - - - - Eine vom Hersteller eines Stoffes vergebene Nummer zur Identifikation einer Charge - Number assigned by the manufacturer of a material to identify the manufacturer's batch - - - - - - - SecondaryKeyInstance - https://www.hsu-hh.de/aut/aas/secondarykeyinstance - - - - - - - - SecondaryKeyInstance - Instanznummer des IT Systems - - SecondaryKeyInstance - - - - - Führende technische ID im IT System der Instanz - SecondaryKeyInstance - - - - - - - DateOfManufacture - 0173-1#02-AAR972#002 - - - - - - - - Date of manufacture - Herstellungsdatum - - Date of manufacture - - - DATE - - Datum, ab der der Herstellungs- und/oder Entstehungsprozess abgeschlossen ist bzw. ab dem eine Dienstleistung vollständig erbracht ist - Date from which the production and / or development process is completed or from which a service is provided completely - - - - - - - DeviceRevision - https://www.hsu-hh.de/aut/aas/devicerevision - - - - - - - - DeviceRevision - DeviceRevision - - DeviceRevision - - - - - DeviceRevision - DeviceRevision - - - - - - - SoftwareRevision - https://www.hsu-hh.de/aut/aas/softwarerevision - - - - - - - - SoftwareRevision - SoftwareRevision - - SoftwareRevision - - - - - SoftwareRevision - SoftwareRevision - - - - - - - HardwareRevision - https://www.hsu-hh.de/aut/aas/hardwarerevision - - - - - - - - HardwareRevision - HardwareRevision - - HardwareRevision - - - - - HardwareRevision - HardwareRevision - - - - - - - QrCode - https://www.hsu-hh.de/aut/aas/qrcode - - - - - - - - QrCode - QrCode - - QrCode - - - - - In dem QRCode ist die URL, die die Instanz des Assets genau beschreibt, hinterlegt. - QrCode - - - - - - - OrganisationContactInfo - https://www.hsu-hh.de/aut/aas/contactinfo - - - - - - - - Contact Info - Kontakt Info - - OrganisationContactInfo - - - - - Sammlung für die allgemeinen Kontaktdaten - Collection for general contact data - - - - - - - PhysicalAddress - https://www.hsu-hh.de/aut/aas/physicaladdress - - - - - - - - PhysicalAddress - Physische Adresse - - PhysicalAddress - - - - - Sammlung für reale physische Adresse - Collection for real physical address - - - - - - - CountryCode - 0173-1#02-AAO730#001 - - - - - - - - - - - - Landeskennung - Country code - - Country code - - - - - Vereinbartes Merkmal zur eindeutigen Identifizierung eines Landes - agreed upon symbol for unambiguous identification of a country - - - - - - - Street - 0173-1#02-AAO128#001 - - - - - - - - Strasse - Street - - Street - - - - - Name der Strasse und Hausnummer - Street name and house number - - - - - - - Zip - 0173-1#02-AAO129#002 - - - - - - - - Zip - Postleitzahl - - PostalCode - - - - - ZIP code of address - Postleitzahl der Anschrift - - - - - - - CityTown - 0173-1#02-AAO132#001 - - - - - - - - Ort - City/town - - City/town - - - - - Town or city of the company - Ortsangabe - - - - - - - StateCounty - 0173-1#02-AAO133#002 - - - - - - - - state/county - Bundesland - - StateCounty - - - - - Bundesland - state/county - - - - - - - Email - https://www.hsu-hh.de/aut/aas/email - - - - - - - - Emailadresse - Email address - - Email - - - - - Emailadresse - Email address - - - - - - - TelephoneContact - https://www.hsu-hh.de/aut/aas/ContactInfo/TelephoneContact - - - - - - - - Telephone Contact - Telefonkontakt - - TelephoneContact - - - - - Sammlung für Kontaktdaten über Telefon - Collection for contact data via telephone - - - - - - - PhoneNumber - 0173-1#02-AAO136#002 - - - - - - - - Telefonnummer - telephone number - - Phone - - - - - vollständige Telefonnummer unter der ein Geschäftspartner erreichbar ist - complete telephone number to be called to reach a business partner - - - - - - - CompanyLogo - https://www.hsu-hh.de/aut/aas/companylogo - - - - - - - - Firmenlogo - CompanyLogo - - CompanyLogo - - - - - Firmenlogo - CompanyLogo - - - - - - - URL - 0173-1#02-AAO694#001 - - - - - - - - Internetadresse - Internet address - - URL - - - - - stated as link to a home page. The home page is the starting page or table of contents of a web site with offerings. It usually has the name index.htm or index.html - Angabe als Link, um in eine Homepage zu gelangen. die Homepage ist die Start- beziehungsweise die Inhaltsseite eines Web-Angebots. Meistens trägt sie den Namen index.htm oder index.html - - - - - - - ProductCountryOfOrigin - 0173-1#02-AAO841#001 - - - - - - - - Produkt Ursprungsland - Product country of origin - - CountryOfOrigin - - - - - Land in dem das Produkt hergestellt wurde (Hersteller Land) - Country in which the product is manufactured (manufacturer country) - - - - - - - YearOfConstruction - 0173-1#02-AAP906#001 - - - - - - - - Year of construction - Baujahr - - YearOfConstruction - - - - - Jahreszahl als Datumsangabe für die Fertigstellung des Objektes - Year as completion date of object - - - - - - - File - 0173-1#02-AAD005#008 - - - - www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360 - - - - - - Enthaltene Doku. Datei - Embedded Doc. file - - File - - - - - Verweis/ BLOB auf enthaltene Dokumentations-Datei. - Reference/ BLOB to embedded documentation file. - - - - - - - ProductMarking - https://www.hsu-hh.de/aut/aas/productmarking - - - - - - - - Produktkennzeichnung - Product Marking - - ProductMarking - - - - - Sammlungsdatei für Produktkennzeichnung - Collection file for product marking - - - - - - - CEQualificationPresent - 0173-1#02-BAF053#008 - - - - - - - - CE-Kennzeichnung vorhanden - CE- qualification present - - CEMarkingPresent - - - BOOLEAN - - whether CE- qualification is present - Angabe, ob CE-Kennzeichnung vorhanden ist - - - - - - - CRUUSLabelingPresent - 0173-1#02-AAR528#005 - - - - - - - - Kennzeichnung (RCM) vorhanden - RCM labeling present - - CRUUSLabelingPresent - - - BOOLEAN - - indication whether the product is equipped with a specified RCM labeling - Angabe, ob das Produkt mit einer spezifizierten RCM-Kennzeichnung ausgestattet ist - - - - - - - DocumentClassification_ClassId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - - - - Dokumentkategorie - Document category - - DocCategory - - - - - Dokumentkategorie nach VDI 2770:2018/10 - Document category after VDI 2770:2018/10 - - - - - - - DocumentId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId - - - - - - - - DocumentId - Dokumenten-Nummer - - DocumentId - - - - - Die Dokument ID stellt eine eindeutige Identifizierung des Dokuments innerhalb einer Domäne sicher. - TBD - - - - - - - VDI2770_DomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/DomainId - - - - - - - - Domain-Nummer - DomainId - - DomainId - - - - - Kennung oder Kennzeichen einer Domäne, in der eine DocumentId eineindeutig ist. - TBD - - - - - - - VDI2770_IdType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentId/IdType - - - - - - - - Nummerntyp - IdType - - IdType - - - - - Besitzt ein Dokument mehrere Identifikationsnummern, muss mithilfe dieser Eigenschaft die führende ID angegeben werden. Der Wert „Primary“ ist für diese ID zu setzen. - TBD - - - - - - - ValString - www.company.com/ids/cd/4490_8182_7091_6124 - - - - - - - - Wert - Value String - - ValString - - - - - Ausdruck für den Wert der übergeordneten Collection. - Value string for the collection value on the next superordinate level - - - - - - - DocumentationItem - 0173-1#02-AAD001#001 - - - - - - - - Dokumentationsgruppe - Documentation item - - DocumentationItem - - - - - Gruppe von Merkmalen, die Zugriff gibt auf eine Dokumentation für ein Asset, beispielhaft struktuiert nach VDI 2770. - Collection of properties, which gives access to documentation of an asset, structured exemplary-wise according to VDI 2770. - - - - - - - DocumentIdDomain - www.company.com/ids/cd/6003_8182_7091_9350 - - - - - - - - DocumentIdDomain - DocumentIdDomain - - DocumentIdDomain - - - - - Angabe einer Liste von Domänen, in de-nen die DocumentIds des Dokuments eindeutig sind - TBD - - - - - - - DocumentDomainId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentIdDomain/DocumentDomainId - - - - - - - - DocumentDomainId - DocumentDomainId - - DocumentDomainId - - - - - Kennung oder Kennzeichen einer Domäne - TBD - - - - - - - VDI2770_Party - www.company.com/ids/cd/3153_8182_7091_4327 - - - - - - - - Party - Party - - Party - - - - - Verweis auf eine Party (siehe VDI 2770 Anhang C1.17), die für diese Domäne verantwortlich ist - TBD - - - - - - - VDI2770_Role - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Role - - - - - - - - Rolle - Role - - Role - - - - - Festlegung einer Rolle für die Organisation gemäß der folgenden Auswahlliste: Author (Autor), Customer (Kunde), Supplier (Zulieferer, Anbieter), Manufacturer (Hersteller), Responsible (Verantwortlicher) - TBD - - - - - - - VDI2770_Organisation - www.company.com/ids/cd/9214_8182_7091_6391 - - - - - - - - Organisation - Organisation - - Organisation - - - - - Angabe einer Organisation - TBD - - - - - - - VDI2770_OrganisationId - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationId - - - - - - - - Organisation ID - Organisation ID - - OrganisationId - - - - - eindeutige ID für die Organisation - TBD - - - - - - - VDI2770_OrganisationName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationName - - - - - - - - OrganisationName - OrganisationName - - OrganisationName - - - - - gebräuchliche Bezeichnung für die Organisation - TBD - - - - - - - VDI2770_OrganisationOfficialName - http://www.vdi.de/2770/AssetDocumentation/Document/Party/Organisation/OrganisationOfficialName - - - - - - - - Offizieller Name der Organisation - Organisation Official Name - - OrganisationOfficialName - - - - - offizieller Name der Organisation - TBD - - - - - - - DocumentPartId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentPartId - - - - - - - - Dokumenten-Teilnummer - DocumentPartId - - DocumentPartId - - - - - Ist das Dokument ein zusammengesetztes Dokument, können mithilfe dieser Eigenschaft eindeutige Dokumententeile IDs eingetragen werden, um das Dokument von den anderen Dokumenten zu unterscheiden. - TBD - - - - - - - VDI2770_Description - http://www.vdi.de/2770/AssetDocumentation/Document/Description - - - - - - - - Beschreibung - Description - - Description - - - - - Beschreibung für die nächste übergeordnete Collection - TBD - - - - - - - VDI2770_ClassName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassName - - - - - - - - Klassenname - Class Name - - ClassName - - - - - Liste von sprachabhängigen Namen zur ClassId. Für die Klassennamen nach VDI 2770 müssen die Werte aus Tabelle 1 in Abschnitt 8.5 angewendet werden. - TBD - - - - - - - DocumentVersion_LanguageCode - http://www.vdi.de/2770/AssetDocumentation/Document/LanguageCode - - - - - - - - Sprachenschlüssel - LanguageCode - - LanguageCode - - - - - Angabe eines Sprachcodes gemäss ISO 639-1 oder -2 - TBD - - - - - - - VDI2770_ClassificationSystem - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassificationSystem - - - - - - - - Klassifizierungssystem - classification system - - ClassificationSystem - - - - - Eindeutige Kennung für ein Klassifikationssystem. Für Klassifikationen nach VDI 2770 muss „VDI2770:2018“ verwenden werden. - TBD - - - - - - - DocumentVersion - www.company.com/ids/cd/2580_0282_7091_6213 - - - - - - - - Dokumenten-Version - DocumentVersion - - DocumentVersion - - - - - Zu jedem Dokument muss eine Menge von mindestens einer Dokumentenversion existieren. Es können auch mehrere Dokumentenversionen ausgeliefert werden. - TBD - - - - - - - DocumentVersionId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersionId - - - - - - - - Dokumenten-Versionsnummer - DocumentVersionId - - DocumentVersionId - - - - - Identifikationsnummer zur Dokumenten-version. Verweist ein Document (siehe Anhang C1.1, Eigenschaft DocumentVersion) auf diese Dokumentenversion, muss die Kombination aus DocumentId und DocumentVersionId eindeutig sein. - TBD - - - - - - - VDI2770_Language - www.company.com/ids/cd/0231_0282_7091_5062 - - - - - - - - Sprache - Language - - Language - - - - - Liste der im Dokument verwendeten Sprachen - TBD - - - - - - - DocumentVersion_Description - www.company.com/ids/cd/9151_0282_7091_8032 - - - - - - - - Beschreibung zur DocumentVersion - DocumentVersion Description - - DocumentVersion_Description - - - - - Zusammenfassende Beschreibungen zur Dokumentenversion in ggf. unterschiedlichen Sprachen. - TBD - - - - - - - VDI2770_Title - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Title - - - - - - - - Titel - Title - - VDI2770_Title - - - - - sprachabhängiger Titel des Dokuments - TBD - - - - - - - VDI2770_Summary - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Summary - - - - - - - - Zusammenfassung - Summary - - Summary - - - - - sprachabhängige, aussagekräftige Zusammenfassung des Dokumenteninhalts - TBD - - - - - - - VDI2770_Keywords - http://www.vdi.de/2770/AssetDocumentation/Document/Description/Keywords - - - - - - - - Schlagwörter - Keywords - - Keywords - - - - - sprachabhängige, durch Komma getrennte Liste von Schlagwörtern - TBD - - - - - - - VDI2770_LifeCycleStatus - www.company.com/ids/cd/0282_0282_7091_7878 - - - - - - - - Lebenszyklus Status - LifeCycleStatus - - LifeCycleStatus - - - - - Liste von Statusdefinitionen mit Bezug zum Dokumentenlebenszyklus inklusive der Angabe der Beteiligten und einem zugehörigen Zeitstempel - TBD - - - - - - - VDI2770_StatusValue - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/StatusValue - - - - - - - - Statuswert - StatusValue - - StatusValue - - - - - Jede Dokumentenversion stellt einen Zeitpunkt im Dokumentenlebenszyklus dar. Dieser Statuswert bezieht sich auf die Meilensteine im Dokumentenlebenszyklus. Für die Anwendung dieser Richtlinie sind die beiden folgenden Status zu verwenden. InReview (in Prüfung), Released (freigegeben) - TBD - - - - - - - VDI2770_SetDate - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/SetDate - - - - - - - - Erstellungsdatum - Set Date - - SetDate - - - - - Datum und Uhrzeit, an dem der Status festgelegt wurde Es muss das Datumsformat „YYYY-MM-dd“ verwendet werden (Y = Jahr, M = Monat, d = Tag, siehe DIN ISO 8601). - TBD - - - - - - - VDI2770_Purpose - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Purpose - - - - - - - - Zweck - Purpose - - Purpose - - - - - Hier kann ein Zweck zum Meilenstein angegeben werden, z. B. „zur Weiterleitung an den Kunden“. - TBD - - - - - - - VDI2770_BasedOnProcedure - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/BasedOnProcedure - - - - - - - - Prozedur - Procedure - - BasedOnProcedure - - - - - textueller Bezug auf ein Verfahren, das der Festlegung dieses Status zugrunde liegt - TBD - - - - - - - VDI2770_Comments - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/LifeCycleStatus/Comments - - - - - - - - Kommentar - Comments - - Comments - - - - - textuelle Bemerkungen und Anmerkungen zum Status - TBD - - - - - - - DocumentRelationship - www.company.com/ids/cd/1204_0282_7091_7896 - - - - - - - - Dokumenten-Beziehung - Document Relationship - - DocumentRelationship - - - - - Liste von Beziehungen zu anderen Dokumenten. Es ist möglich, auf einen Dokument, ein Dokument in einer spezifischen Dokumentenversion oder auch ein Teildokument zu verweisen. - TBD - - - - - - - DocumentRelationship_Type - www.company.com/ids/cd/5044_0282_7091_6924 - - - - - - - - Typ der Dokumenten-Beziehung - DocumentRelationship_Type - - DocumentRelationship_Type - - - - - Typisierung der Beziehung zwischen den beiden DocumentVersions. Folgende Beziehungsarten können verwendet werden: Affecting (hat Auswirkungen auf), ReferesTo (bezieht sich auf), BasedOn (basiert auf) - TBD - - - - - - - StoredDocumentRepresentation - www.company.com/ids/cd/3094_0282_7091_2090 - - - - - - - - StoredDocumentRepresentation - StoredDocumentRepresentation - - StoredDocumentRepresentation - - - - - Liste von digitalen Repräsentationen zur DocumentVersion - TBD - - - - - - - VDI2770_DigitalFile - www.company.com/ids/cd/2305_0282_7091_2077 - - - - - - - - Digitaler-File - DigitalFile - - DigitalFile - - - - - Datei, die die DocumentVersion (siehe VDI 2770:2018 Anhang C1.5) repräsentiert Neben der obligatorischen PDF/A-Datei können weitere Dateien angegeben werden. - TBD - - - - - - - VDI2770_FileId - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileId - - - - - - - - ID der Datei - File ID - - FileId - - - - - eindeutige ID für die Datei - TBD - - - - - - - VDI2770_FileName - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileName - - - - - - - - Dateiname - File name - - FileName - - - - - Name der Datei inkl. einer Dateiendung (sofern vorhanden) Es ist nicht notwendig, einen Pfad für die Datei anzugeben. - TBD - - - - - - - VDI2770_FileFormat - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentVersion/StoredDocumentRepresentation/DigitalFile/FileFormat - - - - - - - - Datei Format - File format - - FileFormat - - - - - Angabe eines Media Typs gemäß der Liste der IANA - TBD - - - - - - - DocumentType - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentType - - - - - - - - Dokumententyp - Document Type - - DocumentType - - - - - Festlegung des Typs des Dokuments im Sinne der DIN EN 82045-1: a) Single (Einzeldokument) b) Aggregate (Sammeldokument) c) DocumentSet (Dokumentensatz) d) CompoundDoc (Mischdokument) - TBD - - - - - - - VDI2770_ReferencedObject - www.company.com/ids/cd/2570_2282_7091_0055 - - - - - - - - ReferencedObject - ReferencedObject - - ReferencedObject - - - - - Liste von IDs für ein Objekt, auf das sich das Dokument bezieht - TBD - - - - - - - VDI2770_ReferencedObject_Type - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ReferencedObjectType - - - - - - - - Typ - Type - - Type - - - - - Für Type des Objekts muss immer Product angegeben werden. - TBD - - - - - - - VDI2770_ReferencedObject_RefType - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/RefType - - - - - - - - RefType - RefType - - RefType - - - - - Angabe einer Typisierung zur Kennung des technischen Objekts. Folgende Werte sind möglich, ProductId (Produktnummer), SerialId (Seriennummer) - TBD - - - - - - - VDI2770_ReferencedObject_ObjectId - http://www.vdi.de/2770/AssetDocumentation/Document/ReferencedObject/ObjectId - - - - - - - - ObjectId - ObjectId - - ObjectId - - - - - Angabe der Identifikationsnummer zum Objekt - TBD - - - - - - - ContactInfo_Role - https://www.hsu-hh.de/aut/aas/role - - - - - - - - Rolle - Role - - Role - - - - - Angabe zur Spezifizierung der Rolle, die die Organisation aus ContactInfo einnimmt - Information to specify the role which the organisation of ContactInfo plays - - - - - - - Fax - https://www.hsu-hh.de/aut/aas/fax - - - - - - - - Fax - Fax - - Fax - - - - - Faxnummer - Fax number - - - - - - - 0173-1#02-AAO136#002 - - - - - DocGroup_01 - www.company.com/ids/cd/1420_0113_7091_0891 - - - - - - - - 01 Identifikation - 01 Identification - - DocGroup_01 - - - - - Der Gruppe „Identifikation“ werden alle Dokumente zugeordnet, die der Identifikation des Objekts dienen, zu dem die Herstellerdokumentation gehört. Sie enthält insbesondere Informationen, die die elektronische Datenverarbeitung unterstützen und die es dem Hersteller und dem Nutzer erlauben, das Objekt in ihren jeweiligen elektronischen Datenverarbeitungssystemen zu identifizieren. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocGroup_02 - www.company.com/ids/cd/4323_0113_7091_2591 - - - - - - - - 02 Technische Beschaffenheit - 02 Technical characteristics - - DocGroup_02 - - - - - Die Gruppe „Technische Beschaffenheit“ beinhaltet alle Dokumente, die die technischen Anforderungen, deren Erfüllung und die Bescheinigung der Eigenschaften eines Objekts betreffen. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocGroup_03 - www.company.com/ids/cd/5053_0113_7091_5741 - - - - - - - - 03 Tätigkeitsbezogene Dokumente - 03 Work-related documents - - DocGroup_03 - - - - - Die Gruppe „Tätigkeitsbezogene Dokumente“ beinhaltet alle Dokumente, die Anforderungen, Hinweise und Hilfestellungen für Tätigkeiten an und mit dem Objekt nach der Übergabe an den Nutzer betreffen. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocGroup_04 - www.company.com/ids/cd/5473_0113_7091_1588 - - - - - - - - 04 Vertragsunterlagen - 04 Contract documents - - DocGroup_04 - - - - - Der Gruppe „Vertragsunterlagen“ werden alle Dokumente zugeordnet, die im Zusammenhang mit der kaufmännischen Abwicklung eines Vertrages stehen, aber nicht selbst Gegenstand des Vertrags sind und lediglich zur Erfüllung des Vertrags dienen. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_01-01 - www.company.com/ids/cd/9593_0113_7091_2401 - - - - - - - - 01-01 Identifikation - 01-01 Identification - - DocCategory_01-01 - - - - - Der Kategorie „Identifikation“ werden alle Dokumente zugeordnet, die der Identifikation des Objekts dienen, zu dem die Herstellerdokumentation gehört. Sie enthält insbesondere Informationen, die die elektronische Datenverarbeitung unterstützen und die es dem Hersteller und dem Nutzer erlauben, das Objekt in ihren jeweiligen elektronischen Datenverarbeitungssystemen zu identifizieren. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_02-01 - www.company.com/ids/cd/5314_0113_7091_8640 - - - - - - - - 02-01 Techn. Spezifikation - 02-01 Technical specification - - DocCategory_02-01 - - - - - Der Kategorie „Technische Spezifikation“ werden alle Dokumente zugeordnet, die die Anforderungen an ein Objekt sowie dessen Eigenschaften beschreiben. Dazu gehören die Auslegungsdaten, Berechnungen (Verfahrenstechnik, Festigkeit usw.) sowie alle relevanten Eigenschaften des übergebenen Objekts. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_02-02 - www.company.com/ids/cd/5515_0113_7091_8581 - - - - - - - - 02-02 Zeichnungen, Pläne - 02-02 Drawings and diagrams - - DocCategory_02-02 - - - - - Der Kategorie „Zeichnungen, Pläne“ werden alle Dokumente zugeordnet, die Zeichnungscharakter haben, das heißt eine grafische Darstellung zur Übermittlung von Information nutzen. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_02-03 - www.company.com/ids/cd/0335_0113_7091_0312 - - - - - - - - 02-03 Bauteile - 02-03 Components - - DocCategory_02-03 - - - - - Der Kategorie „Bauteile“ werden alle Dokumente zugeordnet, die eine strukturierte Auflistung der Teile eines Objekts beinhalten. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_02-04 - www.company.com/ids/cd/2155_0113_7091_3955 - - - - - - - - 02-04 Zeugnisse, Zertifikate, Bescheinigungen - 02-04 Reports, Certificates, declarations - - DocCategory_02-04 - - - - - Der Kategorie „Zeugnisse, Zertifikate, Bescheinigungen“ werden alle Dokumente zugeordnet, die Urkundencharakter haben. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_03-01 - www.company.com/ids/cd/3565_0113_7091_2704 - - - - - - - - 03-01 Montage, Inbetriebnahme, Demontage - 03-01 Assembly, commissioning, disassembly - - DocCategory_03-01 - - - - - Der Kategorie „Montage, Demontage“ werden alle Dokumente zugeordnet, die Tätigkeiten und Maßnahmen beschreiben, die erforderlich sind, um ein Objekt: zu transportieren oder zu lagern, als Ganzes in ein übergeordnetes Objekt einzubauen, auszubauen oder an dieses anzuschließen, so weit vorzubereiten, dass es zur Inbetriebnahme bereitsteht, nach Abschluss der Nutzungsphase zu demontieren und zu entsorgen - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_03-02 - www.company.com/ids/cd/4290_1113_7091_7266 - - - - - - - - 03-02 Bedienung - 03-02 Operation - - DocCategory_03-02 - - - - - Der Kategorie „Bedienung“ werden Dokumente zur bestimmungsgemäßen Verwendung und sicheren Bedienung eines Objekts zugeordnet. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_03-03 - www.company.com/ids/cd/2211_1113_7091_3911 - - - - - - - - 03-03 Allgemeine Sicherheit - 03-03 Safety in general - - DocCategory_03-03 - - - - - Der Kategorie „Allgemeine Sicherheit“ werden Dokumente zugeordnet, die Sicherheitshinweise auf mögliche Gefährdungen bei der Verwendung des Objekts geben. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_03-04 - www.company.com/ids/cd/7521_1113_7091_4471 - - - - - - - - 03-04 Inspektion, Wartung, Prüfung - 03-04 Inspection, maintenance, test - - DocCategory_03-04 - - - - - Der Kategorie „Inspektion, Wartung, Prüfung“ werden alle Dokumente zugeordnet, die vom Hersteller vorgeschlagene wiederkehrende Maßnahmen zur Feststellung oder zum Erhalt des funktionsfähigen Zustands beschreiben. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_03-05 - www.company.com/ids/cd/5161_1113_7091_0458 - - - - - - - - 03-05 Instandsetzung - 03-05 Repair - - DocCategory_03-05 - - - - - Der Kategorie „Instandsetzung“ werden alle Dokumente zugeordnet, die Maßnahmen zur Wiederherstellung der Funktion eines Objekts betreffen. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_03-06 - www.company.com/ids/cd/2181_1113_7091_5948 - - - - - - - - 03-06 Ersatzteile - 03-06 Spare parts - - DocCategory_03-06 - - - - - Der Kategorie „Ersatzteile“ werden Dokumente zugeordnet, die Informationen zu Ersatzteilen und Hilfs- und Betriebsstoffen enthalten. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - DocCategory_04-01 - www.company.com/ids/cd/5391_1113_7091_8996 - - - - - - - - 04-01 Vertragsunterlagen - 04-01 Contract documents - - DocCategory_04-01 - - - - - Der Kategorie „Vertragsunterlagen“ werden alle Dokumente zugeordnet, die im Zusammenhang mit der kaufmännischen Abwicklung eines Vertrages stehen, aber nicht selbst Gegenstand des Vertrags sind und lediglich zur Erfüllung des Vertrags dienen. - TBD - - - - - - - http://www.vdi.de/2770/AssetDocumentation/Document/DocumentClassification/ClassId - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary.Tests/TestValidateXml.cs b/src/AasxCsharpLibrary.Tests/TestValidateXml.cs deleted file mode 100644 index dc4b2f64f..000000000 --- a/src/AasxCsharpLibrary.Tests/TestValidateXml.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using NUnit.Framework; -using Environment = System.Environment; -using InvalidOperationException = System.InvalidOperationException; -using Path = System.IO.Path; - -namespace AdminShellNS.Tests -{ - public class TestOnFiles - { - [Test] - public void TestSuccess() - { - string successDir = Path.Combine( - TestContext.CurrentContext.TestDirectory, - "TestResources\\AasxCsharpLibrary.Tests\\XmlValidation\\expectedOk"); - - if (!System.IO.Directory.Exists(successDir)) - { - throw new InvalidOperationException( - $"The directory containing the valid AAS XML files does not exist or is not a directory: " + - successDir); - } - - var paths = System.IO.Directory.GetFiles(successDir) - .Where(p => System.IO.Path.GetExtension(p) == ".xml") - .ToList(); - - if (paths.Count == 0) - { - throw new InvalidOperationException( - $"No *.xml files were found in the directory expected to contain the valid XML files: " + - successDir); - } - - var validator = AasSchemaValidation.NewXmlValidator(); - - foreach (string path in paths) - { - using var fileStream = System.IO.File.OpenRead(path); - var records = new AasValidationRecordList(); - validator.Validate(records, fileStream); - if (records.Count != 0) - { - var parts = new List - { - $"Failed to validate XML file {path}:" - }; - parts.AddRange(records.Select((r) => r.Message)); - throw new AssertionException(string.Join(Environment.NewLine, parts)); - } - } - } - } -} diff --git a/src/AasxCsharpLibrary/AasxCompatibilityModels/V10/AdminShellV10.cs b/src/AasxCsharpLibrary/AasxCompatibilityModels/V10/AdminShellV10.cs deleted file mode 100644 index 91c73d650..000000000 --- a/src/AasxCsharpLibrary/AasxCompatibilityModels/V10/AdminShellV10.cs +++ /dev/null @@ -1,4649 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections.Generic; -using System.IO; -using System.IO.Packaging; -using System.Text.RegularExpressions; -using System.Xml; -using System.Xml.Serialization; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; - -// ReSharper disable All .. as this is legacy code! - -#if !DoNotUseAasxCompatibilityModels - -namespace AasxCompatibilityModels -{ - #region Utils - // - // Utils - // - - public class AdminShellUtilV10 - { - public static string EvalToNonNullString(string fmt, object o, string elseString = "") - { - if (o == null) - return elseString; - return string.Format(fmt, o); - } - - public static string EvalToNonEmptyString(string fmt, string o, string elseString = "") - { - if (o == "") - return elseString; - return string.Format(fmt, o); - } - - public static string FilterFriendlyName(string src) - { - if (src == null) - return null; - return Regex.Replace(src, @"[^a-zA-Z0-9\-_]", "_"); - } - - public static bool HasWhitespace(string src) - { - if (src == null) - throw new ArgumentNullException(nameof(src)); - for (var i = 0; i < src.Length; i++) - foreach (var c in src) - if (char.IsWhiteSpace(c)) - return true; - return false; - } - - public static bool ComplyIdShort(string src) - { - if (src == null) - throw new ArgumentNullException(nameof(src)); - var res = true; - foreach (var c in src) - if (!Char.IsLetterOrDigit(c) && c != '_') - res = false; - if (src.Length > 0 && !Char.IsLetter(src[0])) - res = false; - return res; - } - - public static string ShortLocation(Exception ex) - { - if (ex == null || ex.StackTrace == null) - return ""; - string[] lines = ex.StackTrace.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None); - if (lines.Length < 1) - return ""; - // search for " in " - // as the most actual stacktrace might be a built-in function, this might not work and therefore - // go down in the stack - int currLine = 0; - while (true) - { - // nothing found at all - if (currLine >= lines.Length) - return ""; - // access current line - var p = lines[currLine].IndexOf(" in ", StringComparison.Ordinal); - if (p < 0) - { - // advance to next oldest line - currLine++; - continue; - } - // search last "\" or "/", to get only filename portion and position - p = lines[currLine].LastIndexOfAny(new[] { '\\', '/' }); - if (p < 0) - { - // advance to next oldest line - currLine++; - continue; - } - // return this - return lines[currLine].Substring(p); - } - } - - } - - #endregion - - - #region AdminShell_V1_0 - - /// - /// Version of Details of Administration Shell Part 1 V1.0 published Nov/Dec/Jan 2018/19 - /// - public class AdminShellV10 - { - - public class Identification - { - - // members - - [XmlAttribute] - public string idType = ""; - [XmlText] - public string id = ""; - - // constructors - - public Identification() { } - - public Identification(string idType, string id) - { - this.idType = idType; - this.id = id; - } - - public Identification(Identification src) - { - this.idType = src.idType; - this.id = src.id; - } - - // Creator with validation - - public static Identification CreateNew(string idType, string id) - { - if (idType == null || id == null) - return null; - var found = false; - foreach (var x in Key.IdentifierTypeNames) - found = found || idType.ToLower().Trim() == x.ToLower().Trim(); - if (!found) - return null; - return new Identification(idType, id); - } - - // further - - public bool IsEqual(Identification other) - { - return (this.idType.Trim().ToLower() == other.idType.Trim().ToLower() - && this.id.Trim().ToLower() == other.id.Trim().ToLower()); - } - - public override string ToString() - { - return $"[{this.idType}] {this.id}"; - } - } - - public class Administration - { - - // members - - public string version = ""; - public string revision = ""; - - // constructors - - public Administration() { } - - public Administration(Administration src) - { - this.version = src.version; - this.revision = src.revision; - } - - public Administration(string version, string revision) - { - this.version = version; - this.revision = revision; - } - - public override string ToString() - { - return $"R={this.version}, V={this.revision}"; - } - } - - public class Key - { - [XmlAttribute] - public string type = ""; - [XmlAttribute] - public bool local = false; - - [XmlAttribute] - [JsonIgnore] - public string idType = ""; - [XmlIgnore] - [JsonProperty(PropertyName = "idType")] - public string JsonIdType - { - get { return (idType == "idShort") ? "IdShort" : idType; } - set { if (value == "IdShort") idType = "idShort"; else idType = value; } - } - - [XmlText] - public string value = ""; - - [XmlIgnore] - [JsonProperty(PropertyName = "index")] - public int index = 0; - - public Key() - { - } - - public Key(Key src) - { - this.type = src.type; - this.local = src.local; - this.idType = src.idType; - this.value = src.value; - } - - public Key(string type, bool local, string idType, string value) - { - this.type = type; - this.local = local; - this.idType = idType; - this.value = value; - } - - public static Key CreateNew(string type, bool local, string idType, string value) - { - var k = new Key(); - k.type = type; - k.local = local; - k.idType = idType; - k.value = value; - return (k); - } - - public static Key GetFromRef(Reference r) - { - if (r == null || r.Count != 1) - return null; - return r[0]; - } - - public override string ToString() - { - var local = (this.local) ? "Local" : "not Local"; - return $"[{this.type}, {local}, {this.idType}, {this.value}]"; - } - - public static string KeyListToString(List keys) - { - if (keys == null || keys.Count < 1) - return ""; - // normally, exactly one key - if (keys.Count == 1) - return keys[0].ToString(); - // multiple! - var s = "[ "; - foreach (var k in keys) - { - if (s.Length > 0) - s += ", "; - s += k.ToString(); - } - return s + " ]"; - } - - public static string[] KeyElements = new string[] { - "GlobalReference", - "AccessPermissionRule", - "Asset", - "AssetAdministrationShell", - "ConceptDescription", - "Submodel", - "SubmodelRef", // not completely right, but used by Package Explorer - "Blob", - "ConceptDictionary", - "DataElement", - "File", - "Event", - "Operation", - "OperationVariable", - "Property", - "ReferenceElement", - "RelationshipElement", - "SubmodelElement", - "SubmodelElementCollection", - "View" }; - - public static string[] ReferableElements = new string[] { - "AccessPermissionRule", - "Asset", - "AssetAdministrationShell", - "ConceptDescription", - "Submodel", - "Blob", - "ConceptDictionary", - "DataElement", - "File", - "Event", - "Operation", - "OperationVariable", - "Property", - "ReferenceElement", - "RelationshipElement", - "SubmodelElement", - "SubmodelElementCollection", - "View" - }; - - public static string[] SubmodelElements = new string[] { - "DataElement", - "File", - "Event", - "Operation", - "Property", - "ReferenceElement", - "RelationshipElement", - "SubmodelElementCollection"}; - - public static string[] IdentifiableElements = new string[] { - "Asset", - "AssetAdministrationShell", - "ConceptDescription", - "Submodel" }; - - // use this in list to designate all of the above elements - public static string AllElements = "All"; - - // use this in list to designate the GlobalReference - public static string GlobalReference = "GlobalReference"; - public static string ConceptDescription = "ConceptDescription"; - public static string SubmodelRef = "SubmodelRef"; - public static string Submodel = "Submodel"; - public static string Asset = "Asset"; - public static string AAS = "AssetAdministrationShell"; - - public static string[] IdentifierTypeNames = new string[] { "IdShort", "Custom", "IRDI", "URI" }; - - public enum IdentifierType { IdShort = 0, Custom, IRDI, URI }; - - public static string GetIdentifierTypeName(IdentifierType t) - { - return IdentifierTypeNames[(int)t]; - } - - // some helpers - - public static bool IsInKeyElements(string ke) - { - var res = false; - foreach (var s in KeyElements) - if (s.Trim().ToLower() == ke.Trim().ToLower()) - res = true; - return res; - } - - } - - // the whole class shall not be serialized by having it private - public class KeyList - { - // members - - [XmlIgnore] // anyway, as it is privat - private List key = new List(); - - // getters / setters - - [XmlIgnore] - public List Keys { get { return key; } } - [XmlIgnore] - public bool IsEmpty { get { return key == null || key.Count < 1; } } - [XmlIgnore] - public int Count { get { if (key == null) return 0; return key.Count; } } - [XmlIgnore] - public Key this[int index] { get { return key[index]; } } - - // constructors / creators - - public void Add(Key k) - { - key.Add(k); - } - - public static KeyList CreateNew(Key k) - { - var kl = new KeyList(); - kl.Add(k); - return kl; - } - - public static KeyList CreateNew(string type, bool local, string idType, string value) - { - var kl = new KeyList(); - kl.Add(Key.CreateNew(type, local, idType, value)); - return kl; - } - - // other - - public void NumberIndices() - { - if (this.Keys == null) - return; - for (int i = 0; i < this.Keys.Count; i++) - this.Keys[i].index = i; - } - } - - [XmlType(TypeName = "reference")] - public class Reference - { - - // members - - [XmlIgnore] // anyway, as it is privat - [JsonIgnore] - private KeyList keys = new KeyList(); - - // getters / setters - - [XmlArray("keys")] - [XmlArrayItem("key")] - [JsonIgnore] - public List Keys { get { return keys?.Keys; } } - [XmlIgnore] - [JsonProperty(PropertyName = "keys")] - public List JsonKeys - { - get - { - keys?.NumberIndices(); - return keys.Keys; - } - } - - [XmlIgnore] - [JsonIgnore] - public bool IsEmpty { get { return keys == null || keys.Count < 1; } } - [XmlIgnore] - [JsonIgnore] - public int Count { get { if (keys == null) return 0; return keys.Count; } } - [XmlIgnore] - [JsonIgnore] - public Key this[int index] { get { return keys[index]; } } - - // constructors / creators - - public Reference() - { - } - - public Reference(Key k) - { - if (k != null) - keys.Keys.Add(k); - } - - public Reference(Reference src) - { - if (src != null) - foreach (var k in src.Keys) - keys.Add(new Key(k)); - } - - public Reference(SemanticId src) - { - if (src != null) - foreach (var k in src.Keys) - keys.Add(new Key(k)); - } - - public static Reference CreateNew(Key k) - { - if (k == null) - return null; - var r = new Reference(); - r.keys.Keys.Add(k); - return r; - } - - public static Reference CreateNew(List k) - { - if (k == null) - return null; - var r = new Reference(); - r.keys.Keys.AddRange(k); - return r; - } - - public static Reference CreateNew(string type, bool local, string idType, string value) - { - if (type == null || idType == null || value == null) - return null; - var r = new Reference(); - r.keys.Keys.Add(Key.CreateNew(type, local, idType, value)); - return r; - } - - public static Reference CreateIrdiReference(string irdi) - { - if (irdi == null) - return null; - var r = new Reference(); - r.keys.Keys.Add(new Key(Key.GlobalReference, false, "IRDI", irdi)); - return r; - } - - // further - - public bool IsExactlyOneKey(string type, bool local, string idType, string id) - { - if (keys == null || keys.Keys == null || keys.Count != 1) - return false; - var k = keys.Keys[0]; - return k.type == type && k.local == local && k.idType == idType && k.value == id; - } - - public bool MatchesTo(Identification other) - { - return (this.keys != null && this.keys.Count == 1 - && this.keys[0].idType.Trim().ToLower() == other.idType.Trim().ToLower() - && this.keys[0].value.Trim().ToLower() == other.id.Trim().ToLower()); - } - - public bool MatchesTo(Reference other) - { - if (this.keys == null || other == null || other.keys == null || other.Count != this.Count) - return false; - - var same = true; - for (int i = 0; i < this.Count; i++) - same = same - && this.keys[i].type.Trim().ToLower() == other.keys[i].type.Trim().ToLower() - && this.keys[i].local == other.keys[i].local - && this.keys[i].idType.Trim().ToLower() == other.keys[i].idType.Trim().ToLower() - && this.keys[i].value.Trim().ToLower() == other.keys[i].value.Trim().ToLower(); - - return same; - } - - public override string ToString() - { - var res = ""; - if (keys != null && keys.Keys != null) - foreach (var k in keys.Keys) - res += k.ToString() + ","; - return res.TrimEnd(','); - } - - public string ListOfValues(string delim) - { - string res = ""; - if (this.Keys != null) - foreach (var x in this.Keys) - { - if (x == null) - continue; - if (res != "") res += delim; - res += x.value; - } - return res; - } - - public virtual string GetElementName() - { - return "Reference"; - } - } - - [XmlType(TypeName = "derivedFrom")] - public class AssetAdministrationShellRef : Reference - { - // constructors - - public AssetAdministrationShellRef() : base() { } - - public AssetAdministrationShellRef(Key k) : base(k) { } - - public AssetAdministrationShellRef(Reference src) : base(src) { } - - // further methods - - public override string GetElementName() - { - return "AssetAdministrationShellRef"; - } - } - - [XmlType(TypeName = "assetRef")] - public class AssetRef : Reference - { - // constructors - - public AssetRef() : base() { } - - public AssetRef(AssetRef src) : base(src) { } - - // translation - - public static AssetRef CreateNew(Reference r) - { - return (AssetRef)new Reference(r); - } - - // further methods - - public override string GetElementName() - { - return "AssetRef"; - } - } - - [XmlType(TypeName = "submodelRef")] - public class SubmodelRef : Reference - { - // constructors - - public SubmodelRef() : base() { } - - public SubmodelRef(SubmodelRef src) : base(src) { } - - public static new SubmodelRef CreateNew(string type, bool local, string idType, string value) - { - var r = new SubmodelRef(); - r.Keys.Add(Key.CreateNew(type, local, idType, value)); - return r; - } - - public static SubmodelRef CreateNew(Reference src) - { - if (src == null || src.Keys == null) - return null; - var r = new SubmodelRef(); - r.Keys.AddRange(src.Keys); - return r; - } - - // further methods - - public override string GetElementName() - { - return "SubmodelRef"; - } - } - - [XmlType(TypeName = "conceptDescriptionRef")] - public class ConceptDescriptionRef : Reference - { - // constructors - - public ConceptDescriptionRef() : base() { } - - public ConceptDescriptionRef(ConceptDescriptionRef src) : base(src) { } - - // further methods - - public new static ConceptDescriptionRef CreateNew(string type, bool local, string idType, string value) - { - var r = new ConceptDescriptionRef(); - r.Keys.Add(Key.CreateNew(type, local, idType, value)); - return r; - } - - public override string GetElementName() - { - return "ConceptDescriptionRef"; - } - } - - [XmlType(TypeName = "dataSpecificationRef")] - public class DataSpecificationRef : Reference - { - // constructors - - public DataSpecificationRef() : base() { } - - public DataSpecificationRef(DataSpecificationRef src) : base(src) { } - - // further methods - - public static DataSpecificationRef CreateNew(Reference src) - { - if (src == null || src.Keys == null) - return null; - var res = new DataSpecificationRef(); - foreach (var k in src.Keys) - res.Keys.Add(new Key(k)); - return res; - } - - public override string GetElementName() - { - return "DataSpecificationRef"; - } - } - - [XmlType(TypeName = "conceptDescriptions")] - public class ConceptDescriptionRefs - { - [XmlElement(ElementName = "conceptDescriptionRef")] - public List conceptDescriptions = new List(); - - // constructors - - public ConceptDescriptionRefs() { } - - public ConceptDescriptionRefs(ConceptDescriptionRefs src) - { - if (src.conceptDescriptions != null) - foreach (var cdr in src.conceptDescriptions) - this.conceptDescriptions.Add(new ConceptDescriptionRef(cdr)); - } - } - - [XmlType(TypeName = "containedElementRef")] - public class ContainedElementRef : Reference - { - // constructors - - public ContainedElementRef() { } - public ContainedElementRef(ContainedElementRef src) : base(src) { } - - public static ContainedElementRef CreateNew(Reference src) - { - if (src == null || src.Keys == null) - return null; - var r = new ContainedElementRef(); - r.Keys.AddRange(src.Keys); - return r; - } - - // further methods - - public override string GetElementName() - { - return "ContainedElementRef"; - } - } - - [XmlType(TypeName = "hasDataSpecification")] - public class HasDataSpecification - { - [XmlElement(ElementName = "reference")] // make "reference" go away by magic?! - public List reference = new List(); - - public HasDataSpecification() { } - - public HasDataSpecification(HasDataSpecification src) - { - foreach (var r in src.reference) - reference.Add(new Reference(r)); - } - } - - [XmlType(TypeName = "ContainedElements")] - public class ContainedElements - { - - // members - - [XmlElement(ElementName = "containedElementRef")] // make "reference" go away by magic?! - public List reference = new List(); - - // getter / setter - - public bool IsEmpty { get { return reference == null || reference.Count < 1; } } - public int Count { get { if (reference == null) return 0; return reference.Count; } } - public ContainedElementRef this[int index] { get { return reference[index]; } } - - // Creators - - public ContainedElements() { } - - public ContainedElements(ContainedElements src) - { - if (src.reference != null) - foreach (var r in src.reference) - this.reference.Add(new ContainedElementRef(r)); - } - - public static ContainedElements CreateOrSetInner(ContainedElements outer, ContainedElementRef[] inner) - { - var res = outer; - if (res == null) - res = new ContainedElements(); - if (inner == null) - { - res.reference = null; - return res; - } - res.reference = new List(inner); - return res; - } - - } - - [XmlType(TypeName = "langString", Namespace = "http://www.admin-shell.io/1/0")] - public class LangStr - { - - // members - - [XmlAttribute(Namespace = "http://www.admin-shell.io/1/0")] - [JsonProperty(PropertyName = "language")] - public string lang = ""; - [XmlText] - [JsonProperty(PropertyName = "text")] - public string str = ""; - - // constructors - - public LangStr() { } - - public LangStr(LangStr src) - { - this.lang = src.lang; - this.str = src.str; - } - - public static LangStr CreateNew(string lang, string str) - { - var l = new LangStr(); - l.lang = lang; - l.str = str; - return (l); - } - - public static List CreateManyFromStringArray(string[] s) - { - var r = new List(); - var i = 0; - while ((i + 1) < s.Length) - { - r.Add(LangStr.CreateNew(s[i], s[i + 1])); - i += 2; - } - return r; - } - } - - public class Description - { - - // members - - [XmlElement(ElementName = "langString")] - public List langString = new List(); - - // constructors - - public Description() { } - - public Description(Description src) - { - if (src != null) - foreach (var ls in src.langString) - langString.Add(new LangStr(ls)); - } - } - - public class Kind - { - [XmlText] - public string kind = "Instance"; - - // getters / setters - - [XmlIgnore] - [JsonIgnore] - public bool IsInstance { get { return kind == null || kind.Trim().ToLower() == "instance"; } } - - [XmlIgnore] - [JsonIgnore] - public bool IsType { get { return kind != null && kind.Trim().ToLower() == "type"; } } - - // constructors / creators - - public Kind() { } - - public Kind(Kind src) - { - kind = src.kind; - } - - public Kind(string kind) - { - this.kind = kind; - } - - public static Kind CreateFrom(Kind k) - { - var res = new Kind(); - res.kind = k.kind; - return res; - } - - public static Kind CreateAsType() - { - var res = new Kind(); - res.kind = "Type"; - return res; - } - - public static Kind CreateAsInstance() - { - var res = new Kind(); - res.kind = "Instance"; - return res; - } - } - - public class SemanticId - { - - // members - - [XmlIgnore] - [JsonIgnore] - private KeyList keys = new KeyList(); - - // getters / setters - - [XmlArray("keys")] - [XmlArrayItem("key")] - [JsonIgnore] - public List Keys { get { return keys?.Keys; } } - [XmlIgnore] - [JsonProperty(PropertyName = "keys")] - public List JsonKeys - { - get - { - keys?.NumberIndices(); - return keys.Keys; - } - } - - [XmlIgnore] - [JsonIgnore] - public bool IsEmpty { get { return keys == null || keys.IsEmpty; } } - [XmlIgnore] - [JsonIgnore] - public int Count { get { if (keys == null) return 0; return keys.Count; } } - [XmlIgnore] - [JsonIgnore] - public Key this[int index] { get { return keys[index]; } } - - public override string ToString() - { - return Key.KeyListToString(keys.Keys); - } - - // constructors / creators - - public SemanticId() - { - } - - public SemanticId(SemanticId src) - { - if (src != null) - foreach (var k in src.Keys) - keys.Add(k); - } - - public static SemanticId CreateFromKey(Key key) - { - if (key == null) - return null; - var res = new SemanticId(); - res.Keys.Add(key); - return res; - } - - public static SemanticId CreateFromKeys(List keys) - { - if (keys == null) - return null; - var res = new SemanticId(); - res.Keys.AddRange(keys); - return res; - } - - // matching - - public bool Matches(string type, bool local, string idType, string value) - { - if (this.Count == 1 - && this.keys[0].type.ToLower().Trim() == type.ToLower().Trim() - && this.keys[0].local == local - && this.keys[0].idType.ToLower().Trim() == idType.ToLower().Trim() - && this.keys[0].value.ToLower().Trim() == value.ToLower().Trim()) - return true; - return false; - } - } - - public class Referable - { - - // members - - public string idShort = null; - public string category = null; - - [XmlElement(ElementName = "description")] - [JsonIgnore] - public Description description = null; - [XmlIgnore] - [JsonProperty(PropertyName = "descriptions")] - public List JsonDescription - { - get - { - if (description == null) - return null; - return description.langString; - } - set - { - if (description == null) - description = new Description(); - description.langString = value; - } - } - - [XmlIgnore] - [JsonIgnore] - public Referable parent = null; - - public static string[] ReferableCategoryNames = new string[] { "CONSTANT", "PARAMETER", "VARIABLE" }; - - // constructors - - public Referable() { } - - public Referable(Referable src) - { - this.idShort = src.idShort; - this.category = src.category; - if (src.description != null) - this.description = new Description(src.description); - } - - public void AddDescription(string lang, string str) - { - if (description == null) - description = new Description(); - description.langString.Add(LangStr.CreateNew(lang, str)); - } - - public virtual string GetElementName() - { - return "GlobalReference"; // not correct, but this method wasn't overridden correctly - } - - public string GetFriendlyName() - { - return AdminShellUtilV10.FilterFriendlyName(this.idShort); - } - - public void CollectReferencesByParent(List refs) - { - // check, if this is identifiable - if (this is Identifiable) - { - var idf = this as Identifiable; - var k = Key.CreateNew( - idf.GetElementName(), true, idf.identification.idType, idf.identification.id); - refs.Insert(0, k); - } - else - { - var k = Key.CreateNew(this.GetElementName(), true, "idShort", this.idShort); - refs.Insert(0, k); - // recurse upwards! - if (parent != null && parent is Referable) - (this.parent).CollectReferencesByParent(refs); - } - } - - public string CollectIdShortByParent() - { - // recurse first - var head = ""; - if (!(this is Identifiable) && this.parent != null && this.parent is Referable) - // can go up - head = this.parent.CollectIdShortByParent() + "/"; - // add own - var myid = ""; - if (this.idShort != null && this.idShort.Trim() != "") - myid = this.idShort.Trim(); - // together - return head + myid; - } - } - - public class Identifiable : Referable - { - - // members - - public Identification identification = new Identification(); - public Administration administration = null; - - // constructors - - public Identifiable() : base() { } - - public Identifiable(Identifiable src) - : base(src) - { - if (src.identification != null) - this.identification = new Identification(src.identification); - if (src.administration != null) - this.administration = new Administration(src.administration); - } - - public void SetIdentification(string idType, string id, string idShort = null) - { - identification.idType = idType; - identification.id = id; - if (idShort != null) - this.idShort = idShort; - } - - public void SetAdminstration(string version, string revision) - { - if (administration == null) - administration = new Administration(); - administration.version = version; - administration.revision = revision; - } - - public new string GetFriendlyName() - { - if (identification != null && identification.id != "") - return AdminShellUtilV10.FilterFriendlyName(this.identification.id); - return AdminShellUtilV10.FilterFriendlyName(this.idShort); - } - - } - - public class JsonModelTypeWrapper - { - public string name = ""; - - public JsonModelTypeWrapper(string name = "") { this.name = name; } - } - - public class AdministrationShell : Identifiable - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // from hasDataSpecification: - [XmlElement(ElementName = "hasDataSpecification")] - public HasDataSpecification hasDataSpecification = null; - - // from this very class - public AssetAdministrationShellRef derivedFrom = null; - - [JsonProperty(PropertyName = "asset")] - public AssetRef assetRef = new AssetRef(); - - [JsonProperty(PropertyName = "submodels")] - public List submodelRefs = new List(); - - [JsonIgnore] - public Views views = null; - [XmlIgnore] - [JsonProperty(PropertyName = "views")] - public View[] JsonViews - { - get { return views?.views.ToArray(); } - set { views = Views.CreateOrSetInnerViews(views, value); } - } - - [JsonProperty(PropertyName = "conceptDictionaries")] - public List conceptDictionaries = null; - - // constructurs - - public AdministrationShell() { } - - public AdministrationShell(AdministrationShell src) - : base(src) - { - if (src.hasDataSpecification != null) - this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - - if (src.derivedFrom != null) - this.derivedFrom = new AssetAdministrationShellRef(src.derivedFrom); - - if (src.assetRef != null) - this.assetRef = new AssetRef(src.assetRef); - - if (src.submodelRefs != null) - foreach (var smr in src.submodelRefs) - this.submodelRefs.Add(new SubmodelRef(smr)); - - if (src.views != null) - this.views = new Views(src.views); - - if (src.conceptDictionaries != null) - { - this.conceptDictionaries = new List(); - foreach (var cdd in src.conceptDictionaries) - this.conceptDictionaries.Add(new ConceptDictionary(cdd)); - } - } - - public static AdministrationShell CreateNew( - string idType, string id, string version = null, string revision = null) - { - var s = new AdministrationShell(); - s.identification.idType = idType; - s.identification.id = id; - if (version != null) - s.SetAdminstration(version, revision); - return (s); - } - - // add - - public void AddView(View v) - { - if (views == null) - views = new Views(); - views.views.Add(v); - } - - public void AddConceptDictionary(ConceptDictionary d) - { - if (conceptDictionaries == null) - conceptDictionaries = new List(); - conceptDictionaries.Add(d); - } - - public void AddDataSpecification(Key k) - { - if (hasDataSpecification == null) - hasDataSpecification = new HasDataSpecification(); - var r = new Reference(); - r.Keys.Add(k); - hasDataSpecification.reference.Add(r); - } - - public override string GetElementName() - { - return "AssetAdministrationShell"; - } - - public Tuple ToCaptionInfo() - { - var caption = AdminShellUtilV10.EvalToNonNullString("\"{0}\" ", idShort, "\"AAS\""); - if (administration != null) - caption += "V" + administration.version + "." + administration.revision; - - var info = ""; - if (identification != null) - info = $"[{identification.idType}, {identification.id}]"; - return Tuple.Create(caption, info); - } - - public override string ToString() - { - var ci = ToCaptionInfo(); - return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); - } - - public SubmodelRef FindSubmodelRef(Identification refid) - { - if (this.submodelRefs == null) - return null; - foreach (var r in this.submodelRefs) - if (r.MatchesTo(refid)) - return r; - return null; - } - - public bool HasSubmodelRef(SubmodelRef newref) - { - // check, if existing - if (this.submodelRefs == null) - return false; - var found = false; - foreach (var r in this.submodelRefs) - if (r.MatchesTo(newref)) - found = true; - - return found; - } - - public void AddSubmodelRef(SubmodelRef newref) - { - if (this.submodelRefs == null) - this.submodelRefs = new List(); - this.submodelRefs.Add(newref); - } - } - - public class Asset : Identifiable - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // from hasDataSpecification: - [XmlElement(ElementName = "hasDataSpecification")] - public HasDataSpecification hasDataSpecification = null; - // from HasKind - [XmlElement(ElementName = "kind")] - [JsonIgnore] - public Kind kind = new Kind(); - [XmlIgnore] - [JsonProperty(PropertyName = "kind")] - public string JsonKind - { - get - { - if (kind == null) - return null; - return kind.kind; - } - set - { - if (kind == null) - kind = new Kind(); - kind.kind = value; - } - } - // from this very class - [XmlElement(ElementName = "assetIdentificationModelRef")] - public SubmodelRef assetIdentificationModelRef = null; - - // constructors - - public Asset() { } - - public Asset(Asset src) - : base(src) - { - if (src.hasDataSpecification != null) - this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - if (src.kind != null) - this.kind = new Kind(src.kind); - if (src.assetIdentificationModelRef != null) - this.assetIdentificationModelRef = new SubmodelRef(src.assetIdentificationModelRef); - } - - // Getter & setters - - public AssetRef GetReference() - { - var r = new AssetRef(); - r.Keys.Add( - Key.CreateNew(this.GetElementName(), true, this.identification.idType, this.identification.id)); - return r; - } - - public override string GetElementName() - { - return "Asset"; - } - - public Tuple ToCaptionInfo() - { - var caption = AdminShellUtilV10.EvalToNonNullString("\"{0}\" ", idShort, ""); - if (administration != null) - caption += "V" + administration.version + "." + administration.revision; - - var info = ""; - if (identification != null) - info = $"[{identification.idType}, {identification.id}]"; - return Tuple.Create(caption, info); - } - - public override string ToString() - { - var ci = ToCaptionInfo(); - return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); - } - - } - - public class View : Referable - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // members - - // from hasSemanticId: - [XmlElement(ElementName = "semanticId")] - public SemanticId semanticId = null; - // from hasDataSpecification - [XmlElement(ElementName = "hasDataSpecification")] - public HasDataSpecification hasDataSpecification = null; - - // from this very class - [JsonIgnore] - public ContainedElements containedElements = null; - [XmlIgnore] - [JsonProperty(PropertyName = "containedElements")] - public ContainedElementRef[] JsonContainedElements - { - get { return containedElements?.reference.ToArray(); } - set { containedElements = ContainedElements.CreateOrSetInner(containedElements, value); } - } - - // getter / setter - - [XmlIgnore] - [JsonIgnore] - public bool IsEmpty { get { return containedElements == null || containedElements.Count < 1; } } - [XmlIgnore] - [JsonIgnore] - public int Count { get { if (containedElements == null) return 0; return containedElements.Count; } } - - public ContainedElementRef this[int index] - { - get - { - if ( -containedElements == null) return null; return containedElements[index]; - } - } - - // constructors / creators - - public View() { } - - public View(View src) - : base(src) - { - if (src.semanticId != null) - this.semanticId = new SemanticId(src.semanticId); - if (src.hasDataSpecification != null) - this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - if (src.containedElements != null) - this.containedElements = new ContainedElements(src.containedElements); - } - - public static View CreateNew(string idShort) - { - var v = new View(); - v.idShort = idShort; - return (v); - } - - public void AddDataSpecification(Key k) - { - if (hasDataSpecification == null) - hasDataSpecification = new HasDataSpecification(); - var r = new Reference(); - r.Keys.Add(k); - hasDataSpecification.reference.Add(r); - } - - public void AddContainedElement(Key k) - { - if (containedElements == null) - containedElements = new ContainedElements(); - var r = new ContainedElementRef(); - r.Keys.Add(k); - containedElements.reference.Add(r); - } - - public void AddContainedElement(List keys) - { - if (containedElements == null) - containedElements = new ContainedElements(); - var r = new ContainedElementRef(); - foreach (var k in keys) - r.Keys.Add(k); - containedElements.reference.Add(r); - } - - public void AddContainedElement(Reference r) - { - if (containedElements == null) - containedElements = new ContainedElements(); - containedElements.reference.Add(ContainedElementRef.CreateNew(r)); - } - - public void AddContainedElement(List rlist) - { - if (containedElements == null) - containedElements = new ContainedElements(); - foreach (var r in rlist) - containedElements.reference.Add(ContainedElementRef.CreateNew(r)); - } - - public override string GetElementName() - { - return "View"; - } - - public Tuple ToCaptionInfo() - { - var caption = AdminShellUtilV10.EvalToNonNullString("\"{0}\" ", idShort, ""); - var info = ""; - if (this.semanticId != null) - info = Key.KeyListToString(this.semanticId.Keys); - if (this.containedElements != null && this.containedElements.reference != null) - info = - (info + " ").Trim() + String.Format("({0} elements)", this.containedElements.reference.Count); - return Tuple.Create(caption, info); - } - - public override string ToString() - { - var ci = ToCaptionInfo(); - return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); - } - } - - public class Views - { - [XmlElement(ElementName = "view")] - [JsonIgnore] - public List views = new List(); - - // constructors - - public Views() { } - - public Views(Views src) - { - if (src != null && src.views != null) - foreach (var v in src.views) - this.views.Add(new View(v)); - } - - public static Views CreateOrSetInnerViews(Views outer, View[] inner) - { - var res = outer; - if (res == null) - res = new Views(); - if (inner == null) - { - res.views = null; - return res; - } - res.views = new List(inner); - return res; - } - } - - public class LangStringIEC61360 - { - - // members - - [XmlElement(ElementName = "langString", Namespace = "http://www.admin-shell.io/aas/1/0")] - public List langString = new List(); - - // getters / setters - - [XmlIgnore] - [JsonIgnore] - public bool IsEmpty { get { return langString == null || langString.Count < 1; } } - [XmlIgnore] - [JsonIgnore] - public int Count { get { if (langString == null) return 0; return langString.Count; } } - [XmlIgnore] - [JsonIgnore] - public LangStr this[int index] { get { return langString[index]; } } - - // constructors - - public LangStringIEC61360() { } - - public LangStringIEC61360(LangStringIEC61360 src) - { - if (src.langString != null) - foreach (var ls in src.langString) - this.langString.Add(new LangStr(ls)); - } - - // converter - - public static LangStringIEC61360 CreateFrom(List src) - { - var res = new LangStringIEC61360(); - if (src != null) - foreach (var ls in src) - res.langString.Add(new LangStr(ls)); - return res; - } - - } - - public class UnitId - { - - // members - - [XmlIgnore] - [JsonIgnore] - public KeyList keys = new KeyList(); - - // getter / setters - - [XmlArray("keys")] - [XmlArrayItem("key")] - [JsonIgnore] - public List Keys { get { return keys?.Keys; } } - [XmlIgnore] - [JsonProperty(PropertyName = "keys")] - public List JsonKeys - { - get - { - keys?.NumberIndices(); - return keys.Keys; - } - } - - [XmlIgnore] - [JsonIgnore] - public bool IsEmpty { get { return keys == null || keys.IsEmpty; } } - [XmlIgnore] - [JsonIgnore] - public int Count { get { if (keys == null) return 0; return keys.Count; } } - [XmlIgnore] - [JsonIgnore] - public Key this[int index] { get { return keys.Keys[index]; } } - - // constructors / creators - - public UnitId() { } - - public UnitId(UnitId src) - { - if (src.keys != null) - foreach (var k in src.Keys) - this.keys.Add(new Key(k)); - } - - public static UnitId CreateNew(string type, bool local, string idType, string value) - { - var u = new UnitId(); - u.keys.Keys.Add(Key.CreateNew(type, local, idType, value)); - return u; - } - - public static UnitId CreateNew(Reference src) - { - var res = new UnitId(); - if (src != null && src.Keys != null) - foreach (var k in src.Keys) - res.keys.Add(k); - return res; - } - } - - [XmlRoot(Namespace = "http://www.admin-shell.io/IEC61360/1/0")] - public class DataSpecificationIEC61360 - { - // static member - [XmlIgnore] - [JsonIgnore] - public static string[] DataTypeNames = { - "STRING", - "STRING_TRANSLATABLE", - "REAL_MEASURE", - "REAL_COUNT", - "REAL_CURRENCY", - "INTEGER_MEASURE", - "INTEGER_COUNT", - "INTEGER_CURRENCY", - "BOOLEAN", - "URL", - "RATIONAL", - "RATIONAL_MEASURE", - "TIME", - "TIMESTAMP", - "DATE" }; - - // members - public LangStringIEC61360 preferredName = new LangStringIEC61360(); - public string shortName = ""; - public string unit = ""; - public UnitId unitId = null; - public string valueFormat = null; - public List sourceOfDefinition = new List(); - public string symbol = null; - public string dataType = ""; - public LangStringIEC61360 definition = new LangStringIEC61360(); - - // getter / setters - - // constructors - - public DataSpecificationIEC61360() { } - - public DataSpecificationIEC61360(DataSpecificationIEC61360 src) - { - if (src.preferredName != null) - this.preferredName = new LangStringIEC61360(src.preferredName); - this.shortName = src.shortName; - this.unit = src.unit; - if (src.unitId != null) - this.unitId = new UnitId(src.unitId); - this.valueFormat = src.valueFormat; - if (src.sourceOfDefinition != null) - foreach (var sod in src.sourceOfDefinition) - this.sourceOfDefinition.Add(sod); - this.symbol = src.symbol; - this.dataType = src.dataType; - if (src.definition != null) - this.definition = new LangStringIEC61360(src.definition); - } - - public static DataSpecificationIEC61360 CreateNew( - string[] preferredName = null, - string shortName = "", - string unit = "", - UnitId unitId = null, - string valueFormat = null, - string[] sourceOfDefinition = null, - string symbol = null, - string dataType = "", - string[] definition = null - ) - { - var d = new DataSpecificationIEC61360(); - if (preferredName != null) - d.preferredName.langString = LangStr.CreateManyFromStringArray(preferredName); - d.shortName = shortName; - d.unit = unit; - d.unitId = unitId; - d.valueFormat = valueFormat; - if (sourceOfDefinition != null) - d.sourceOfDefinition = LangStr.CreateManyFromStringArray(sourceOfDefinition); - d.symbol = symbol; - d.dataType = dataType; - if (definition != null) - d.definition.langString = LangStr.CreateManyFromStringArray(definition); - return (d); - } - } - - public class DataSpecificationISO99999 - { - } - - public class DataSpecificationContent - { - - // members - - public DataSpecificationIEC61360 dataSpecificationIEC61360 = new DataSpecificationIEC61360(); - public DataSpecificationISO99999 dataSpecificationISO99999 = null; - - // constructors - - public DataSpecificationContent() { } - - public DataSpecificationContent(DataSpecificationContent src) - { - if (src.dataSpecificationIEC61360 != null) - this.dataSpecificationIEC61360 = new DataSpecificationIEC61360(src.dataSpecificationIEC61360); - } - } - - public class EmbeddedDataSpecification - { - // members - - public DataSpecificationRef hasDataSpecification = new DataSpecificationRef(); - public DataSpecificationContent dataSpecificationContent = new DataSpecificationContent(); - - // constructors - - public EmbeddedDataSpecification() { } - - public EmbeddedDataSpecification(EmbeddedDataSpecification src) - { - if (src.hasDataSpecification != null) - this.hasDataSpecification = new DataSpecificationRef(src.hasDataSpecification); - if (src.dataSpecificationContent != null) - this.dataSpecificationContent = new DataSpecificationContent(src.dataSpecificationContent); - } - } - - public class ConceptDescription : Identifiable, System.IDisposable - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // members - - // do this in order to be IDisposable, that is: suitable for (using) - void System.IDisposable.Dispose() { } - public void GetData() { } - // from HasDataSpecification - // TODO (Michael Hoffmeister, 1970-01-01): in V1.0, shall be a list of embeddedDataSpecification - [XmlElement(ElementName = "embeddedDataSpecification")] - [JsonIgnore] - public EmbeddedDataSpecification embeddedDataSpecification = new EmbeddedDataSpecification(); - [XmlIgnore] - [JsonProperty(PropertyName = "embeddedDataSpecifications")] - public EmbeddedDataSpecification[] JsonEmbeddedDataSpecifications - { - get - { - if (embeddedDataSpecification == null) - return null; - return new EmbeddedDataSpecification[] { embeddedDataSpecification }; - } - set - { - if (value == null) - embeddedDataSpecification = null; - else - embeddedDataSpecification = value[0]; - } - } - - // this class - [XmlIgnore] - private List isCaseOf = null; - - // getter / setter - - [XmlElement(ElementName = "isCaseOf")] - [JsonProperty(PropertyName = "isCaseOf")] - public List IsCaseOf - { - get { return isCaseOf; } - set { isCaseOf = value; } - } - - // constructors / creators - - public ConceptDescription() : base() { } - - public ConceptDescription(ConceptDescription src) - : base(src) - { - if (src.embeddedDataSpecification != null) - this.embeddedDataSpecification = new EmbeddedDataSpecification(src.embeddedDataSpecification); - if (src.isCaseOf != null) - foreach (var ico in src.isCaseOf) - { - if (this.isCaseOf == null) - this.isCaseOf = new List(); - this.isCaseOf.Add(new Reference(ico)); - } - } - - public static ConceptDescription CreateNew( - string idType, string id, string version = null, string revision = null) - { - var cd = new ConceptDescription(); - cd.identification.idType = idType; - cd.identification.id = id; - if (version != null) - { - if (cd.administration == null) - cd.administration = new Administration(); - cd.administration.version = version; - cd.administration.revision = revision; - } - return (cd); - } - - public ConceptDescriptionRef GetReference() - { - var r = new ConceptDescriptionRef(); - r.Keys.Add( - Key.CreateNew(this.GetElementName(), true, this.identification.idType, this.identification.id)); - return r; - } - - public Key GetGlobalDataSpecRef() - { - if (embeddedDataSpecification.hasDataSpecification.Count != 1) - return null; - return (embeddedDataSpecification.hasDataSpecification[0]); - } - - public void SetIEC61360Spec( - string[] preferredNames = null, - string shortName = "", - string unit = "", - UnitId unitId = null, - string valueFormat = null, - string[] sourceOfDefinition = null, - string symbol = null, - string dataType = "", - string[] definition = null - ) - { - this.embeddedDataSpecification = new EmbeddedDataSpecification(); - this.embeddedDataSpecification.hasDataSpecification.Keys.Add( - Key.CreateNew("GlobalReference", false, "URI", - "www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360")); - this.embeddedDataSpecification.dataSpecificationContent.dataSpecificationIEC61360 = - AdminShellV10.DataSpecificationIEC61360.CreateNew( - preferredNames, shortName, unit, unitId, valueFormat, sourceOfDefinition, symbol, dataType, - definition); - this.AddIsCaseOf( - Reference.CreateNew(new Key( - "ConceptDescription", false, this.identification.idType, this.identification.id))); - } - - public DataSpecificationIEC61360 GetIEC61360() - { - if (embeddedDataSpecification != null && - embeddedDataSpecification.dataSpecificationContent != null && - embeddedDataSpecification.dataSpecificationContent.dataSpecificationIEC61360 != null) - return embeddedDataSpecification.dataSpecificationContent.dataSpecificationIEC61360; - return null; - } - - public string GetShortName() - { - if (embeddedDataSpecification != null && - embeddedDataSpecification.dataSpecificationContent != null && - embeddedDataSpecification.dataSpecificationContent.dataSpecificationIEC61360 != null) - return embeddedDataSpecification.dataSpecificationContent.dataSpecificationIEC61360.shortName; - return ""; - } - - public override string GetElementName() - { - return "ConceptDescription"; - } - - public Tuple ToCaptionInfo() - { - var caption = ""; - if (this.idShort != null && this.idShort.Trim() != "") - caption = $"\"{this.idShort.Trim()}\""; - if (this.identification != null) - caption = (caption + " " + this.identification).Trim(); - - var info = ""; - if (embeddedDataSpecification != null && - embeddedDataSpecification.dataSpecificationContent != null && - embeddedDataSpecification.dataSpecificationContent.dataSpecificationIEC61360 != null) - info += embeddedDataSpecification.dataSpecificationContent.dataSpecificationIEC61360.shortName; - - return Tuple.Create(caption, info); - } - - public override string ToString() - { - var ci = ToCaptionInfo(); - return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); - } - - public void AddIsCaseOf(Reference ico) - { - if (isCaseOf == null) - isCaseOf = new List(); - isCaseOf.Add(ico); - } - - public static IDisposable CreateNew() - { - throw new NotImplementedException(); - } - } - - public class ConceptDictionary : Referable - { - [XmlElement(ElementName = "conceptDescriptions")] - public ConceptDescriptionRefs conceptDescriptionsRefs = null; - - // constructors - - public ConceptDictionary() { } - - public ConceptDictionary(ConceptDictionary src) - { - if (src.conceptDescriptionsRefs != null) - this.conceptDescriptionsRefs = new ConceptDescriptionRefs(src.conceptDescriptionsRefs); - } - - public static ConceptDictionary CreateNew(string idShort = null) - { - var d = new ConceptDictionary(); - if (idShort != null) - d.idShort = idShort; - return (d); - } - - // add - - public void AddReference(Reference r) - { - var cdr = (ConceptDescriptionRef)(ConceptDescriptionRef.CreateNew(r.Keys)); - if (conceptDescriptionsRefs == null) - conceptDescriptionsRefs = new ConceptDescriptionRefs(); - conceptDescriptionsRefs.conceptDescriptions.Add(cdr); - } - - public override string GetElementName() - { - return "ConceptDictionary"; - } - } - - [XmlRoot(ElementName = "aasenv", Namespace = "http://www.admin-shell.io/aas/1/0")] - public class AdministrationShellEnv - { - [XmlAttribute(Namespace = System.Xml.Schema.XmlSchema.InstanceNamespace)] - public string schemaLocation = - "http://www.admin-shell.io/aas/1/0 AAS.xsd http://www.admin-shell.io/IEC61360/1/0 IEC61360.xsd"; - - /// [XmlElement(ElementName="assetAdministrationShells")] - [XmlIgnore] // will be ignored, anyway - private List administrationShells = new List(); - [XmlIgnore] // will be ignored, anyway - private List assets = new List(); - [XmlIgnore] // will be ignored, anyway - private List submodels = new List(); - [XmlIgnore] // will be ignored, anyway - private List conceptDescriptions = new List(); - - // getter / setters - - [XmlArray("assetAdministrationShells")] - [XmlArrayItem("assetAdministrationShell")] - [JsonProperty(PropertyName = "assetAdministrationShells")] - public List AdministrationShells - { - get { return administrationShells; } - set { administrationShells = value; } - } - - [XmlArray("assets")] - [XmlArrayItem("asset")] - [JsonProperty(PropertyName = "assets")] - public List Assets - { - get { return assets; } - set { assets = value; } - } - - [XmlArray("submodels")] - [XmlArrayItem("submodel")] - [JsonProperty(PropertyName = "submodels")] - public List Submodels - { - get { return submodels; } - set { submodels = value; } - } - - [XmlArray("conceptDescriptions")] - [XmlArrayItem("conceptDescription")] - [JsonProperty(PropertyName = "conceptDescriptions")] - public List ConceptDescriptions - { - get { return conceptDescriptions; } - set { conceptDescriptions = value; } - } - - // finders - - public AdministrationShell FindAAS(Identification id) - { - if (id == null) - return null; - foreach (var aas in this.AdministrationShells) - if (aas.identification != null && aas.identification.IsEqual(id)) - return aas; - return null; - } - - public AdministrationShell FindAAS(string idShort) - { - if (idShort == null) - return null; - foreach (var aas in this.AdministrationShells) - if (aas.idShort != null && aas.idShort.Trim().ToLower() == idShort.Trim().ToLower()) - return aas; - return null; - } - - public AdministrationShell FindAASwithSubmodel(Identification smid) - { - if (smid == null) - return null; - foreach (var aas in this.AdministrationShells) - if (aas.submodelRefs != null) - foreach (var smref in aas.submodelRefs) - if (smref.MatchesTo(smid)) - return aas; - return null; - } - - public Asset FindAsset(Identification id) - { - if (id == null) - return null; - foreach (var asset in this.Assets) - if (asset.identification != null && asset.identification.IsEqual(id)) - return asset; - return null; - } - - public Asset FindAsset(AssetRef aref) - { - // trivial - if (aref == null) - return null; - // can only refs with 1 key - if (aref.Count != 1) - return null; - // and we're picky - var key = aref[0]; - if (!key.local || key.type.ToLower().Trim() != "asset") - return null; - // brute force - foreach (var a in assets) - if (a.identification.idType.ToLower().Trim() == key.idType.ToLower().Trim() - && a.identification.id.ToLower().Trim() == key.value.ToLower().Trim()) - return a; - // uups - return null; - } - - public Submodel FindSubmodel(Identification id) - { - if (id == null) - return null; - foreach (var sm in this.Submodels) - if (sm.identification != null && sm.identification.IsEqual(id)) - return sm; - return null; - } - - public Submodel FindSubmodel(SubmodelRef smref) - { - // trivial - if (smref == null) - return null; - // can only refs with 1 key - if (smref.Count != 1) - return null; - // and we're picky - var key = smref.Keys[0]; - if (!key.local || key.type.ToLower().Trim() != "submodel") - return null; - // brute force - foreach (var sm in this.Submodels) - if (sm.identification.idType.ToLower().Trim() == key.idType.ToLower().Trim() - && sm.identification.id.ToLower().Trim() == key.value.ToLower().Trim()) - return sm; - // uups - return null; - } - - public Referable FindReferableByReference(Reference rf, int keyIndex = 0) - { - // first index needs to exist .. - if (rf == null || keyIndex >= rf.Count) - return null; - - // which type? - var firstType = rf[keyIndex].type.Trim().ToLower(); - var firstIdentification = new Identification(rf[keyIndex].idType, rf[keyIndex].value); - - if (firstType == Key.AAS.Trim().ToLower()) - return this.FindAAS(firstIdentification); - - if (firstType == Key.Asset.Trim().ToLower()) - return this.FindAsset(firstIdentification); - - if (firstType == Key.ConceptDescription.Trim().ToLower()) - return this.FindConceptDescription(firstIdentification); - - if (firstType == Key.Submodel.Trim().ToLower()) - { - // ok, search Submodel - var sm = this.FindSubmodel(new Identification(rf[keyIndex].idType, rf[keyIndex].value)); - if (sm == null) - return null; - - // at our end? - if (keyIndex >= rf.Count - 1) - return sm; - - // go inside - return SubmodelElementWrapper.FindReferableByReference(sm.submodelElements, rf, keyIndex + 1); - } - - // nothing in this Environment - return null; - } - - - public ConceptDescription FindConceptDescription(ConceptDescriptionRef cdr) - { - if (cdr == null) - return null; - return FindConceptDescription(cdr.Keys); - } - - public ConceptDescription FindConceptDescription(Identification id) - { - var cdr = ConceptDescriptionRef.CreateNew("Conceptdescription", true, id.idType, id.id); - return FindConceptDescription(cdr); - } - - public ConceptDescription FindConceptDescription(List keys) - { - // trivial - if (keys == null) - return null; - // can only refs with 1 key - if (keys.Count != 1) - return null; - // and we're picky - var key = keys[0]; - if (!key.local || key.type.ToLower().Trim() != "conceptdescription") - return null; - // brute force - foreach (var cd in conceptDescriptions) - if (cd.identification.idType.ToLower().Trim() == key.idType.ToLower().Trim() - && cd.identification.id.ToLower().Trim() == key.value.ToLower().Trim()) - return cd; - // uups - return null; - } - - public ConceptDescription FindConceptDescription(Key key) - { - if (key == null) - return null; - var l = new List(); - l.Add(key); - return (FindConceptDescription(l)); - } - - // creators - - private void CopyConceptDescriptionsFrom( - AdministrationShellEnv srcEnv, SubmodelElement src, bool shallowCopy = false) - { - // access - if (srcEnv == null || src == null || src.semanticId == null) - return; - // check for this SubmodelElement in Source - var cdSrc = srcEnv.FindConceptDescription(src.semanticId.Keys); - if (cdSrc == null) - return; - // check for this SubmodelElement in Destnation (this!) - var cdDest = this.FindConceptDescription(src.semanticId.Keys); - if (cdDest != null) - return; - // copy new - this.ConceptDescriptions.Add(new ConceptDescription(cdSrc)); - // recurse? - if (!shallowCopy && src is SubmodelElementCollection) - foreach (var m in (src as SubmodelElementCollection).value) - CopyConceptDescriptionsFrom(srcEnv, m.submodelElement, shallowCopy); - - } - - public SubmodelElementWrapper CopySubmodelElementAndCD( - AdministrationShellEnv srcEnv, SubmodelElement srcElem, bool copyCD = false, bool shallowCopy = false) - { - // access - if (srcEnv == null || srcElem == null) - return null; - - // 1st result pretty easy (calling function will add this to the appropriate Submodel) - var res = new SubmodelElementWrapper(srcElem); - - // copy the CDs.. - if (copyCD) - CopyConceptDescriptionsFrom(srcEnv, srcElem, shallowCopy); - - // give back - return res; - } - - public SubmodelRef CopySubmodelRefAndCD( - AdministrationShellEnv srcEnv, SubmodelRef srcSubRef, bool copySubmodel = false, bool copyCD = false, - bool shallowCopy = false) - { - // access - if (srcEnv == null || srcSubRef == null) - return null; - - // need to have the source Submodel - var srcSub = srcEnv.FindSubmodel(srcSubRef); - if (srcSub == null) - return null; - - // 1st result pretty easy (calling function will add this to the appropriate AAS) - var dstSubRef = new SubmodelRef(srcSubRef); - - // get the destination and shall src != dst - var dstSub = this.FindSubmodel(dstSubRef); - if (srcSub == dstSub) - return null; - - // maybe we need the Submodel in our environment, as well - if (dstSub == null && copySubmodel) - { - dstSub = new Submodel(srcSub, shallowCopy); - this.Submodels.Add(dstSub); - } - else - { - // there is already an submodel, just add members - if (!shallowCopy && srcSub.submodelElements != null) - { - if (dstSub.submodelElements == null) - dstSub.submodelElements = new List(); - foreach (var smw in srcSub.submodelElements) - dstSub.submodelElements.Add(new SubmodelElementWrapper(smw.submodelElement, shallowCopy)); - } - } - - // copy the CDs.. - if (copyCD && srcSub.submodelElements != null) - foreach (var smw in srcSub.submodelElements) - CopyConceptDescriptionsFrom(srcEnv, smw.submodelElement, shallowCopy); - - // give back - return dstSubRef; - } - - // serializations - - public void SerializeXmlToStream(StreamWriter s) - { - var serializer = new XmlSerializer(typeof(AdminShellV10.AdministrationShellEnv)); - var nss = new XmlSerializerNamespaces(); - nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace); - nss.Add("aas", "http://www.admin-shell.io/aas/1/0"); - nss.Add("IEC61360", "http://www.admin-shell.io/IEC61360/1/0"); - serializer.Serialize(s, this, nss); - } - - public JsonWriter SerialiazeJsonToStream(StreamWriter sw, bool leaveJsonWriterOpen = false) - { - sw.AutoFlush = true; - - JsonSerializer serializer = new JsonSerializer(); - serializer.NullValueHandling = NullValueHandling.Ignore; - serializer.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; - serializer.Formatting = Newtonsoft.Json.Formatting.Indented; - - JsonWriter writer = new JsonTextWriter(sw); - serializer.Serialize(writer, this); - if (leaveJsonWriterOpen) - return writer; - writer.Close(); - return null; - } - - public AdministrationShellEnv DeserializeFromXmlStream(TextReader reader) - { - XmlSerializer serializer = new XmlSerializer( - typeof(AdminShellV10.AdministrationShellEnv), "http://www.admin-shell.io/aas/1/0"); - var res = serializer.Deserialize(reader) as AdminShellV10.AdministrationShellEnv; - return res; - } - - public AdministrationShellEnv DeserializeFromJsonStream(TextReader reader) - { - JsonSerializer serializer = new JsonSerializer(); - serializer.Converters.Add(new AdminShellV10.JsonAasxConverter("modelType", "name")); - var res = (AdministrationShellEnv)serializer.Deserialize(reader, typeof(AdministrationShellEnv)); - return res; - } - - // special functions - - private static void CreateFromExistingEnvRecurseForCDs( - AdministrationShellEnv src, List wrappers, - ref List filterForCD) - { - if (wrappers == null || filterForCD == null) - return; - - foreach (var w in wrappers) - { - // include in filter .. - if (w.submodelElement.semanticId != null) - { - var cd = src.FindConceptDescription(w.submodelElement.semanticId.Keys); - if (cd != null) - filterForCD.Add(cd); - } - - // recurse? - if (w.submodelElement is SubmodelElementCollection) - CreateFromExistingEnvRecurseForCDs( - src, (w.submodelElement as SubmodelElementCollection).value, ref filterForCD); - - if (w.submodelElement is Operation) - for (int i = 0; i < 2; i++) - { - var w2s = Operation.GetWrappers((w.submodelElement as Operation)[i]); - CreateFromExistingEnvRecurseForCDs(src, w2s, ref filterForCD); - } - - } - } - - public static AdministrationShellEnv CreateFromExistingEnv(AdministrationShellEnv src, - List filterForAas = null, - List filterForAsset = null, - List filterForSubmodel = null, - List filterForCD = null) - { - // prepare defaults - if (filterForAas == null) - filterForAas = new List(); - if (filterForAsset == null) - filterForAsset = new List(); - if (filterForSubmodel == null) - filterForSubmodel = new List(); - if (filterForCD == null) - filterForCD = new List(); - - // make new - var res = new AdministrationShellEnv(); - - // take over AAS - foreach (var aas in src.administrationShells) - if (filterForAas.Contains(aas)) - { - // take over - res.administrationShells.Add(new AdministrationShell(aas)); - - // consequences - if (aas.assetRef != null) - { - var asset = src.FindAsset(aas.assetRef); - if (asset != null) - filterForAsset.Add(asset); - } - - if (aas.submodelRefs != null) - foreach (var smr in aas.submodelRefs) - { - var sm = src.FindSubmodel(smr); - if (sm != null) - filterForSubmodel.Add(sm); - } - - if (aas.conceptDictionaries != null) - foreach (var cdd in aas.conceptDictionaries) - if (cdd.conceptDescriptionsRefs != null && - cdd.conceptDescriptionsRefs.conceptDescriptions != null) - foreach (var cdr in cdd.conceptDescriptionsRefs.conceptDescriptions) - { - var cd = src.FindConceptDescription(cdr); - if (cd != null) - filterForCD.Add(cd); - } - } - - // take over Assets - foreach (var asset in src.assets) - if (filterForAsset.Contains(asset)) - { - // take over - res.assets.Add(new Asset(asset)); - } - - // take over Submodels - foreach (var sm in src.Submodels) - if (filterForSubmodel.Contains(sm)) - { - // take over - res.submodels.Add(new Submodel(sm)); - - // recursion in order to find used CDs - CreateFromExistingEnvRecurseForCDs(src, sm.submodelElements, ref filterForCD); - } - - // ConceptDescriptions - foreach (var cd in src.ConceptDescriptions) - if (filterForCD.Contains(cd)) - { - // take over - res.conceptDescriptions.Add(new ConceptDescription(cd)); - } - - // ok - return res; - } - } - - // - // Submodel + Submodel elements - // - - public interface IGetReference - { - Reference GetReference(); - } - - public class Qualifier - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // member - - // from hasSemantics: - [XmlElement(ElementName = "semanticId")] - // TODO (Michael Hoffmeister, 1970-01-01): Qualifiers not working! - // 190410: test-wise enable them again, everyhing works fine .. - public SemanticId semanticId = null; - - // this class - public string qualifierType = null; - public string qualifierValue = null; - public Reference qualifierValueId = null; - - // constructors - - public Qualifier() { } - - public Qualifier(Qualifier src) - { - if (src.semanticId != null) - this.semanticId = new SemanticId(src.semanticId); - this.qualifierType = src.qualifierType; - this.qualifierValue = src.qualifierValue; - if (src.qualifierValueId != null) - this.qualifierValueId = new Reference(src.qualifierValueId); - } - - public string GetElementName() - { - return "Qualifier"; - } - } - - public class SubmodelElement : Referable, System.IDisposable, IGetReference - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // members - - // do this in order to be IDisposable, that is: suitable for (using) - void System.IDisposable.Dispose() { } - public void GetData() { } - // from hasDataSpecification: - [XmlElement(ElementName = "hasDataSpecification")] - public HasDataSpecification hasDataSpecification = null; - // from hasSemantics: - [XmlElement(ElementName = "semanticId")] - public SemanticId semanticId = null; - // from hasKind: - [XmlElement(ElementName = "kind")] - [JsonIgnore] - public Kind kind = null; - [XmlIgnore] - [JsonProperty(PropertyName = "kind")] - public string JsonKind - { - get - { - if (kind == null) - return null; - return kind.kind; - } - set - { - if (kind == null) - kind = new Kind(); - kind.kind = value; - } - } - // from Qualifiable: - [XmlArray("qualifier")] - [XmlArrayItem("qualifier")] - [JsonProperty(PropertyName = "constraints")] - public List qualifiers = null; - - // getter / setter - - // constructors / creators - - public SubmodelElement() - : base() { } - - public SubmodelElement(SubmodelElement src) - : base(src) - { - if (src.hasDataSpecification != null) - hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - if (src.semanticId != null) - semanticId = new SemanticId(src.semanticId); - if (src.kind != null) - kind = new Kind(src.kind); - if (src.qualifiers != null) - { - if (qualifiers == null) - qualifiers = new List(); - foreach (var q in src.qualifiers) - qualifiers.Add(new Qualifier(q)); - } - } - - public void CreateNewLogic(string idShort = null, string category = null, Key semanticIdKey = null) - { - if (idShort != null) - this.idShort = idShort; - if (category != null) - this.category = category; - if (semanticIdKey != null) - { - if (this.semanticId == null) - this.semanticId = new SemanticId(); - this.semanticId.Keys.Add(semanticIdKey); - } - } - - public void AddQualifier( - string qualifierType = null, string qualifierValue = null, KeyList semanticKeys = null, - Reference qualifierValueId = null) - { - if (this.qualifiers == null) - this.qualifiers = new List(); - var q = new Qualifier(); - q.qualifierType = qualifierType; - q.qualifierValue = qualifierValue; - q.qualifierValueId = qualifierValueId; - if (semanticKeys != null) - q.semanticId = SemanticId.CreateFromKeys(semanticKeys.Keys); - this.qualifiers.Add(q); - } - - public Qualifier HasQualifierOfType(string qualifierType) - { - if (this.qualifiers == null || qualifierType == null) - return null; - foreach (var q in this.qualifiers) - if (q.qualifierType.Trim().ToLower() == qualifierType.Trim().ToLower()) - return q; - return null; - } - - public override string GetElementName() - { - return "SubmodelElement"; - } - - public Reference GetReference() - { - Reference r = new Reference(); - // this is the tail of our referencing chain .. - r.Keys.Add(Key.CreateNew(GetElementName(), true, "idShort", this.idShort)); - // try to climb up .. - var current = this.parent; - while (current != null) - { - if (current is Identifiable) - { - // add big information set - r.Keys.Insert(0, Key.CreateNew( - current.GetElementName(), - true, - (current as Identifiable).identification.idType, - (current as Identifiable).identification.id)); - } - else - { - // reference via idShort - r.Keys.Insert(0, Key.CreateNew( - current.GetElementName(), - true, - "idShort", this.idShort)); - } - current = current.parent; - } - return r; - } - - public Tuple ToCaptionInfo() - { - var caption = AdminShellUtilV10.EvalToNonNullString("\"{0}\" ", idShort, ""); - var info = ""; - if (semanticId != null) - info = AdminShellUtilV10.EvalToNonEmptyString("\u21e8 {0}", semanticId.ToString(), ""); - return Tuple.Create(caption, info); - } - - public override string ToString() - { - var ci = ToCaptionInfo(); - return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); - } - - - } - - [XmlType(TypeName = "submodelElement")] - public class SubmodelElementWrapper - { - - // members - - [XmlElement(ElementName = "property", Type = typeof(Property))] - [XmlElement(ElementName = "file", Type = typeof(File))] - [XmlElement(ElementName = "blob", Type = typeof(Blob))] - [XmlElement(ElementName = "referenceElement", Type = typeof(ReferenceElement))] - [XmlElement(ElementName = "relationshipElement", Type = typeof(RelationshipElement))] - [XmlElement(ElementName = "submodelElementCollection", Type = typeof(SubmodelElementCollection))] - [XmlElement(ElementName = "operation", Type = typeof(Operation))] - public SubmodelElement submodelElement; - - // element names - public static string[] AdequateElementNames = { - "SubmodelElementCollection", "Property", "File", "Blob", "ReferenceElement", - "RelationshipElement", "Operation", "OperationVariable" }; - - // constructors - - public SubmodelElementWrapper() { } - - // for cloning - public SubmodelElementWrapper(SubmodelElement src, bool shallowCopy = false) - { - if (src is Property) - this.submodelElement = new Property(src as Property); - if (src is File) - this.submodelElement = new File(src as File); - if (src is Blob) - this.submodelElement = new Blob(src as Blob); - if (src is ReferenceElement) - this.submodelElement = new ReferenceElement(src as ReferenceElement); - if (src is RelationshipElement) - this.submodelElement = new RelationshipElement(src as RelationshipElement); - if (src is SubmodelElementCollection) - this.submodelElement = new SubmodelElementCollection( - src as SubmodelElementCollection, shallowCopy: shallowCopy); - if (src is Operation) - this.submodelElement = new Operation(src as Operation); - } - - /// - /// Introduced for JSON serialization, can create SubModelElements based on a string name - /// - /// string name (standard PascalCased) - /// SubmodelElement - public static SubmodelElement CreateAdequateType(string elementName) - { - if (elementName == "Property") - return new Property(); - if (elementName == "File") - return new File(); - if (elementName == "Blob") - return new Blob(); - if (elementName == "ReferenceElement") - return new ReferenceElement(); - if (elementName == "RelationshipElement") - return new RelationshipElement(); - if (elementName == "SubmodelElementCollection") - return new SubmodelElementCollection(); - if (elementName == "Operation") - return new Operation(); - if (elementName == "OperationVariable") - return new OperationVariable(); - return null; - } - - /// - /// Can create SubmodelElements based on a numerical index - /// - /// Index 0..7 (6+7 are Operation..!) - /// SubmodelElement - public static SubmodelElement CreateAdequateType(int index) - { - AdminShellV10.SubmodelElement sme = null; - switch (index) - { - case 0: - sme = new AdminShellV10.Property(); - break; - case 1: - sme = new AdminShellV10.File(); - break; - case 2: - sme = new AdminShellV10.Blob(); - break; - case 3: - sme = new AdminShellV10.ReferenceElement(); - break; - case 4: - sme = new AdminShellV10.SubmodelElementCollection(); - break; - case 5: - sme = new AdminShellV10.RelationshipElement(); - break; - case 6: - sme = new AdminShellV10.Operation(); - break; - case 7: - sme = new AdminShellV10.OperationVariable(); - break; - } - return sme; - } - - public string GetFourDigitCode() - { - if (submodelElement == null) - return ("Null"); - if (submodelElement is AdminShellV10.Property) return ("Prop"); - if (submodelElement is AdminShellV10.File) return ("File"); - if (submodelElement is AdminShellV10.Blob) return ("Blob"); - if (submodelElement is AdminShellV10.ReferenceElement) return ("Ref"); - if (submodelElement is AdminShellV10.RelationshipElement) return ("Rel"); - if (submodelElement is AdminShellV10.SubmodelElementCollection) return ("Coll"); - if (submodelElement is AdminShellV10.Operation) return ("Opr"); - return ("Elem"); - } - - public static List ListOfWrappersToListOfElems(List wrappers) - { - var res = new List(); - if (wrappers == null) - return res; - foreach (var w in wrappers) - if (w.submodelElement != null) - res.Add(w.submodelElement); - return res; - } - - public static SubmodelElementWrapper CreateFor(SubmodelElement sme) - { - var res = new SubmodelElementWrapper(); - res.submodelElement = sme; - return res; - } - - public static Referable FindReferableByReference( - List wrappers, Reference rf, int keyIndex) - { - // first index needs to exist .. - if (wrappers == null || rf == null || keyIndex >= rf.Count) - return null; - - // as SubmodelElements are not Identifiables, the actual key shall be IdSHort - if (rf[keyIndex].idType.Trim().ToLower() != - Key.GetIdentifierTypeName(Key.IdentifierType.IdShort).Trim().ToLower()) - return null; - - // over all wrappers - if (wrappers != null) - foreach (var smw in wrappers) - if (smw.submodelElement != null && - smw.submodelElement.idShort.Trim().ToLower() == rf[keyIndex].value.Trim().ToLower()) - { - // match on this level. Did we find a leaf element? - if ((keyIndex + 1) >= rf.Count) - return smw.submodelElement; - - // ok, not a leaf, must be a recursion - // int SMEC - if (smw.submodelElement is SubmodelElementCollection) - return FindReferableByReference( - (smw.submodelElement as SubmodelElementCollection).value, rf, keyIndex + 1); - - // TODO (Michael Hoffmeister, 1970-01-01): Operation - - // else: - return null; - } - - // no? - return null; - } - } - - public class Submodel : Identifiable, System.IDisposable, IGetReference - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // members - - // do this in order to be IDisposable, that is: suitable for (using) - void System.IDisposable.Dispose() { } - public void GetData() { } - // from hasDataSpecification: - [XmlElement(ElementName = "hasDataSpecification")] - public HasDataSpecification hasDataSpecification = null; - // from hasSemanticId: - [XmlElement(ElementName = "semanticId")] - public SemanticId semanticId = new SemanticId(); - // from Kindable - [XmlElement(ElementName = "kind")] - [JsonIgnore] - public Kind kind = new Kind(); - [XmlIgnore] - [JsonProperty(PropertyName = "kind")] - public string JsonKind - { - get - { - if (kind == null) - return null; - return kind.kind; - } - set - { - if (kind == null) - kind = new Kind(); - kind.kind = value; - } - } - // from Qualifiable: - [XmlArray("qualifier")] - [XmlArrayItem("qualifier")] - public List qualifiers = null; - - // from this very class - [JsonIgnore] - public List submodelElements = null; - [XmlIgnore] - [JsonProperty(PropertyName = "submodelElements")] - public SubmodelElement[] JsonSubmodelElements - { - get - { - var res = new List(); - if (submodelElements != null) - foreach (var smew in submodelElements) - res.Add(smew.submodelElement); - return res.ToArray(); - } - set - { - if (value != null) - { - this.submodelElements = new List(); - foreach (var x in value) - { - var smew = new SubmodelElementWrapper(); - smew.submodelElement = x; - this.submodelElements.Add(smew); - } - } - } - } - - // getter / setter - - // constructors / creators - - public Submodel() : base() { } - - public Submodel(Submodel src, bool shallowCopy = false) - : base(src) - { - if (src.hasDataSpecification != null) - this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - if (src.semanticId != null) - this.semanticId = new SemanticId(src.semanticId); - if (src.kind != null) - this.kind = new Kind(src.kind); - if (!shallowCopy && src.submodelElements != null) - { - if (this.submodelElements == null) - this.submodelElements = new List(); - foreach (var smw in src.submodelElements) - this.submodelElements.Add(new SubmodelElementWrapper(smw.submodelElement, shallowCopy)); - } - } - - public static Submodel CreateNew(string idType, string id, string version = null, string revision = null) - { - var s = new Submodel(); - s.identification.idType = idType; - s.identification.id = id; - if (version != null) - { - if (s.administration == null) - s.administration = new Administration(); - s.administration.version = version; - s.administration.revision = revision; - } - return (s); - } - - public override string GetElementName() - { - return "Submodel"; - } - - public Reference GetReference() - { - SubmodelRef l = new SubmodelRef(); - l.Keys.Add( - Key.CreateNew(this.GetElementName(), true, this.identification.idType, this.identification.id)); - return l; - } - - public void Add(SubmodelElement se) - { - if (submodelElements == null) - submodelElements = new List(); - var sew = new SubmodelElementWrapper(); - se.parent = this; // track parent here! - sew.submodelElement = se; - submodelElements.Add(sew); - } - - public void AddDataSpecification(Key k) - { - if (hasDataSpecification == null) - hasDataSpecification = new HasDataSpecification(); - var r = new Reference(); - r.Keys.Add(k); - hasDataSpecification.reference.Add(r); - } - - public SubmodelElementWrapper FindSubmodelElementWrapper(string idShort) - { - if (this.submodelElements == null) - return null; - foreach (var smw in this.submodelElements) - if (smw.submodelElement != null) - if (smw.submodelElement.idShort.Trim().ToLower() == idShort.Trim().ToLower()) - return smw; - return null; - } - - public Tuple ToCaptionInfo() - { - var caption = AdminShellUtilV10.EvalToNonNullString("\"{0}\" ", idShort, ""); - if (administration != null) - caption += "V" + administration.version + "." + administration.revision; - var info = ""; - if (identification != null) - info = $"[{identification.idType}, {identification.id}]"; - return Tuple.Create(caption, info); - } - - public override string ToString() - { - var ci = ToCaptionInfo(); - return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); - } - - // Recursing - - private void RecurseOnSubmodelElementsRecurse( - List wrappers, object state, List parents, - Action, SubmodelElement> lambda) - { - // trivial - if (wrappers == null || parents == null || lambda == null) - return; - - // over all elements - foreach (var smw in wrappers) - { - var current = smw.submodelElement; - if (current == null) - continue; - - // call lambda for this element - lambda(state, parents, current); - - // add to parents - parents.Add(current); - - // dive into? - if (current is SubmodelElementCollection) - { - var smc = current as SubmodelElementCollection; - RecurseOnSubmodelElementsRecurse(smc.value, state, parents, lambda); - } - - if (current is Operation) - { - var op = current as Operation; - for (int i = 0; i < 2; i++) - RecurseOnSubmodelElementsRecurse(Operation.GetWrappers(op[i]), state, parents, lambda); - } - - // remove from parents - parents.RemoveAt(parents.Count - 1); - } - } - - public void RecurseOnSubmodelElements( - object state, Action, SubmodelElement> lambda) - { - RecurseOnSubmodelElementsRecurse(this.submodelElements, state, new List(), lambda); - } - - // Parents stuff - - private static void SetParentsForSME(Referable parent, SubmodelElement se) - { - se.parent = parent; - var smc = se as SubmodelElementCollection; - if (smc != null) - foreach (var sme in smc.value) - SetParentsForSME(se, sme.submodelElement); - } - - public void SetAllParents() - { - if (this.submodelElements != null) - foreach (var sme in this.submodelElements) - SetParentsForSME(this, sme.submodelElement); - } - - } - - // - // Derived from SubmodelElements - // - - public class DataElement : SubmodelElement - { - - public DataElement() { } - - public DataElement(DataElement src) - : base(src) - { } - - public override string GetElementName() - { - return "DataElement"; - } - } - - public class JsonValueTypeCast - { - - public class JsonDataObjectType - { - [JsonProperty(PropertyName = "name")] - public string name = ""; - } - - [JsonProperty(PropertyName = "dataObjectType")] - public JsonDataObjectType dataObjectType = new JsonDataObjectType(); - - public JsonValueTypeCast(string name) - { - this.dataObjectType.name = name; - } - } - - public class Property : DataElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - - [JsonIgnore] - public string valueType = ""; - [XmlIgnore] - [JsonProperty(PropertyName = "valueType")] - public JsonValueTypeCast JsonValueType - { - get { return new JsonValueTypeCast(this.valueType); } - set { this.valueType = value?.dataObjectType?.name; } - } - - - public string value = ""; - public Reference valueId = null; - - // constructors - - public Property() { } - - public Property(Property src) - : base(src) - { - this.valueType = src.valueType; - this.value = src.value; - if (src.valueId != null) - src.valueId = new Reference(src.valueId); - } - - public static Property CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new Property(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - public void Set(string valueType = "", string value = "") - { - this.valueType = valueType; - this.value = value; - } - - public void Set(string type, bool local, string idType, string value) - { - this.valueId = Reference.CreateNew(Key.CreateNew(type, local, idType, value)); - } - - public override string GetElementName() - { - return "Property"; - } - } - - public class Blob : DataElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - - public string mimeType = ""; - public string value = ""; - - // constructors - - public Blob() { } - - public Blob(Blob src) - : base(src) - { - this.mimeType = src.mimeType; - this.value = src.value; - } - - public static Blob CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new Blob(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - public void Set(string mimeType = "", string value = "") - { - this.mimeType = mimeType; - this.value = value; - } - - public override string GetElementName() - { - return "Blob"; - } - - } - - public class File : DataElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - - public string mimeType = ""; - public string value = ""; - - // constructors - - public File() { } - - public File(File src) - : base(src) - { - this.mimeType = src.mimeType; - this.value = src.value; - } - - public static File CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new File(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - public void Set(string mimeType = "", string value = "") - { - this.mimeType = mimeType; - this.value = value; - } - - public override string GetElementName() - { - return "File"; - } - - public static string[] GetPopularMimeTypes() - { - return - new string[] { - System.Net.Mime.MediaTypeNames.Text.Plain, - System.Net.Mime.MediaTypeNames.Text.Xml, - System.Net.Mime.MediaTypeNames.Text.Html, - "application/json", - "application/rdf+xml", - System.Net.Mime.MediaTypeNames.Application.Pdf, - System.Net.Mime.MediaTypeNames.Image.Jpeg, - "image/png", - System.Net.Mime.MediaTypeNames.Image.Gif, - "application/iges", - "application/step" - }; - } - } - - public class ReferenceElement : DataElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - - public Reference value = new Reference(); - - // constructors - - public ReferenceElement() { } - - public ReferenceElement(ReferenceElement src) - : base(src) - { - if (src.value != null) - this.value = new Reference(src.value); - } - - public static ReferenceElement CreateNew( - string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new ReferenceElement(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - public void Set(Reference value = null) - { - this.value = value; - } - - public override string GetElementName() - { - return "ReferenceElement"; - } - - } - - public class RelationshipElement : DataElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - - public Reference first = new Reference(); - public Reference second = new Reference(); - - // constructors - - public RelationshipElement() { } - - public RelationshipElement(RelationshipElement src) - : base(src) - { - if (src.first != null) - this.first = new Reference(src.first); - if (src.second != null) - this.second = new Reference(src.second); - } - - public static RelationshipElement CreateNew( - string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new RelationshipElement(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - public void Set(Reference first = null, Reference second = null) - { - this.first = first; - this.second = second; - } - - public override string GetElementName() - { - return "RelationshipElement"; - } - } - - public class SubmodelElementCollection : SubmodelElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - [JsonIgnore] - public List value = new List(); - - [XmlIgnore] - [JsonProperty(PropertyName = "value")] - public SubmodelElement[] JsonValue - { - get - { - var res = new List(); - if (value != null) - foreach (var smew in value) - res.Add(smew.submodelElement); - return res.ToArray(); - } - set - { - if (value != null) - { - this.value = new List(); - foreach (var x in value) - { - var smew = new SubmodelElementWrapper(); - smew.submodelElement = x; - this.value.Add(smew); - } - } - } - } - - // further members - public bool ordered = false; - public bool allowDuplicates = false; - - // constructors - - public SubmodelElementCollection() { } - - public SubmodelElementCollection(SubmodelElementCollection src, bool shallowCopy = false) - : base(src) - { - this.ordered = src.ordered; - this.allowDuplicates = src.allowDuplicates; - if (!shallowCopy) - foreach (var smw in src.value) - value.Add(new SubmodelElementWrapper(smw.submodelElement)); - } - - public static SubmodelElementCollection CreateNew( - string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new SubmodelElementCollection(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - public void Set(bool allowDuplicates = false, bool ordered = false) - { - this.allowDuplicates = allowDuplicates; - this.ordered = ordered; - } - - public void Add(SubmodelElement se) - { - if (value == null) - value = new List(); - var sew = new SubmodelElementWrapper(); - se.parent = this; // track parent here! - sew.submodelElement = se; - value.Add(sew); - } - - public SubmodelElementWrapper FindSubmodelElementWrapper(string idShort) - { - if (this.value == null) - return null; - foreach (var smw in this.value) - if (smw.submodelElement != null) - if (smw.submodelElement.idShort.Trim().ToLower() == idShort.Trim().ToLower()) - return smw; - return null; - } - - public override string GetElementName() - { - return "SubmodelElementCollection"; - } - } - - public class OperationVariable : SubmodelElement - { - public enum Direction { In, Out }; - - // Note: for OperationVariable, the values of the SubmodelElement itself ARE NOT TO BE USED! - // only the SME attributes of "value" are counting - - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - public SubmodelElementWrapper value = null; - - // constructors - - public OperationVariable() - { - this.kind = new Kind("Type"); - } - - public OperationVariable(OperationVariable src, bool shallowCopy = false) - : base(src) - { - this.value = new SubmodelElementWrapper(src.value.submodelElement, shallowCopy); - } - - public OperationVariable(SubmodelElement elem) - : base() - { - this.value = new SubmodelElementWrapper(elem); - } - - public override string GetElementName() - { - return "OperationVariable"; - } - } - - public class Operation : SubmodelElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - [JsonIgnore] - [XmlElement(ElementName = "in")] - public List valueIn = new List(); - - [JsonIgnore] - [XmlElement(ElementName = "out")] - public List valueOut = new List(); - - [XmlIgnore] - // MICHA 190504: enabled JSON operation variables! - [JsonProperty(PropertyName = "in")] - public OperationVariable[] JsonValueIn - { - get { return valueIn?.ToArray(); } - set { valueIn = (value != null) ? new List(value) : null; } - } - - [XmlIgnore] - [JsonProperty(PropertyName = "out")] - // MICHA 190504: enabled JSON operation variables! - public OperationVariable[] JsonValueOut - { - get { return valueOut?.ToArray(); } - set { valueOut = (value != null) ? new List(value) : null; } - } - - public List this[OperationVariable.Direction dir] - { - get - { - return (dir == OperationVariable.Direction.In) ? valueIn : valueOut; - } - set - { - if (dir == OperationVariable.Direction.In) - valueIn = value; - else - valueOut = value; - } - } - - public List this[int dir] - { - get - { - return (dir == 0) ? valueIn : valueOut; - } - set - { - if (dir == 0) - valueIn = value; - else - valueOut = value; - } - } - - public static List GetWrappers(List ovl) - { - var res = new List(); - foreach (var ov in ovl) - if (ov.value != null) - res.Add(ov.value); - return res; - } - - // constructors - - public Operation() { } - - public Operation(Operation src) - : base(src) - { - for (int i = 0; i < 2; i++) - if (src[i] != null) - { - if (this[i] == null) - this[i] = new List(); - foreach (var ov in src[i]) - this[i].Add(ov); - } - } - - - public override string GetElementName() - { - return "Operation"; - } - } - - // - // Handling of packages - // - - /// - /// This converter is used for reading JSON files; it claims to be responsible for - /// "SubmodelElements" (the base class) - /// and decides, which sub-class of the base class shall be populated. - /// The decision, shich special sub-class to create is done in a factory - /// AdminShell.SubmodelElementWrapper.CreateAdequateType(), - /// in order to have all sub-class specific decisions in one place (SubmodelElementWrapper) - /// Remark: There is a NuGet package JsonSubTypes, which could have done the job, except the fact of having - /// "modelType" being a class property with a contained property "name". - /// - public class JsonAasxConverter : JsonConverter - { - private string UpperClassProperty = "modelType"; - private string LowerClassProperty = "name"; - - public JsonAasxConverter() : base() - { - } - - public JsonAasxConverter(string UpperClassProperty, string LowerClassProperty) : base() - { - this.UpperClassProperty = UpperClassProperty; - this.LowerClassProperty = LowerClassProperty; - } - - public override bool CanConvert(Type objectType) - { - if (typeof(AdminShellV10.SubmodelElement).IsAssignableFrom(objectType)) - return true; - return false; - } - - public override bool CanWrite - { - get { return false; } - } - - public override object ReadJson(JsonReader reader, - Type objectType, - object existingValue, - JsonSerializer serializer) - { - // Load JObject from stream - JObject jObject = JObject.Load(reader); - - // Create target object based on JObject - object target = new AdminShellV10.SubmodelElement(); - - if (jObject.ContainsKey(UpperClassProperty)) - { - var j2 = jObject[UpperClassProperty]; - foreach (var c in j2.Children()) - { - var cprop = c as Newtonsoft.Json.Linq.JProperty; - if (cprop == null) - continue; - if (cprop.Name == LowerClassProperty && - cprop.Value != null && - cprop.Value.Type.ToString() == "String") - { - var cpval = cprop.Value.ToObject(); - if (cpval == null) - continue; - var o = AdminShellV10.SubmodelElementWrapper.CreateAdequateType(cpval); - if (o != null) - target = o; - } - } - } - - // Populate the object properties - serializer.Populate(jObject.CreateReader(), target); - - return target; - } - - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) - { - throw new NotImplementedException(); - } - } - - /// - /// This class lets an outer functionality keep track on the supplementary files, which are in or - /// are pending to be added or deleted to an Package. - /// - public class PackageSupplementaryFile : Referable - { - public enum LocationType { InPackage, AddPending, DeletePending } - - public enum SpecialHandlingType { None, EmbedAsThumbnail } - - public Uri uri = null; - public string sourcePath = null; - public LocationType location = LocationType.InPackage; - public SpecialHandlingType specialHandling = SpecialHandlingType.None; - - public PackageSupplementaryFile( - Uri uri, string sourcePath = null, LocationType location = LocationType.InPackage, - SpecialHandlingType specialHandling = SpecialHandlingType.None) - { - this.uri = uri; - this.sourcePath = sourcePath; - this.location = location; - this.specialHandling = specialHandling; - } - - // class derives from Referable in order to provide GetElementName - public override string GetElementName() - { - return "File"; - } - - } - - /// - /// This class encapsulates an AdminShellEnvironment and supplementary files into an AASX Package. - /// Specifically has the capability to load, update and store .XML, .JSON and .AASX packages. - /// - public class PackageEnv - { - private string fn = "New Package"; - private AdministrationShellEnv aasenv = new AdministrationShellEnv(); - private Package openPackage = null; - private List pendingFilesToAdd = new List(); - private List pendingFilesToDelete = new List(); - - public PackageEnv() - { - } - - public PackageEnv(AdministrationShellEnv env) - { - if (env != null) - this.aasenv = env; - } - - public PackageEnv(string fn) - { - Load(fn); - } - - public bool IsOpen - { - get - { - return openPackage != null; - } - } - - public string Filename - { - get - { - return fn; - } - } - - public AdminShellV10.AdministrationShellEnv AasEnv - { - get - { - return aasenv; - } - } - - public bool Load(string fn) - { - this.fn = fn; - if (this.openPackage != null) - this.openPackage.Close(); - this.openPackage = null; - - if (fn.ToLower().EndsWith(".xml")) - { - // load only XML - try - { - // TODO (Michael Hoffmeister, 1970-01-01): use aasenv serialzers here! - XmlSerializer serializer = new XmlSerializer( - typeof(AdminShellV10.AdministrationShellEnv), "http://www.admin-shell.io/aas/1/0"); - TextReader reader = new StreamReader(fn); - this.aasenv = serializer.Deserialize(reader) as AdminShellV10.AdministrationShellEnv; - if (this.aasenv == null) - throw (new Exception("Type error for XML file!")); - reader.Close(); - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While reading AAS {0} at {1} gave: {2}", fn, - AdminShellUtilV10.ShortLocation(ex), ex.Message))); - } - return true; - } - - if (fn.ToLower().EndsWith(".json")) - { - // load only JSON - try - { - using (StreamReader file = System.IO.File.OpenText(fn)) - { - // TODO (Michael Hoffmeister, 1970-01-01): use aasenv serialzers here! - JsonSerializer serializer = new JsonSerializer(); - serializer.Converters.Add(new AdminShellV10.JsonAasxConverter("modelType", "name")); - this.aasenv = (AdministrationShellEnv)serializer.Deserialize( - file, typeof(AdministrationShellEnv)); - } - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While reading AAS {0} at {1} gave: {2}", - fn, AdminShellUtilV10.ShortLocation(ex), ex.Message))); - } - return true; - } - - if (fn.ToLower().EndsWith(".aasx")) - { - // load package AASX - try - { - var package = Package.Open(fn, FileMode.Open); - - // get the origin from the package - PackagePart originPart = null; - var xs = package.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aasx-origin"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/") - { - originPart = package.GetPart(x.TargetUri); - break; - } - if (originPart == null) - throw (new Exception(string.Format("Unable to find AASX origin. Aborting!"))); - - // get the specs from the package - PackagePart specPart = null; - xs = originPart.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aas-spec"); - foreach (var x in xs) - { - specPart = package.GetPart(x.TargetUri); - break; - } - if (specPart == null) - throw (new Exception(string.Format("Unable to find AASX spec(s). Aborting!"))); - - // open spec part to read - try - { - if (specPart.Uri.ToString().ToLower().Trim().EndsWith("json")) - { - using (var s = specPart.GetStream(FileMode.Open)) - { - using (StreamReader file = new StreamReader(s)) - { - JsonSerializer serializer = new JsonSerializer(); - serializer.Converters.Add( - new AdminShellV10.JsonAasxConverter("modelType", "name")); - this.aasenv = (AdministrationShellEnv)serializer.Deserialize( - file, typeof(AdministrationShellEnv)); - } - } - } - else - { - using (var s = specPart.GetStream(FileMode.Open)) - { - // own catch loop to be more specific - XmlSerializer serializer = new XmlSerializer( - typeof(AdminShellV10.AdministrationShellEnv), - "http://www.admin-shell.io/aas/1/0"); - this.aasenv = serializer.Deserialize(s) as AdminShellV10.AdministrationShellEnv; - this.openPackage = package; - if (this.aasenv == null) - throw (new Exception("Type error for XML file!")); - s.Close(); - } - } - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While reading AAS {0} spec at {1} gave: {2}", - fn, AdminShellUtilV10.ShortLocation(ex), ex.Message))); - } - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While reading AASX {0} at {1} gave: {2}", fn, - AdminShellUtilV10.ShortLocation(ex), ex.Message))); - } - return true; - } - - // Don't know to handle - throw (new Exception(string.Format($"Not able to handle {fn}."))); - } - - public bool LoadFromAasEnvString(string content) - { - try - { - using (var file = new StringReader(content)) - { - // TODO (Michael Hoffmeister, 1970-01-01): use aasenv serialzers here! - JsonSerializer serializer = new JsonSerializer(); - serializer.Converters.Add(new AdminShellV10.JsonAasxConverter("modelType", "name")); - this.aasenv = (AdministrationShellEnv)serializer.Deserialize( - file, typeof(AdministrationShellEnv)); - } - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While reading AASENV string {0} gave: {1}", - AdminShellUtilV10.ShortLocation(ex), ex.Message))); - } - return true; - } - - public enum PreferredFormat { None, Xml, Json }; - - public bool SaveAs(string fn, bool writeFreshly = false, PreferredFormat prefFmt = PreferredFormat.None) - { - - if (fn.ToLower().EndsWith(".xml")) - { - // save only XML - this.fn = fn; - try - { - using (var s = new StreamWriter(this.fn)) - { - // TODO (Michael Hoffmeister, 1970-01-01): use aasenv serialzers here! - var serializer = new XmlSerializer(typeof(AdminShellV10.AdministrationShellEnv)); - var nss = new XmlSerializerNamespaces(); - nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace); - nss.Add("aas", "http://www.admin-shell.io/aas/1/0"); - nss.Add("IEC61360", "http://www.admin-shell.io/IEC61360/1/0"); - serializer.Serialize(s, this.aasenv, nss); - } - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While writing AAS {0} at {1} gave: {2}", - fn, AdminShellUtilV10.ShortLocation(ex), ex.Message))); - } - return true; - } - - if (fn.ToLower().EndsWith(".json")) - { - // save only JSON - // this funcitonality is a initial test - this.fn = fn; - try - { - using (var sw = new StreamWriter(fn)) - { - // TODO (Michael Hoffmeister, 1970-01-01): use aasenv serialzers here! - - sw.AutoFlush = true; - - JsonSerializer serializer = new JsonSerializer(); - serializer.NullValueHandling = NullValueHandling.Ignore; - serializer.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; - serializer.Formatting = Newtonsoft.Json.Formatting.Indented; - using (JsonWriter writer = new JsonTextWriter(sw)) - { - serializer.Serialize(writer, this.aasenv); - } - } - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While writing AAS {0} at {1} gave: {2}", - fn, AdminShellUtilV10.ShortLocation(ex), ex.Message))); - } - return true; - } - - if (fn.ToLower().EndsWith(".aasx")) - { - // save package AASX - try - { - // we want existing contents to be preserved, but no possiblity to change file name - // therefore: copy file to new name, re-open! - // fn could be changed, therefore close "old" package first - if (this.openPackage != null) - { - try - { - this.openPackage.Close(); - if (!writeFreshly) - System.IO.File.Copy(this.fn, fn); - } - catch { } - this.openPackage = null; - } - - // approach is to utilize the existing package, if possible. If not, create from scratch - var package = Package.Open(fn, (writeFreshly) ? FileMode.Create : FileMode.OpenOrCreate); - this.fn = fn; - - // get the origin from the package - PackagePart originPart = null; - var xs = package.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aasx-origin"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/") - { - originPart = package.GetPart(x.TargetUri); - break; - } - if (originPart == null) - { - // create, as not existing - originPart = package.CreatePart( - new Uri( - "/aasx/aasx-origin", UriKind.RelativeOrAbsolute), - System.Net.Mime.MediaTypeNames.Text.Plain, CompressionOption.Maximum); - using (var s = originPart.GetStream(FileMode.Create)) - { - var bytes = System.Text.Encoding.ASCII.GetBytes("Intentionally empty."); - s.Write(bytes, 0, bytes.Length); - } - package.CreateRelationship( - originPart.Uri, TargetMode.Internal, - "http://www.admin-shell.io/aasx/relationships/aasx-origin"); - } - - // get the specs from the package - PackagePart specPart = null; - PackageRelationship specRel = null; - xs = originPart.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aas-spec"); - foreach (var x in xs) - { - specRel = x; - specPart = package.GetPart(x.TargetUri); - break; - } - - // check, if we have to change the spec part - if (specPart != null && specRel != null) - { - var name = System.IO.Path.GetFileNameWithoutExtension( - specPart.Uri.ToString()).ToLower().Trim(); - var ext = System.IO.Path.GetExtension(specPart.Uri.ToString()).ToLower().Trim(); - if ((ext == ".json" && prefFmt == PreferredFormat.Xml) - || (ext == ".xml" && prefFmt == PreferredFormat.Json) - || (name.StartsWith("aasenv-with-no-id"))) - { - // try kill specpart - try - { - originPart.DeleteRelationship(specRel.Id); - package.DeletePart(specPart.Uri); - } - catch { } - finally { specPart = null; specRel = null; } - } - } - - if (specPart == null) - { - // create, as not existing - var frn = "aasenv-with-no-id"; - if (this.aasenv.AdministrationShells.Count > 0) - frn = this.aasenv.AdministrationShells[0].GetFriendlyName() ?? frn; - var aas_spec_fn = "/aasx/#/#.aas"; - if (prefFmt == PreferredFormat.Json) - aas_spec_fn += ".json"; - else - aas_spec_fn += ".xml"; - aas_spec_fn = aas_spec_fn.Replace("#", "" + frn); - specPart = package.CreatePart( - new Uri( - aas_spec_fn, UriKind.RelativeOrAbsolute), System.Net.Mime.MediaTypeNames.Text.Xml, - CompressionOption.Maximum); - originPart.CreateRelationship( - specPart.Uri, TargetMode.Internal, - "http://www.admin-shell.io/aasx/relationships/aas-spec"); - } - - // now, specPart shall be != null! - if (specPart.Uri.ToString().ToLower().Trim().EndsWith("json")) - { - using (var s = specPart.GetStream(FileMode.Create)) - { - JsonSerializer serializer = new JsonSerializer(); - serializer.NullValueHandling = NullValueHandling.Ignore; - serializer.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; - serializer.Formatting = Newtonsoft.Json.Formatting.Indented; - using (var sw = new StreamWriter(s)) - { - using (JsonWriter writer = new JsonTextWriter(sw)) - { - serializer.Serialize(writer, this.aasenv); - } - } - } - } - else - { - using (var s = specPart.GetStream(FileMode.Create)) - { - var serializer = new XmlSerializer(typeof(AdminShellV10.AdministrationShellEnv)); - var nss = new XmlSerializerNamespaces(); - nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace); - nss.Add("aas", "http://www.admin-shell.io/aas/1/0"); - nss.Add("IEC61360", "http://www.admin-shell.io/IEC61360/1/0"); - serializer.Serialize(s, this.aasenv, nss); - } - } - - // there might be pending files to be deleted (first delete, then add, in case of identical - // files in both categories) - foreach (var psfDel in pendingFilesToDelete) - { - // try find an existing part for that file .. - var found = false; - - // normal files - xs = specPart.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aas-suppl"); - foreach (var x in xs) - if (x.TargetUri == psfDel.uri) - { - // try to delete - specPart.DeleteRelationship(x.Id); - package.DeletePart(psfDel.uri); - found = true; - break; - } - - // thumbnails - xs = package.GetRelationshipsByType( - "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); - foreach (var x in xs) - if (x.TargetUri == psfDel.uri) - { - // try to delete - package.DeleteRelationship(x.Id); - package.DeletePart(psfDel.uri); - found = true; - break; - } - - if (!found) - throw (new Exception( - $"Not able to delete pending file {psfDel.uri} in saving package {fn}")); - } - - // after this, there are no more pending for delete files - pendingFilesToDelete.Clear(); - - // write pending supplementary files - foreach (var psfAdd in pendingFilesToAdd) - { - // make sure .. - if (psfAdd.sourcePath == null || - psfAdd.location != PackageSupplementaryFile.LocationType.AddPending) - continue; - - // normal file? - if (psfAdd.specialHandling == PackageSupplementaryFile.SpecialHandlingType.None) - { - - // try find an existing part for that file .. - PackagePart filePart = null; - xs = specPart.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aas-suppl"); - foreach (var x in xs) - if (x.TargetUri == psfAdd.uri) - { - filePart = package.GetPart(x.TargetUri); - break; - } - - if (filePart == null) - { - // create new part and link - filePart = package.CreatePart( - psfAdd.uri, AdminShellV10.PackageEnv.GuessMimeType(psfAdd.sourcePath), - CompressionOption.Maximum); - specPart.CreateRelationship( - filePart.Uri, TargetMode.Internal, - "http://www.admin-shell.io/aasx/relationships/aas-suppl"); - } - - // now should be able to write - using (var s = filePart.GetStream(FileMode.Create)) - { - var bytes = System.IO.File.ReadAllBytes(psfAdd.sourcePath); - s.Write(bytes, 0, bytes.Length); - } - } - - // thumbnail file? - if (psfAdd.specialHandling == - PackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail) - { - // try find an existing part for that file .. - PackagePart filePart = null; - xs = package.GetRelationshipsByType( - "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/" && x.TargetUri == psfAdd.uri) - { - filePart = package.GetPart(x.TargetUri); - break; - } - - if (filePart == null) - { - // create new part and link - filePart = package.CreatePart( - psfAdd.uri, AdminShellV10.PackageEnv.GuessMimeType(psfAdd.sourcePath), - CompressionOption.Maximum); - package.CreateRelationship( - filePart.Uri, TargetMode.Internal, - "http://schemas.openxmlformats.org/package/2006/" + - "relationships/metadata/thumbnail"); - } - - // now should be able to write - using (var s = filePart.GetStream(FileMode.Create)) - { - var bytes = System.IO.File.ReadAllBytes(psfAdd.sourcePath); - s.Write(bytes, 0, bytes.Length); - } - } - } - - // after this, there are no more pending for add files - pendingFilesToAdd.Clear(); - - // flush, but leave open - package.Flush(); - this.openPackage = package; - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While write AASX {0} at {1} gave: {2}", - fn, AdminShellUtilV10.ShortLocation(ex), ex.Message))); - } - return true; - } - - // Don't know to handle - throw (new Exception(string.Format($"Not able to handle {fn}."))); - } - - private int BackupIndex = 0; - - public void BackupInDir(string backupDir, int maxFiles) - { - // access - if (backupDir == null || maxFiles < 1) - return; - - // we do it not caring on any errors - try - { - // get index in form - if (BackupIndex == 0) - { - // do not always start at 0!! - var rnd = new Random(); - BackupIndex = rnd.Next(maxFiles); - } - var ndx = BackupIndex % maxFiles; - BackupIndex += 1; - - // build a filename - var fn = Path.Combine(backupDir, $"backup{ndx:000}.xml"); - - // raw save - using (var s = new StreamWriter(fn)) - { - var serializer = new XmlSerializer(typeof(AdminShellV10.AdministrationShellEnv)); - var nss = new XmlSerializerNamespaces(); - nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace); - nss.Add("aas", "http://www.admin-shell.io/aas/1/0"); - nss.Add("IEC61360", "http://www.admin-shell.io/IEC61360/1/0"); - serializer.Serialize(s, this.aasenv, nss); - } - } - catch { } - } - - public Stream GetLocalStreamFromPackage(string uriString) - { - // access - if (this.openPackage == null) - throw (new Exception(string.Format($"AASX Package {this.fn} not opened. Aborting!"))); - var part = this.openPackage.GetPart(new Uri(uriString, UriKind.RelativeOrAbsolute)); - if (part == null) - throw (new Exception( - string.Format( - $"Cannot access URI {uriString} in {this.fn} not opened. Aborting!"))); - return part.GetStream(FileMode.Open); - } - - public long GetStreamSizeFromPackage(string uriString) - { - long res = 0; - try - { - if (this.openPackage == null) - return 0; - var part = this.openPackage.GetPart(new Uri(uriString, UriKind.RelativeOrAbsolute)); - if (part == null) - return 0; - using (var s = part.GetStream(FileMode.Open)) - { - res = s.Length; - } - } - catch { return 0; } - return res; - } - - public Stream GetLocalThumbnailStream(ref Uri thumbUri) - { - // access - if (this.openPackage == null) - throw (new Exception(string.Format($"AASX Package {this.fn} not opened. Aborting!"))); - // get the thumbnail over the relationship - PackagePart thumbPart = null; - var xs = this.openPackage.GetRelationshipsByType( - "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/") - { - thumbPart = this.openPackage.GetPart(x.TargetUri); - thumbUri = x.TargetUri; - break; - } - if (thumbPart == null) - throw (new Exception(string.Format("Unable to find AASX thumbnail. Aborting!"))); - return thumbPart.GetStream(FileMode.Open); - } - - public Stream GetLocalThumbnailStream() - { - Uri dummy = null; - return GetLocalThumbnailStream(ref dummy); - } - - public List GetListOfSupplementaryFiles() - { - // new result - var result = new List(); - - // access - if (this.openPackage != null) - { - - // get the thumbnail(s) from the package - var xs = this.openPackage.GetRelationshipsByType( - "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/") - { - result.Add(new PackageSupplementaryFile( - x.TargetUri, - location: PackageSupplementaryFile.LocationType.InPackage, - specialHandling: PackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail)); - } - - // get the origin from the package - PackagePart originPart = null; - xs = this.openPackage.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aasx-origin"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/") - { - originPart = this.openPackage.GetPart(x.TargetUri); - break; - } - - if (originPart != null) - { - // get the specs from the origin - PackagePart specPart = null; - xs = originPart.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aas-spec"); - foreach (var x in xs) - { - specPart = this.openPackage.GetPart(x.TargetUri); - break; - } - - if (specPart != null) - { - // get the supplementaries from the package, derived from spec - xs = specPart.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aas-suppl"); - foreach (var x in xs) - { - result.Add( - new PackageSupplementaryFile( - x.TargetUri, location: PackageSupplementaryFile.LocationType.InPackage)); - } - } - } - } - - // add or modify the files to delete - foreach (var psfDel in pendingFilesToDelete) - { - // already in - var found = result.Find(x => { return x.uri == psfDel.uri; }); - if (found != null) - found.location = PackageSupplementaryFile.LocationType.DeletePending; - else - { - psfDel.location = PackageSupplementaryFile.LocationType.DeletePending; - result.Add(psfDel); - } - } - - // add the files to store as well - foreach (var psfAdd in pendingFilesToAdd) - { - // already in (should not happen ?!) - var found = result.Find(x => { return x.uri == psfAdd.uri; }); - if (found != null) - found.location = PackageSupplementaryFile.LocationType.AddPending; - else - { - psfAdd.location = PackageSupplementaryFile.LocationType.AddPending; - result.Add(psfAdd); - } - } - - // done - return result; - } - - public static string GuessMimeType(string fn) - { - var file_ext = System.IO.Path.GetExtension(fn).ToLower().Trim(); - var content_type = System.Net.Mime.MediaTypeNames.Text.Plain; - if (file_ext == ".pdf") content_type = System.Net.Mime.MediaTypeNames.Application.Pdf; - if (file_ext == ".xml") content_type = System.Net.Mime.MediaTypeNames.Text.Xml; - if (file_ext == ".txt") content_type = System.Net.Mime.MediaTypeNames.Text.Plain; - if (file_ext == ".igs") content_type = "application/iges"; - if (file_ext == ".iges") content_type = "application/iges"; - if (file_ext == ".stp") content_type = "application/step"; - if (file_ext == ".step") content_type = "application/step"; - if (file_ext == ".jpg") content_type = System.Net.Mime.MediaTypeNames.Image.Jpeg; - if (file_ext == ".jpeg") content_type = System.Net.Mime.MediaTypeNames.Image.Jpeg; - if (file_ext == ".png") content_type = "image/png"; - if (file_ext == ".gif") content_type = System.Net.Mime.MediaTypeNames.Image.Gif; - return content_type; - } - - public void AddSupplementaryFileToStore( - string sourcePath, string targetDir, string targetFn, bool embedAsThumb) - { - // beautify parameters - sourcePath = sourcePath.Trim(); - targetDir = targetDir.Trim(); - if (!targetDir.EndsWith("/")) - targetDir += "/"; - targetDir = targetDir.Replace(@"\", "/"); - targetFn = targetFn.Trim(); - if (sourcePath == "" || targetDir == "" || targetFn == "") - throw (new Exception(string.Format("Trying add supplementary file with empty name or path!"))); - - var file_fn = "" + targetDir.Trim() + targetFn.Trim(); - - // add record - pendingFilesToAdd.Add( - new PackageSupplementaryFile( - new Uri(file_fn, UriKind.RelativeOrAbsolute), - sourcePath, - location: PackageSupplementaryFile.LocationType.AddPending, - specialHandling: ( - embedAsThumb - ? PackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail - : PackageSupplementaryFile.SpecialHandlingType.None) - )); - } - - public void DeleteSupplementaryFile(PackageSupplementaryFile psf) - { - if (psf == null) - throw (new Exception(string.Format("No supplementary file given!"))); - - if (psf.location == PackageSupplementaryFile.LocationType.AddPending) - { - // is still pending in add list -> remove - pendingFilesToAdd.RemoveAll((x) => { return x.uri == psf.uri; }); - } - - if (psf.location == PackageSupplementaryFile.LocationType.InPackage) - { - // add to pending delete list - pendingFilesToDelete.Add(psf); - } - } - - public void Close() - { - if (this.openPackage != null) - this.openPackage.Close(); - this.openPackage = null; - this.fn = ""; - this.aasenv = null; - } - } - - } - - #endregion -} - -#endif diff --git a/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShell.cs b/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShell.cs deleted file mode 100644 index 045199144..000000000 --- a/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShell.cs +++ /dev/null @@ -1,8895 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Text.RegularExpressions; -using System.Xml; -using System.Xml.Serialization; -using AdminShell_V20; -using Newtonsoft.Json; - -//namespace AdminShellNS -//namespace AdminShell_V20 -namespace AasxCompatibilityModels -{ - /// - /// This empty class derives always from the current version of the Administration Shell class hierarchy. - /// - public class AdminShell : AdminShellV20 { } - - #region AdminShell_V2_0 - - /// - /// Version of Details of Administration Shell Part 1 V1.0 published Nov/Dec/Jan 2018/19 - /// - public class AdminShellV20 - { - public class Identification - { - - // members - - [XmlAttribute] - [CountForHash] - public string idType = ""; - - [XmlText] - [CountForHash] - public string id = ""; - - // some constants - - public static string IRDI = "IRDI"; - public static string IRI = "IRI"; - public static string IdShort = "IdShort"; - - // constructors - - public Identification() { } - - public Identification(Identification src) - { - this.idType = src.idType; - this.id = src.id; - } - -#if !DoNotUseAasxCompatibilityModels - public Identification(AasxCompatibilityModels.AdminShellV10.Identification src) - { - this.idType = src.idType; - if (this.idType.Trim().ToLower() == "uri") - this.idType = Identification.IRI; - this.id = src.id; - } -#endif - - public Identification(string idType, string id) - { - this.idType = idType; - this.id = id; - } - - public Identification(Key key) - { - this.idType = key.idType; - this.id = key.value; - } - - // Creator with validation - - public static Identification CreateNew(string idType, string id) - { - if (idType == null || id == null) - return null; - var found = false; - foreach (var x in Key.IdentifierTypeNames) - found = found || idType.ToLower().Trim() == x.ToLower().Trim(); - if (!found) - return null; - return new Identification(idType, id); - } - - // further - - public bool IsEqual(Identification other) - { - return (this.idType.Trim().ToLower() == other.idType.Trim().ToLower() - && this.id.Trim().ToLower() == other.id.Trim().ToLower()); - } - - public bool IsIRI() - { - return idType?.Trim().ToUpper() == "URI" - || idType?.Trim().ToUpper() == IRI; - } - - public bool IsIRDI() - { - return idType?.Trim().ToUpper() == IRDI; - } - - public override string ToString() - { - return $"[{this.idType}] {this.id}"; - } - } - - public class Administration - { - - // members - - [MetaModelName("Administration.version")] - [TextSearchable] - [CountForHash] - public string version = ""; - - [MetaModelName("Administration.revision")] - [TextSearchable] - [CountForHash] - public string revision = ""; - - // constructors - - public Administration() { } - - public Administration(Administration src) - { - this.version = src.version; - this.revision = src.revision; - } - -#if !DoNotUseAasxCompatibilityModels - public Administration(AasxCompatibilityModels.AdminShellV10.Administration src) - { - this.version = src.version; - this.revision = src.revision; - } -#endif - - public Administration(string version, string revision) - { - this.version = version; - this.revision = revision; - } - - public override string ToString() - { - return $"R={this.version}, V={this.revision}"; - } - } - - public class Key - { - // Constants - - public enum MatchMode { Strict, Relaxed, Identification }; - - // Members - - [MetaModelName("Key.type")] - [TextSearchable] - [XmlAttribute] - [CountForHash] - public string type = ""; - - [XmlAttribute] - [CountForHash] - public bool local = false; - - [MetaModelName("Key.idType")] - [TextSearchable] - [XmlAttribute] - [JsonIgnore] - [CountForHash] - public string idType = ""; - - [XmlIgnore] - [JsonProperty(PropertyName = "idType")] - public string JsonIdType - { - // adapt idShort <-> IdShort - get => (idType == "idShort") ? "IdShort" : idType; - set => idType = (value == "idShort") ? "IdShort" : value; - } - - [MetaModelName("Key.value")] - [TextSearchable] - [XmlText] - [CountForHash] - public string value = ""; - - [XmlIgnore] - [JsonProperty(PropertyName = "index")] - [CountForHash] - public int index = 0; - - public Key() - { - } - - public Key(Key src) - { - this.type = src.type; - this.local = src.local; - this.idType = src.idType; - this.value = src.value; - } - -#if !DoNotUseAasxCompatibilityModels - public Key(AasxCompatibilityModels.AdminShellV10.Key src) - { - this.type = src.type; - this.local = src.local; - this.idType = src.idType; - if (this.idType.Trim().ToLower() == "uri") - this.idType = Identification.IRI; - if (this.idType.Trim().ToLower() == "idshort") - this.idType = Identification.IdShort; - this.value = src.value; - } -#endif - - public Key(string type, bool local, string idType, string value) - { - this.type = type; - this.local = local; - this.idType = idType; - this.value = value; - } - - public static Key CreateNew(string type, bool local, string idType, string value) - { - var k = new Key() - { - type = type, - local = local, - idType = idType, - value = value - }; - return (k); - } - - public static Key GetFromRef(Reference r) - { - if (r == null || r.Count != 1) - return null; - return r[0]; - } - - public Identification ToId() - { - return new Identification(this); - } - - public string ToString(int format = 0) - { - if (format == 1) - { - return String.Format( - "({0})({1})[{2}]{3}", this.type, this.local ? "local" : "no-local", this.idType, this.value); - } - if (format == 2) - { - return String.Format("[{0}]{1}", this.idType, this.value); - } - - // (old) default - var tlc = (this.local) ? "Local" : "not Local"; - return $"[{this.type}, {tlc}, {this.idType}, {this.value}]"; - } - - public static Key Parse(string cell, string typeIfNotSet = null, - bool allowFmtAll = false, bool allowFmt0 = false, - bool allowFmt1 = false, bool allowFmt2 = false) - { - // access and defaults? - if (cell == null || cell.Trim().Length < 1) - return null; - if (typeIfNotSet == null) - typeIfNotSet = Key.GlobalReference; - - // format == 1 - if (allowFmtAll || allowFmt1) - { - var m = Regex.Match(cell, @"\((\w+)\)\((\S+)\)\[(\w+)\]( ?)(.*)$"); - if (m.Success) - { - return new AdminShell.Key( - m.Groups[1].ToString(), m.Groups[2].ToString() == "local", - m.Groups[3].ToString(), m.Groups[5].ToString()); - } - } - - // format == 2 - if (allowFmtAll || allowFmt2) - { - var m = Regex.Match(cell, @"\[(\w+)\]( ?)(.*)$"); - if (m.Success) - { - return new AdminShell.Key( - typeIfNotSet, true, - m.Groups[1].ToString(), m.Groups[3].ToString()); - } - } - - // format == 0 - if (allowFmtAll || allowFmt0) - { - var m = Regex.Match(cell, @"\[(\w+),( ?)([^,]+),( ?)\[(\w+)\],( ?)(.*)\]"); - if (m.Success) - { - return new AdminShell.Key( - m.Groups[1].ToString(), !m.Groups[3].ToString().Contains("not"), - m.Groups[5].ToString(), m.Groups[7].ToString()); - } - } - - // no - return null; - } - - public static string KeyListToString(List keys) - { - if (keys == null || keys.Count < 1) - return ""; - // normally, exactly one key - if (keys.Count == 1) - return keys[0].ToString(); - // multiple! - var s = "[ "; - foreach (var k in keys) - { - if (s.Length > 0) - s += ", "; - s += k.ToString(); - } - return s + " ]"; - } - - public static string[] KeyElements = new string[] { - "GlobalReference", - "FragmentReference", - "AccessPermissionRule", - "Asset", - "AssetAdministrationShell", - "ConceptDescription", - "Submodel", - "SubmodelRef", // not completely right, but used by Package Explorer - "Blob", - "ConceptDictionary", - "DataElement", - "File", - "Operation", - "OperationVariable", - "BasicEvent", - "Entity", - "Property", - "MultiLanguageProperty", - "Range", - "ReferenceElement", - "RelationshipElement", - "AnnotatedRelationshipElement", - "Capability", - "SubmodelElement", - "SubmodelElementCollection", - "View" }; - - public static string[] ReferableElements = new string[] { - "AccessPermissionRule", - "Asset", - "AssetAdministrationShell", - "ConceptDescription", - "Submodel", - "Blob", - "ConceptDictionary", - "DataElement", - "File", - "Operation", - "OperationVariable", - "Entity", - "BasicEvent", - "Property", - "MultiLanguageProperty", - "Range", - "ReferenceElement", - "RelationshipElement", - "AnnotatedRelationshipElement", - "Capability", - "SubmodelElement", - "SubmodelElementCollection", - "View" }; - - public static string[] SubmodelElements = new string[] { - "DataElement", - "File", - "Event", - "Operation", - "Property", - "MultiLanguageProperty", - "Range", - "ReferenceElement", - "RelationshipElement", - "AnnotatedRelationshipElement", - "Capability", - "BasicEvent", - "Entity", - "SubmodelElementCollection"}; - - public static string[] IdentifiableElements = new string[] { - "Asset", - "AssetAdministrationShell", - "ConceptDescription", - "Submodel" }; - - // use this in list to designate all of the above elements - public static string AllElements = "All"; - - // use this in list to designate the GlobalReference - // Resharper disable MemberHidesStaticFromOuterClass - public static string GlobalReference = "GlobalReference"; - public static string FragmentReference = "FragmentReference"; - public static string ConceptDescription = "ConceptDescription"; - public static string SubmodelRef = "SubmodelRef"; - public static string Submodel = "Submodel"; - public static string SubmodelElement = "SubmodelElement"; - public static string Asset = "Asset"; - public static string AAS = "AssetAdministrationShell"; - public static string Entity = "Entity"; - public static string View = "View"; - // Resharper enable MemberHidesStaticFromOuterClass - - public static string[] IdentifierTypeNames = new string[] { - Identification.IdShort, "FragmentId", "Custom", Identification.IRDI, Identification.IRI }; - - public enum IdentifierType { IdShort = 0, FragmentId, Custom, IRDI, IRI }; - - public static string GetIdentifierTypeName(IdentifierType t) - { - return IdentifierTypeNames[(int)t]; - } - - public static string IdShort = "IdShort"; - public static string FragmentId = "FragmentId"; - public static string Custom = "Custom"; - - // some helpers - - public static bool IsInKeyElements(string ke) - { - var res = false; - foreach (var s in KeyElements) - if (s.Trim().ToLower() == ke.Trim().ToLower()) - res = true; - return res; - } - - public bool IsIdType(string[] value) - { - if (value == null || idType == null || idType.Trim() == "") - return false; - return value.Contains(idType.Trim()); - } - - public bool IsIdType(string value) - { - if (value == null || idType == null || idType.Trim() == "") - return false; - return value.Trim().Equals(idType.Trim()); - } - - public bool IsType(string value) - { - if (value == null || type == null || type.Trim() == "") - return false; - return value.Trim().ToLower().Equals(type.Trim().ToLower()); - } - - public bool IsAbsolute() - { - return IsType(Key.GlobalReference) - || IsType(Key.AAS) - || IsType(Key.Asset) - || IsType(Key.Submodel); - } - - public bool Matches( - string type, bool local, string idType, string id, MatchMode matchMode = MatchMode.Strict) - { - if (matchMode == MatchMode.Strict) - return this.type == type && this.local == local && this.idType == idType && this.value == id; - - if (matchMode == MatchMode.Relaxed) - return (this.type == type || this.type == Key.GlobalReference || type == Key.GlobalReference) - && this.idType == idType && this.value == id; - - if (matchMode == MatchMode.Identification) - return this.idType == idType && this.value == id; - - return false; - } - - public bool Matches(Identification id) - { - if (id == null) - return false; - return this.Matches(Key.GlobalReference, false, id.idType, id.id, MatchMode.Identification); - } - - public bool Matches(Key key, MatchMode matchMode = MatchMode.Strict) - { - if (key == null) - return false; - return this.Matches(key.type, key.local, key.idType, key.value, matchMode); - } - - // validation - - public static AasValidationAction Validate(AasValidationRecordList results, Key k, Referable container) - { - // access - if (results == null || container == null) - return AasValidationAction.No; - - var res = AasValidationAction.No; - - // check - if (k == null) - { - // violation case - results.Add(new AasValidationRecord( - AasValidationSeverity.SpecViolation, container, - "Key: is null", - () => - { - res = AasValidationAction.ToBeDeleted; - })); - } - else - { - // check IdType - var idf = AdminShellUtilV20.CheckIfInConstantStringArray(IdentifierTypeNames, k.idType); - if (idf == AdminShellUtilV20.ConstantFoundEnum.No) - // violation case - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, container, - "Key: idType is not in allowed enumeration values", - () => - { - k.idType = Custom; - })); - if (idf == AdminShellUtilV20.ConstantFoundEnum.AnyCase) - // violation case - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, container, - "Key: idType in wrong casing", - () => - { - k.idType = AdminShellUtilV20.CorrectCasingForConstantStringArray( - IdentifierTypeNames, k.idType); - })); - - // check type - var tf = AdminShellUtilV20.CheckIfInConstantStringArray(KeyElements, k.type); - if (tf == AdminShellUtilV20.ConstantFoundEnum.No) - // violation case - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, container, - "Key: type is not in allowed enumeration values", - () => - { - k.type = GlobalReference; - })); - if (tf == AdminShellUtilV20.ConstantFoundEnum.AnyCase) - // violation case - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, container, - "Key: type in wrong casing", - () => - { - k.idType = AdminShellUtilV20.CorrectCasingForConstantStringArray( - KeyElements, k.type); - })); - } - - // may give result "to be deleted" - return res; - } - } - - public class KeyList : List - { - // getters / setters - - [XmlIgnore] - public bool IsEmpty { get { return this.Count < 1; } } - - // constructors / creators - - public KeyList() { } - - public KeyList(KeyList src) - { - if (src != null) - foreach (var k in src) - this.Add(new Key(k)); - } - - public static KeyList CreateNew(Key k) - { - var kl = new KeyList { k }; - return kl; - } - - public static KeyList CreateNew(string type, bool local, string idType, string value) - { - var kl = new KeyList() { - Key.CreateNew(type, local, idType, value) - }; - return kl; - } - - public static KeyList CreateNew(string type, bool local, string idType, string[] valueItems) - { - // access - if (valueItems == null) - return null; - - // prepare - var kl = new AdminShell.KeyList(); - foreach (var x in valueItems) - kl.Add(new AdminShell.Key(type, local, idType, "" + x)); - return kl; - } - - // matches - - public bool Matches(KeyList other, Key.MatchMode matchMode = Key.MatchMode.Strict) - { - if (other == null || other.Count != this.Count) - return false; - - var same = true; - for (int i = 0; i < this.Count; i++) - same = same && this[i].Matches(other[i], matchMode); - - return same; - } - - // other - - public void NumberIndices() - { - for (int i = 0; i < this.Count; i++) - this[i].index = i; - } - - public string ToString(int format = 0, string delimiter = ",") - { - var res = string.Join(delimiter, this.Select((k) => k.ToString(format))); - return res; - } - - public static KeyList Parse(string input) - { - // access - if (input == null) - return null; - - // split - var parts = input.Split(',', ';'); - var kl = new KeyList(); - - foreach (var p in parts) - { - var k = Key.Parse(p); - if (k != null) - kl.Add(k); - } - - return kl; - } - - public string MostSignificantInfo() - { - if (this.Count < 1) - return "-"; - var i = this.Count - 1; - var res = this[i].value; - if (this[i].IsIdType(new[] { Key.FragmentId }) && i > 0) - res += this[i - 1].value; - return res; - } - - // validation - - public static void Validate(AasValidationRecordList results, KeyList kl, - Referable container) - { - // access - if (results == null || kl == null || container == null) - return; - - // iterate thru - var idx = 0; - while (idx < kl.Count) - { - var act = Key.Validate(results, kl[idx], container); - if (act == AasValidationAction.ToBeDeleted) - { - kl.RemoveAt(idx); - continue; - } - idx++; - } - } - - public bool StartsWith(KeyList head, bool emptyIsTrue = false, - Key.MatchMode matchMode = Key.MatchMode.Strict) - { - // access - if (head == null) - return false; - if (head.Count == 0) - return emptyIsTrue; - - // simply test element-wise - for (int i = 0; i < head.Count; i++) - { - // does head have more elements than this list? - if (i >= this.Count) - return false; - - if (!head[i].Matches(this[i], matchMode)) - return false; - } - - // ok! - return true; - } - - // arithmetics - - public static KeyList operator +(KeyList a, Key b) - { - var res = new KeyList(a); - if (b != null) - res.Add(b); - return res; - } - - public static KeyList operator +(KeyList a, KeyList b) - { - var res = new KeyList(a); - if (b != null) - res.AddRange(b); - return res; - } - - public KeyList SubList(int startPos, int count = int.MaxValue) - { - var res = new KeyList(); - if (startPos >= this.Count) - return res; - int nr = 0; - for (int i = startPos; i < this.Count && nr < count; i++) - { - nr++; - res.Add(this[i]); - } - return res; - } - - public KeyList ReplaceLastKey(KeyList newKeys) - { - var res = new KeyList(this); - if (res.Count < 1 || newKeys == null || newKeys.Count < 1) - return res; - - res.Remove(res.Last()); - res = res + newKeys; - - return res; - } - - // other - - /// - /// Take only idShort, ignore all other key-types and create a '/'-separated list - /// - /// Empty string or list of idShorts - public string BuildIdShortPath(int startPos = 0, int count = int.MaxValue) - { - if (startPos >= this.Count) - return ""; - int nr = 0; - var res = ""; - for (int i = startPos; i < this.Count && nr < count; i++) - { - nr++; - if (this[i].idType.Trim().ToLower() == Key.IdShort.Trim().ToLower()) - { - if (res != "") - res += "/"; - res += this[i].value; - } - } - return res; - } - } - - public class AasElementSelfDescription - { - public string ElementName = ""; - public string ElementAbbreviation = ""; - public SubmodelElementWrapper.AdequateElementEnum ElementEnum = - SubmodelElementWrapper.AdequateElementEnum.Unknown; - - public AasElementSelfDescription() { } - - public AasElementSelfDescription( - string ElementName, string ElementAbbreviation, - SubmodelElementWrapper.AdequateElementEnum elementEnum - = SubmodelElementWrapper.AdequateElementEnum.Unknown) - { - this.ElementName = ElementName; - this.ElementAbbreviation = ElementAbbreviation; - this.ElementEnum = elementEnum; - } - } - - /// - /// Extends understanding of Referable to further elements, which can be related to - /// - public interface IAasElement - { - AasElementSelfDescription GetSelfDescription(); - string GetElementName(); - } - - [XmlType(TypeName = "reference")] - public class Reference : IAasElement - { - - // members - - [XmlIgnore] // anyway, as it is private - [JsonIgnore] - private KeyList keys = new KeyList(); - - // getters / setters - - [XmlArray("keys")] - [XmlArrayItem("key")] - [JsonIgnore] - public KeyList Keys { get { return keys; } } - [XmlIgnore] - [JsonProperty(PropertyName = "keys")] - public KeyList JsonKeys - { - get - { - keys?.NumberIndices(); - return keys; - } - } - - [XmlIgnore] - [JsonIgnore] - public bool IsEmpty { get { return keys == null || keys.Count < 1; } } - [XmlIgnore] - [JsonIgnore] - public int Count { get { if (keys == null) return 0; return keys.Count; } } - [XmlIgnore] - [JsonIgnore] - public Key this[int index] { get { return keys[index]; } } - - [XmlIgnore] - [JsonIgnore] - public Key First { get { return this.Count < 1 ? null : this.keys[0]; } } - - [XmlIgnore] - [JsonIgnore] - public Key Last { get { return this.Count < 1 ? null : this.keys[this.keys.Count - 1]; } } - - // constructors / creators - - public Reference() - { - } - - public Reference(Key k) - { - if (k != null) - keys.Add(k); - } - - public Reference(Reference src) - { - if (src != null) - foreach (var k in src.Keys) - keys.Add(new Key(k)); - } - -#if !DoNotUseAasxCompatibilityModels - public Reference(AasxCompatibilityModels.AdminShellV10.Reference src) - { - if (src != null) - foreach (var k in src.Keys) - keys.Add(new Key(k)); - } -#endif - - public Reference(SemanticId src) - { - if (src != null) - foreach (var k in src.Keys) - keys.Add(new Key(k)); - } - -#if !DoNotUseAasxCompatibilityModels - public Reference(AasxCompatibilityModels.AdminShellV10.SemanticId src) - { - if (src != null) - foreach (var k in src.Keys) - keys.Add(new Key(k)); - } -#endif - public static Reference CreateNew(Key k) - { - if (k == null) - return null; - var r = new Reference(); - r.keys.Add(k); - return r; - } - - public static Reference CreateNew(List k) - { - if (k == null) - return null; - var r = new Reference(); - r.keys.AddRange(k); - return r; - } - - public static Reference CreateNew(string type, bool local, string idType, string value) - { - if (type == null || idType == null || value == null) - return null; - var r = new Reference(); - r.keys.Add(Key.CreateNew(type, local, idType, value)); - return r; - } - - public static Reference CreateIrdiReference(string irdi) - { - if (irdi == null) - return null; - var r = new Reference(); - r.keys.Add(new Key(Key.GlobalReference, false, Identification.IRDI, irdi)); - return r; - } - - // additions - - public static Reference operator +(Reference a, Key b) - { - var res = new Reference(a); - res.Keys?.Add(b); - return res; - } - - public static Reference operator +(Reference a, Reference b) - { - var res = new Reference(a); - res.Keys?.AddRange(b?.Keys); - return res; - } - - // further - - public Key GetAsExactlyOneKey() - { - if (keys == null || keys.Count != 1) - return null; - var k = keys[0]; - return new Key(k.type, k.local, k.idType, k.value); - } - - public bool MatchesExactlyOneKey( - string type, bool local, string idType, string id, Key.MatchMode matchMode = Key.MatchMode.Strict) - { - if (keys == null || keys.Count != 1) - return false; - var k = keys[0]; - return k.Matches(type, local, idType, id, matchMode); - } - - public bool MatchesExactlyOneKey(Key key, Key.MatchMode matchMode = Key.MatchMode.Strict) - { - if (key == null) - return false; - return this.MatchesExactlyOneKey(key.type, key.local, key.idType, key.value, matchMode); - } - - public bool Matches( - string type, bool local, string idType, string id, Key.MatchMode matchMode = Key.MatchMode.Strict) - { - if (this.Count == 1) - { - var k = keys[0]; - return k.Matches(type, local, idType, id, matchMode); - } - return false; - } - - public bool Matches(Key key, Key.MatchMode matchMode = Key.MatchMode.Strict) - { - if (this.Count == 1) - { - var k = keys[0]; - return k.Matches(key, matchMode); - } - return false; - } - - public bool Matches(Identification other) - { - if (other == null) - return false; - if (this.Count == 1) - { - var k = keys[0]; - return k.Matches(Key.GlobalReference, false, other.idType, other.id, Key.MatchMode.Identification); - } - return false; - } - - public bool Matches(Reference other, Key.MatchMode matchMode = Key.MatchMode.Strict) - { - if (this.keys == null || other == null || other.keys == null || other.Count != this.Count) - return false; - - var same = true; - for (int i = 0; i < this.Count; i++) - same = same && this.keys[i].Matches(other.keys[i], matchMode); - - return same; - } - - public bool Matches(SemanticId other, Key.MatchMode matchMode = Key.MatchMode.Strict) - { - return Matches(new Reference(other), matchMode); - } - - public bool Matches(ConceptDescription cd, Key.MatchMode matchMode = Key.MatchMode.Strict) - { - return Matches(cd?.GetReference(), matchMode); - } - - public string ToString(int format = 0, string delimiter = ",") - { - return keys?.ToString(format, delimiter); - } - - public static Reference Parse(string input) - { - return CreateNew(KeyList.Parse(input)); - } - - public string ListOfValues(string delim) - { - string res = ""; - if (this.Keys != null) - foreach (var x in this.Keys) - { - if (x == null) - continue; - if (res != "") res += delim; - res += x.value; - } - return res; - } - - // self description - - public virtual AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("Reference", "Rfc"); - } - - public virtual string GetElementName() - { - return this.GetSelfDescription()?.ElementName; - } - } - - [XmlType(TypeName = "derivedFrom")] - public class AssetAdministrationShellRef : Reference - { - // constructors - - public AssetAdministrationShellRef() : base() { } - - public AssetAdministrationShellRef(Key k) : base(k) { } - - public AssetAdministrationShellRef(Reference src) : base(src) { } - -#if !DoNotUseAasxCompatibilityModels - public AssetAdministrationShellRef(AasxCompatibilityModels.AdminShellV10.Reference src) : base(src) { } -#endif - - // further methods - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("AssetAdministrationShellRef", "AasRef"); - } - } - - [XmlType(TypeName = "assetRef")] - public class AssetRef : Reference - { - // constructors - - public AssetRef() : base() { } - - public AssetRef(AssetRef src) : base(src) { } - -#if !DoNotUseAasxCompatibilityModels - public AssetRef(AasxCompatibilityModels.AdminShellV10.AssetRef src) : base(src) { } -#endif - - public AssetRef(Reference r) - : base(r) - { - } - - // further methods - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("AssetRef", "AssetRef"); - } - } - - [XmlType(TypeName = "submodelRef")] - public class SubmodelRef : Reference - { - // constructors - - public SubmodelRef() : base() { } - - public SubmodelRef(SubmodelRef src) : base(src) { } - - public SubmodelRef(Reference src) : base(src) { } - -#if !DoNotUseAasxCompatibilityModels - public SubmodelRef(AasxCompatibilityModels.AdminShellV10.SubmodelRef src) : base(src) { } -#endif - - public new static SubmodelRef CreateNew(string type, bool local, string idType, string value) - { - var r = new SubmodelRef(); - r.Keys.Add(Key.CreateNew(type, local, idType, value)); - return r; - } - - public static SubmodelRef CreateNew(Reference src) - { - if (src == null || src.Keys == null) - return null; - var r = new SubmodelRef(); - r.Keys.AddRange(src.Keys); - return r; - } - - // further methods - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("SubmodelRef", "SMRef"); - } - } - - [XmlType(TypeName = "conceptDescriptionRef")] - public class ConceptDescriptionRef : Reference - { - // constructors - - public ConceptDescriptionRef() : base() { } - - public ConceptDescriptionRef(ConceptDescriptionRef src) : base(src) { } - -#if !DoNotUseAasxCompatibilityModels - public ConceptDescriptionRef( - AasxCompatibilityModels.AdminShellV10.ConceptDescriptionRef src) : base(src) { } -#endif - - // further methods - - public new static ConceptDescriptionRef CreateNew(string type, bool local, string idType, string value) - { - var r = new ConceptDescriptionRef(); - r.Keys.Add(Key.CreateNew(type, local, idType, value)); - return r; - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("ConceptDescriptionRef", "CDRef"); - } - - } - - [XmlType(TypeName = "dataSpecificationRef")] - public class DataSpecificationRef : Reference - { - // constructors - - public DataSpecificationRef() : base() { } - - public DataSpecificationRef(DataSpecificationRef src) : base(src) { } - - public DataSpecificationRef(Reference src) : base(src) { } - -#if !DoNotUseAasxCompatibilityModels - public DataSpecificationRef(AasxCompatibilityModels.AdminShellV10.DataSpecificationRef src) : base(src) { } - - public DataSpecificationRef(AasxCompatibilityModels.AdminShellV10.Reference src) : base(src) { } -#endif - - // further methods - - public static DataSpecificationRef CreateNew(Reference src) - { - if (src == null || src.Keys == null) - return null; - var res = new DataSpecificationRef(); - foreach (var k in src.Keys) - res.Keys.Add(new Key(k)); - return res; - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("DataSpecificationRef", "DSRef"); - } - - } - - [XmlType(TypeName = "conceptDescriptions")] - public class ConceptDescriptionRefs - { - [XmlElement(ElementName = "conceptDescriptionRef")] - public List conceptDescriptions = new List(); - - // constructors - - public ConceptDescriptionRefs() { } - - public ConceptDescriptionRefs(ConceptDescriptionRefs src) - { - if (src.conceptDescriptions != null) - foreach (var cdr in src.conceptDescriptions) - this.conceptDescriptions.Add(new ConceptDescriptionRef(cdr)); - } - -#if !DoNotUseAasxCompatibilityModels - public ConceptDescriptionRefs(AasxCompatibilityModels.AdminShellV10.ConceptDescriptionRefs src) - { - if (src.conceptDescriptions != null) - foreach (var cdr in src.conceptDescriptions) - this.conceptDescriptions.Add(new ConceptDescriptionRef(cdr)); - } -#endif - } - - [XmlType(TypeName = "containedElementRef")] - public class ContainedElementRef : Reference - { - // constructors - - public ContainedElementRef() { } - - public ContainedElementRef(ContainedElementRef src) : base(src) { } - -#if !DoNotUseAasxCompatibilityModels - public ContainedElementRef(AasxCompatibilityModels.AdminShellV10.ContainedElementRef src) : base(src) { } -#endif - - public static ContainedElementRef CreateNew(Reference src) - { - if (src == null || src.Keys == null) - return null; - var r = new ContainedElementRef(); - r.Keys.AddRange(src.Keys); - return r; - } - - // further methods - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("ContainedElementRef", "CERef"); - } - - } - -#if __not_valid_anymore - [XmlType(TypeName = "hasDataSpecification")] - public class HasDataSpecification - { - [XmlElement(ElementName = "reference")] // make "reference" go away by magic?! - public List reference = new List(); - - public HasDataSpecification() { } - - public HasDataSpecification(HasDataSpecification src) - { - foreach (var r in src.reference) - reference.Add(new Reference(r)); - } - -#if !DoNotUseAasxCompatibilityModels - public HasDataSpecification(AasxCompatibilityModels.AdminShellV10.HasDataSpecification src) - { - foreach (var r in src.reference) - reference.Add(new Reference(r)); - } -#endif - } -#else - // Note: In versions prior to V2.0.1, the SDK has "HasDataSpecification" containing only a Reference. - // Iv 2.0.1, theoretically each entity with HasDataSpecification could also conatin a - // EmbeddedDataSpecification. - - [XmlType(TypeName = "hasDataSpecification")] - public class HasDataSpecification : List - { - public HasDataSpecification() { } - - public HasDataSpecification(HasDataSpecification src) - { - foreach (var r in src) - this.Add(new EmbeddedDataSpecification(r)); - } - - public HasDataSpecification(IEnumerable src) - { - foreach (var r in src) - this.Add(new EmbeddedDataSpecification(r)); - } - -#if !DoNotUseAasxCompatibilityModels - public HasDataSpecification(AasxCompatibilityModels.AdminShellV10.HasDataSpecification src) - { - foreach (var r in src.reference) - this.Add(new EmbeddedDataSpecification(r)); - } -#endif - - // make some explicit and easy to use getter, setters - - [XmlIgnore] - [JsonIgnore] - public EmbeddedDataSpecification IEC61360 - { - get - { - foreach (var eds in this) - if (eds?.dataSpecificationContent?.dataSpecificationIEC61360 != null - || eds?.dataSpecification?.MatchesExactlyOneKey( - DataSpecificationIEC61360.GetKey(), Key.MatchMode.Identification) == true) - return eds; - return null; - } - set - { - // search existing first? - var eds = this.IEC61360; - if (eds != null) - { - // replace this - /* TODO (MIHO, 2020-08-30): this does not prevent the corner case, that we could have - * multiple dataSpecificationIEC61360 in this list, which would be an error */ - this.Remove(eds); - this.Add(value); - return; - } - - // no? .. add! - this.Add(value); - } - } - - [XmlIgnore] - [JsonIgnore] - public DataSpecificationIEC61360 IEC61360Content - { - get - { - return this.IEC61360?.dataSpecificationContent?.dataSpecificationIEC61360; - } - set - { - // search existing first? - var eds = this.IEC61360; - if (eds != null) - { - // replace this - eds.dataSpecificationContent.dataSpecificationIEC61360 = value; - return; - } - // no? .. add! - var edsnew = new EmbeddedDataSpecification(); - edsnew.dataSpecificationContent.dataSpecificationIEC61360 = value; - this.Add(edsnew); - } - } - - } -#endif - - [XmlType(TypeName = "ContainedElements")] - public class ContainedElements - { - - // members - - [XmlElement(ElementName = "containedElementRef")] // make "reference" go away by magic?! - public List reference = new List(); - - // getter / setter - - public bool IsEmpty { get { return reference == null || reference.Count < 1; } } - public int Count { get { if (reference == null) return 0; return reference.Count; } } - public ContainedElementRef this[int index] { get { return reference[index]; } } - - // Creators - - public ContainedElements() { } - - public ContainedElements(ContainedElements src) - { - if (src.reference != null) - foreach (var r in src.reference) - this.reference.Add(new ContainedElementRef(r)); - } - -#if !DoNotUseAasxCompatibilityModels - public ContainedElements(AasxCompatibilityModels.AdminShellV10.ContainedElements src) - { - if (src.reference != null) - foreach (var r in src.reference) - this.reference.Add(new ContainedElementRef(r)); - } -#endif - - public static ContainedElements CreateOrSetInner(ContainedElements outer, ContainedElementRef[] inner) - { - var res = outer; - if (res == null) - res = new ContainedElements(); - if (inner == null) - { - res.reference = null; - return res; - } - res.reference = new List(inner); - return res; - } - - } - - [XmlType(TypeName = "langString", Namespace = "http://www.admin-shell.io/2/0")] - public class LangStr - { - // constants - public static string LANG_DEFAULT = "en"; - - // members - - [MetaModelName("LangStr.lang")] - [TextSearchable] - [XmlAttribute(Namespace = "http://www.admin-shell.io/2/0")] - [JsonProperty(PropertyName = "language")] - [CountForHash] - public string lang = ""; - - [MetaModelName("LangStr.str")] - [TextSearchable] - [XmlText] - [JsonProperty(PropertyName = "text")] - [CountForHash] - public string str = ""; - - // constructors - - public LangStr() { } - - public LangStr(LangStr src) - { - this.lang = src.lang; - this.str = src.str; - } - -#if !DoNotUseAasxCompatibilityModels - public LangStr(AasxCompatibilityModels.AdminShellV10.LangStr src) - { - this.lang = src.lang; - this.str = src.str; - } -#endif - - public LangStr(string lang, string str) - { - this.lang = lang; - this.str = str; - } - - public static ListOfLangStr CreateManyFromStringArray(string[] s) - { - var r = new ListOfLangStr(); - var i = 0; - while ((i + 1) < s.Length) - { - r.Add(new LangStr(s[i], s[i + 1])); - i += 2; - } - return r; - } - - public override string ToString() - { - return $"{str}@{lang}"; - } - } - - public class ListOfLangStr : List - { - public ListOfLangStr() { } - - public ListOfLangStr(LangStr ls) - { - if (ls != null) - this.Add(ls); - } - - public ListOfLangStr(ListOfLangStr src) - { - if (src != null) - foreach (var ls in src) - this.Add(ls); - } - - public string this[string lang] - { - get - { - return GetDefaultStr(lang); - } - set - { - foreach (var ls in this) - if (ls.lang.Trim().ToLower() == lang?.Trim().ToLower()) - { - ls.str = value; - return; - } - this.Add(new LangStr(lang, value)); - } - } - - public string GetDefaultStr(string defaultLang = null) - { - // start - if (defaultLang == null) - defaultLang = LangStr.LANG_DEFAULT; - defaultLang = defaultLang.Trim().ToLower(); - string res = null; - - // search - foreach (var ls in this) - if (ls.lang.Trim().ToLower() == defaultLang) - res = ls.str; - if (res == null && this.Count > 0) - res = this[0].str; - - // found? - return res; - } - - public string GetExactStrForLang(string lang) - { - // start - if (lang == null) - return null; - string res = null; - - // exact search - foreach (var ls in this) - if (ls.lang.Trim().ToLower() == lang) - res = ls.str; - - // found? - return res; - } - - public bool ContainsLang(string lang) - { - return GetExactStrForLang(lang) != null; - } - - public bool AllLangSameString() - { - if (this.Count < 2) - return true; - - for (int i = 1; i < this.Count; i++) - if (this[0]?.str != null && this[0]?.str?.Trim() != this[i]?.str?.Trim()) - return false; - - return true; - } - - public override string ToString() - { - return string.Join(", ", this.Select((ls) => ls.ToString())); - } - - public static ListOfLangStr Parse(string cell) - { - // access - if (cell == null) - return null; - - // iterative approach - var res = new ListOfLangStr(); - while (true) - { - // trivial case and finite end - if (!cell.Contains("@")) - { - if (cell.Trim() != "") - res.Add(new LangStr(LangStr.LANG_DEFAULT, cell)); - break; - } - - // OK, pick the next couple - var m = Regex.Match(cell, @"(.*?)@(\w+)", RegexOptions.Singleline); - if (!m.Success) - { - // take emergency exit? - res.Add(new LangStr("??", cell)); - break; - } - - // use the match and shorten cell .. - res.Add(new LangStr(m.Groups[2].ToString(), m.Groups[1].ToString().Trim())); - cell = cell.Substring(m.Index + m.Length); - } - - return res; - } - } - - public class Description - { - - // members - - [XmlElement(ElementName = "langString")] - public ListOfLangStr langString = new ListOfLangStr(); - - // constructors - - public Description() { } - - public Description(Description src) - { - if (src != null && src.langString != null) - foreach (var ls in src.langString) - langString.Add(new LangStr(ls)); - } - - public Description(LangStringSet src) - { - if (src != null && src.langString != null) - foreach (var ls in src.langString) - langString.Add(new LangStr(ls)); - } - -#if !DoNotUseAasxCompatibilityModels - public Description(AasxCompatibilityModels.AdminShellV10.Description src) - { - if (src != null) - foreach (var ls in src.langString) - langString.Add(new LangStr(ls)); - } -#endif - - // single string representation - public string GetDefaultStr(string defaultLang = null) - { - return this.langString?.GetDefaultStr(defaultLang); - } - - } - - public class AssetKind - { - // constants - public static string Type = "Type"; - public static string Instance = "Instance"; - - [MetaModelName("AssetKind.kind")] - [TextSearchable] - [XmlText] - [CountForHash] - public string kind = "Instance"; - - // getters / setters - - [XmlIgnore] - [JsonIgnore] - public bool IsInstance { get { return kind == null || kind.Trim().ToLower() == "instance"; } } - - [XmlIgnore] - [JsonIgnore] - public bool IsType { get { return kind != null && kind.Trim().ToLower() == "type"; } } - - // constructors / creators - - public AssetKind() { } - - public AssetKind(AssetKind src) - { - kind = src.kind; - } - -#if !DoNotUseAasxCompatibilityModels - public AssetKind(AasxCompatibilityModels.AdminShellV10.Kind src) - { - kind = src.kind; - } -#endif - - public AssetKind(string kind) - { - this.kind = kind; - } - - public static AssetKind CreateAsType() - { - var res = new AssetKind() { kind = AssetKind.Type }; - return res; - } - - public static AssetKind CreateAsInstance() - { - var res = new AssetKind() { kind = AssetKind.Instance }; - return res; - } - } - - public class ModelingKind - { - // constants - public static string Template = "Template"; - public static string Instance = "Instance"; - - [MetaModelName("ModelingKind.kind")] - [TextSearchable] - [XmlText] - [CountForHash] - public string kind = Instance; - - // getters / setters - - [XmlIgnore] - [JsonIgnore] - public bool IsInstance { get { return kind == null || kind.Trim().ToLower() == Instance.ToLower(); } } - - [XmlIgnore] - [JsonIgnore] - public bool IsTemplate { get { return kind != null && kind.Trim().ToLower() == Template.ToLower(); } } - - // constructors / creators - - public ModelingKind() { } - - public ModelingKind(ModelingKind src) - { - kind = src.kind; - } - -#if !DoNotUseAasxCompatibilityModels - public ModelingKind(AasxCompatibilityModels.AdminShellV10.Kind src) - { - kind = src.kind; - } -#endif - - public ModelingKind(string kind) - { - this.kind = kind; - } - - public static ModelingKind CreateAsTemplate() - { - var res = new ModelingKind() { kind = Template }; - return res; - } - - public static ModelingKind CreateAsInstance() - { - var res = new ModelingKind() { kind = Instance }; - return res; - } - - // validation - - public static void Validate(AasValidationRecordList results, ModelingKind mk, Referable container) - { - // access - if (results == null || container == null) - return; - - // check - if (mk == null || mk.kind == null) - { - // warning - results.Add(new AasValidationRecord( - AasValidationSeverity.Warning, container, - "ModelingKind: is null", - () => - { - })); - } - else - { - var k = mk.kind.Trim(); - var kl = k.ToLower(); - if (kl != Template.ToLower() && kl != Instance.ToLower()) - { - // violation case - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, container, - $"ModelingKind: enumeration value neither {Template} nor {Instance}", - () => - { - mk.kind = Instance; - })); - } - else if (k != Template && k != Instance) - { - // warning - results.Add(new AasValidationRecord( - AasValidationSeverity.Warning, container, - "ModelingKind: enumeration value in wrong casing", - () => - { - if (kl == Template.ToLower()) - mk.kind = Template; - else - mk.kind = Instance; - })); - } - } - } - } - - public class SemanticId : Reference - { - - // constructors / creators - - public SemanticId() - : base() - { - } - - public SemanticId(SemanticId src) - : base(src) - { - } - - public SemanticId(Reference src) : base(src) { } - -#if !DoNotUseAasxCompatibilityModels - public SemanticId(AasxCompatibilityModels.AdminShellV10.SemanticId src) - : base(src) - { - } -#endif - public SemanticId(Key key) : base(key) { } - - public static SemanticId CreateFromKey(Key key) - { - if (key == null) - return null; - var res = new SemanticId(); - res.Keys.Add(key); - return res; - } - - public static SemanticId CreateFromKeys(List keys) - { - if (keys == null) - return null; - var res = new SemanticId(); - res.Keys.AddRange(keys); - return res; - } - - public new static SemanticId Parse(string input) - { - return (SemanticId)CreateNew(KeyList.Parse(input)); - } - } - - /// - /// This class allows to describe further data (in derived classes) when enumerating Children. - /// - public class EnumerationPlacmentBase - { - } - - public interface IEnumerateChildren - { - IEnumerable EnumerateChildren(); - EnumerationPlacmentBase GetChildrenPlacement(SubmodelElement child); - object AddChild(SubmodelElementWrapper smw, EnumerationPlacmentBase placement = null); - } - - public interface IValidateEntity - { - void Validate(AasValidationRecordList results); - } - - /// - /// This attribute indicates, that it should e.g. serialized in JSON. - /// - [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = true)] - public class CountForHash : System.Attribute - { - } - - /// - /// This attribute indicates, that evaluation shall not count following field or not dive into references. - /// - [System.AttributeUsage(System.AttributeTargets.Field, AllowMultiple = true)] - public class SkipForHash : System.Attribute - { - } - - /// - /// This attribute indicates, that the field / property is searchable - /// - [System.AttributeUsage(System.AttributeTargets.Field | System.AttributeTargets.Property, AllowMultiple = true)] - public class MetaModelName : System.Attribute - { - public string name; - public MetaModelName(string name) - { - this.name = name; - } - } - - /// - /// This attribute indicates, that the field / property shall be skipped for reflection - /// in order to avoid cycles - /// - [System.AttributeUsage(System.AttributeTargets.Field | System.AttributeTargets.Property, AllowMultiple = true)] - public class SkipForReflection : System.Attribute - { - } - - /// - /// This attribute indicates, that the field / property shall be skipped for searching, because it is not - /// directly displayed in Package Explorer - /// - [System.AttributeUsage(System.AttributeTargets.Field | System.AttributeTargets.Property, AllowMultiple = true)] - public class SkipForSearch : System.Attribute - { - } - - /// - /// This attribute indicates, that the field / property is searchable - /// - [System.AttributeUsage(System.AttributeTargets.Field | System.AttributeTargets.Property, AllowMultiple = true)] - public class TextSearchable : System.Attribute - { - } - - /// - /// Result of FindReferable in Environment - /// - public class ReferableRootInfo - { - public AdministrationShell AAS = null; - public Asset Asset = null; - public Submodel Submodel = null; - - public int NrOfRootKeys = 0; - - public bool IsValid - { - get - { - return NrOfRootKeys > 0 && (AAS != null || Submodel != null || Asset != null); - } - } - } - - /// - /// Marks an object, preferaby a payload item, which might be featured by the diary collection - /// - public interface IAasDiaryEntry - { - } - - public class DiaryDataDef - { - public enum TimeStampKind { Create, Update } - - [XmlIgnore] - [JsonIgnore] - private DateTime[] _timeStamp = new DateTime[2]; - - [XmlIgnore] - [JsonIgnore] - public DateTime[] TimeStamp { get { return _timeStamp; } } - - /// - /// List of entries, timewise one after each other (entries are timestamped). - /// Note: Default is Entries = null, as handling of many many AAS elements does not - /// create additional overhead of creating empty lists. An empty list shall be avoided. - /// - public List Entries = null; - - public static void AddAndSetTimestamps(Referable element, IAasDiaryEntry de, bool isCreate = false) - { - // trivial - if (element == null || de == null || element.DiaryData == null) - return; - - // add entry - if (element.DiaryData.Entries == null) - element.DiaryData.Entries = new List(); - element.DiaryData.Entries.Add(de); - - // figure out which timestamp - var tsk = TimeStampKind.Update; - if (isCreate) - { - tsk = TimeStampKind.Create; - } - - // set this timestamp (and for the parents, as well) - IDiaryData el = element; - while (el?.DiaryData != null) - { - // itself - el.DiaryData.TimeStamp[(int)tsk] = DateTime.UtcNow; - - // go up - el = (el as Referable)?.parent as IDiaryData; - } - } - } - - public interface IDiaryData - { - DiaryDataDef DiaryData { get; } - } - - public class ListOfReferable : List - { - // conversion to other list - - public KeyList ToKeyList() - { - var res = new KeyList(); - foreach (var rf in this) - res.Add(rf.ToKey()); - return res; - } - - public Reference GetReference() - { - return Reference.CreateNew(ToKeyList()); - } - } - - public interface IRecurseOnReferables - { - void RecurseOnReferables( - object state, Func lambda, - bool includeThis = false); - } - - public class Referable : IValidateEntity, IAasElement, IDiaryData, IGetReference, IRecurseOnReferables - { - // diary - - [XmlIgnore] - [JsonIgnore] - [SkipForHash] - [SkipForReflection] - private DiaryDataDef _diaryData = new DiaryDataDef(); - - [XmlIgnore] - [JsonIgnore] - [SkipForReflection] - public DiaryDataDef DiaryData { get { return _diaryData; } } - - // members - - [MetaModelName("Referable.IdShort")] - [TextSearchable] - [CountForHash] - public string idShort = ""; - - [MetaModelName("Referable.category")] - [TextSearchable] - [CountForHash] - public string category = null; - - [XmlElement(ElementName = "description")] - [JsonIgnore] - [CountForHash] - public Description description = null; - - [XmlIgnore] - [JsonProperty(PropertyName = "descriptions")] - public ListOfLangStr JsonDescription - { - get - { - return description?.langString; - } - set - { - if (value == null) - { - description = null; - return; - } - - if (description == null) - description = new Description(); - description.langString = value; - } - } - - [XmlIgnore] - [JsonIgnore] - [SkipForHash] // important to skip, as recursion elsewise will go in cycles! - [SkipForReflection] // important to skip, as recursion elsewise will go in cycles! - public IAasElement parent = null; - - public static string CONSTANT = "CONSTANT"; - public static string Category_PARAMETER = "PARAMETER"; - public static string VARIABLE = "VARIABLE"; - - public static string[] ReferableCategoryNames = new string[] { CONSTANT, Category_PARAMETER, VARIABLE }; - - // constructors - - public Referable() { } - - public Referable(string idShort) - { - this.idShort = idShort; - } - - public Referable(Referable src) - { - if (src == null) - return; - this.idShort = src.idShort; - this.category = src.category; - if (src.description != null) - this.description = new Description(src.description); - } - -#if !DoNotUseAasxCompatibilityModels - public Referable(AasxCompatibilityModels.AdminShellV10.Referable src) - { - if (src == null) - return; - this.idShort = src.idShort; - if (this.idShort == null) - // change in V2.0 -> mandatory - this.idShort = ""; - this.category = src.category; - if (src.description != null) - this.description = new Description(src.description); - } -#endif - - /// - /// Introduced for JSON serialization, can create Referables based on a string name - /// - /// string name (standard PascalCased) - public static Referable CreateAdequateType(string elementName) - { - if (elementName == Key.AAS) - return new AdministrationShell(); - if (elementName == Key.Asset) - return new Asset(); - if (elementName == Key.ConceptDescription) - return new ConceptDescription(); - if (elementName == Key.Submodel) - return new Submodel(); - if (elementName == Key.View) - return new View(); - return SubmodelElementWrapper.CreateAdequateType(elementName); - } - - public void AddDescription(string lang, string str) - { - if (description == null) - description = new Description(); - description.langString.Add(new LangStr(lang, str)); - } - - public virtual AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("Referable", "Ref"); - } - - public virtual string GetElementName() - { - return this.GetSelfDescription()?.ElementName; - } - - public string GetFriendlyName() - { - return AdminShellUtilV20.FilterFriendlyName(this.idShort); - } - - public virtual Reference GetReference(bool includeParents = true) - { - return new Reference( - new AdminShell.Key( - this.GetElementName(), false, Key.IdShort, "" + this.idShort)); - } - - public void CollectReferencesByParent(List refs) - { - // access - if (refs == null) - return; - - // check, if this is identifiable - if (this is Identifiable) - { - var idf = this as Identifiable; - if (idf != null) - { - var k = Key.CreateNew( - idf.GetElementName(), true, idf.identification?.idType, idf.identification?.id); - refs.Insert(0, k); - } - } - else - { - var k = Key.CreateNew(this.GetElementName(), true, "IdShort", this.idShort); - refs.Insert(0, k); - // recurse upwards! - if (this.parent is Referable prf) - prf.CollectReferencesByParent(refs); - } - } - - public string CollectIdShortByParent() - { - // recurse first - var head = ""; - if (!(this is Identifiable) && this.parent is Referable prf) - // can go up - head = prf.CollectIdShortByParent() + "/"; - // add own - var myid = ""; - if (this.idShort != null && this.idShort.Trim() != "") - myid = this.idShort.Trim(); - // together - return head + myid; - } - - // string functions - - public string ToIdShortString() - { - if (this.idShort == null || this.idShort.Trim().Length < 1) - return (""); - return this.idShort.Trim(); - } - - public override string ToString() - { - return "" + this.idShort; - } - - public virtual Key ToKey() - { - return new Key(GetElementName(), true, Key.IdShort, idShort); - } - - // hash functionality - - public class ObjectFieldInfo - { - public object o; - public FieldInfo fi; - public ObjectFieldInfo() { } - public ObjectFieldInfo(object o, FieldInfo fi) - { - this.o = o; - this.fi = fi; - } - } - - public List RecursivelyFindFields(object o, Type countAttribute, Type skipAttribute) - { - // access - var res = new List(); - if (o == null || countAttribute == null) - return res; - - // find fields for this object - var t = o.GetType(); - var l = t.GetFields(BindingFlags.Instance | BindingFlags.Public); - foreach (var f in l) - { - // Skip this field?? - if (skipAttribute != null && f.GetCustomAttribute(skipAttribute) != null) - continue; - - // add directly? - if (f.GetCustomAttribute(countAttribute) != null) - res.Add(new ObjectFieldInfo(o, f)); - - // object - if (f.FieldType.IsClass) - { - var oo = f.GetValue(o); - var r = RecursivelyFindFields(oo, countAttribute, skipAttribute); - res.AddRange(r); - } - - // try cast in IList to check further - var elems = f.GetValue(o) as IList; - if (elems != null) - foreach (var e in elems) - { - var r = RecursivelyFindFields(e, countAttribute, skipAttribute); - res.AddRange(r); - } - - } - // OK - return res; - } - - public byte[] ComputeByteArray() - { - // use memory stream for effcient behaviour - var mems = new MemoryStream(); - - // TEST - var xxx = RecursivelyFindFields(this, typeof(CountForHash), typeof(SkipForHash)); - - foreach (var ofi in xxx) - { - var a = ofi.fi.GetCustomAttribute(); - if (a != null) - { - // found an accountable field, get bytes - var o = ofi.fi.GetValue(ofi.o); - byte[] bs = null; - - // optimize for probabilities - - if (o is string) - bs = System.Text.Encoding.UTF8.GetBytes((string)o); - else if (o is char[]) - bs = System.Text.Encoding.UTF8.GetBytes((char[])o); - else if (o is double) - bs = BitConverter.GetBytes((double)o); - else if (o is float) - bs = BitConverter.GetBytes((float)o); - else if (o is char) - bs = BitConverter.GetBytes((char)o); - else if (o is byte) - bs = BitConverter.GetBytes((byte)o); - else if (o is int) - bs = BitConverter.GetBytes((int)o); - else if (o is long) - bs = BitConverter.GetBytes((long)o); - else if (o is short) - bs = BitConverter.GetBytes((short)o); - else if (o is uint) - bs = BitConverter.GetBytes((uint)o); - else if (o is ulong) - bs = BitConverter.GetBytes((ulong)o); - else if (o is ushort) - bs = BitConverter.GetBytes((ushort)o); - - if (bs != null) - mems.Write(bs, 0, bs.Length); - } - } - - return mems.ToArray(); - } - - private static System.Security.Cryptography.SHA256 HashProvider = - System.Security.Cryptography.SHA256.Create(); - - public string ComputeHashcode() - { - var dataBytes = this.ComputeByteArray(); - var hashBytes = Referable.HashProvider.ComputeHash(dataBytes); - - StringBuilder sb = new StringBuilder(); - foreach (var hb in hashBytes) - sb.Append(hb.ToString("X2")); - return sb.ToString(); - } - - // sorting - - public class ComparerIdShort : IComparer - { - public int Compare(Referable a, Referable b) - { - return String.Compare(a?.idShort, b?.idShort, - CultureInfo.InvariantCulture, CompareOptions.IgnoreCase); - } - } - - public class ComparerIndexed : IComparer - { - public int NullIndex = int.MaxValue; - public Dictionary Index = new Dictionary(); - - public int Compare(Referable a, Referable b) - { - var ca = Index.ContainsKey(a); - var cb = Index.ContainsKey(b); - - if (!ca && !cb) - return 0; - // make CDs without usage to appear at end of list - if (!ca) - return +1; - if (!cb) - return -1; - - var ia = Index[a]; - var ib = Index[b]; - - if (ia == ib) - return 0; - if (ia < ib) - return -1; - return +1; - } - } - - // validation - - public virtual void Validate(AasValidationRecordList results) - { - // access - if (results == null) - return; - - // check - if (this.idShort == null || this.idShort.Trim() == "") - results.Add(new AasValidationRecord( - AasValidationSeverity.SpecViolation, this, - "Referable: missing idShort", - () => - { - this.idShort = "TO_FIX"; - })); - - if (this.description != null && (this.description.langString == null - || this.description.langString.Count < 1)) - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, this, - "Referable: existing description with missing langString", - () => - { - this.description = null; - })); - } - - // hierarchy & recursion (by derived elements) - - public virtual void RecurseOnReferables( - object state, Func lambda, - bool includeThis = false) - { - if (includeThis) - lambda(state, null, this); - } - - public Identifiable FindParentFirstIdentifiable() - { - Referable curr = this; - while (curr != null) - { - if (curr is Identifiable curri) - return curri; - curr = curr.parent as Referable; - } - return null; - } - } - - public class Identifiable : Referable, IGetReference - { - - // members - - public Identification identification = new Identification(); - public Administration administration = null; - - // constructors - - public Identifiable() : base() { } - - public Identifiable(string idShort) : base(idShort) { } - - public Identifiable(Identifiable src) - : base(src) - { - if (src == null) - return; - if (src.identification != null) - this.identification = new Identification(src.identification); - if (src.administration != null) - this.administration = new Administration(src.administration); - } - -#if !DoNotUseAasxCompatibilityModels - public Identifiable(AasxCompatibilityModels.AdminShellV10.Identifiable src) - : base(src) - { - if (src.identification != null) - this.identification = new Identification(src.identification); - if (src.administration != null) - this.administration = new Administration(src.administration); - } -#endif - - public void SetIdentification(string idType, string id, string idShort = null) - { - identification.idType = idType; - identification.id = id; - if (idShort != null) - this.idShort = idShort; - } - - public void SetAdminstration(string version, string revision) - { - if (administration == null) - administration = new Administration(); - administration.version = version; - administration.revision = revision; - } - - public new string GetFriendlyName() - { - if (identification != null && identification.id != "") - return AdminShellUtilV20.FilterFriendlyName(this.identification.id); - return AdminShellUtilV20.FilterFriendlyName(this.idShort); - } - - public override string ToString() - { - return ("" + identification?.ToString() + " " + administration?.ToString()).Trim(); - } - - public override Key ToKey() - { - return new Key(GetElementName(), true, "" + identification?.idType, "" + identification?.id); - } - - // self description - - public override Reference GetReference(bool includeParents = true) - { - var r = new Reference(); - r.Keys.Add( - Key.CreateNew( - this.GetElementName(), true, this.identification.idType, this.identification.id)); - return r; - } - - // sorting - - public class ComparerIdentification : IComparer - { - public int Compare(Identifiable a, Identifiable b) - { - if (a?.identification == null && b?.identification == null) - return 0; - if (a?.identification == null) - return +1; - if (b?.identification == null) - return -1; - - var vc = String.Compare(a.identification.idType, b.identification.idType, - CultureInfo.InvariantCulture, CompareOptions.IgnoreCase); - if (vc != 0) - return vc; - - return String.Compare(a.identification.id, b.identification.id, - CultureInfo.InvariantCulture, CompareOptions.IgnoreCase | CompareOptions.IgnoreNonSpace); - } - } - - } - - public class JsonModelTypeWrapper - { - public string name = ""; - - public JsonModelTypeWrapper(string name = "") { this.name = name; } - } - - public interface IFindAllReferences - { - IEnumerable FindAllReferences(); - } - - public interface IGetSemanticId - { - SemanticId GetSemanticId(); - } - - public class AdministrationShell : Identifiable, IFindAllReferences - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // from hasDataSpecification: - [XmlElement(ElementName = "hasDataSpecification")] - public HasDataSpecification hasDataSpecification = null; - - // from this very class - public AssetAdministrationShellRef derivedFrom = null; - - [JsonProperty(PropertyName = "asset")] - public AssetRef assetRef = new AssetRef(); - - [JsonProperty(PropertyName = "submodels")] - [SkipForSearch] - public List submodelRefs = new List(); - - [JsonIgnore] - public Views views = null; - [XmlIgnore] - [JsonProperty(PropertyName = "views")] - public View[] JsonViews - { - get { return views?.views.ToArray(); } - set { views = Views.CreateOrSetInnerViews(views, value); } - } - - [JsonProperty(PropertyName = "conceptDictionaries")] - public List conceptDictionaries = null; - - // constructors - - public AdministrationShell() { } - - public AdministrationShell(string idShort) : base(idShort) { } - - public AdministrationShell(AdministrationShell src) - : base(src) - { - if (src != null) - { - if (src.hasDataSpecification != null) - this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - - if (src.derivedFrom != null) - this.derivedFrom = new AssetAdministrationShellRef(src.derivedFrom); - - if (src.assetRef != null) - this.assetRef = new AssetRef(src.assetRef); - - if (src.submodelRefs != null) - foreach (var smr in src.submodelRefs) - this.submodelRefs.Add(new SubmodelRef(smr)); - - if (src.views != null) - this.views = new Views(src.views); - - if (src.conceptDictionaries != null) - { - this.conceptDictionaries = new List(); - foreach (var cdd in src.conceptDictionaries) - this.conceptDictionaries.Add(new ConceptDictionary(cdd)); - } - } - } - -#if !DoNotUseAasxCompatibilityModels - public AdministrationShell(AasxCompatibilityModels.AdminShellV10.AdministrationShell src) - : base(src) - { - if (src.hasDataSpecification != null) - this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - - if (src.derivedFrom != null) - this.derivedFrom = new AssetAdministrationShellRef(src.derivedFrom); - - if (src.assetRef != null) - this.assetRef = new AssetRef(src.assetRef); - - if (src.submodelRefs != null) - foreach (var smr in src.submodelRefs) - this.submodelRefs.Add(new SubmodelRef(smr)); - - if (src.views != null) - this.views = new Views(src.views); - - if (src.conceptDictionaries != null) - { - this.conceptDictionaries = new List(); - foreach (var cdd in src.conceptDictionaries) - this.conceptDictionaries.Add(new ConceptDictionary(cdd)); - } - } -#endif - - public static AdministrationShell CreateNew( - string idShort, string idType, string id, string version = null, string revision = null) - { - var s = new AdministrationShell(); - s.idShort = idShort; - if (version != null) - s.SetAdminstration(version, revision); - s.identification.idType = idType; - s.identification.id = id; - return (s); - } - - // add - - public void AddView(View v) - { - if (views == null) - views = new Views(); - views.views.Add(v); - } - - public void AddConceptDictionary(ConceptDictionary d) - { - if (conceptDictionaries == null) - conceptDictionaries = new List(); - conceptDictionaries.Add(d); - } - - public void AddDataSpecification(Key k) - { - if (hasDataSpecification == null) - hasDataSpecification = new HasDataSpecification(); - var r = new Reference(); - r.Keys.Add(k); - hasDataSpecification.Add(new EmbeddedDataSpecification(r)); - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("AssetAdministrationShell", "AAS"); - } - - public Tuple ToCaptionInfo() - { - var caption = AdminShellUtilV20.EvalToNonNullString("\"{0}\" ", idShort, "\"AAS\""); - if (administration != null) - caption += "V" + administration.version + "." + administration.revision; - - var info = ""; - if (identification != null) - info = $"[{identification.idType}, {identification.id}]"; - return Tuple.Create(caption, info); - } - - public override string ToString() - { - var ci = ToCaptionInfo(); - return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); - } - - public SubmodelRef FindSubmodelRef(Identification refid) - { - if (this.submodelRefs == null) - return null; - foreach (var r in this.submodelRefs) - if (r.Matches(refid)) - return r; - return null; - } - - public bool HasSubmodelRef(SubmodelRef newref) - { - // check, if existing - if (this.submodelRefs == null) - return false; - var found = false; - foreach (var r in this.submodelRefs) - if (r.Matches(newref)) - found = true; - - return found; - } - - public void AddSubmodelRef(SubmodelRef newref) - { - if (this.submodelRefs == null) - this.submodelRefs = new List(); - this.submodelRefs.Add(newref); - } - - public IEnumerable FindAllReferences() - { - // Asset - if (this.assetRef != null) - yield return new LocatedReference(this, this.assetRef); - - // Submodel references - if (this.submodelRefs != null) - foreach (var r in this.submodelRefs) - yield return new LocatedReference(this, r); - - // Views - if (this.views?.views != null) - foreach (var vw in this.views.views) - if (vw?.containedElements?.reference != null) - foreach (var r in vw.containedElements.reference) - yield return new LocatedReference(this, r); - } - } - - public class ListOfAdministrationShells : List, IAasElement - { - // self decscription - - public AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("AssetAdministrationShells", "AASs"); - } - - public string GetElementName() - { - return this.GetSelfDescription()?.ElementName; - } - } - - public class Asset : Identifiable - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // from hasDataSpecification: - [XmlElement(ElementName = "hasDataSpecification")] - public HasDataSpecification hasDataSpecification = null; - - // from this very class - [XmlElement(ElementName = "assetIdentificationModelRef")] - public SubmodelRef assetIdentificationModelRef = null; - - [XmlElement(ElementName = "billOfMaterialRef")] - public SubmodelRef billOfMaterialRef = null; - - // from HasKind - [XmlElement(ElementName = "kind")] - [JsonIgnore] - public AssetKind kind = new AssetKind(); - [XmlIgnore] - [JsonProperty(PropertyName = "kind")] - public string JsonKind - { - get - { - if (kind == null) - return null; - return kind.kind; - } - set - { - if (kind == null) - kind = new AssetKind(); - kind.kind = value; - } - } - - // constructors - - public Asset() { } - - public Asset(string idShort) : base(idShort) { } - - public Asset(Asset src) - : base(src) - { - if (src != null) - { - if (src.hasDataSpecification != null) - this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - if (src.kind != null) - this.kind = new AssetKind(src.kind); - if (src.assetIdentificationModelRef != null) - this.assetIdentificationModelRef = new SubmodelRef(src.assetIdentificationModelRef); - } - } - -#if !DoNotUseAasxCompatibilityModels - public Asset(AasxCompatibilityModels.AdminShellV10.Asset src) - : base(src) - { - if (src != null) - { - if (src.hasDataSpecification != null) - this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - if (src.kind != null) - this.kind = new AssetKind(src.kind); - if (src.assetIdentificationModelRef != null) - this.assetIdentificationModelRef = new SubmodelRef(src.assetIdentificationModelRef); - } - } -#endif - - // Getter & setters - - public AssetRef GetAssetReference() - { - var r = new AssetRef(); - r.Keys.Add( - Key.CreateNew( - this.GetElementName(), true, this.identification.idType, this.identification.id)); - return r; - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("Asset", "Asset"); - } - - public Tuple ToCaptionInfo() - { - var caption = AdminShellUtilV20.EvalToNonNullString("\"{0}\" ", idShort, ""); - if (administration != null) - caption += "V" + administration.version + "." + administration.revision; - - var info = ""; - if (identification != null) - info = $"[{identification.idType}, {identification.id}]"; - return Tuple.Create(caption, info); - } - - public override string ToString() - { - var ci = ToCaptionInfo(); - return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); - } - - public IEnumerable FindAllReferences() - { - if (this.assetIdentificationModelRef != null) - yield return this.assetIdentificationModelRef; - if (this.billOfMaterialRef != null) - yield return this.billOfMaterialRef; - } - } - - public class ListOfAssets : List, IAasElement - { - // self decscription - - public AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("Assets", "Assets"); - } - - public string GetElementName() - { - return this.GetSelfDescription()?.ElementName; - } - - } - - public class View : Referable - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // members - - // from hasSemanticId: - [XmlElement(ElementName = "semanticId")] - public SemanticId semanticId = null; - - // from hasDataSpecification - [XmlElement(ElementName = "hasDataSpecification")] - public HasDataSpecification hasDataSpecification = null; - - // from this very class - [JsonIgnore] - [SkipForSearch] - public ContainedElements containedElements = null; - [XmlIgnore] - [SkipForSearch] - [JsonProperty(PropertyName = "containedElements")] - public ContainedElementRef[] JsonContainedElements - { - get { return containedElements?.reference.ToArray(); } - set { containedElements = ContainedElements.CreateOrSetInner(containedElements, value); } - } - - // getter / setter - - [XmlIgnore] - [JsonIgnore] - public bool IsEmpty { get { return containedElements == null || containedElements.Count < 1; } } - [XmlIgnore] - [JsonIgnore] - public int Count { get { if (containedElements == null) return 0; return containedElements.Count; } } - - public ContainedElementRef this[int index] - { - get { if (containedElements == null) return null; return containedElements[index]; } - } - - // constructors / creators - - public View() { } - - public View(View src) - : base(src) - { - if (src.semanticId != null) - this.semanticId = new SemanticId(src.semanticId); - if (src.hasDataSpecification != null) - this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - if (src.containedElements != null) - this.containedElements = new ContainedElements(src.containedElements); - } - -#if !DoNotUseAasxCompatibilityModels - public View(AasxCompatibilityModels.AdminShellV10.View src) - : base(src) - { - if (src.semanticId != null) - this.semanticId = new SemanticId(src.semanticId); - if (src.hasDataSpecification != null) - this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - if (src.containedElements != null) - this.containedElements = new ContainedElements(src.containedElements); - } -#endif - - public static View CreateNew(string idShort) - { - var v = new View() { idShort = idShort }; - return (v); - } - - public void AddDataSpecification(Key k) - { - if (hasDataSpecification == null) - hasDataSpecification = new HasDataSpecification(); - var r = new Reference(); - r.Keys.Add(k); - hasDataSpecification.Add(new EmbeddedDataSpecification(r)); - } - - public void AddContainedElement(Key k) - { - if (containedElements == null) - containedElements = new ContainedElements(); - var r = new ContainedElementRef(); - r.Keys.Add(k); - containedElements.reference.Add(r); - } - - public void AddContainedElement(List keys) - { - if (containedElements == null) - containedElements = new ContainedElements(); - var r = new ContainedElementRef(); - foreach (var k in keys) - r.Keys.Add(k); - containedElements.reference.Add(r); - } - - public void AddContainedElement(Reference r) - { - if (containedElements == null) - containedElements = new ContainedElements(); - containedElements.reference.Add(ContainedElementRef.CreateNew(r)); - } - - public void AddContainedElement(List rlist) - { - if (containedElements == null) - containedElements = new ContainedElements(); - foreach (var r in rlist) - containedElements.reference.Add(ContainedElementRef.CreateNew(r)); - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("View", "View"); - } - - public Tuple ToCaptionInfo() - { - var caption = AdminShellUtilV20.EvalToNonNullString("\"{0}\" ", idShort, ""); - var info = ""; - if (this.semanticId != null) - info = Key.KeyListToString(this.semanticId.Keys); - if (this.containedElements != null && this.containedElements.reference != null) - info = (info + " ").Trim() + - String.Format("({0} elements)", this.containedElements.reference.Count); - return Tuple.Create(caption, info); - } - - public override string ToString() - { - var ci = ToCaptionInfo(); - return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); - } - - // validation - - public override void Validate(AasValidationRecordList results) - { - // access - if (results == null) - return; - - // check - base.Validate(results); - KeyList.Validate(results, semanticId?.Keys, this); - } - } - - public class Views - { - [XmlElement(ElementName = "view")] - [JsonIgnore] - public List views = new List(); - - // constructors - - public Views() { } - - public Views(Views src) - { - if (src != null && src.views != null) - foreach (var v in src.views) - this.views.Add(new View(v)); - } - -#if !DoNotUseAasxCompatibilityModels - public Views(AasxCompatibilityModels.AdminShellV10.Views src) - { - if (src != null && src.views != null) - foreach (var v in src.views) - this.views.Add(new View(v)); - } -#endif - - public static Views CreateOrSetInnerViews(Views outer, View[] inner) - { - var res = outer; - if (res == null) - res = new Views(); - if (inner == null) - { - res.views = null; - return res; - } - res.views = new List(inner); - return res; - } - } - - /// - /// Multiple lang string for the AAS namespace - /// - public class LangStringSet - { - - // members - - [XmlElement(ElementName = "langString", Namespace = "http://www.admin-shell.io/aas/2/0")] - public ListOfLangStr langString = new ListOfLangStr(); - - // getters / setters - - [XmlIgnore] - [JsonIgnore] - public bool IsEmpty { get { return langString == null || langString.Count < 1; } } - [XmlIgnore] - [JsonIgnore] - public int Count { get { if (langString == null) return 0; return langString.Count; } } - [XmlIgnore] - [JsonIgnore] - public LangStr this[int index] { get { return langString[index]; } } - - // constructors - - public LangStringSet() { } - - public LangStringSet(LangStringSet src) - { - if (src.langString != null) - foreach (var ls in src.langString) - this.langString.Add(new LangStr(ls)); - } - - public LangStringSet(ListOfLangStr src) - { - if (src != null) - foreach (var ls in src) - this.langString.Add(new LangStr(ls)); - } - -#if !DoNotUseAasxCompatibilityModels - // not available in V1.0 -#endif - public LangStringSet(string lang, string str) - { - if (str == null || str.Trim() == "") - return; - this.langString.Add(new LangStr(lang, str)); - } - - // converter - - public static LangStringSet CreateFrom(List src) - { - var res = new LangStringSet(); - if (src != null) - foreach (var ls in src) - res.langString.Add(new LangStr(ls)); - return res; - } - - // add - - public LangStr Add(LangStr ls) - { - this.langString.Add(ls); - return ls; - } - - public LangStr Add(string lang, string str) - { - var ls = new LangStr(lang, str); - this.langString.Add(ls); - return ls; - } - - // single string representation - public string GetDefaultStr(string defaultLang = null) - { - return this.langString?.GetDefaultStr(defaultLang); - } - } - - /// - /// Multiple lang string for the IEC61360 namespace - /// - public class LangStringSetIEC61360 : ListOfLangStr - { - - // getters / setters - - [XmlIgnore] - [JsonIgnore] - public bool IsEmpty { get { return this.Count < 1; } } - - // constructors - - public LangStringSetIEC61360() { } - - public LangStringSetIEC61360(ListOfLangStr lol) : base(lol) { } - - public LangStringSetIEC61360(LangStringSetIEC61360 src) - { - foreach (var ls in src) - this.Add(new LangStr(ls)); - } - -#if !DoNotUseAasxCompatibilityModels - public LangStringSetIEC61360(AasxCompatibilityModels.AdminShellV10.LangStringIEC61360 src) - { - if (src.langString != null) - foreach (var ls in src.langString) - this.Add(new LangStr(ls)); - } -#endif - public LangStringSetIEC61360(string lang, string str) - { - if (str == null || str.Trim() == "") - return; - this.Add(new LangStr(lang, str)); - } - - // converter - - public static LangStringSetIEC61360 CreateFrom(List src) - { - var res = new LangStringSetIEC61360(); - if (src != null) - foreach (var ls in src) - res.Add(new LangStr(ls)); - return res; - } - - } - - public class UnitId - { - - // members - - [XmlIgnore] - [JsonIgnore] - public KeyList keys = new KeyList(); - - // getter / setters - - [XmlArray("keys")] - [XmlArrayItem("key")] - [JsonIgnore] - public KeyList Keys { get { return keys; } } - [XmlIgnore] - [JsonProperty(PropertyName = "keys")] - public KeyList JsonKeys - { - get - { - keys?.NumberIndices(); - return keys; - } - } - - [XmlIgnore] - [JsonIgnore] - public bool IsEmpty { get { return keys == null || keys.IsEmpty; } } - [XmlIgnore] - [JsonIgnore] - public int Count { get { if (keys == null) return 0; return keys.Count; } } - [XmlIgnore] - [JsonIgnore] - public Key this[int index] { get { return keys[index]; } } - - // constructors / creators - - public UnitId() { } - - public UnitId(UnitId src) - { - if (src.keys != null) - foreach (var k in src.Keys) - this.keys.Add(new Key(k)); - } - -#if !DoNotUseAasxCompatibilityModels - public UnitId(AasxCompatibilityModels.AdminShellV10.UnitId src) - { - if (src.keys != null) - foreach (var k in src.Keys) - this.keys.Add(new Key(k)); - } -#endif - - public static UnitId CreateNew(string type, bool local, string idType, string value) - { - var u = new UnitId(); - u.keys.Add(Key.CreateNew(type, local, idType, value)); - return u; - } - - public static UnitId CreateNew(Reference src) - { - if (src == null) - return null; - var res = new UnitId(); - if (src.Keys != null) - foreach (var k in src.Keys) - res.keys.Add(k); - return res; - } - } - - [XmlRoot(Namespace = "http://www.admin-shell.io/IEC61360/2/0")] - public class DataSpecificationIEC61360 - { - // static member - [XmlIgnore] - [JsonIgnore] - public static string[] DataTypeNames = { - "STRING", - "STRING_TRANSLATABLE", - "REAL_MEASURE", - "REAL_COUNT", - "REAL_CURRENCY", - "INTEGER_MEASURE", - "INTEGER_COUNT", - "INTEGER_CURRENCY", - "BOOLEAN", - "URL", - "RATIONAL", - "RATIONAL_MEASURE", - "TIME", - "TIMESTAMP", - "DATE" }; - - // members - // TODO (MIHO, 2020-08-27): According to spec, cardinality is [1..1][1..n] - // these cardinalities are NOT MAINTAINED in ANY WAY by the system - public LangStringSetIEC61360 preferredName = new LangStringSetIEC61360(); - - // TODO (MIHO, 2020-08-27): According to spec, cardinality is [0..1][1..n] - // these cardinalities are NOT MAINTAINED in ANY WAY by the system - public LangStringSetIEC61360 shortName = null; - - [MetaModelName("DataSpecificationIEC61360.unit")] - [TextSearchable] - [CountForHash] - public string unit = ""; - - public UnitId unitId = null; - - [MetaModelName("DataSpecificationIEC61360.valueFormat")] - [TextSearchable] - [CountForHash] - public string valueFormat = null; - - [MetaModelName("DataSpecificationIEC61360.sourceOfDefinition")] - [TextSearchable] - [CountForHash] - public string sourceOfDefinition = null; - - [MetaModelName("DataSpecificationIEC61360.symbol")] - [TextSearchable] - [CountForHash] - public string symbol = null; - - [MetaModelName("DataSpecificationIEC61360.dataType")] - [TextSearchable] - [CountForHash] - public string dataType = ""; - - // TODO (MIHO, 2020-08-27): According to spec, cardinality is [0..1][1..n] - // these cardinalities are NOT MAINTAINED in ANY WAY by the system - public LangStringSetIEC61360 definition = null; - - // getter / setters - - // constructors - - public DataSpecificationIEC61360() { } - - public DataSpecificationIEC61360(DataSpecificationIEC61360 src) - { - if (src.preferredName != null) - this.preferredName = new LangStringSetIEC61360(src.preferredName); - this.shortName = src.shortName; - this.unit = src.unit; - if (src.unitId != null) - this.unitId = new UnitId(src.unitId); - this.valueFormat = src.valueFormat; - this.sourceOfDefinition = src.sourceOfDefinition; - this.symbol = src.symbol; - this.dataType = src.dataType; - if (src.definition != null) - this.definition = new LangStringSetIEC61360(src.definition); - } - -#if !DoNotUseAasxCompatibilityModels - public DataSpecificationIEC61360(AasxCompatibilityModels.AdminShellV10.DataSpecificationIEC61360 src) - { - if (src.preferredName != null) - this.preferredName = new LangStringSetIEC61360(src.preferredName); - this.shortName = new LangStringSetIEC61360("EN?", src.shortName); - this.unit = src.unit; - if (src.unitId != null) - this.unitId = new UnitId(src.unitId); - this.valueFormat = src.valueFormat; - if (src.sourceOfDefinition != null && src.sourceOfDefinition.Count > 0) - this.sourceOfDefinition = src.sourceOfDefinition[0].str; - this.symbol = src.symbol; - this.dataType = src.dataType; - if (src.definition != null) - this.definition = new LangStringSetIEC61360(src.definition); - } -#endif - - public static DataSpecificationIEC61360 CreateNew( - string[] preferredName = null, - string shortName = "", - string unit = "", - UnitId unitId = null, - string valueFormat = null, - string sourceOfDefinition = null, - string symbol = null, - string dataType = "", - string[] definition = null - ) - { - var d = new DataSpecificationIEC61360(); - if (preferredName != null) - { - d.preferredName = new LangStringSetIEC61360(LangStr.CreateManyFromStringArray(preferredName)); - } - d.shortName = new LangStringSetIEC61360("EN?", shortName); - d.unit = unit; - d.unitId = unitId; - d.valueFormat = valueFormat; - d.sourceOfDefinition = sourceOfDefinition; - d.symbol = symbol; - d.dataType = dataType; - if (definition != null) - { - if (d.definition == null) - d.definition = new LangStringSetIEC61360(); - d.definition = new LangStringSetIEC61360(LangStr.CreateManyFromStringArray(definition)); - } - return (d); - } - - // "constants" - - public static Key GetKey() - { - return Key.CreateNew( - "GlobalReference", false, "IRI", - "http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/2/0"); - } - - // validation - - public void Validate(AasValidationRecordList results, ConceptDescription cd) - { - // access - if (results == null || cd == null) - return; - - // check IEC61360 spec - if (this.preferredName == null || this.preferredName.Count < 1) - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, cd, - "ConceptDescription: missing preferredName", - () => - { - this.preferredName = new AdminShell.LangStringSetIEC61360("EN?", - AdminShellUtilV20.EvalToNonEmptyString("{0}", cd.idShort, "UNKNOWN")); - })); - - if (this.shortName != null && this.shortName.Count < 1) - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, cd, - "ConceptDescription: existing shortName with missing langString", - () => - { - this.shortName = null; - })); - - if (this.definition != null && this.definition.Count < 1) - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, cd, - "ConceptDescription: existing definition with missing langString", - () => - { - this.definition = null; - })); - - // check data type - string foundDataType = null; - if (this.dataType != null) - foreach (var dtn in DataTypeNames) - if (this.dataType.Trim() == dtn.Trim()) - foundDataType = this.dataType; - if (foundDataType == null) - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, cd, - "ConceptDescription: dataType does not match allowed enumeration values", - () => - { - this.dataType = "STRING"; - })); - } - } - - // ReSharper disable ClassNeverInstantiated.Global .. class is important to show potential for ISO! - - public class DataSpecificationISO99999 - { - } - - // ReSharper enable ClassNeverInstantiated.Global - - public class DataSpecificationContent - { - - // members - - public DataSpecificationIEC61360 dataSpecificationIEC61360 = null; - public DataSpecificationISO99999 dataSpecificationISO99999 = null; - - // constructors - - public DataSpecificationContent() { } - - public DataSpecificationContent(DataSpecificationContent src) - { - if (src.dataSpecificationIEC61360 != null) - this.dataSpecificationIEC61360 = new DataSpecificationIEC61360(src.dataSpecificationIEC61360); - } - -#if !DoNotUseAasxCompatibilityModels - public DataSpecificationContent(AasxCompatibilityModels.AdminShellV10.DataSpecificationContent src) - { - if (src.dataSpecificationIEC61360 != null) - this.dataSpecificationIEC61360 = new DataSpecificationIEC61360(src.dataSpecificationIEC61360); - } -#endif - } - - public class EmbeddedDataSpecification - { - // members - - [JsonIgnore] - public DataSpecificationContent dataSpecificationContent = null; - - [XmlIgnore] - [JsonProperty("dataSpecificationContent")] - public DataSpecificationIEC61360 JsonWrongDataSpec61360 - { - get { return dataSpecificationContent?.dataSpecificationIEC61360; } - set - { - if (dataSpecificationContent == null) - dataSpecificationContent = new DataSpecificationContent(); - dataSpecificationContent.dataSpecificationIEC61360 = value; - } - } - - public DataSpecificationRef dataSpecification = null; - - // constructors - - public EmbeddedDataSpecification() { } - - public EmbeddedDataSpecification( - DataSpecificationRef dataSpecification, - DataSpecificationContent dataSpecificationContent) - { - this.dataSpecification = dataSpecification; - this.dataSpecificationContent = dataSpecificationContent; - } - - public EmbeddedDataSpecification(EmbeddedDataSpecification src) - { - if (src.dataSpecification != null) - this.dataSpecification = new DataSpecificationRef(src.dataSpecification); - if (src.dataSpecificationContent != null) - this.dataSpecificationContent = new DataSpecificationContent(src.dataSpecificationContent); - } - - public EmbeddedDataSpecification(Reference src) - { - if (src != null) - this.dataSpecification = new DataSpecificationRef(src); - } - -#if !DoNotUseAasxCompatibilityModels - public EmbeddedDataSpecification(AasxCompatibilityModels.AdminShellV10.EmbeddedDataSpecification src) - { - if (src.hasDataSpecification != null) - this.dataSpecification = new DataSpecificationRef(src.hasDataSpecification); - if (src.dataSpecificationContent != null) - this.dataSpecificationContent = new DataSpecificationContent(src.dataSpecificationContent); - } - - public EmbeddedDataSpecification(AasxCompatibilityModels.AdminShellV10.Reference src) - { - if (src != null) - this.dataSpecification = new DataSpecificationRef(src); - } -#endif - - public static EmbeddedDataSpecification CreateIEC61360WithContent() - { - var eds = new EmbeddedDataSpecification(new DataSpecificationRef(), new DataSpecificationContent()); - - eds.dataSpecification.Keys.Add(DataSpecificationIEC61360.GetKey()); - - eds.dataSpecificationContent.dataSpecificationIEC61360 = - AdminShell.DataSpecificationIEC61360.CreateNew(); - - return eds; - } - - public DataSpecificationIEC61360 GetIEC61360() - { - return this.dataSpecificationContent?.dataSpecificationIEC61360; - } - } - - public class ConceptDescription : Identifiable, System.IDisposable - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // members - - // do this in order to be IDisposable, that is: suitable for (using) - void System.IDisposable.Dispose() { } - public void GetData() { } - // from HasDataSpecification - -#if __not_anymore - - [XmlElement(ElementName = "embeddedDataSpecification")] - [JsonIgnore] - public EmbeddedDataSpecification embeddedDataSpecification = new EmbeddedDataSpecification(); -#else - // According to Spec V2.0.1, a ConceptDescription might feature alos multiple data specifications - /* TODO (MIHO, 2020-08-30): align wording of the member ("embeddedDataSpecification") with the - * wording of the other entities ("hasDataSpecification") */ - [XmlElement(ElementName = "embeddedDataSpecification")] - [JsonIgnore] - public HasDataSpecification embeddedDataSpecification = null; -#endif - - [XmlIgnore] - [JsonProperty(PropertyName = "embeddedDataSpecifications")] - public EmbeddedDataSpecification[] JsonEmbeddedDataSpecifications - { - get - { - return this.embeddedDataSpecification?.ToArray(); - } - set - { - embeddedDataSpecification = new HasDataSpecification(value); - } - } - - // old - - // this class - [XmlIgnore] - private List isCaseOf = null; - - // getter / setter - - [XmlElement(ElementName = "isCaseOf")] - [JsonProperty(PropertyName = "isCaseOf")] - public List IsCaseOf - { - get { return isCaseOf; } - set { isCaseOf = value; } - } - - // constructors / creators - - public ConceptDescription() : base() { } - - public ConceptDescription(ConceptDescription src) - : base(src) - { - if (src.embeddedDataSpecification != null) - this.embeddedDataSpecification = new HasDataSpecification(src.embeddedDataSpecification); - if (src.isCaseOf != null) - foreach (var ico in src.isCaseOf) - { - if (this.isCaseOf == null) - this.isCaseOf = new List(); - this.isCaseOf.Add(new Reference(ico)); - } - } - -#if !DoNotUseAasxCompatibilityModels - public ConceptDescription(AasxCompatibilityModels.AdminShellV10.ConceptDescription src) - : base(src) - { - if (src.embeddedDataSpecification != null) - { - this.embeddedDataSpecification = new HasDataSpecification(); - this.embeddedDataSpecification.Add(new EmbeddedDataSpecification(src.embeddedDataSpecification)); - } - if (src.IsCaseOf != null) - foreach (var ico in src.IsCaseOf) - { - if (this.isCaseOf == null) - this.isCaseOf = new List(); - this.isCaseOf.Add(new Reference(ico)); - } - } -#endif - - public static ConceptDescription CreateNew( - string idShort, string idType, string id, string version = null, string revision = null) - { - var cd = new ConceptDescription(); - cd.idShort = idShort; - cd.identification.idType = idType; - cd.identification.id = id; - if (version != null) - { - if (cd.administration == null) - cd.administration = new Administration(); - cd.administration.version = version; - cd.administration.revision = revision; - } - return (cd); - } - - public Key GetSingleKey() - { - return Key.CreateNew(this.GetElementName(), true, this.identification.idType, this.identification.id); - } - - public ConceptDescriptionRef GetCdReference() - { - var r = new ConceptDescriptionRef(); - r.Keys.Add( - Key.CreateNew( - this.GetElementName(), true, this.identification.idType, this.identification.id)); - return r; - } - - public void SetIEC61360Spec( - string[] preferredNames = null, - string shortName = "", - string unit = "", - UnitId unitId = null, - string valueFormat = null, - string sourceOfDefinition = null, - string symbol = null, - string dataType = "", - string[] definition = null - ) - { - var eds = new EmbeddedDataSpecification(new DataSpecificationRef(), new DataSpecificationContent()); - eds.dataSpecification.Keys.Add( - DataSpecificationIEC61360.GetKey()); - eds.dataSpecificationContent.dataSpecificationIEC61360 = - AdminShell.DataSpecificationIEC61360.CreateNew( - preferredNames, shortName, unit, unitId, valueFormat, sourceOfDefinition, symbol, - dataType, definition); - - this.embeddedDataSpecification = new HasDataSpecification(); - this.embeddedDataSpecification.Add(eds); - - this.AddIsCaseOf( - Reference.CreateNew( - new Key("ConceptDescription", false, this.identification.idType, this.identification.id))); - } - - public DataSpecificationIEC61360 GetIEC61360() - { - return this.embeddedDataSpecification?.IEC61360Content; - } - - // as experimental approach, forward the IEC getter/sett of hasDataSpec directly - - [XmlIgnore] - [JsonIgnore] - public EmbeddedDataSpecification IEC61360DataSpec - { - get - { - return this.embeddedDataSpecification?.IEC61360; - } - set - { - // add embeddedDataSpecification first? - if (this.embeddedDataSpecification == null) - this.embeddedDataSpecification = new HasDataSpecification(); - this.embeddedDataSpecification.IEC61360 = value; - } - } - - [XmlIgnore] - [JsonIgnore] - public DataSpecificationIEC61360 IEC61360Content - { - get - { - return this.embeddedDataSpecification?.IEC61360Content; - } - set - { - // add embeddedDataSpecification first? - if (this.embeddedDataSpecification == null) - this.embeddedDataSpecification = new HasDataSpecification(); - - // check, if e IEC61360 can be found - var eds = this.embeddedDataSpecification.IEC61360; - - // if already there, update - if (eds != null) - { - eds.dataSpecificationContent = new DataSpecificationContent(); - eds.dataSpecificationContent.dataSpecificationIEC61360 = value; - return; - } - - // no: add a full record - eds = EmbeddedDataSpecification.CreateIEC61360WithContent(); - eds.dataSpecificationContent.dataSpecificationIEC61360 = value; - this.embeddedDataSpecification.Add(eds); - } - } - - public DataSpecificationIEC61360 CreateDataSpecWithContentIec61360() - { - var eds = AdminShell.EmbeddedDataSpecification.CreateIEC61360WithContent(); - if (this.embeddedDataSpecification == null) - this.embeddedDataSpecification = new HasDataSpecification(); - this.embeddedDataSpecification.Add(eds); - return eds.dataSpecificationContent?.dataSpecificationIEC61360; - } - - public string GetDefaultPreferredName(string defaultLang = null) - { - return "" + - GetIEC61360()? - .preferredName?.GetDefaultStr(defaultLang); - } - - public string GetDefaultShortName(string defaultLang = null) - { - return "" + - GetIEC61360()? - .shortName?.GetDefaultStr(defaultLang); - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("ConceptDescription", "CD"); - } - - public Tuple ToCaptionInfo() - { - var caption = ""; - if (this.idShort != null && this.idShort.Trim() != "") - caption = $"\"{this.idShort.Trim()}\""; - if (this.identification != null) - caption = (caption + " " + this.identification).Trim(); - - var info = "" + GetDefaultShortName(); - - return Tuple.Create(caption, info); - } - - public override string ToString() - { - var ci = ToCaptionInfo(); - return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); - } - - public void AddIsCaseOf(Reference ico) - { - if (isCaseOf == null) - isCaseOf = new List(); - isCaseOf.Add(ico); - } - - public static IDisposable CreateNew() - { - throw new NotImplementedException(); - } - - // validation - - public override void Validate(AasValidationRecordList results) - { - // access - if (results == null) - return; - - // check CD itself - base.Validate(results); - - // check IEC61360 spec - var eds61360 = this.IEC61360DataSpec; - if (eds61360 != null) - { - // check data spec - if (eds61360.dataSpecification == null || - !(eds61360.dataSpecification.MatchesExactlyOneKey(DataSpecificationIEC61360.GetKey()))) - results.Add(new AasValidationRecord( - AasValidationSeverity.SpecViolation, this, - "HasDataSpecification: data specification content set to IEC61360, but no " + - "data specification reference set!", - () => - { - eds61360.dataSpecification = new DataSpecificationRef( - new Reference( - DataSpecificationIEC61360.GetKey())); - })); - - // validate content - if (eds61360.dataSpecificationContent?.dataSpecificationIEC61360 == null) - { - results.Add(new AasValidationRecord( - AasValidationSeverity.SpecViolation, this, - "HasDataSpecification: data specification reference set to IEC61360, but no " + - "data specification content set!", - () => - { - eds61360.dataSpecificationContent = new DataSpecificationContent(); - eds61360.dataSpecificationContent.dataSpecificationIEC61360 = - new DataSpecificationIEC61360(); - })); - } - else - { - // validate - eds61360.dataSpecificationContent.dataSpecificationIEC61360.Validate(results, this); - } - } - } - - // more find - - public IEnumerable FindAllReferences() - { - yield break; - } - } - - public class ListOfConceptDescriptions : List, IAasElement - { - // finding - - public ConceptDescription Find(ConceptDescriptionRef cdr) - { - if (cdr == null) - return null; - return Find(cdr.Keys); - } - - public ConceptDescription Find(Identification id) - { - var cdr = ConceptDescriptionRef.CreateNew("Conceptdescription", true, id.idType, id.id); - return Find(cdr); - } - - public ConceptDescription Find(List keys) - { - // trivial - if (keys == null) - return null; - // can only refs with 1 key - if (keys.Count != 1) - return null; - // and we're picky - var key = keys[0]; - if (!key.local || key.type.ToLower().Trim() != "conceptdescription") - return null; - // brute force - foreach (var cd in this) - if (cd.identification.idType.ToLower().Trim() == key.idType.ToLower().Trim() - && cd.identification.id.ToLower().Trim() == key.value.ToLower().Trim()) - return cd; - // uups - return null; - } - - // item management - - public ConceptDescription AddIfNew(ConceptDescription cd) - { - if (cd == null) - return null; - - var exist = this.Find(cd.identification); - if (exist != null) - return exist; - - this.Add(cd); - return cd; - } - - // self decscription - - public AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("ConceptDescriptions", "CDS"); - } - - public string GetElementName() - { - return this.GetSelfDescription()?.ElementName; - } - - // sorting - - - } - - public class ConceptDictionary : Referable - { - [XmlElement(ElementName = "conceptDescriptions")] - public ConceptDescriptionRefs conceptDescriptionsRefs = null; - - // constructors - - public ConceptDictionary() { } - - public ConceptDictionary(ConceptDictionary src) - { - if (src.conceptDescriptionsRefs != null) - this.conceptDescriptionsRefs = new ConceptDescriptionRefs(src.conceptDescriptionsRefs); - } - -#if !DoNotUseAasxCompatibilityModels - public ConceptDictionary(AasxCompatibilityModels.AdminShellV10.ConceptDictionary src) - { - if (src.conceptDescriptionsRefs != null) - this.conceptDescriptionsRefs = new ConceptDescriptionRefs(src.conceptDescriptionsRefs); - } -#endif - - public static ConceptDictionary CreateNew(string idShort = null) - { - var d = new ConceptDictionary(); - if (idShort != null) - d.idShort = idShort; - return (d); - } - - // add - - public void AddReference(Reference r) - { - var cdr = (ConceptDescriptionRef)(ConceptDescriptionRef.CreateNew(r.Keys)); - if (conceptDescriptionsRefs == null) - conceptDescriptionsRefs = new ConceptDescriptionRefs(); - conceptDescriptionsRefs.conceptDescriptions.Add(cdr); - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("ConceptDictionary", "CDic"); - } - } - - /// - /// Use by FindAllReference to provide a enumeration of referenced with location - /// info, where they are contained - /// - public class LocatedReference - { - public Identifiable Identifiable; - public Reference Reference; - - public LocatedReference() { } - public LocatedReference(Identifiable identifiable, Reference reference) - { - Identifiable = identifiable; - Reference = reference; - } - } - - [XmlRoot(ElementName = "aasenv", Namespace = "http://www.admin-shell.io/aas/2/0")] - public class AdministrationShellEnv : IFindAllReferences, IAasElement, IDiaryData, IRecurseOnReferables - { - - // diary (as e.g. deleted AASes need to be listed somewhere) - - [XmlIgnore] - [JsonIgnore] - [SkipForHash] - [SkipForReflection] - private DiaryDataDef _diaryData = new DiaryDataDef(); - - [XmlIgnore] - [JsonIgnore] - [SkipForReflection] - public DiaryDataDef DiaryData { get { return _diaryData; } } - - // members - - [XmlAttribute(Namespace = System.Xml.Schema.XmlSchema.InstanceNamespace)] - [JsonIgnore] - public string schemaLocation = - "http://www.admin-shell.io/aas/2/0 AAS.xsd http://www.admin-shell.io/IEC61360/2/0 IEC61360.xsd"; - - [XmlIgnore] // will be ignored, anyway - private ListOfAdministrationShells administrationShells = new ListOfAdministrationShells(); - [XmlIgnore] // will be ignored, anyway - private ListOfAssets assets = new ListOfAssets(); - [XmlIgnore] // will be ignored, anyway - private ListOfSubmodels submodels = new ListOfSubmodels(); - [XmlIgnore] // will be ignored, anyway - private ListOfConceptDescriptions conceptDescriptions = new ListOfConceptDescriptions(); - - // getter / setters - - [XmlArray("assetAdministrationShells")] - [XmlArrayItem("assetAdministrationShell")] - [JsonProperty(PropertyName = "assetAdministrationShells")] - public ListOfAdministrationShells AdministrationShells - { - get { return administrationShells; } - set { administrationShells = value; } - } - - [XmlArray("assets")] - [XmlArrayItem("asset")] - [JsonProperty(PropertyName = "assets")] - public ListOfAssets Assets - { - get { return assets; } - set { assets = value; } - } - - [XmlArray("submodels")] - [XmlArrayItem("submodel")] - [JsonProperty(PropertyName = "submodels")] - public ListOfSubmodels Submodels - { - get { return submodels; } - set { submodels = value; } - } - - [XmlArray("conceptDescriptions")] - [XmlArrayItem("conceptDescription")] - [JsonProperty(PropertyName = "conceptDescriptions")] - public ListOfConceptDescriptions ConceptDescriptions - { - get { return conceptDescriptions; } - set { conceptDescriptions = value; } - } - - // constructors - - public AdministrationShellEnv() { } - -#if !DoNotUseAasxCompatibilityModels - public AdministrationShellEnv(AasxCompatibilityModels.AdminShellV10.AdministrationShellEnv src) - { - if (src.AdministrationShells != null) - foreach (var aas in src.AdministrationShells) - this.administrationShells.Add(new AdministrationShell(aas)); - - if (src.Assets != null) - foreach (var asset in src.Assets) - this.assets.Add(new Asset(asset)); - - if (src.Submodels != null) - foreach (var sm in src.Submodels) - this.submodels.Add(new Submodel(sm)); - - if (src.ConceptDescriptions != null) - foreach (var cd in src.ConceptDescriptions) - this.conceptDescriptions.Add(new ConceptDescription(cd)); - } -#endif - - // to String - - public override string ToString() - { - var res = "AAS-ENV"; - if (AdministrationShells != null) - res += $" {AdministrationShells.Count} AAS"; - if (Assets != null) - res += $" {Assets.Count} Assets"; - if (Submodels != null) - res += $" {Submodels.Count} Submodels"; - if (ConceptDescriptions != null) - res += $" {ConceptDescriptions.Count} CDs"; - return res; - } - - // self decscription - - public AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("AdministrationShellEnv", "Env"); - } - - public string GetElementName() - { - return this.GetSelfDescription()?.ElementName; - } - - // finders - - public AdministrationShell FindAAS(Identification id) - { - if (id == null) - return null; - foreach (var aas in this.AdministrationShells) - if (aas.identification != null && aas.identification.IsEqual(id)) - return aas; - return null; - } - - public AdministrationShell FindAAS(string idShort) - { - if (idShort == null) - return null; - foreach (var aas in this.AdministrationShells) - if (aas.idShort != null && aas.idShort.Trim().ToLower() == idShort.Trim().ToLower()) - return aas; - return null; - } - - public AdministrationShell FindAASwithSubmodel(Identification smid) - { - if (smid == null) - return null; - foreach (var aas in this.AdministrationShells) - if (aas.submodelRefs != null) - foreach (var smref in aas.submodelRefs) - if (smref.Matches(smid)) - return aas; - return null; - } - - public IEnumerable FindAllAAS( - Predicate p = null) - { - if (this.administrationShells == null) - yield break; - foreach (var x in this.administrationShells) - if (p == null || p(x)) - yield return x; - } - - public IEnumerable FindAllSubmodelGroupedByAAS( - Func p = null) - { - if (this.administrationShells == null || this.submodels == null) - yield break; - foreach (var aas in this.administrationShells) - { - if (aas?.submodelRefs == null) - continue; - foreach (var smref in aas.submodelRefs) - { - var sm = this.FindSubmodel(smref); - if (sm != null && (p == null || p(aas, sm))) - yield return sm; - } - } - } - - public Asset FindAsset(Identification id) - { - if (id == null) - return null; - foreach (var asset in this.Assets) - if (asset.identification != null && asset.identification.IsEqual(id)) - return asset; - return null; - } - - public Asset FindAsset(AssetRef aref) - { - // trivial - if (aref == null) - return null; - // can only refs with 1 key - if (aref.Count != 1) - return null; - // and we're picky - var key = aref[0]; - if (!key.local || key.type.ToLower().Trim() != "asset") - return null; - // brute force - foreach (var a in assets) - if (a.identification.idType.ToLower().Trim() == key.idType.ToLower().Trim() - && a.identification.id.ToLower().Trim() == key.value.ToLower().Trim()) - return a; - // uups - return null; - } - - public Submodel FindSubmodel(Identification id) - { - if (id == null) - return null; - foreach (var sm in this.Submodels) - if (sm.identification != null && sm.identification.IsEqual(id)) - return sm; - return null; - } - - public Submodel FindSubmodel(SubmodelRef smref) - { - // trivial - if (smref == null) - return null; - // can only refs with 1 key - if (smref.Count != 1) - return null; - // and we're picky - var key = smref.Keys[0]; - if (!key.local || key.type.ToLower().Trim() != "submodel") - return null; - // brute force - foreach (var sm in this.Submodels) - if (sm.identification.idType.ToLower().Trim() == key.idType.ToLower().Trim() - && sm.identification.id.ToLower().Trim() == key.value.ToLower().Trim()) - return sm; - // uups - return null; - } - - public Submodel FindFirstSubmodelBySemanticId(Key semId) - { - // access - if (semId == null) - return null; - - // brute force - foreach (var sm in this.Submodels) - if (true == sm.semanticId?.MatchesExactlyOneKey(semId)) - return sm; - - return null; - } - - public IEnumerable FindAllSubmodelBySemanticId( - Key semId, Key.MatchMode matchMode = Key.MatchMode.Strict) - { - // access - if (semId == null) - yield break; - - // brute force - foreach (var sm in this.Submodels) - if (true == sm.semanticId?.MatchesExactlyOneKey(semId, matchMode)) - yield return sm; - } - - public IEnumerable FindAllReferable(Predicate p) - { - if (p == null) - yield break; - - foreach (var r in this.FindAllReferable()) - if (r != null && p(r)) - yield return r; - } - - public IEnumerable FindAllReferable(bool onlyIdentifiables = false) - { - if (this.AdministrationShells != null) - foreach (var aas in this.AdministrationShells) - if (aas != null) - { - // AAS itself - yield return aas; - - if (!onlyIdentifiables) - { - // Views - if (aas.views?.views != null) - foreach (var view in aas.views.views) - yield return view; - } - } - - if (this.Assets != null) - foreach (var asset in this.Assets) - if (asset != null) - yield return asset; - - if (this.Submodels != null) - foreach (var sm in this.Submodels) - if (sm != null) - { - yield return sm; - - if (!onlyIdentifiables) - { - // TODO (MIHO, 2020-08-26): not very elegant, yet. Avoid temporary collection - var allsme = new ListOfSubmodelElement(); - sm.RecurseOnSubmodelElements(null, (state, parents, sme) => - { - allsme.Add(sme); return true; - }); - foreach (var sme in allsme) - yield return sme; - } - } - - if (this.ConceptDescriptions != null) - foreach (var cd in this.ConceptDescriptions) - if (cd != null) - yield return cd; - } - - // - // Reference handling - // - - public Referable FindReferableByReference(Reference rf, int keyIndex = 0, bool exactMatch = false) - { - return FindReferableByReference(rf?.Keys); - } - - public Referable FindReferableByReference(KeyList kl, int keyIndex = 0, bool exactMatch = false, - ReferableRootInfo rootInfo = null) - { - // first index needs to exist .. - if (kl == null || keyIndex >= kl.Count) - return null; - - // which type? - var firstType = kl[keyIndex].type.Trim().ToLower(); - var firstIdentification = new Identification(kl[keyIndex].idType, kl[keyIndex].value); - AdministrationShell aasToFollow = null; - - if (firstType == Key.AAS.Trim().ToLower()) - { - // search aas - var aas = this.FindAAS(firstIdentification); - - // not found or already at end with our search? - if (aas == null || keyIndex >= kl.Count - 1) - return aas; - - // side info? - if (rootInfo != null) - { - rootInfo.AAS = aas; - rootInfo.NrOfRootKeys = 1 + keyIndex; - } - - // follow up - aasToFollow = aas; - } - - if (firstType == Key.Asset.Trim().ToLower()) - { - // search asset - var asset = this.FindAsset(firstIdentification); - - // not found or already at end with our search? - if (asset == null || keyIndex >= kl.Count - 1) - return exactMatch ? null : asset; - - // try find aas for it - var aas = this.FindAllAAS((a) => - { - return a?.assetRef?.Matches(asset.identification) == true; - }).FirstOrDefault(); - if (aas == null) - return exactMatch ? null : asset; - - // side info? - if (rootInfo != null) - { - rootInfo.Asset = asset; - rootInfo.NrOfRootKeys = 1 + keyIndex; - } - - // follow up - aasToFollow = aas; - } - - // try - if (aasToFollow != null) - { - // search different entities - if (kl[keyIndex + 1].type.Trim().ToLower() == Key.Submodel.ToLower() - || kl[keyIndex + 1].type.Trim().ToLower() == Key.SubmodelRef.ToLower()) - { - // ok, search SubmodelRef - var smref = aasToFollow.FindSubmodelRef(kl[keyIndex + 1].ToId()); - if (smref == null) - return exactMatch ? null : aasToFollow; - - // validate matching submodel - var sm = this.FindSubmodel(smref); - if (sm == null) - return exactMatch ? null : aasToFollow; - - // side info - // side info? - if (rootInfo != null) - { - rootInfo.Submodel = sm; - rootInfo.NrOfRootKeys = 2 + keyIndex; - } - - // at our end? - if (keyIndex >= kl.Count - 2) - return sm; - - // go inside - return SubmodelElementWrapper.FindReferableByReference(sm.submodelElements, kl, keyIndex + 2); - } - } - - if (firstType == Key.ConceptDescription.Trim().ToLower()) - return this.FindConceptDescription(firstIdentification); - - if (firstType == Key.Submodel.Trim().ToLower()) - { - // ok, search Submodel - var sm = this.FindSubmodel(new Identification(kl[keyIndex].idType, kl[keyIndex].value)); - if (sm == null) - return null; - - // notice in side info - if (rootInfo != null) - { - rootInfo.Submodel = sm; - rootInfo.NrOfRootKeys = 1 + keyIndex; - - // add even more info - if (rootInfo.AAS == null) - { - foreach (var aas2 in this.AdministrationShells) - { - var smref2 = aas2.FindSubmodelRef(sm.identification); - if (smref2 != null) - { - rootInfo.AAS = aas2; - break; - } - } - } - } - - // at our end? - if (keyIndex >= kl.Count - 1) - return sm; - - // go inside - return SubmodelElementWrapper.FindReferableByReference(sm.submodelElements, kl, keyIndex + 1); - } - - // nothing in this Environment - return null; - } - - // - // Handling of CDs - // - - public ConceptDescription FindConceptDescription(ConceptDescriptionRef cdr) - { - if (cdr == null) - return null; - return FindConceptDescription(cdr.Keys); - } - - public ConceptDescription FindConceptDescription(SemanticId semId) - { - if (semId == null) - return null; - return FindConceptDescription(semId.Keys); - } - - public ConceptDescription FindConceptDescription(Reference rf) - { - if (rf == null) - return null; - return FindConceptDescription(rf.Keys); - } - - public ConceptDescription FindConceptDescription(Identification id) - { - var cdr = ConceptDescriptionRef.CreateNew("Conceptdescription", true, id.idType, id.id); - return FindConceptDescription(cdr); - } - - public ConceptDescription FindConceptDescription(List keys) - { - // trivial - if (keys == null) - return null; - // can only refs with 1 key - if (keys.Count != 1) - return null; - // and we're picky - var key = keys[0]; - if (!key.local || key.type.ToLower().Trim() != "conceptdescription") - return null; - // brute force - foreach (var cd in conceptDescriptions) - if (cd.identification.idType.ToLower().Trim() == key.idType.ToLower().Trim() - && cd.identification.id.ToLower().Trim() == key.value.ToLower().Trim()) - return cd; - // uups - return null; - } - - public IEnumerable FindAllSubmodelElements( - Predicate match = null, AdministrationShell onlyForAAS = null) where T : SubmodelElement - { - // more or less two different schemes - if (onlyForAAS != null) - { - if (onlyForAAS.submodelRefs == null) - yield break; - foreach (var smr in onlyForAAS.submodelRefs) - { - var sm = this.FindSubmodel(smr); - if (sm?.submodelElements != null) - foreach (var x in sm.submodelElements.FindDeep(match)) - yield return x; - } - } - else - { - if (this.Submodels != null) - foreach (var sm in this.Submodels) - if (sm?.submodelElements != null) - foreach (var x in sm.submodelElements.FindDeep(match)) - yield return x; - } - } - - public ConceptDescription FindConceptDescription(Key key) - { - if (key == null) - return null; - var l = new List { key }; - return (FindConceptDescription(l)); - } - - public IEnumerable FindAllReferences() - { - if (this.AdministrationShells != null) - foreach (var aas in this.AdministrationShells) - if (aas != null) - foreach (var r in aas.FindAllReferences()) - yield return r; - - if (this.Assets != null) - foreach (var asset in this.Assets) - if (asset != null) - foreach (var r in asset.FindAllReferences()) - yield return new LocatedReference(asset, r); - - if (this.Submodels != null) - foreach (var sm in this.Submodels) - if (sm != null) - foreach (var r in sm.FindAllReferences()) - yield return r; - - if (this.ConceptDescriptions != null) - foreach (var cd in this.ConceptDescriptions) - if (cd != null) - foreach (var r in cd.FindAllReferences()) - yield return new LocatedReference(cd, r); - } - - // creators - - private void CopyConceptDescriptionsFrom( - AdministrationShellEnv srcEnv, SubmodelElement src, bool shallowCopy = false) - { - // access - if (srcEnv == null || src == null || src.semanticId == null) - return; - // check for this SubmodelElement in Source - var cdSrc = srcEnv.FindConceptDescription(src.semanticId.Keys); - if (cdSrc == null) - return; - // check for this SubmodelElement in Destnation (this!) - var cdDest = this.FindConceptDescription(src.semanticId.Keys); - if (cdDest != null) - return; - // copy new - this.ConceptDescriptions.Add(new ConceptDescription(cdSrc)); - // recurse? - if (!shallowCopy && src is SubmodelElementCollection) - foreach (var m in (src as SubmodelElementCollection).value) - CopyConceptDescriptionsFrom(srcEnv, m.submodelElement, shallowCopy: false); - - } - - public SubmodelElementWrapper CopySubmodelElementAndCD( - AdministrationShellEnv srcEnv, SubmodelElement srcElem, bool copyCD = false, bool shallowCopy = false) - { - // access - if (srcEnv == null || srcElem == null) - return null; - - // 1st result pretty easy (calling function will add this to the appropriate Submodel) - var res = new SubmodelElementWrapper(srcElem); - - // copy the CDs.. - if (copyCD) - CopyConceptDescriptionsFrom(srcEnv, srcElem, shallowCopy); - - // give back - return res; - } - - public SubmodelRef CopySubmodelRefAndCD( - AdministrationShellEnv srcEnv, SubmodelRef srcSubRef, bool copySubmodel = false, bool copyCD = false, - bool shallowCopy = false) - { - // access - if (srcEnv == null || srcSubRef == null) - return null; - - // need to have the source Submodel - var srcSub = srcEnv.FindSubmodel(srcSubRef); - if (srcSub == null) - return null; - - // 1st result pretty easy (calling function will add this to the appropriate AAS) - var dstSubRef = new SubmodelRef(srcSubRef); - - // get the destination and shall src != dst - var dstSub = this.FindSubmodel(dstSubRef); - if (srcSub == dstSub) - return null; - - // maybe we need the Submodel in our environment, as well - if (dstSub == null && copySubmodel) - { - dstSub = new Submodel(srcSub, shallowCopy); - this.Submodels.Add(dstSub); - } - else - if (dstSub != null) - { - // there is already an submodel, just add members - if (!shallowCopy && srcSub.submodelElements != null) - { - if (dstSub.submodelElements == null) - dstSub.submodelElements = new SubmodelElementWrapperCollection(); - foreach (var smw in srcSub.submodelElements) - dstSub.submodelElements.Add( - new SubmodelElementWrapper( - smw.submodelElement, shallowCopy: false)); - } - } - - // copy the CDs.. - if (copyCD && srcSub.submodelElements != null) - foreach (var smw in srcSub.submodelElements) - CopyConceptDescriptionsFrom(srcEnv, smw.submodelElement, shallowCopy); - - // give back - return dstSubRef; - } - - /// - /// Tries renaming an Identifiable, specifically: the identification of an Identifiable and - /// all references to it. - /// Currently supported: ConceptDescriptions - /// Returns a list of Referables, which were changed or null in case of error - /// - public List RenameIdentifiable(Identification oldId, Identification newId) - where T : Identifiable - { - // access - if (oldId == null || newId == null || oldId.IsEqual(newId)) - return null; - - var res = new List(); - - if (typeof(T) == typeof(ConceptDescription)) - { - // check, if exist or not exist - var cdOld = FindConceptDescription(oldId); - if (cdOld == null || FindConceptDescription(newId) != null) - return null; - - // rename old cd - cdOld.identification = newId; - res.Add(cdOld); - - // search all SMEs referring to this CD - foreach (var sme in this.FindAllSubmodelElements(match: (s) => - { - return (s != null && s.semanticId != null && s.semanticId.Matches(oldId)); - })) - { - sme.semanticId[0].idType = newId.idType; - sme.semanticId[0].value = newId.id; - res.Add(sme); - } - - // seems fine - return res; - } - - if (typeof(T) == typeof(Submodel)) - { - // check, if exist or not exist - var smOld = FindSubmodel(oldId); - if (smOld == null || FindSubmodel(newId) != null) - return null; - - // recurse all possible Referenes in the aas env - foreach (var lr in this.FindAllReferences()) - { - var r = lr?.Reference; - if (r != null) - for (int i = 0; i < r.Count; i++) - if (r[i].Matches(Key.Submodel, false, oldId.idType, oldId.id, Key.MatchMode.Relaxed)) - { - // directly replace - r[i].idType = newId.idType; - r[i].value = newId.id; - if (res.Contains(lr.Identifiable)) - res.Add(lr.Identifiable); - } - } - - // rename old Submodel - smOld.identification = newId; - - // seems fine - return res; - } - - if (typeof(T) == typeof(Asset)) - { - // check, if exist or not exist - var assetOld = FindAsset(oldId); - if (assetOld == null || FindAsset(newId) != null) - return null; - - // recurse all possible Referenes in the aas env - foreach (var lr in this.FindAllReferences()) - { - var r = lr?.Reference; - if (r != null) - for (int i = 0; i < r.Count; i++) - if (r[i].Matches(Key.Asset, false, oldId.idType, oldId.id, Key.MatchMode.Relaxed)) - { - // directly replace - r[i].idType = newId.idType; - r[i].value = newId.id; - if (res.Contains(lr.Identifiable)) - res.Add(lr.Identifiable); - } - } - - // rename old Submodel - assetOld.identification = newId; - - // seems fine - return res; - } - - // no result is false, as well - return null; - } - - // serializations - - public void SerializeXmlToStream(StreamWriter s) - { - var serializer = new XmlSerializer(typeof(AdminShell.AdministrationShellEnv)); - var nss = new XmlSerializerNamespaces(); - nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace); - nss.Add("aas", "http://www.admin-shell.io/aas/2/0"); - nss.Add("IEC61360", "http://www.admin-shell.io/IEC61360/2/0"); - serializer.Serialize(s, this, nss); - } - - public JsonWriter SerialiazeJsonToStream(StreamWriter sw, bool leaveJsonWriterOpen = false) - { - sw.AutoFlush = true; - - JsonSerializer serializer = new JsonSerializer() - { - NullValueHandling = NullValueHandling.Ignore, - ReferenceLoopHandling = ReferenceLoopHandling.Serialize, - Formatting = Newtonsoft.Json.Formatting.Indented - }; - - JsonWriter writer = new JsonTextWriter(sw); - serializer.Serialize(writer, this); - if (leaveJsonWriterOpen) - return writer; - writer.Close(); - return null; - } - - public AdministrationShellEnv DeserializeFromXmlStream(TextReader reader) - { - XmlSerializer serializer = new XmlSerializer( - typeof(AdminShell.AdministrationShellEnv), "http://www.admin-shell.io/aas/2/0"); - var res = serializer.Deserialize(reader) as AdminShell.AdministrationShellEnv; - return res; - } - - public AdministrationShellEnv DeserializeFromJsonStream(TextReader reader) - { - JsonSerializer serializer = new JsonSerializer(); - serializer.Converters.Add(new AdminShellConverters.JsonAasxConverter("modelType", "name")); - var res = (AdministrationShellEnv)serializer.Deserialize(reader, typeof(AdministrationShellEnv)); - return res; - } - - // special functions - - private static void CreateFromExistingEnvRecurseForCDs( - AdministrationShellEnv src, List wrappers, - ref List filterForCD) - { - if (wrappers == null || filterForCD == null) - return; - - foreach (var w in wrappers) - { - // access - if (w == null) - continue; - - // include in filter .. - if (w.submodelElement.semanticId != null) - { - var cd = src.FindConceptDescription(w.submodelElement.semanticId.Keys); - if (cd != null) - filterForCD.Add(cd); - } - - // recurse? - if (w.submodelElement is SubmodelElementCollection smec) - CreateFromExistingEnvRecurseForCDs(src, smec.value, ref filterForCD); - - if (w.submodelElement is Operation op) - for (int i = 0; i < 2; i++) - { - var w2s = Operation.GetWrappers(op[i]); - CreateFromExistingEnvRecurseForCDs(src, w2s, ref filterForCD); - } - - if (w.submodelElement is Entity smee) - CreateFromExistingEnvRecurseForCDs(src, smee.statements, ref filterForCD); - - if (w.submodelElement is AnnotatedRelationshipElement smea) - CreateFromExistingEnvRecurseForCDs(src, smea.annotations, ref filterForCD); - } - } - - public static AdministrationShellEnv CreateFromExistingEnv(AdministrationShellEnv src, - List filterForAas = null, - List filterForAsset = null, - ListOfSubmodels filterForSubmodel = null, - List filterForCD = null) - { - // prepare defaults - if (filterForAas == null) - filterForAas = new List(); - if (filterForAsset == null) - filterForAsset = new List(); - if (filterForSubmodel == null) - filterForSubmodel = new ListOfSubmodels(); - if (filterForCD == null) - filterForCD = new List(); - - // make new - var res = new AdministrationShellEnv(); - - // take over AAS - foreach (var aas in src.administrationShells) - if (filterForAas.Contains(aas)) - { - // take over - res.administrationShells.Add(new AdministrationShell(aas)); - - // consequences - if (aas.assetRef != null) - { - var asset = src.FindAsset(aas.assetRef); - if (asset != null) - filterForAsset.Add(asset); - } - - if (aas.submodelRefs != null) - foreach (var smr in aas.submodelRefs) - { - var sm = src.FindSubmodel(smr); - if (sm != null) - filterForSubmodel.Add(sm); - } - - if (aas.conceptDictionaries != null) - foreach (var cdd in aas.conceptDictionaries) - if (cdd.conceptDescriptionsRefs != null && - cdd.conceptDescriptionsRefs.conceptDescriptions != null) - foreach (var cdr in cdd.conceptDescriptionsRefs.conceptDescriptions) - { - var cd = src.FindConceptDescription(cdr); - if (cd != null) - filterForCD.Add(cd); - } - } - - // take over Assets - foreach (var asset in src.assets) - if (filterForAsset.Contains(asset)) - { - // take over - res.assets.Add(new Asset(asset)); - } - - // take over Submodels - foreach (var sm in src.Submodels) - if (filterForSubmodel.Contains(sm)) - { - // take over - res.submodels.Add(new Submodel(sm)); - - // recursion in order to find used CDs - CreateFromExistingEnvRecurseForCDs(src, sm.submodelElements, ref filterForCD); - } - - // ConceptDescriptions - foreach (var cd in src.ConceptDescriptions) - if (filterForCD.Contains(cd)) - { - // take over - res.conceptDescriptions.Add(new ConceptDescription(cd)); - } - - // ok - return res; - } - - // Sorting - - public Referable.ComparerIndexed CreateIndexedComparerCdsForSmUsage() - { - var cmp = new Referable.ComparerIndexed(); - int nr = 0; - foreach (var sm in FindAllSubmodelGroupedByAAS()) - foreach (var sme in sm.FindDeep()) - { - if (sme.semanticId == null) - continue; - var cd = this.FindConceptDescription(sme.semanticId); - if (cd == null) - continue; - if (cmp.Index.ContainsKey(cd)) - continue; - cmp.Index[cd] = nr++; - } - return cmp; - } - - // Validation - - public AasValidationRecordList ValidateAll() - { - // collect results - var results = new AasValidationRecordList(); - - // all entities - foreach (var rf in this.FindAllReferable()) - rf.Validate(results); - - // give back - return results; - } - - public int AutoFix(IEnumerable records) - { - // access - if (records == null) - return -1; - - // collect Referables (expensive safety measure) - var allowedReferables = this.FindAllReferable().ToList(); - - // go thru records - int res = 0; - foreach (var rec in records) - { - // access - if (rec == null || rec.Fix == null || rec.Source == null) - continue; - - // minimal safety measure - if (!allowedReferables.Contains(rec.Source)) - continue; - - // apply fix - res++; - try - { - rec.Fix.Invoke(); - } - catch - { - res--; - } - } - - // return number of applied fixes - return res; - } - - public void RecurseOnReferables( - object state, Func lambda, bool includeThis = false) - { - // includeThis does not make sense, as no Referable - // just use the others - foreach (var idf in this.FindAllReferable(onlyIdentifiables: true)) - idf?.RecurseOnReferables(state, lambda, includeThis); - } - } - - // - // Submodel + Submodel elements - // - - public interface IGetReference - { - Reference GetReference(bool includeParents = true); - } - - public interface IGetQualifiers - { - QualifierCollection GetQualifiers(); - } - - public class Qualifier : IAasElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // member - // from hasSemantics: - [XmlElement(ElementName = "semanticId")] - public SemanticId semanticId = null; - - // this class - // TODO (Michael Hoffmeister, 2020-08-01): check, if Json has Qualifiers or not - - [MetaModelName("Qualifier.type")] - [TextSearchable] - [CountForHash] - public string type = ""; - - [MetaModelName("Qualifier.valueType")] - [TextSearchable] - [CountForHash] - public string valueType = ""; - - [CountForHash] - public Reference valueId = null; - - [MetaModelName("Qualifier.value")] - [TextSearchable] - [CountForHash] - public string value = null; - - // dead-csharp off - // Remark: due to publication of v2.0.1, the order of elements has changed!!! - // from hasSemantics: - // [XmlElement(ElementName = "semanticId")] - // [JsonIgnore] - // public SemanticId semanticId = null; - // dead-csharp on - - // constructors - - public Qualifier() { } - - public Qualifier(Qualifier src) - { - if (src.semanticId != null) - this.semanticId = new SemanticId(src.semanticId); - this.type = src.type; - this.value = src.value; - if (src.valueId != null) - this.valueId = new Reference(src.valueId); - } - - public Qualifier(string type, string value) - { - this.type = type; - this.value = value; - } - -#if !DoNotUseAasxCompatibilityModels - public Qualifier(AasxCompatibilityModels.AdminShellV10.Qualifier src) - { - if (src.semanticId != null) - this.semanticId = new SemanticId(src.semanticId); - this.type = src.qualifierType; - this.value = src.qualifierValue; - if (src.qualifierValueId != null) - this.valueId = new Reference(src.qualifierValueId); - } -#endif - - public AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("Qualifier", "Qfr"); - } - - public string GetElementName() - { - return this.GetSelfDescription()?.ElementName; - } - - // ReSharper disable MethodOverloadWithOptionalParameter .. this seems to work, anyhow - // ReSharper disable RedundantArgumentDefaultValue - public string ToString(int format = 0, string delimiter = ",") - { - var res = "" + type; - if (res == "") - res += "" + semanticId?.ToString(format, delimiter); - - if (value != null) - res += " = " + value; - else if (valueId != null) - res += " = " + valueId?.ToString(format, delimiter); - - return res; - } - - public override string ToString() - { - return this.ToString(0); - } - // ReSharper enable MethodOverloadWithOptionalParameter - // ReSharper enable RedundantArgumentDefaultValue - - public static Qualifier Parse(string input) - { - var m = Regex.Match(input, @"\s*([^,]*)(,[^=]+){0,1}\s*=\s*([^,]*)(,.+){0,1}\s*"); - if (!m.Success) - return null; - - return new Qualifier() - { - type = m.Groups[1].ToString().Trim(), - semanticId = SemanticId.Parse(m.Groups[1].ToString().Trim()), - value = m.Groups[3].ToString().Trim(), - valueId = Reference.Parse(m.Groups[1].ToString().Trim()) - }; - } - } - - /// - /// This class holds some convenience functions for Qualifiers - /// - public class QualifierCollection : List - { - public QualifierCollection() - { - - } - -#if !DoNotUseAasxCompatibilityModels - public QualifierCollection( - List src, bool shallowCopy = false) - - { - if (src != null && src.Count != 0) - { - foreach (var q in src) - { - this.Add(new Qualifier(q)); - } - } - } -#endif - - /// - /// Add qualifier. If null, do nothing - /// - public new void Add(Qualifier q) - { - if (q == null) - return; - base.Add(q); - } - - public Qualifier FindType(string type) - { - if (type == null) - return null; - foreach (var q in this) - if (q != null && q.type != null && q.type.Trim() == type.Trim()) - return q; - return null; - } - - public Qualifier FindSemanticId(SemanticId semId) - { - if (semId == null) - return null; - foreach (var q in this) - if (q != null && q.semanticId != null && q.semanticId.Matches(semId)) - return q; - return null; - } - - // ReSharper disable MethodOverloadWithOptionalParameter .. this seems to work, anyhow - // ReSharper disable RedundantArgumentDefaultValue - public string ToString(int format = 0, string delimiter = ";", string referencesDelimiter = ",") - { - var res = ""; - foreach (var q in this) - { - if (res != "") - res += delimiter; - res += q.ToString(format, referencesDelimiter); - } - return res; - } - - public override string ToString() - { - return this.ToString(0); - } - // ReSharper enable MethodOverloadWithOptionalParameter - // ReSharper enable RedundantArgumentDefaultValue - - // for convenience methods of Submodel, SubmodelElement - - public static void AddQualifier( - ref QualifierCollection qualifiers, - Qualifier q) - { - if (q == null) - return; - if (qualifiers == null) - qualifiers = new QualifierCollection(); - qualifiers.Add(q); - } - - public static void AddQualifier( - ref QualifierCollection qualifiers, - string qualifierType = null, string qualifierValue = null, KeyList semanticKeys = null, - Reference qualifierValueId = null) - { - if (qualifiers == null) - qualifiers = new QualifierCollection(); - var q = new Qualifier() - { - type = qualifierType, - value = qualifierValue, - valueId = qualifierValueId, - }; - if (semanticKeys != null) - q.semanticId = SemanticId.CreateFromKeys(semanticKeys); - qualifiers.Add(q); - } - - public static Qualifier HasQualifierOfType( - QualifierCollection qualifiers, - string qualifierType) - { - if (qualifiers == null || qualifierType == null) - return null; - foreach (var q in qualifiers) - if (q.type.Trim().ToLower() == qualifierType.Trim().ToLower()) - return q; - return null; - } - - public IEnumerable FindAllQualifierType(string qualifierType) - { - if (qualifierType == null) - yield break; - foreach (var q in this) - if (q.type.Trim().ToLower() == qualifierType.Trim().ToLower()) - yield return q; - } - } - - public class ListOfSubmodelElement : List - { - // conversion to other list - - public KeyList ToKeyList() - { - var res = new KeyList(); - foreach (var sme in this) - res.Add(sme.ToKey()); - return res; - } - - public Reference GetReference() - { - return Reference.CreateNew(ToKeyList()); - } - } - - public class SubmodelElement : Referable, System.IDisposable, IGetReference, IGetSemanticId, IGetQualifiers - { - // constants - public static Type[] PROP_MLP = new Type[] { - typeof(AdminShell.MultiLanguageProperty), typeof(AdminShell.Property) }; - - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // members - - // do this in order to be IDisposable, that is: suitable for (using) - void System.IDisposable.Dispose() { } - public void GetData() { } - - // from HasKind - [XmlElement(ElementName = "kind")] - [JsonIgnore] - public ModelingKind kind = new ModelingKind(); - [XmlIgnore] - [JsonProperty(PropertyName = "kind")] - public string JsonKind - { - get - { - if (kind == null) - return null; - return kind.kind; - } - set - { - if (kind == null) - kind = new ModelingKind(); - kind.kind = value; - } - } - - // from hasSemanticId: - [XmlElement(ElementName = "semanticId")] - public SemanticId semanticId = new SemanticId(); - public SemanticId GetSemanticId() { return semanticId; } - - // from Qualifiable: - [XmlArray("qualifier")] - [XmlArrayItem("qualifier")] - [JsonProperty(PropertyName = "constraints")] - public QualifierCollection qualifiers = null; - public QualifierCollection GetQualifiers() => qualifiers; - - // from hasDataSpecification: - [XmlElement(ElementName = "embeddedDataSpecification")] - public HasDataSpecification hasDataSpecification = null; - - // getter / setter - - // constructors / creators - - public SubmodelElement() - : base() { } - - public SubmodelElement(SubmodelElement src) - : base(src) - { - if (src == null) - return; - if (src.hasDataSpecification != null) - hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - if (src.semanticId != null) - semanticId = new SemanticId(src.semanticId); - if (src.kind != null) - kind = new ModelingKind(src.kind); - if (src.qualifiers != null) - { - if (qualifiers == null) - qualifiers = new QualifierCollection(); - foreach (var q in src.qualifiers) - qualifiers.Add(new Qualifier(q)); - } - } - -#if !DoNotUseAasxCompatibilityModels - public SubmodelElement(AasxCompatibilityModels.AdminShellV10.SubmodelElement src) - : base(src) - { - if (src.hasDataSpecification != null) - hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - if (src.semanticId != null) - semanticId = new SemanticId(src.semanticId); - if (src.kind != null) - kind = new ModelingKind(src.kind); - if (src.qualifiers != null) - { - if (qualifiers == null) - qualifiers = new QualifierCollection(src.qualifiers); - foreach (var q in src.qualifiers) - qualifiers.Add(new Qualifier(q)); - } - } -#endif - - public static T CreateNew(string idShort = null, string category = null, Reference semanticId = null) - where T : SubmodelElement, new() - { - var res = new T(); - if (idShort != null) - res.idShort = idShort; - if (category != null) - res.category = category; - if (semanticId != null) - res.semanticId = new SemanticId(semanticId); - return res; - } - - public void CreateNewLogic(string idShort = null, string category = null, Key semanticIdKey = null) - { - if (idShort != null) - this.idShort = idShort; - if (category != null) - this.category = category; - if (semanticIdKey != null) - { - if (this.semanticId == null) - this.semanticId = new SemanticId(); - this.semanticId.Keys.Add(semanticIdKey); - } - } - - public void AddQualifier( - Qualifier q) - { - QualifierCollection.AddQualifier( - ref this.qualifiers, q); - } - - public void AddQualifier( - string qualifierType = null, string qualifierValue = null, KeyList semanticKeys = null, - Reference qualifierValueId = null) - { - QualifierCollection.AddQualifier( - ref this.qualifiers, qualifierType, qualifierValue, semanticKeys, qualifierValueId); - } - - public Qualifier HasQualifierOfType(string qualifierType) - { - return QualifierCollection.HasQualifierOfType(this.qualifiers, qualifierType); - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("SubmodelElement", "SME"); - } - - public override Reference GetReference(bool includeParents = true) - { - Reference r = new Reference(); - // this is the tail of our referencing chain .. - r.Keys.Add(Key.CreateNew(GetElementName(), true, "IdShort", this.idShort)); - // try to climb up .. - var current = this.parent; - while (includeParents && current != null) - { - if (current is Identifiable cid) - { - // add big information set - r.Keys.Insert(0, Key.CreateNew( - current.GetElementName(), - true, - cid.identification.idType, - cid.identification.id)); - } - else - if (current is Referable crf) - { - // reference via idShort - r.Keys.Insert(0, Key.CreateNew( - current.GetElementName(), - true, - "IdShort", crf.idShort)); - } - - if (current is Referable crf2) - current = crf2.parent; - else - current = null; - } - return r; - } - - public IEnumerable FindAllParents( - Predicate p, - bool includeThis = false, bool includeSubmodel = false, - bool passOverMiss = false) - { - // call for this? - if (includeThis) - { - if (p == null || p.Invoke(this)) - yield return this; - else - if (!passOverMiss) - yield break; - } - - // daisy chain all parents .. - if (this.parent != null) - { - if (this.parent is SubmodelElement psme) - { - foreach (var q in psme.FindAllParents(p, includeThis: true, - passOverMiss: passOverMiss)) - yield return q; - } - else if (includeSubmodel && this.parent is Submodel psm) - { - if (p == null || p.Invoke(psm)) - yield return this; - } - } - } - - public IEnumerable FindAllParentsWithSemanticId( - SemanticId semId, - bool includeThis = false, bool includeSubmodel = false, bool passOverMiss = false) - { - return (FindAllParents( - (rf) => (true == (rf as IGetSemanticId)?.GetSemanticId()?.Matches(semId, - matchMode: Key.MatchMode.Relaxed)), - includeThis: includeThis, includeSubmodel: includeSubmodel, passOverMiss: passOverMiss)); - } - - public Tuple ToCaptionInfo() - { - var caption = AdminShellUtilV20.EvalToNonNullString("\"{0}\" ", idShort, ""); - var info = ""; - // TODO (MIHO, 2021-07-08): obvious error .. info should receive semanticId .. but would change - // display presentation .. therefore to be checked again - if (semanticId != null) - AdminShellUtilV20.EvalToNonEmptyString("\u21e8 {0}", semanticId.ToString(), ""); - return Tuple.Create(caption, info); - } - - public override string ToString() - { - var ci = ToCaptionInfo(); - return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); - } - - public virtual string ValueAsText(string defaultLang = null) - { - return ""; - } - - public virtual double? ValueAsDouble() - { - return null; - } - - public virtual void ValueFromText(string text, string defaultLang = null) - { - } - - // validation - - public override void Validate(AasValidationRecordList results) - { - // access - if (results == null) - return; - - // check - base.Validate(results); - ModelingKind.Validate(results, kind, this); - KeyList.Validate(results, semanticId?.Keys, this); - } - } - - [XmlType(TypeName = "submodelElement")] - public class SubmodelElementWrapper - { - - // members - - [XmlElement(ElementName = "property", Type = typeof(Property))] - [XmlElement(ElementName = "multiLanguageProperty", Type = typeof(MultiLanguageProperty))] - [XmlElement(ElementName = "range", Type = typeof(Range))] - [XmlElement(ElementName = "file", Type = typeof(File))] - [XmlElement(ElementName = "blob", Type = typeof(Blob))] - [XmlElement(ElementName = "referenceElement", Type = typeof(ReferenceElement))] - [XmlElement(ElementName = "relationshipElement", Type = typeof(RelationshipElement))] - [XmlElement(ElementName = "annotatedRelationshipElement", Type = typeof(AnnotatedRelationshipElement))] - [XmlElement(ElementName = "capability", Type = typeof(Capability))] - [XmlElement(ElementName = "submodelElementCollection", Type = typeof(SubmodelElementCollection))] - [XmlElement(ElementName = "operation", Type = typeof(Operation))] - [XmlElement(ElementName = "basicEvent", Type = typeof(BasicEvent))] - [XmlElement(ElementName = "entity", Type = typeof(Entity))] - public SubmodelElement submodelElement; - - // element names - public enum AdequateElementEnum - { - Unknown = 0, SubmodelElementCollection, Property, MultiLanguageProperty, Range, File, Blob, - ReferenceElement, RelationshipElement, AnnotatedRelationshipElement, Capability, Operation, - BasicEvent, Entity - } - - public static AdequateElementEnum[] AdequateElementsDataElement = - { - AdequateElementEnum.SubmodelElementCollection, AdequateElementEnum.RelationshipElement, - AdequateElementEnum.AnnotatedRelationshipElement, AdequateElementEnum.Capability, - AdequateElementEnum.Operation, AdequateElementEnum.BasicEvent, AdequateElementEnum.Entity - }; - - public static string[] AdequateElementNames = { "Unknown", "SubmodelElementCollection", "Property", - "MultiLanguageProperty", "Range", "File", "Blob", "ReferenceElement", "RelationshipElement", - "AnnotatedRelationshipElement", "Capability", "Operation", "BasicEvent", "Entity" }; - - public static string[] AdequateElementShortName = { null, "SMC", null, - "MLP", null, null, null, "Ref", "Rel", - "ARel", null, null, "Event", "Entity" }; - - // constructors - - public SubmodelElementWrapper() { } - - // cloning - - public SubmodelElementWrapper(SubmodelElement src, bool shallowCopy = false) - { - /* TODO (MIHO, 2021-08-12): consider using: - Activator.CreateInstance(pl.GetType(), new object[] { pl }) */ - - if (src is SubmodelElementCollection) - this.submodelElement = new SubmodelElementCollection( - src as SubmodelElementCollection, shallowCopy: shallowCopy); - if (src is Property) - this.submodelElement = new Property(src as Property); - if (src is MultiLanguageProperty) - this.submodelElement = new MultiLanguageProperty(src as MultiLanguageProperty); - if (src is Range) - this.submodelElement = new Range(src as Range); - if (src is File) - this.submodelElement = new File(src as File); - if (src is Blob) - this.submodelElement = new Blob(src as Blob); - if (src is ReferenceElement) - this.submodelElement = new ReferenceElement(src as ReferenceElement); - if (src is RelationshipElement) - this.submodelElement = new RelationshipElement(src as RelationshipElement); - if (src is AnnotatedRelationshipElement) - this.submodelElement = new AnnotatedRelationshipElement(src as AnnotatedRelationshipElement); - if (src is Capability) - this.submodelElement = new Capability(src as Capability); - if (src is Operation) - this.submodelElement = new Operation(src as Operation); - if (src is BasicEvent) - this.submodelElement = new BasicEvent(src as BasicEvent); - if (src is Entity) - this.submodelElement = new Entity(src as Entity); - } - -#if !DoNotUseAasxCompatibilityModels - public SubmodelElementWrapper( - AasxCompatibilityModels.AdminShellV10.SubmodelElement src, bool shallowCopy = false) - { - if (src is AasxCompatibilityModels.AdminShellV10.SubmodelElementCollection) - this.submodelElement = new SubmodelElementCollection( - src as AasxCompatibilityModels.AdminShellV10.SubmodelElementCollection, - shallowCopy: shallowCopy); - if (src is AasxCompatibilityModels.AdminShellV10.Property) - this.submodelElement = new Property(src as AasxCompatibilityModels.AdminShellV10.Property); - if (src is AasxCompatibilityModels.AdminShellV10.File) - this.submodelElement = new File(src as AasxCompatibilityModels.AdminShellV10.File); - if (src is AasxCompatibilityModels.AdminShellV10.Blob) - this.submodelElement = new Blob(src as AasxCompatibilityModels.AdminShellV10.Blob); - if (src is AasxCompatibilityModels.AdminShellV10.ReferenceElement) - this.submodelElement = new ReferenceElement( - src as AasxCompatibilityModels.AdminShellV10.ReferenceElement); - if (src is AasxCompatibilityModels.AdminShellV10.RelationshipElement) - this.submodelElement = new RelationshipElement( - src as AasxCompatibilityModels.AdminShellV10.RelationshipElement); - if (src is AasxCompatibilityModels.AdminShellV10.Operation) - this.submodelElement = new Operation(src as AasxCompatibilityModels.AdminShellV10.Operation); - } -#endif - - public static string GetAdequateName(AdequateElementEnum ae) - { - return AdequateElementNames[(int)ae]; - } - - /// - /// Deprecated. See below. - /// - public static AdequateElementEnum GetAdequateEnum(string adequateName) - { - if (adequateName == null) - return AdequateElementEnum.Unknown; - - foreach (var en in (AdequateElementEnum[])Enum.GetValues(typeof(AdequateElementEnum))) - if (Enum.GetName(typeof(AdequateElementEnum), en)?.Trim().ToLower() == - adequateName.Trim().ToLower()) - return en; - - return AdequateElementEnum.Unknown; - } - - /// - /// This version uses the element name array and allows using ShortName - /// - public static AdequateElementEnum GetAdequateEnum2(string adequateName, bool useShortName = false) - { - if (adequateName == null) - return AdequateElementEnum.Unknown; - - foreach (var en in (AdequateElementEnum[])Enum.GetValues(typeof(AdequateElementEnum))) - if (((int)en < AdequateElementNames.Length - && AdequateElementNames[(int)en].Trim().ToLower() == adequateName.Trim().ToLower()) - || (useShortName - && (int)en < AdequateElementShortName.Length - && AdequateElementShortName[(int)en] != null - && AdequateElementShortName[(int)en].Trim().ToLower() == adequateName.Trim().ToLower())) - return en; - - return AdequateElementEnum.Unknown; - } - - public static IEnumerable GetAdequateEnums( - AdequateElementEnum[] excludeValues = null, AdequateElementEnum[] includeValues = null) - { - if (includeValues != null) - { - foreach (var en in includeValues) - yield return en; - } - else - { - foreach (var en in (AdequateElementEnum[])Enum.GetValues(typeof(AdequateElementEnum))) - { - if (en == AdequateElementEnum.Unknown) - continue; - if (excludeValues != null && excludeValues.Contains(en)) - continue; - yield return en; - } - } - } - - /// - /// Introduced for JSON serialization, can create SubModelElements based on a string name - /// - public static SubmodelElement CreateAdequateType(AdequateElementEnum ae, SubmodelElement src = null) - { - if (ae == AdequateElementEnum.Property) - return new Property(src); - if (ae == AdequateElementEnum.MultiLanguageProperty) - return new MultiLanguageProperty(src); - if (ae == AdequateElementEnum.Range) - return new Range(src); - if (ae == AdequateElementEnum.File) - return new File(src); - if (ae == AdequateElementEnum.Blob) - return new Blob(src); - if (ae == AdequateElementEnum.ReferenceElement) - return new ReferenceElement(src); - if (ae == AdequateElementEnum.RelationshipElement) - return new RelationshipElement(src); - if (ae == AdequateElementEnum.AnnotatedRelationshipElement) - return new AnnotatedRelationshipElement(src); - if (ae == AdequateElementEnum.Capability) - return new Capability(src); - if (ae == AdequateElementEnum.SubmodelElementCollection) - return new SubmodelElementCollection(src); - if (ae == AdequateElementEnum.Operation) - return new Operation(src); - if (ae == AdequateElementEnum.BasicEvent) - return new BasicEvent(src); - if (ae == AdequateElementEnum.Entity) - return new Entity(src); - return null; - } - - /// - /// Introduced for JSON serialization, can create SubModelElements based on a string name - /// - /// string name (standard PascalCased) - public static SubmodelElement CreateAdequateType(string elementName) - { - return CreateAdequateType(GetAdequateEnum(elementName)); - } - - /// - /// Can create SubmodelElements based on a given type information - /// - /// Type of the SME to be created - /// SubmodelElement or null - public static SubmodelElement CreateAdequateType(Type t) - { - if (t == null || !t.IsSubclassOf(typeof(AdminShell.SubmodelElement))) - return null; - var sme = Activator.CreateInstance(t) as SubmodelElement; - return sme; - } - - public string GetElementAbbreviation() - { - if (submodelElement == null) - return ("Null"); - var dsc = submodelElement.GetSelfDescription(); - if (dsc?.ElementAbbreviation == null) - return ("Null"); - return dsc.ElementAbbreviation; - } - - public static string GetElementNameByAdequateType(SubmodelElement sme) - { - // access - var sd = sme.GetSelfDescription(); - if (sd == null || sd.ElementEnum == AdequateElementEnum.Unknown) - return null; - var en = sd.ElementEnum; - - // get the names - string res = null; - if ((int)en < AdequateElementNames.Length) - res = AdequateElementNames[(int)en].Trim(); - if ((int)en < AdequateElementShortName.Length && AdequateElementShortName[(int)en] != null) - res = AdequateElementShortName[(int)en].Trim(); - return res; - } - - public static ListOfSubmodelElement ListOfWrappersToListOfElems(List wrappers) - { - var res = new ListOfSubmodelElement(); - if (wrappers == null) - return res; - foreach (var w in wrappers) - if (w.submodelElement != null) - res.Add(w.submodelElement); - return res; - } - - public static SubmodelElementWrapper CreateFor(SubmodelElement sme) - { - var res = new SubmodelElementWrapper() { submodelElement = sme }; - return res; - } - - public static Referable FindReferableByReference( - List wrappers, Reference rf, int keyIndex) - { - return FindReferableByReference(wrappers, rf?.Keys, keyIndex); - } - - public static Referable FindReferableByReference( - List wrappers, KeyList rf, int keyIndex) - { - // first index needs to exist .. - if (wrappers == null || rf == null || keyIndex >= rf.Count) - return null; - - // as SubmodelElements are not Identifiables, the actual key shall be IdShort - if (rf[keyIndex].idType.Trim().ToLower() != Key.GetIdentifierTypeName( - Key.IdentifierType.IdShort).Trim().ToLower()) - return null; - - // over all wrappers - foreach (var smw in wrappers) - if (smw.submodelElement != null && - smw.submodelElement.idShort.Trim().ToLower() == rf[keyIndex].value.Trim().ToLower()) - { - // match on this level. Did we find a leaf element? - if ((keyIndex + 1) >= rf.Count) - return smw.submodelElement; - - // dive into SMC? - if (smw.submodelElement is SubmodelElementCollection smc) - { - var found = FindReferableByReference(smc.value, rf, keyIndex + 1); - if (found != null) - return found; - } - - // dive into Entity statements? - if (smw.submodelElement is Entity ent) - { - var found = FindReferableByReference(ent.statements, rf, keyIndex + 1); - if (found != null) - return found; - } - - // else: - return null; - } - - // no? - return null; - } - - // typecasting wrapper into specific type - public T GetAs() where T : SubmodelElement - { - var x = (this.submodelElement) as T; - return x; - } - - } - - public class SubmodelElementWrapperCollection : BaseSubmodelElementWrapperCollection - { - public SubmodelElementWrapperCollection() : base() { } - - public SubmodelElementWrapperCollection(SubmodelElementWrapper smw) : base(smw) { } - - public SubmodelElementWrapperCollection(SubmodelElement sme) : base(sme) { } - - public SubmodelElementWrapperCollection(SubmodelElementWrapperCollection other) : base(other) { } - } - - public class DataElementWrapperCollection : BaseSubmodelElementWrapperCollection - { - public DataElementWrapperCollection() : base() { } - - public DataElementWrapperCollection(SubmodelElementWrapperCollection other) - : base(other) - { - } - - public DataElementWrapperCollection(DataElementWrapperCollection other) - : base() - { - foreach (var wo in other) - this.Add(wo); - } - } - - /// - /// Provides some more functionalities for searching specific elements, e.g. in a SMEC - /// - // OZ - // Resharper disable UnusedTypeParameter - public class BaseSubmodelElementWrapperCollection : List - where ELEMT : SubmodelElement - { - // Resharper enable UnusedTypeParameter - - // member: Parent - // will be held correctly by the containing class - public Referable Parent = null; - - // constructors - - public BaseSubmodelElementWrapperCollection() : base() { } - - public BaseSubmodelElementWrapperCollection(SubmodelElementWrapperCollection other) - : base() - { - if (other == null) - return; - - foreach (var smw in other) - this.Add(new SubmodelElementWrapper(smw.submodelElement)); - } - - public BaseSubmodelElementWrapperCollection(SubmodelElementWrapper smw) - : base() - { - if (smw != null) - this.Add(smw); - } - - public BaseSubmodelElementWrapperCollection(SubmodelElement sme) - : base() - { - if (sme != null) - this.Add(new SubmodelElementWrapper(sme)); - } - - // better find functions - - public IEnumerable FindDeep(Predicate match = null) where T : SubmodelElement - { - foreach (var smw in this) - { - var current = smw.submodelElement; - if (current == null) - continue; - - // call lambda for this element - if (current is T) - if (match == null || match.Invoke(current as T)) - yield return current as T; - - // dive into? - // TODO (MIHO, 2020-07-31): would be nice to use IEnumerateChildren for this .. - if (current is SubmodelElementCollection smc && smc.value != null) - foreach (var x in smc.value.FindDeep(match)) - yield return x; - - if (current is AnnotatedRelationshipElement are && are.annotations != null) - foreach (var x in are.annotations.FindDeep(match)) - yield return x; - - if (current is Entity ent && ent.statements != null) - foreach (var x in ent.statements.FindDeep(match)) - yield return x; - - if (current is Operation op) - for (int i = 0; i < 2; i++) - if (Operation.GetWrappers(op[i]) != null) - foreach (var x in Operation.GetWrappers(op[i]).FindDeep(match)) - yield return x; - } - } - - public IEnumerable FindAllIdShort(string idShort) - { - foreach (var smw in this) - if (smw.submodelElement != null) - if (smw.submodelElement.idShort.Trim().ToLower() == idShort.Trim().ToLower()) - yield return smw; - } - - public IEnumerable FindAllIdShortAs(string idShort) where T : SubmodelElement - { - foreach (var smw in this) - if (smw.submodelElement != null && smw.submodelElement is T) - if (smw.submodelElement.idShort.Trim().ToLower() == idShort.Trim().ToLower()) - yield return smw.submodelElement as T; - } - - public SubmodelElementWrapper FindFirstIdShort(string idShort) - { - return FindAllIdShort(idShort)?.FirstOrDefault(); - } - - public T FindFirstIdShortAs(string idShort) where T : SubmodelElement - { - return FindAllIdShortAs(idShort)?.FirstOrDefault(); - } - - public IEnumerable FindAllSemanticId( - Key semId, Type[] allowedTypes = null, Key.MatchMode matchMode = Key.MatchMode.Strict) - { - foreach (var smw in this) - if (smw.submodelElement != null && smw.submodelElement.semanticId != null) - { - if (smw.submodelElement == null) - continue; - - if (allowedTypes != null) - { - var smwt = smw.submodelElement.GetType(); - if (!allowedTypes.Contains(smwt)) - continue; - } - - if (smw.submodelElement.semanticId.MatchesExactlyOneKey(semId, matchMode)) - yield return smw; - } - } - - public IEnumerable FindAllSemanticIdAs(Key semId, Key.MatchMode matchMode = Key.MatchMode.Strict) - where T : SubmodelElement - { - foreach (var smw in this) - if (smw.submodelElement != null && smw.submodelElement is T - && smw.submodelElement.semanticId != null) - if (smw.submodelElement.semanticId.MatchesExactlyOneKey(semId, matchMode)) - yield return smw.submodelElement as T; - } - - public IEnumerable FindAllSemanticIdAs(Reference semId, - Key.MatchMode matchMode = Key.MatchMode.Strict) - where T : SubmodelElement - { - foreach (var smw in this) - if (smw.submodelElement != null && smw.submodelElement is T - && smw.submodelElement.semanticId != null) - if (smw.submodelElement.semanticId.Matches(semId, matchMode)) - yield return smw.submodelElement as T; - } - - public IEnumerable FindAllSemanticIdAs(ConceptDescription cd, - Key.MatchMode matchMode = Key.MatchMode.Strict) - where T : SubmodelElement - { - foreach (var x in FindAllSemanticIdAs(cd.GetReference(), matchMode)) - yield return x; - } - - public SubmodelElementWrapper FindFirstSemanticId( - Key semId, Type[] allowedTypes = null, Key.MatchMode matchMode = Key.MatchMode.Strict) - { - return FindAllSemanticId(semId, allowedTypes, matchMode)?.FirstOrDefault(); - } - - public SubmodelElementWrapper FindFirstAnySemanticId( - Key[] semId, Type[] allowedTypes = null, Key.MatchMode matchMode = Key.MatchMode.Strict) - { - if (semId == null) - return null; - foreach (var si in semId) - { - var found = FindAllSemanticId(si, allowedTypes, matchMode)? - .FirstOrDefault(); - if (found != null) - return found; - } - return null; - } - - public T FindFirstSemanticIdAs(Key semId, Key.MatchMode matchMode = Key.MatchMode.Strict) - where T : SubmodelElement - { - return FindAllSemanticIdAs(semId, matchMode)?.FirstOrDefault(); - } - - public T FindFirstAnySemanticIdAs(Key[] semId, Key.MatchMode matchMode = Key.MatchMode.Strict) - where T : SubmodelElement - { - if (semId == null) - return null; - foreach (var si in semId) - { - var found = FindAllSemanticIdAs(si, matchMode)?.FirstOrDefault(); - if (found != null) - return found; - } - return null; - } - - public T FindFirstSemanticIdAs(Reference semId, Key.MatchMode matchMode = Key.MatchMode.Strict) - where T : SubmodelElement - { - return FindAllSemanticIdAs(semId, matchMode)?.FirstOrDefault(); - } - - /* TODO (MIHO, 2021-10-18): there are overlaps of this new function with - * this old function: FindFirstAnySemanticId(Key[] semId .. - * clarify/ refactor */ - public IEnumerable FindAllSemanticId( - Key[] allowedSemId, Key.MatchMode matchMode = Key.MatchMode.Strict, - bool invertAllowed = false) - where T : SubmodelElement - { - if (allowedSemId == null || allowedSemId.Length < 1) - yield break; - - foreach (var smw in this) - { - if (smw.submodelElement == null || !(smw.submodelElement is T)) - continue; - - if (smw.submodelElement.semanticId == null || smw.submodelElement.semanticId.Count < 1) - { - if (invertAllowed) - yield return smw.submodelElement as T; - continue; - } - - var found = false; - foreach (var semId in allowedSemId) - if (smw.submodelElement.semanticId.MatchesExactlyOneKey(semId, matchMode)) - { - found = true; - break; - } - - if (invertAllowed) - found = !found; - - if (found) - yield return smw.submodelElement as T; - } - } - - public T FindFirstAnySemanticId( - Key[] allowedSemId, Key.MatchMode matchMode = Key.MatchMode.Strict, - bool invertAllowed = false) - where T : SubmodelElement - { - return FindAllSemanticId(allowedSemId, matchMode, invertAllowed)?.FirstOrDefault(); - } - - // recursion - - /// - /// Recurses on all Submodel elements of a Submodel or SME, which allows children. - /// The state object will be passed to the lambda function in order to provide - /// stateful approaches. Also a list of parents will be provided to - /// the lambda. This list of parents can be initialized or simply set to null - /// in order to be created automatically. - /// - /// State object to be provided to lambda. Could be null. - /// List of already existing parents to be provided to lambda. - /// Could be null. - /// The lambda function as (state, parents, SME) - /// The lambda shall return TRUE in order to deep into recursion. - /// - public void RecurseOnReferables( - object state, ListOfReferable parents, - Func lambda) - { - // trivial - if (lambda == null) - return; - if (parents == null) - parents = new ListOfReferable(); - - // over all elements - foreach (var smw in this) - { - var current = smw.submodelElement; - if (current == null) - continue; - - // call lambda for this element - // AND decide, if to recurse! - var goDeeper = lambda(state, parents, current); - - if (goDeeper) - { - // add to parents - parents.Add(current); - - // dive into? - if (current is SubmodelElementCollection smc) - smc.value?.RecurseOnReferables(state, parents, lambda); - - if (current is Entity ent) - ent.statements?.RecurseOnReferables(state, parents, lambda); - - if (current is Operation op) - for (int i = 0; i < 2; i++) - Operation.GetWrappers(op[i])?.RecurseOnReferables(state, parents, lambda); - - if (current is AnnotatedRelationshipElement arel) - arel.annotations?.RecurseOnReferables(state, parents, lambda); - - // remove from parents - parents.RemoveAt(parents.Count - 1); - } - } - } - - // idShort management - - /// - /// Checks, if given idShort is already existing in the collection of SubmodelElements. - /// Trims the string, but does not ignore upper/ lowercase. An empty idShort returns false. - /// - public bool CheckIdShortIsUnique(string idShort) - { - idShort = idShort?.Trim(); - if (idShort == null || idShort.Length < 1) - return false; - - var res = true; - foreach (var smw in this) - if (smw.submodelElement != null && smw.submodelElement.idShort != null && - smw.submodelElement.idShort == idShort) - { - res = false; - break; - } - - return res; - } - - /// - /// The string idShortTemplate shall contain Format.String partt such as {0}. - /// A int-Parameter is as long incremented, until the resulting idShort proves - /// to be unique in the collection of SubmodelElements or maxNum is reached. - /// Returns null in case of any error. - /// - public string IterateIdShortTemplateToBeUnique(string idShortTemplate, int maxNum) - { - if (idShortTemplate == null || maxNum < 1 || !idShortTemplate.Contains("{0")) - return null; - - int i = 1; - while (i < maxNum) - { - var ids = String.Format(idShortTemplate, i); - if (this.CheckIdShortIsUnique(ids)) - return ids; - i++; - } - - return null; - } - - // give more direct access to SMEs - - /// - /// Add sme by creating a SubmodelElementWrapper for it and adding to this collection. - /// - public void Add(SubmodelElement sme) - { - if (sme == null) - return; - sme.parent = this.Parent; - this.Add(SubmodelElementWrapper.CreateFor(sme)); - } - - /// - /// Add sme by creating a SubmodelElementWrapper for it and adding to this collection. - /// - public void Insert(int index, SubmodelElement sme) - { - if (sme == null || index < 0 || index >= this.Count) - return; - sme.parent = this.Parent; - this.Insert(index, SubmodelElementWrapper.CreateFor(sme)); - } - - /// - /// Finds the first (shall be only 1!) SubmodelElementWrapper with SubmodelElement sme. - /// - public SubmodelElementWrapper FindSubModelElement(SubmodelElement sme) - { - if (sme != null) - foreach (var smw in this) - if (smw?.submodelElement == sme) - return smw; - return null; - } - - /// - /// Removes the first (shall be only 1!) SubmodelElementWrapper with SubmodelElement sme. - /// - public void Remove(SubmodelElement sme) - { - if (sme == null) - return; - var found = FindSubModelElement(sme); - if (found != null) - this.Remove(found); - } - - // a little more business logic - - public T CreateSMEForCD(ConceptDescription cd, string category = null, string idShort = null, - string idxTemplate = null, int maxNum = 999, bool addSme = false, bool isTemplate = false) - where T : SubmodelElement, new() - { - // access - if (cd == null) - return null; - - // try to potentially figure out idShort - var ids = cd.idShort; - if ((ids == null || ids.Trim() == "") && cd.GetIEC61360() != null) - ids = cd.GetIEC61360().shortName? - .GetDefaultStr(); - if (idShort != null) - ids = idShort; - if (ids == null) - return null; - - // unique? - if (idxTemplate != null) - ids = this.IterateIdShortTemplateToBeUnique(idxTemplate, maxNum); - - // make a new instance - var sme = new T() - { - idShort = ids, - semanticId = new SemanticId(cd.GetCdReference()) - }; - if (category != null) - sme.category = category; - if (isTemplate) - sme.kind = ModelingKind.CreateAsTemplate(); - - // if its a SMC, make sure its accessible - if (sme is SubmodelElementCollection smc) - smc.value = new SubmodelElementWrapperCollection(); - - // instantanously add it? - if (addSme) - this.Add(sme); - - // give back - return sme; - } - - public T CreateSMEForIdShort(string idShort, string category = null, - string idxTemplate = null, int maxNum = 999, bool addSme = false) where T : SubmodelElement, new() - { - // access - if (idShort == null) - return null; - - // try to potentially figure out idShort - var ids = idShort; - - // unique? - if (idxTemplate != null) - ids = this.IterateIdShortTemplateToBeUnique(idxTemplate, maxNum); - - // make a new instance - var sme = new T() { idShort = ids }; - if (category != null) - sme.category = category; - - // instantanously add it? - if (addSme) - this.Add(sme); - - // give back - return sme; - } - - // for conversion - - public T AdaptiveConvertTo( - SubmodelElement anySrc, - ConceptDescription createDefault = null, - string idShort = null, bool addSme = false) where T : SubmodelElement, new() - { - if (typeof(T) == typeof(MultiLanguageProperty) - && anySrc is Property srcProp) - { - var res = this.CreateSMEForCD(createDefault, idShort: idShort, addSme: addSme); - if (res is MultiLanguageProperty mlp) - { - mlp.value = new LangStringSet("EN?", srcProp.value); - mlp.valueId = srcProp.valueId; - return res; - } - } - - if (typeof(T) == typeof(Property) - && anySrc is MultiLanguageProperty srcMlp) - { - var res = this.CreateSMEForCD(createDefault, idShort: idShort, addSme: addSme); - if (res is Property prp) - { - prp.value = "" + srcMlp.value?.GetDefaultStr(); - prp.valueId = srcMlp.valueId; - return res; - } - } - - return null; - } - - public T CopyOneSMEbyCopy(Key destSemanticId, - SubmodelElementWrapperCollection sourceSmc, Key[] sourceSemanticId, - ConceptDescription createDefault = null, Action setDefault = null, - Key.MatchMode matchMode = Key.MatchMode.Relaxed, - string idShort = null, bool addSme = false) where T : SubmodelElement, new() - { - // get source - var src = sourceSmc?.FindFirstAnySemanticIdAs(sourceSemanticId, matchMode); - - // may be make an adaptive conversion - if (src == null) - { - var anySrc = sourceSmc?.FindFirstAnySemanticId(sourceSemanticId, matchMode: matchMode); - src = AdaptiveConvertTo(anySrc?.submodelElement, createDefault, - idShort: idShort, addSme: false); - } - - // proceed - var aeSrc = SubmodelElementWrapper.GetAdequateEnum(src?.GetElementName()); - if (src == null || aeSrc == SubmodelElementWrapper.AdequateElementEnum.Unknown) - { - // create a default? - if (createDefault == null) - return null; - - // ok, default - var dflt = this.CreateSMEForCD(createDefault, idShort: idShort, addSme: addSme); - - // set default? - setDefault?.Invoke(dflt); - - // return - return dflt; - } - - // ok, create new one - var dst = SubmodelElementWrapper.CreateAdequateType(aeSrc, src) as T; - if (dst == null) - return null; - - // make same things sure - dst.idShort = src.idShort; - dst.category = src.category; - dst.semanticId = new SemanticId(destSemanticId); - - // instantanously add it? - if (addSme) - this.Add(dst); - - // give back - return dst; - } - - public T CopyOneSMEbyCopy(ConceptDescription destCD, - SubmodelElementWrapperCollection sourceSmc, ConceptDescription sourceCD, - bool createDefault = false, Action setDefault = null, - Key.MatchMode matchMode = Key.MatchMode.Relaxed, - string idShort = null, bool addSme = false) where T : SubmodelElement, new() - { - return this.CopyOneSMEbyCopy(destCD?.GetSingleKey(), sourceSmc, new[] { sourceCD?.GetSingleKey() }, - createDefault ? destCD : null, setDefault, matchMode, idShort, addSme); - } - - public T CopyOneSMEbyCopy(ConceptDescription destCD, - SubmodelElementWrapperCollection sourceSmc, Key[] sourceKeys, - bool createDefault = false, Action setDefault = null, - Key.MatchMode matchMode = Key.MatchMode.Relaxed, - string idShort = null, bool addSme = false) where T : SubmodelElement, new() - { - return this.CopyOneSMEbyCopy(destCD?.GetSingleKey(), sourceSmc, sourceKeys, - createDefault ? destCD : null, setDefault, matchMode, idShort, addSme); - } - - public void CopyManySMEbyCopy(Key destSemanticId, - SubmodelElementWrapperCollection sourceSmc, Key sourceSemanticId, - ConceptDescription createDefault = null, Action setDefault = null, - Key.MatchMode matchMode = Key.MatchMode.Relaxed) where T : SubmodelElement, new() - { - // bool find possible sources - bool foundSrc = false; - if (sourceSmc == null) - return; - foreach (var src in sourceSmc.FindAllSemanticIdAs(sourceSemanticId, matchMode)) - { - // type of found src? - var aeSrc = SubmodelElementWrapper.GetAdequateEnum(src?.GetElementName()); - - // ok? - if (src == null || aeSrc == SubmodelElementWrapper.AdequateElementEnum.Unknown) - continue; - foundSrc = true; - - // ok, create new one - var dst = SubmodelElementWrapper.CreateAdequateType(aeSrc, src) as T; - if (dst != null) - { - // make same things sure - dst.idShort = src.idShort; - dst.category = src.category; - dst.semanticId = new SemanticId(destSemanticId); - - // instantanously add it? - this.Add(dst); - } - } - - // default? - if (createDefault != null && !foundSrc) - { - // ok, default - var dflt = this.CreateSMEForCD(createDefault, addSme: true); - - // set default? - setDefault?.Invoke(dflt); - } - } - - public void CopyManySMEbyCopy(ConceptDescription destCD, - SubmodelElementWrapperCollection sourceSmc, ConceptDescription sourceCD, - bool createDefault = false, Action setDefault = null, - Key.MatchMode matchMode = Key.MatchMode.Relaxed) where T : SubmodelElement, new() - { - CopyManySMEbyCopy(destCD.GetSingleKey(), sourceSmc, sourceCD.GetSingleKey(), - createDefault ? destCD : null, setDefault, matchMode); - } - } - - public interface IManageSubmodelElements - { - void Add(SubmodelElement sme); - void Insert(int index, SubmodelElement sme); - void Remove(SubmodelElement sme); - } - - public class Submodel : Identifiable, IManageSubmodelElements, - System.IDisposable, IEnumerateChildren, IFindAllReferences, - IGetSemanticId, IGetQualifiers - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // members - - // do this in order to be IDisposable, that is: suitable for (using) - void System.IDisposable.Dispose() { } - public void GetData() { } - - // from HasKind - [XmlElement(ElementName = "kind")] - [JsonIgnore] - public ModelingKind kind = new ModelingKind(); - [XmlIgnore] - [JsonProperty(PropertyName = "kind")] - public string JsonKind - { - get - { - if (kind == null) - return null; - return kind.kind; - } - set - { - if (kind == null) - kind = new ModelingKind(); - kind.kind = value; - } - } - - // from hasSemanticId: - [XmlElement(ElementName = "semanticId")] - public SemanticId semanticId = new SemanticId(); - public SemanticId GetSemanticId() { return semanticId; } - - // from Qualifiable: - [XmlArray("qualifier")] - [XmlArrayItem("qualifier")] - public QualifierCollection qualifiers = null; - public QualifierCollection GetQualifiers() => qualifiers; - - // from hasDataSpecification: - [XmlElement(ElementName = "embeddedDataSpecification")] - public HasDataSpecification hasDataSpecification = null; - - // from this very class - [XmlIgnore] - [JsonIgnore] - private SubmodelElementWrapperCollection _submodelElements = null; - - [JsonIgnore] - public SubmodelElementWrapperCollection submodelElements - { - get { return _submodelElements; } - set { _submodelElements = value; _submodelElements.Parent = this; } - } - - [XmlIgnore] - [JsonProperty(PropertyName = "submodelElements")] - public SubmodelElement[] JsonSubmodelElements - { - get - { - var res = new ListOfSubmodelElement(); - if (submodelElements != null) - foreach (var smew in submodelElements) - res.Add(smew.submodelElement); - return res.ToArray(); - } - set - { - if (value != null) - { - this.submodelElements = new SubmodelElementWrapperCollection(); - foreach (var x in value) - { - var smew = new SubmodelElementWrapper() { submodelElement = x }; - this.submodelElements.Add(smew); - } - } - } - } - - // getter / setter - - // constructors / creators - - public Submodel() : base() { } - - public Submodel(Submodel src, bool shallowCopy = false) - : base(src) - { - if (src == null) - return; - if (src.hasDataSpecification != null) - this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - if (src.semanticId != null) - this.semanticId = new SemanticId(src.semanticId); - if (src.kind != null) - this.kind = new ModelingKind(src.kind); - if (!shallowCopy && src.submodelElements != null) - { - if (this.submodelElements == null) - this.submodelElements = new SubmodelElementWrapperCollection(); - foreach (var smw in src.submodelElements) - this.submodelElements.Add(new SubmodelElementWrapper(smw.submodelElement, shallowCopy: false)); - } - } - -#if !DoNotUseAasxCompatibilityModels - public Submodel(AasxCompatibilityModels.AdminShellV10.Submodel src, bool shallowCopy = false) - : base(src) - { - if (src.hasDataSpecification != null) - this.hasDataSpecification = new HasDataSpecification(src.hasDataSpecification); - if (src.semanticId != null) - this.semanticId = new SemanticId(src.semanticId); - if (src.kind != null) - this.kind = new ModelingKind(src.kind); - if (src.qualifiers != null) - this.qualifiers = new QualifierCollection(src.qualifiers); - if (!shallowCopy && src.submodelElements != null) - { - if (this.submodelElements == null) - this.submodelElements = new SubmodelElementWrapperCollection(); - foreach (var smw in src.submodelElements) - this.submodelElements.Add(new SubmodelElementWrapper(smw.submodelElement, shallowCopy: false)); - } - } -#endif - - public static Submodel CreateNew(string idType, string id, string version = null, string revision = null) - { - var s = new Submodel() { identification = new Identification(idType, id) }; - if (version != null) - { - if (s.administration == null) - s.administration = new Administration(); - s.administration.version = version; - s.administration.revision = revision; - } - return (s); - } - - [JsonIgnore] - [XmlIgnore] - public SubmodelElementWrapperCollection SmeForWrite - { - get - { - if (this.submodelElements == null) - this.submodelElements = new SubmodelElementWrapperCollection(); - return this.submodelElements; - } - } - - // from IEnumarateChildren - public IEnumerable EnumerateChildren() - { - if (this.submodelElements != null) - foreach (var smw in this.submodelElements) - yield return smw; - } - - public EnumerationPlacmentBase GetChildrenPlacement(SubmodelElement child) - { - return null; - } - - public object AddChild(SubmodelElementWrapper smw, EnumerationPlacmentBase placement = null) - { - if (smw == null) - return null; - if (this.submodelElements == null) - this.submodelElements = new SubmodelElementWrapperCollection(); - if (smw.submodelElement != null) - smw.submodelElement.parent = this; - this.submodelElements.Add(smw); - return smw; - } - - // from IManageSubmodelElements - public void Add(SubmodelElement sme) - { - if (submodelElements == null) - submodelElements = new SubmodelElementWrapperCollection(); - var sew = new SubmodelElementWrapper(); - sme.parent = this; // track parent here! - sew.submodelElement = sme; - submodelElements.Add(sew); - } - - public void Insert(int index, SubmodelElement sme) - { - if (submodelElements == null) - submodelElements = new SubmodelElementWrapperCollection(); - var sew = new SubmodelElementWrapper(); - sme.parent = this; // track parent here! - sew.submodelElement = sme; - if (index < 0 || index >= submodelElements.Count) - return; - submodelElements.Insert(index, sew); - } - - public void Remove(SubmodelElement sme) - { - if (submodelElements != null) - submodelElements.Remove(sme); - } - - // further - - public void AddQualifier( - string qualifierType = null, string qualifierValue = null, KeyList semanticKeys = null, - Reference qualifierValueId = null) - { - QualifierCollection.AddQualifier( - ref this.qualifiers, qualifierType, qualifierValue, semanticKeys, qualifierValueId); - } - - public Qualifier HasQualifierOfType(string qualifierType) - { - return QualifierCollection.HasQualifierOfType(this.qualifiers, qualifierType); - } - - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("Submodel", "SM"); - } - - public SubmodelRef GetSubmodelRef() - { - SubmodelRef l = new SubmodelRef(); - l.Keys.Add( - Key.CreateNew( - this.GetElementName(), true, this.identification.idType, this.identification.id)); - return l; - } - - /// - /// If instance, return semanticId as on key. - /// If template, return identification as key. - /// - /// - public Key GetSemanticKey() - { - if (true == this.kind?.IsTemplate) - return new Key(this.GetElementName(), true, this.identification?.idType, this.identification?.id); - else - return this.semanticId?.GetAsExactlyOneKey(); - } - - public void AddDataSpecification(Key k) - { - if (hasDataSpecification == null) - hasDataSpecification = new HasDataSpecification(); - var r = new Reference(); - r.Keys.Add(k); - hasDataSpecification.Add(new EmbeddedDataSpecification(r)); - } - - public SubmodelElementWrapper FindSubmodelElementWrapper(string idShort) - { - if (this.submodelElements == null) - return null; - foreach (var smw in this.submodelElements) - if (smw.submodelElement != null) - if (smw.submodelElement.idShort.Trim().ToLower() == idShort.Trim().ToLower()) - return smw; - return null; - } - - public IEnumerable FindDeep(Predicate match = null) where T : SubmodelElement - { - if (this.submodelElements == null) - yield break; - foreach (var x in this.submodelElements.FindDeep(match)) - yield return x; - } - - public Tuple ToCaptionInfo() - { - var caption = AdminShellUtilV20.EvalToNonNullString("\"{0}\" ", idShort, ""); - if (administration != null) - caption += "V" + administration.version + "." + administration.revision; - var info = ""; - if (identification != null) - info = $"[{identification.idType}, {identification.id}]"; - return Tuple.Create(caption, info); - } - - public override string ToString() - { - var ci = ToCaptionInfo(); - return string.Format("{0}{1}", ci.Item1, (ci.Item2 != "") ? " / " + ci.Item2 : ""); - } - - // Recursing - - /// - /// Recurses on all Submodel elements of a Submodel or SME, which allows children. - /// The state object will be passed to the lambda function in order to provide - /// stateful approaches. - /// - /// State object to be provided to lambda. Could be null. - /// The lambda function as (state, parents, SME) - /// The lambda shall return TRUE in order to deep into recursion. - /// - public void RecurseOnSubmodelElements( - object state, Func lambda) - { - this.submodelElements?.RecurseOnReferables(state, null, (o, par, rf) => - { - if (rf is SubmodelElement sme) - return lambda(o, par, sme); - else - return true; - }); - } - - /// - /// Recurses on all Submodel elements of a Submodel or SME, which allows children. - /// The state object will be passed to the lambda function in order to provide - /// stateful approaches. Include this element, as well. - /// - /// State object to be provided to lambda. Could be null. - /// The lambda function as (state, parents, SME) - /// The lambda shall return TRUE in order to deep into recursion. - /// Include this element as well. parents will then - /// include this element as well! - public override void RecurseOnReferables( - object state, Func lambda, - bool includeThis = false) - { - var parents = new ListOfReferable(); - if (includeThis) - { - lambda(state, null, this); - parents.Add(this); - } - this.submodelElements?.RecurseOnReferables(state, parents, lambda); - } - - // Parents stuff - - public static void SetParentsForSME(Referable parent, SubmodelElement se) - { - if (se == null) - return; - - se.parent = parent; - - // via interface enumaration - if (se is IEnumerateChildren) - { - var childs = (se as IEnumerateChildren).EnumerateChildren(); - if (childs != null) - foreach (var c in childs) - SetParentsForSME(se, c.submodelElement); - } - } - - public void SetAllParents() - { - if (this.submodelElements != null) - foreach (var sme in this.submodelElements) - SetParentsForSME(this, sme.submodelElement); - } - - public T CreateSMEForCD(ConceptDescription cd, string category = null, string idShort = null, - string idxTemplate = null, int maxNum = 999, bool addSme = false) where T : SubmodelElement, new() - { - if (this.submodelElements == null) - this.submodelElements = new SubmodelElementWrapperCollection(); - return this.submodelElements.CreateSMEForCD(cd, category, idShort, idxTemplate, maxNum, addSme); - } - - public T CreateSMEForIdShort(string idShort, string category = null, - string idxTemplate = null, int maxNum = 999, bool addSme = false) where T : SubmodelElement, new() - { - if (this.submodelElements == null) - this.submodelElements = new SubmodelElementWrapperCollection(); - return this.submodelElements.CreateSMEForIdShort(idShort, category, idxTemplate, maxNum, addSme); - } - - // validation - - public override void Validate(AasValidationRecordList results) - { - // access - if (results == null) - return; - - // check - base.Validate(results); - ModelingKind.Validate(results, kind, this); - KeyList.Validate(results, semanticId?.Keys, this); - } - - // find - - public IEnumerable FindAllReferences() - { - // not nice: use temp list - var temp = new List(); - - // recurse - this.RecurseOnSubmodelElements(null, (state, parents, sme) => - { - if (sme is ReferenceElement re) - if (re.value != null) - temp.Add(re.value); - if (sme is RelationshipElement rl) - { - if (rl.first != null) - temp.Add(rl.first); - if (rl.second != null) - temp.Add(rl.second); - } - // recurse - return true; - }); - - // now, give back - foreach (var r in temp) - yield return new LocatedReference(this, r); - } - } - - public class ListOfSubmodels : List, IAasElement - { - // self decscription - - public AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("Submodels", "SMS"); - } - - public string GetElementName() - { - return this.GetSelfDescription()?.ElementName; - } - } - - // - // Derived from SubmodelElements - // - - public class DataElement : SubmodelElement - { - public static string ValueType_STRING = "string"; - public static string ValueType_DATE = "date"; - public static string ValueType_BOOLEAN = "boolean"; - - public static string[] ValueTypeItems = new string[] { - "anyType", "complexType", "anySimpleType", "anyAtomicType", "anyURI", "base64Binary", - "boolean", "date", "dateTime", - "dateTimeStamp", "decimal", "integer", "long", "int", "short", "byte", "nonNegativeInteger", - "positiveInteger", - "unsignedLong", "unsignedInt", "unsignedShort", "unsignedByte", "nonPositiveInteger", - "negativeInteger", "double", "duration", - "dayTimeDuration", "yearMonthDuration", "float", "hexBinary", "string", "langString", "time" }; - - public static string[] ValueTypes_Number = new[] { - "decimal", "integer", "long", "int", "short", "byte", "nonNegativeInteger", - "positiveInteger", - "unsignedLong", "unsignedInt", "unsignedShort", "unsignedByte", "nonPositiveInteger", - "negativeInteger", "double", "float" }; - - public DataElement() { } - - public DataElement(SubmodelElement src) : base(src) { } - - public DataElement(DataElement src) : base(src) { } - -#if !DoNotUseAasxCompatibilityModels - public DataElement(AasxCompatibilityModels.AdminShellV10.DataElement src) - : base(src) - { } -#endif - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("DataElement", "DE"); - } - } - - public class JsonValueTypeCast - { - - public class JsonDataObjectType - { - [JsonProperty(PropertyName = "name")] - public string name = ""; - } - - [JsonProperty(PropertyName = "dataObjectType")] - public JsonDataObjectType dataObjectType = new JsonDataObjectType(); - - public JsonValueTypeCast(string name) - { - this.dataObjectType.name = name; - } - } - - public class Property : DataElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - - [MetaModelName("Property.valueType")] - [TextSearchable] - [JsonIgnore] - public string valueType = ""; - [XmlIgnore] - [JsonProperty(PropertyName = "valueType")] - public JsonValueTypeCast JsonValueType - { - get { return new JsonValueTypeCast(this.valueType); } - set { this.valueType = value?.dataObjectType?.name; } - } - - - [MetaModelName("Property.value")] - [TextSearchable] - public string value = ""; - public Reference valueId = null; - - // constructors - - public Property() { } - - public Property(SubmodelElement src) - : base(src) - { - if (!(src is Property p)) - return; - this.valueType = p.valueType; - this.value = p.value; - if (p.valueId != null) - valueId = new Reference(p.valueId); - } - -#if !DoNotUseAasxCompatibilityModels - public Property(AasxCompatibilityModels.AdminShellV10.Property src) - : base(src) - { - if (src == null) - return; - - this.valueType = src.valueType; - this.value = src.value; - if (src.valueId != null) - this.valueId = new Reference(src.valueId); - } -#endif - - public static Property CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new Property(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - public Property Set(string valueType = "", string value = "") - { - this.valueType = valueType; - this.value = value; - return this; - } - - public Property Set(string type, bool local, string idType, string value) - { - this.valueId = Reference.CreateNew(Key.CreateNew(type, local, idType, value)); - return this; - } - - public Property Set(Qualifier q) - { - if (q != null) - this.AddQualifier(q); - return this; - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("Property", "Prop", - SubmodelElementWrapper.AdequateElementEnum.Property); - } - - public override string ValueAsText(string defaultLang = null) - { - return "" + value; - } - - public override void ValueFromText(string text, string defaultLang = null) - { - value = "" + text; - } - - public bool IsTrue() - { - if (this.valueType?.Trim().ToLower() == "boolean") - { - var v = "" + this.value?.Trim().ToLower(); - if (v == "true" || v == "1") - return true; - } - return false; - } - - public override double? ValueAsDouble() - { - // pointless - if (this.value == null || this.value.Trim() == "" || this.valueType == null) - return null; - - // type? - var vt = this.valueType.Trim().ToLower(); - if (!DataElement.ValueTypes_Number.Contains(vt)) - return null; - - // try convert - if (double.TryParse(this.value, NumberStyles.Any, CultureInfo.InvariantCulture, out double dbl)) - return dbl; - - // no - return null; - } - - } - - public class MultiLanguageProperty : DataElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - - public LangStringSet value = new LangStringSet(); - public Reference valueId = null; - - // constructors - - public MultiLanguageProperty() { } - - public MultiLanguageProperty(SubmodelElement src) - : base(src) - { - if (!(src is MultiLanguageProperty mlp)) - return; - - this.value = new LangStringSet(mlp.value); - if (mlp.valueId != null) - valueId = new Reference(mlp.valueId); - } - -#if !DoNotUseAasxCompatibilityModels - // not available in V1.0 -#endif - - public static MultiLanguageProperty CreateNew( - string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new MultiLanguageProperty(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("MultiLanguageProperty", "MLP", - SubmodelElementWrapper.AdequateElementEnum.MultiLanguageProperty); - } - - public MultiLanguageProperty Set(LangStringSet ls) - { - this.value = ls; - return this; - } - - public MultiLanguageProperty Set(ListOfLangStr ls) - { - this.value = new LangStringSet(ls); - return this; - } - - public MultiLanguageProperty Set(LangStr ls) - { - if (ls == null) - return this; - if (this.value?.langString == null) - this.value = new LangStringSet(); - this.value.langString[ls.lang] = ls.str; - return this; - } - - public MultiLanguageProperty Set(string lang, string str) - { - return this.Set(new LangStr(lang, str)); - } - - public override string ValueAsText(string defaultLang = null) - { - return "" + value?.GetDefaultStr(defaultLang); - } - - public override void ValueFromText(string text, string defaultLang = null) - { - Set(defaultLang, text); - } - - } - - public class Range : DataElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - - [MetaModelName("Range.valueType")] - [TextSearchable] - [JsonIgnore] - [CountForHash] - public string valueType = ""; - - [XmlIgnore] - [JsonProperty(PropertyName = "valueType")] - public JsonValueTypeCast JsonValueType - { - get { return new JsonValueTypeCast(this.valueType); } - set { this.valueType = value?.dataObjectType?.name; } - } - - [MetaModelName("Range.min")] - [TextSearchable] - [CountForHash] - public string min = ""; - - [MetaModelName("Range.max")] - [TextSearchable] - [CountForHash] - public string max = ""; - - // constructors - - public Range() { } - - public Range(SubmodelElement src) - : base(src) - { - if (!(src is Range rng)) - return; - - this.valueType = rng.valueType; - this.min = rng.min; - this.max = rng.max; - } - -#if !DoNotUseAasxCompatibilityModels - // not available in V1.0 -#endif - - public static Range CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new Range(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("Range", "Range", - SubmodelElementWrapper.AdequateElementEnum.Range); - } - - public override string ValueAsText(string defaultLang = null) - { - return "" + min + " .. " + max; - } - - } - - public class Blob : DataElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - - [MetaModelName("Blob.mimeType")] - [TextSearchable] - [CountForHash] - public string mimeType = ""; - - [MetaModelName("Blob.value")] - [TextSearchable] - [CountForHash] - public string value = ""; - - // constructors - - public Blob() { } - - public Blob(SubmodelElement src) - : base(src) - { - if (!(src is Blob blb)) - return; - - this.mimeType = blb.mimeType; - this.value = blb.value; - } - -#if !DoNotUseAasxCompatibilityModels - public Blob(AasxCompatibilityModels.AdminShellV10.Blob src) - : base(src) - { - if (src == null) - return; - - this.mimeType = src.mimeType; - this.value = src.value; - } -#endif - - public static Blob CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new Blob(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - public void Set(string mimeType = "", string value = "") - { - this.mimeType = mimeType; - this.value = value; - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("Blob", "Blob", - SubmodelElementWrapper.AdequateElementEnum.Blob); - } - - } - - public class File : DataElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - - [MetaModelName("File.mimeType")] - [TextSearchable] - [CountForHash] - public string mimeType = ""; - - [MetaModelName("File.value")] - [TextSearchable] - [CountForHash] - public string value = ""; - - // constructors - - public File() { } - - public File(SubmodelElement src) - : base(src) - { - if (!(src is File fil)) - return; - - this.mimeType = fil.mimeType; - this.value = fil.value; - } - -#if !DoNotUseAasxCompatibilityModels - public File(AasxCompatibilityModels.AdminShellV10.File src) - : base(src) - { - if (src == null) - return; - - this.mimeType = src.mimeType; - this.value = src.value; - } -#endif - - public static File CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new File(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - public void Set(string mimeType = "", string value = "") - { - this.mimeType = mimeType; - this.value = value; - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("File", "File", - SubmodelElementWrapper.AdequateElementEnum.File); - } - - public static string[] GetPopularMimeTypes() - { - return - new[] { - System.Net.Mime.MediaTypeNames.Text.Plain, - System.Net.Mime.MediaTypeNames.Text.Xml, - System.Net.Mime.MediaTypeNames.Text.Html, - "application/json", - "application/rdf+xml", - System.Net.Mime.MediaTypeNames.Application.Pdf, - System.Net.Mime.MediaTypeNames.Image.Jpeg, - "image/png", - System.Net.Mime.MediaTypeNames.Image.Gif, - "application/iges", - "application/step" - }; - } - - public override string ValueAsText(string defaultLang = null) - { - return "" + value; - } - } - - public class ReferenceElement : DataElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - - public Reference value = new Reference(); - - // constructors - - public ReferenceElement() { } - - public ReferenceElement(SubmodelElement src) - : base(src) - { - if (!(src is ReferenceElement re)) - return; - - if (re.value != null) - this.value = new Reference(re.value); - } - -#if !DoNotUseAasxCompatibilityModels - public ReferenceElement(AasxCompatibilityModels.AdminShellV10.ReferenceElement src) - : base(src) - { - if (src == null) - return; - - if (src.value != null) - this.value = new Reference(src.value); - } -#endif - - public static ReferenceElement CreateNew( - string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new ReferenceElement(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - public void Set(Reference value = null) - { - this.value = value; - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("ReferenceElement", "Ref", - SubmodelElementWrapper.AdequateElementEnum.ReferenceElement); - } - - } - - public class RelationshipElement : DataElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - - public Reference first = new Reference(); - public Reference second = new Reference(); - - // constructors - - public RelationshipElement() { } - - public RelationshipElement(SubmodelElement src) - : base(src) - { - if (!(src is RelationshipElement rel)) - return; - - if (rel.first != null) - this.first = new Reference(rel.first); - if (rel.second != null) - this.second = new Reference(rel.second); - } - -#if !DoNotUseAasxCompatibilityModels - public RelationshipElement(AasxCompatibilityModels.AdminShellV10.RelationshipElement src) - : base(src) - { - if (src == null) - return; - - if (src.first != null) - this.first = new Reference(src.first); - if (src.second != null) - this.second = new Reference(src.second); - } -#endif - - public static RelationshipElement CreateNew( - string idShort = null, string category = null, Key semanticIdKey = null, Reference first = null, - Reference second = null) - { - var x = new RelationshipElement(); - x.CreateNewLogic(idShort, category, semanticIdKey); - x.first = first; - x.second = second; - return (x); - } - - public void Set(Reference first = null, Reference second = null) - { - this.first = first; - this.second = second; - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("RelationshipElement", "Rel", - SubmodelElementWrapper.AdequateElementEnum.RelationshipElement); - } - } - - public class AnnotatedRelationshipElement : RelationshipElement, IManageSubmodelElements, IEnumerateChildren - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - - // from this very class - - [JsonIgnore] - [SkipForHash] // do NOT count children! - [XmlArray("annotations")] - [XmlArrayItem("dataElement")] - public DataElementWrapperCollection annotations = null; - - [XmlIgnore] - [JsonProperty(PropertyName = "annotations")] - public DataElement[] JsonAnotations - { - get - { - var res = new List(); - if (annotations != null) - foreach (var smew in annotations) - if (smew.submodelElement is DataElement de) - res.Add(de); - return res.ToArray(); - } - set - { - if (value != null) - { - this.annotations = new DataElementWrapperCollection(); - foreach (var x in value) - { - var smew = new SubmodelElementWrapper() { submodelElement = x }; - this.annotations.Add(smew); - } - } - } - } - - // constructors - - public AnnotatedRelationshipElement() { } - - public AnnotatedRelationshipElement(SubmodelElement src) - : base(src) - { - if (!(src is AnnotatedRelationshipElement arel)) - return; - if (arel.first != null) - this.first = new Reference(arel.first); - if (arel.second != null) - this.second = new Reference(arel.second); - if (arel.annotations != null) - this.annotations = new DataElementWrapperCollection(arel.annotations); - } - - public new static AnnotatedRelationshipElement CreateNew( - string idShort = null, string category = null, Key semanticIdKey = null, - Reference first = null, Reference second = null) - { - var x = new AnnotatedRelationshipElement(); - x.CreateNewLogic(idShort, category, semanticIdKey); - x.first = first; - x.second = second; - return (x); - } - - // enumerates its children - - public IEnumerable EnumerateChildren() - { - if (this.annotations != null) - foreach (var smw in this.annotations) - yield return smw; - } - - public EnumerationPlacmentBase GetChildrenPlacement(SubmodelElement child) - { - return null; - } - - public object AddChild(SubmodelElementWrapper smw, EnumerationPlacmentBase placement = null) - { - if (smw == null || !(smw.submodelElement is DataElement)) - return null; - if (this.annotations == null) - this.annotations = new DataElementWrapperCollection(); - if (smw.submodelElement != null) - smw.submodelElement.parent = this; - this.annotations.Add(smw); - return smw; - } - - // from IManageSubmodelElements - public void Add(SubmodelElement sme) - { - if (annotations == null) - annotations = new DataElementWrapperCollection(); - var sew = new SubmodelElementWrapper(); - sme.parent = this; // track parent here! - sew.submodelElement = sme; - annotations.Add(sew); - } - - public void Insert(int index, SubmodelElement sme) - { - if (annotations == null) - annotations = new DataElementWrapperCollection(); - var sew = new SubmodelElementWrapper(); - sme.parent = this; // track parent here! - if (index < 0 || index >= annotations.Count) - return; - annotations.Insert(index, sew); - } - - public void Remove(SubmodelElement sme) - { - if (annotations != null) - annotations.Remove(sme); - } - - // further - - public new void Set(Reference first = null, Reference second = null) - { - this.first = first; - this.second = second; - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("AnnotatedRelationshipElement", "RelA", - SubmodelElementWrapper.AdequateElementEnum.AnnotatedRelationshipElement); - } - - - } - - public class Capability : SubmodelElement - { - public Capability() { } - - public Capability(SubmodelElement src) - : base(src) - { } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("Capability", "Cap", - SubmodelElementWrapper.AdequateElementEnum.Capability); - } - } - - - public class SubmodelElementCollection : SubmodelElement, IManageSubmodelElements, IEnumerateChildren - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // values == SMEs - [XmlIgnore] - [JsonIgnore] - [SkipForHash] // do NOT count children! - private SubmodelElementWrapperCollection _value = null; - - [JsonIgnore] - public SubmodelElementWrapperCollection value - { - get { return _value; } - set { _value = value; _value.Parent = this; } - } - - [XmlIgnore] - [JsonProperty(PropertyName = "value")] - public SubmodelElement[] JsonValue - { - get - { - var res = new ListOfSubmodelElement(); - if (value != null) - foreach (var smew in value) - res.Add(smew.submodelElement); - return res.ToArray(); - } - set - { - if (value != null) - { - this.value = new SubmodelElementWrapperCollection(); - foreach (var x in value) - { - var smew = new SubmodelElementWrapper() { submodelElement = x }; - this.value.Add(smew); - } - } - } - } - - // constant members - public bool ordered = false; - public bool allowDuplicates = false; - - // enumartes its children - - public IEnumerable EnumerateChildren() - { - if (this.value != null) - foreach (var smw in this.value) - yield return smw; - } - - public EnumerationPlacmentBase GetChildrenPlacement(SubmodelElement child) - { - return null; - } - - public object AddChild(SubmodelElementWrapper smw, EnumerationPlacmentBase placement = null) - { - if (smw == null) - return null; - if (this.value == null) - this.value = new SubmodelElementWrapperCollection(); - if (smw.submodelElement != null) - smw.submodelElement.parent = this; - this.value.Add(smw); - return smw; - } - - // constructors - - public SubmodelElementCollection() { } - - public SubmodelElementCollection(SubmodelElement src, bool shallowCopy = false) - : base(src) - { - if (!(src is SubmodelElementCollection smc)) - return; - - this.ordered = smc.ordered; - this.allowDuplicates = smc.allowDuplicates; - this.value = new SubmodelElementWrapperCollection(); - if (!shallowCopy) - foreach (var smw in smc.value) - value.Add(new SubmodelElementWrapper(smw.submodelElement)); - } - -#if !DoNotUseAasxCompatibilityModels - public SubmodelElementCollection( - AasxCompatibilityModels.AdminShellV10.SubmodelElementCollection src, bool shallowCopy = false) - : base(src) - { - if (src == null) - return; - - this.ordered = src.ordered; - this.allowDuplicates = src.allowDuplicates; - this.value = new SubmodelElementWrapperCollection(); - if (!shallowCopy) - foreach (var smw in src.value) - value.Add(new SubmodelElementWrapper(smw.submodelElement)); - } -#endif - - public static SubmodelElementCollection CreateNew( - string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new SubmodelElementCollection(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - // from IManageSubmodelElements - public void Add(SubmodelElement sme) - { - if (value == null) - value = new SubmodelElementWrapperCollection(); - var sew = new SubmodelElementWrapper(); - sme.parent = this; // track parent here! - sew.submodelElement = sme; - value.Add(sew); - } - - public void Insert(int index, SubmodelElement sme) - { - if (value == null) - value = new SubmodelElementWrapperCollection(); - var sew = new SubmodelElementWrapper(); - sme.parent = this; // track parent here! - sew.submodelElement = sme; - if (index < 0 || index >= value.Count) - return; - value.Insert(index, sew); - } - - public void Remove(SubmodelElement sme) - { - if (value != null) - value.Remove(sme); - } - - // further - - public void Set(bool allowDuplicates = false, bool ordered = false) - { - this.allowDuplicates = allowDuplicates; - this.ordered = ordered; - } - - public SubmodelElementWrapper FindFirstIdShort(string idShort) - { - return this.value?.FindFirstIdShort(idShort); - } - - public T CreateSMEForCD(ConceptDescription cd, string category = null, string idShort = null, - string idxTemplate = null, int maxNum = 999, bool addSme = false) where T : SubmodelElement, new() - { - if (this.value == null) - this.value = new SubmodelElementWrapperCollection(); - return this.value.CreateSMEForCD(cd, category, idShort, idxTemplate, maxNum, addSme); - } - - public T CreateSMEForIdShort(string idShort, string category = null, - string idxTemplate = null, int maxNum = 999, bool addSme = false) where T : SubmodelElement, new() - { - if (this.value == null) - this.value = new SubmodelElementWrapperCollection(); - return this.value.CreateSMEForIdShort(idShort, category, idxTemplate, maxNum, addSme); - } - - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("SubmodelElementCollection", "SMC", - SubmodelElementWrapper.AdequateElementEnum.SubmodelElementCollection); - } - - // Recursing - - /// - /// Recurses on all Submodel elements of a Submodel or SME, which allows children. - /// The state object will be passed to the lambda function in order to provide - /// stateful approaches. - /// - /// State object to be provided to lambda. Could be null. - /// The lambda function as (state, parents, SME) - /// The lambda shall return TRUE in order to deep into recursion. - /// - public void RecurseOnSubmodelElements( - object state, Func lambda) - { - this.value?.RecurseOnReferables(state, null, (o, par, rf) => - { - if (rf is SubmodelElement sme) - return lambda(o, par, sme); - else - return true; - }); - } - - /// - /// Recurses on all Submodel elements of a Submodel or SME, which allows children. - /// The state object will be passed to the lambda function in order to provide - /// stateful approaches. Include this element, as well. - /// - /// State object to be provided to lambda. Could be null. - /// The lambda function as (state, parents, SME) - /// The lambda shall return TRUE in order to deep into recursion. - /// Include this element as well. parents will then - /// include this element as well! - public override void RecurseOnReferables( - object state, Func lambda, - bool includeThis = false) - { - var parents = new ListOfReferable(); - if (includeThis) - { - lambda(state, null, this); - parents.Add(this); - } - this.value?.RecurseOnReferables(state, parents, lambda); - } - } - - public class OperationVariable : IAasElement - { - public enum Direction { In, Out, InOut }; - - // Note: for OperationVariable, the values of the SubmodelElement itself ARE NOT TO BE USED! - // only the SME attributes of "value" are counting - - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public JsonModelTypeWrapper JsonModelType { get { return new JsonModelTypeWrapper(GetElementName()); } } - - // members - public SubmodelElementWrapper value = null; - - // constructors - - public OperationVariable() - { - } - - public OperationVariable(OperationVariable src, bool shallowCopy = false) - { - this.value = new SubmodelElementWrapper(src?.value?.submodelElement, shallowCopy); - } - -#if !DoNotUseAasxCompatibilityModels - public OperationVariable( - AasxCompatibilityModels.AdminShellV10.OperationVariable src, bool shallowCopy = false) - { - this.value = new SubmodelElementWrapper(src.value.submodelElement, shallowCopy); - } -#endif - - public OperationVariable(SubmodelElement elem) - : base() - { - this.value = new SubmodelElementWrapper(elem); - } - - public AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("OperationVariable", "OprVar"); - } - - public string GetElementName() - { - return this.GetSelfDescription()?.ElementName; - } - } - - public class Operation : SubmodelElement, IEnumerateChildren - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // members - [JsonIgnore] - [XmlElement(ElementName = "inputVariable")] - [SkipForHash] // do NOT count children! - public List inputVariable = new List(); - - [JsonIgnore] - [XmlElement(ElementName = "outputVariable")] - [SkipForHash] // do NOT count children! - public List outputVariable = new List(); - - [JsonIgnore] - [XmlElement(ElementName = "inoutputVariable")] - [SkipForHash] // do NOT count children! - public List inoutputVariable = new List(); - - [XmlIgnore] - // MICHA 190504: enabled JSON operation variables! - [JsonProperty(PropertyName = "inputVariable")] - public OperationVariable[] JsonInputVariable - { - get { return inputVariable?.ToArray(); } - set { inputVariable = (value != null) ? new List(value) : null; } - } - - [XmlIgnore] - [JsonProperty(PropertyName = "outputVariable")] - // MICHA 190504: enabled JSON operation variables! - public OperationVariable[] JsonOutputVariable - { - get { return outputVariable?.ToArray(); } - set { outputVariable = (value != null) ? new List(value) : null; } - } - - [XmlIgnore] - [JsonProperty(PropertyName = "inoutputVariable")] - // MICHA 190504: enabled JSON operation variables! - public OperationVariable[] JsonInOutputVariable - { - get { return inoutputVariable?.ToArray(); } - set { inoutputVariable = (value != null) ? new List(value) : null; } - } - - public List this[OperationVariable.Direction dir] - { - get - { - if (dir == OperationVariable.Direction.In) - return inputVariable; - else - if (dir == OperationVariable.Direction.Out) - return outputVariable; - else - return inoutputVariable; - } - set - { - if (dir == OperationVariable.Direction.In) - inputVariable = value; - else - if (dir == OperationVariable.Direction.Out) - outputVariable = value; - else - inoutputVariable = value; - } - } - - public List this[int dir] - { - get - { - if (dir == 0) - return inputVariable; - else - if (dir == 1) - return outputVariable; - else - return inoutputVariable; - } - set - { - if (dir == 0) - inputVariable = value; - else - if (dir == 1) - outputVariable = value; - else - inoutputVariable = value; - } - } - - public static SubmodelElementWrapperCollection GetWrappers(List ovl) - { - var res = new SubmodelElementWrapperCollection(); - foreach (var ov in ovl) - if (ov.value != null) - res.Add(ov.value); - return res; - } - - // enumartes its children - public IEnumerable EnumerateChildren() - { - if (this.inputVariable != null) - foreach (var smw in this.inputVariable) - yield return smw?.value; - - if (this.outputVariable != null) - foreach (var smw in this.outputVariable) - yield return smw?.value; - - if (this.inoutputVariable != null) - foreach (var smw in this.inoutputVariable) - yield return smw?.value; - } - - public class EnumerationPlacmentOperationVariable : EnumerationPlacmentBase - { - public OperationVariable.Direction Direction; - public OperationVariable OperationVariable; - } - - public EnumerationPlacmentBase GetChildrenPlacement(SubmodelElement child) - { - // trivial - if (child == null) - return null; - - // search - OperationVariable.Direction? dir = null; - OperationVariable opvar = null; - if (this.inputVariable != null) - foreach (var ov in this.inputVariable) - if (ov?.value?.submodelElement == child) - { - dir = OperationVariable.Direction.In; - opvar = ov; - } - - if (this.outputVariable != null) - foreach (var ov in this.outputVariable) - if (ov?.value?.submodelElement == child) - { - dir = OperationVariable.Direction.Out; - opvar = ov; - } - - if (this.inoutputVariable != null) - foreach (var ov in this.inoutputVariable) - if (ov?.value?.submodelElement == child) - { - dir = OperationVariable.Direction.InOut; - opvar = ov; - } - - // found - if (!dir.HasValue) - return null; - return new EnumerationPlacmentOperationVariable() - { - Direction = dir.Value, - OperationVariable = opvar - }; - } - - public object AddChild(SubmodelElementWrapper smw, EnumerationPlacmentBase placement = null) - { - // not enough information to select list of children? - var pl = placement as EnumerationPlacmentOperationVariable; - if (smw == null || pl == null) - return null; - - // ok, use information - var ov = new OperationVariable(); - ov.value = smw; - - if (smw.submodelElement != null) - smw.submodelElement.parent = this; - - if (pl.Direction == OperationVariable.Direction.In) - { - if (inputVariable == null) - inputVariable = new List(); - inputVariable.Add(ov); - } - - if (pl.Direction == OperationVariable.Direction.Out) - { - if (outputVariable == null) - outputVariable = new List(); - outputVariable.Add(ov); - } - - if (pl.Direction == OperationVariable.Direction.InOut) - { - if (inoutputVariable == null) - inoutputVariable = new List(); - inoutputVariable.Add(ov); - } - - return ov; - } - - // constructors - - public Operation() { } - - public Operation(SubmodelElement src) - : base(src) - { - if (!(src is Operation op)) - return; - - for (int i = 0; i < 2; i++) - if (op[i] != null) - { - if (this[i] == null) - this[i] = new List(); - foreach (var ov in op[i]) - this[i].Add(new OperationVariable(ov)); - } - } - -#if !DoNotUseAasxCompatibilityModels - public Operation(AasxCompatibilityModels.AdminShellV10.Operation src) - : base(src) - { - for (int i = 0; i < 2; i++) - if (src[i] != null) - { - if (this[i] == null) - this[i] = new List(); - foreach (var ov in src[i]) - this[i].Add(new OperationVariable(ov)); - } - } -#endif - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("Operation", "Opr", - SubmodelElementWrapper.AdequateElementEnum.Operation); - } - } - - public class Entity : SubmodelElement, IManageSubmodelElements, IEnumerateChildren - { - public enum EntityTypeEnum { CoManagedEntity = 0, SelfManagedEntity = 1, Undef = 3 } - public static string[] EntityTypeNames = new string[] { "CoManagedEntity", "SelfManagedEntity" }; - - // for JSON only - - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // from this very class - [XmlIgnore] - [JsonIgnore] - [SkipForHash] // do NOT count children! - private SubmodelElementWrapperCollection _statements = null; - - [JsonIgnore] - public SubmodelElementWrapperCollection statements - { - get { return _statements; } - set { _statements = value; _statements.Parent = this; } - } - - [XmlIgnore] - [JsonProperty(PropertyName = "statements")] - public SubmodelElement[] JsonStatements - { - get - { - var res = new ListOfSubmodelElement(); - if (statements != null) - foreach (var smew in statements) - res.Add(smew.submodelElement); - return res.ToArray(); - } - set - { - if (value != null) - { - this.statements = new SubmodelElementWrapperCollection(); - foreach (var x in value) - { - var smew = new SubmodelElementWrapper() { submodelElement = x }; - this.statements.Add(smew); - } - } - } - } - - // further members - - [CountForHash] - public string entityType = ""; - - [JsonProperty(PropertyName = "asset")] - public AssetRef assetRef = null; - - // enumerates its children - - public IEnumerable EnumerateChildren() - { - if (this.statements != null) - foreach (var smw in this.statements) - yield return smw; - } - - public EnumerationPlacmentBase GetChildrenPlacement(SubmodelElement child) - { - return null; - } - - public object AddChild(SubmodelElementWrapper smw, EnumerationPlacmentBase placement = null) - { - if (smw == null) - return null; - if (this.statements == null) - this.statements = new SubmodelElementWrapperCollection(); - if (smw.submodelElement != null) - smw.submodelElement.parent = this; - this.statements.Add(smw); - return smw; - } - - // constructors - - public Entity() { } - - public Entity(SubmodelElement src) - : base(src) - { - if (!(src is Entity ent)) - return; - - if (ent.statements != null) - { - this.statements = new SubmodelElementWrapperCollection(); - foreach (var smw in ent.statements) - this.statements.Add(new SubmodelElementWrapper(smw.submodelElement)); - } - this.entityType = ent.entityType; - if (ent.assetRef != null) - this.assetRef = new AssetRef(ent.assetRef); - } - - public Entity(EntityTypeEnum entityType, string idShort = null, AssetRef assetRef = null, - string category = null, Key semanticIdKey = null) - { - CreateNewLogic(idShort, null, semanticIdKey); - - this.entityType = EntityTypeNames[(int)entityType]; - this.assetRef = assetRef; - } - -#if !DoNotUseAasxCompatibilityModels - // not available in V1.0 -#endif - - public static Entity CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new Entity(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - // from IManageSubmodelElements - public void Add(SubmodelElement sme) - { - if (statements == null) - statements = new SubmodelElementWrapperCollection(); - var sew = new SubmodelElementWrapper(); - sme.parent = this; // track parent here! - sew.submodelElement = sme; - statements.Add(sew); - } - - public void Insert(int index, SubmodelElement sme) - { - if (statements == null) - statements = new SubmodelElementWrapperCollection(); - var sew = new SubmodelElementWrapper(); - sme.parent = this; // track parent here! - sew.submodelElement = sme; - if (index < 0 || index >= statements.Count) - return; - statements.Insert(index, sew); - } - - public void Remove(SubmodelElement sme) - { - if (statements != null) - statements.Remove(sme); - } - - // management of elememts - - public SubmodelElementWrapper FindSubmodelElementWrapper(string idShort) - { - if (this.statements == null) - return null; - foreach (var smw in this.statements) - if (smw.submodelElement != null) - if (smw.submodelElement.idShort.Trim().ToLower() == idShort.Trim().ToLower()) - return smw; - return null; - } - - public T CreateSMEForCD(ConceptDescription cd, string category = null, string idShort = null, - string idxTemplate = null, int maxNum = 999, bool addSme = false) where T : SubmodelElement, new() - { - if (this.statements == null) - this.statements = new SubmodelElementWrapperCollection(); - return this.statements.CreateSMEForCD(cd, category, idShort, idxTemplate, maxNum, addSme); - } - - public T CreateSMEForIdShort(string idShort, string category = null, - string idxTemplate = null, int maxNum = 999, bool addSme = false) where T : SubmodelElement, new() - { - if (this.statements == null) - this.statements = new SubmodelElementWrapperCollection(); - return this.statements.CreateSMEForIdShort(idShort, category, idxTemplate, maxNum, addSme); - } - - // entity type - - public EntityTypeEnum GetEntityType() - { - EntityTypeEnum res = EntityTypeEnum.Undef; - if (this.entityType != null && this.entityType.Trim().ToLower() == EntityTypeNames[0].ToLower()) - res = EntityTypeEnum.CoManagedEntity; - if (this.entityType != null && this.entityType.Trim().ToLower() == EntityTypeNames[1].ToLower()) - res = EntityTypeEnum.SelfManagedEntity; - return res; - } - - // name - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("Entity", "Ent", - SubmodelElementWrapper.AdequateElementEnum.Entity); - } - } - - public class BasicEvent : SubmodelElement - { - // for JSON only - [XmlIgnore] - [JsonProperty(PropertyName = "modelType")] - public new JsonModelTypeWrapper JsonModelType - { - get { return new JsonModelTypeWrapper(GetElementName()); } - } - - // from this very class - public Reference observed = new Reference(); - - // constructors - - public BasicEvent() { } - - public BasicEvent(SubmodelElement src) - : base(src) - { - if (!(src is BasicEvent be)) - return; - - if (be.observed != null) - this.observed = new Reference(be.observed); - } - -#if !DoNotUseAasxCompatibilityModels - // not available in V1.0 -#endif - - public static BasicEvent CreateNew(string idShort = null, string category = null, Key semanticIdKey = null) - { - var x = new BasicEvent(); - x.CreateNewLogic(idShort, category, semanticIdKey); - return (x); - } - - public override AasElementSelfDescription GetSelfDescription() - { - return new AasElementSelfDescription("BasicEvent", "Evt", - SubmodelElementWrapper.AdequateElementEnum.BasicEvent); - } - } - - // - // Handling of packages - // - } - - #endregion -} - diff --git a/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellConverters.cs b/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellConverters.cs deleted file mode 100644 index ce541f0c0..000000000 --- a/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellConverters.cs +++ /dev/null @@ -1,170 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System; -using System.Reflection; -using AasxCompatibilityModels; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using Newtonsoft.Json.Serialization; - -//namespace AdminShellNS -namespace AdminShell_V20 -{ - public static class AdminShellConverters - { - /// - /// This converter is used for reading JSON files; it claims to be responsible for - /// "Referable" (the base class) - /// and decides, which sub-class of the base class shall be populated. - /// If the object is SubmodelElement, the decision, shich special sub-class to create is done in a factory - /// AdminShell.SubmodelElementWrapper.CreateAdequateType(), - /// in order to have all sub-class specific decisions in one place (SubmodelElementWrapper) - /// Remark: There is a NuGet package JsonSubTypes, which could have done the job, except the fact of having - /// "modelType" being a class property with a contained property "name". - /// - public class JsonAasxConverter : JsonConverter - { - private string UpperClassProperty = "modelType"; - private string LowerClassProperty = "name"; - - public JsonAasxConverter() : base() - { - } - - public JsonAasxConverter(string UpperClassProperty, string LowerClassProperty) : base() - { - this.UpperClassProperty = UpperClassProperty; - this.LowerClassProperty = LowerClassProperty; - } - - public override bool CanConvert(Type objectType) - { - // Info MIHO 21 APR 2020: changed this from SubmodelElement to Referable - if (typeof(AdminShell.Referable).IsAssignableFrom(objectType)) - return true; - return false; - } - - public override bool CanWrite - { - get { return false; } - } - - public override object ReadJson(JsonReader reader, - Type objectType, - object existingValue, - JsonSerializer serializer) - { - // Load JObject from stream - JObject jObject = JObject.Load(reader); - - // Create target object based on JObject - object target = new AdminShell.Referable(); - - if (jObject.ContainsKey(UpperClassProperty)) - { - var j2 = jObject[UpperClassProperty]; - if (j2 != null) - foreach (var c in j2.Children()) - { - var cprop = c as Newtonsoft.Json.Linq.JProperty; - if (cprop == null) - continue; - if (cprop.Name == LowerClassProperty && cprop.Value.Type.ToString() == "String") - { - var cpval = cprop.Value.ToObject(); - if (cpval == null) - continue; - // Info MIHO 21 APR 2020: use Referable.CreateAdequateType instead of SMW... - var o = AdminShell.Referable.CreateAdequateType(cpval); - if (o != null) - target = o; - } - } - } - - // Populate the object properties - serializer.Populate(jObject.CreateReader(), target); - - return target; - } - - /// - /// Introduced for JSON serialization, can create Referables based on a string name - /// - /// string name (standard PascalCased) - - - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) - { - throw new NotImplementedException(); - } - } - - /// - /// This converter / contract resolver for Json.NET adaptively filters different levels of depth - /// of nested AASX structures. - /// - public class AdaptiveFilterContractResolver : DefaultContractResolver - { - public bool AasHasViews = true; - public bool BlobHasValue = true; - public bool SubmodelHasElements = true; - public bool SmcHasValue = true; - public bool OpHasVariables = true; - - public AdaptiveFilterContractResolver() { } - - public AdaptiveFilterContractResolver(bool deep = true, bool complete = true) - { - if (!deep) - { - this.SubmodelHasElements = false; - this.SmcHasValue = false; - this.OpHasVariables = false; - } - if (!complete) - { - this.AasHasViews = false; - this.BlobHasValue = false; - } - - } - - protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) - { - JsonProperty property = base.CreateProperty(member, memberSerialization); - - if (!BlobHasValue && property.DeclaringType == typeof(AdminShell.Blob) && - property.PropertyName == "value") - property.ShouldSerialize = instance => { return false; }; - - if (!SubmodelHasElements && property.DeclaringType == typeof(AdminShell.Submodel) && - property.PropertyName == "submodelElements") - property.ShouldSerialize = instance => { return false; }; - - if (!SmcHasValue && property.DeclaringType == typeof(AdminShell.SubmodelElementCollection) && - property.PropertyName == "value") - property.ShouldSerialize = instance => { return false; }; - - if (!OpHasVariables && property.DeclaringType == typeof(AdminShell.Operation) && - (property.PropertyName == "in" || property.PropertyName == "out")) - property.ShouldSerialize = instance => { return false; }; - - if (!AasHasViews && property.DeclaringType == typeof(AdminShell.AdministrationShell) && - property.PropertyName == "views") - property.ShouldSerialize = instance => { return false; }; - - return property; - } - } - - } -} diff --git a/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellUtil.cs b/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellUtil.cs deleted file mode 100644 index 1452421de..000000000 --- a/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellUtil.cs +++ /dev/null @@ -1,633 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using AasxCompatibilityModels; -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Text.RegularExpressions; - -//namespace AdminShellNS -namespace AdminShell_V20 -{ - public static class AdminShellUtilV20 - { - public static string EvalToNonNullString(string fmt, object o, string elseString = "") - { - if (o == null) - return elseString; - return string.Format(fmt, o); - } - - public static string EvalToNonEmptyString(string fmt, string o, string elseString = "") - { - if (o == null || o == "") - return elseString; - return string.Format(fmt, o); - } - - /// Creates a filter-friendly name from the source. - /// - /// Assert.AreEqual("", AdminShellUtil.FilterFriendlyName("")); - /// Assert.AreEqual("someName", AdminShellUtil.FilterFriendlyName("someName")); - /// Assert.AreEqual("some__name", AdminShellUtil.FilterFriendlyName("some!;name")); - /// - public static string FilterFriendlyName(string src) - { - if (src == null) - return null; - return Regex.Replace(src, @"[^a-zA-Z0-9\-_]", "_"); - } - - /// - /// Assert.IsFalse(AdminShellUtil.HasWhitespace("")); - /// Assert.IsTrue(AdminShellUtil.HasWhitespace(" ")); - /// Assert.IsTrue(AdminShellUtil.HasWhitespace("aa bb")); - /// Assert.IsTrue(AdminShellUtil.HasWhitespace(" aabb")); - /// Assert.IsTrue(AdminShellUtil.HasWhitespace("aabb ")); - /// Assert.IsFalse(AdminShellUtil.HasWhitespace("aabb")); - /// - public static bool HasWhitespace(string src) - { - if (src == null) - throw new ArgumentNullException(nameof(src)); - foreach (var s in src) - if (char.IsWhiteSpace(s)) - return true; - return false; - } - - /// Assert.IsTrue(AdminShellUtil.ComplyIdShort("")); - public static bool ComplyIdShort(string src) - { - if (src == null) - throw new ArgumentNullException(nameof(src)); - var res = true; - foreach (var s in src) - if (!Char.IsLetterOrDigit(s) && s != '_') - res = false; - if (src.Length > 0 && !Char.IsLetter(src[0])) - res = false; - return res; - } - - public static string ByteSizeHumanReadable(long len) - { - // see: https://stackoverflow.com/questions/281640/ - // how-do-i-get-a-human-readable-file-size-in-bytes-abbreviation-using-net - string[] sizes = { "B", "KB", "MB", "GB", "TB" }; - int order = 0; - while (len >= 1024 && order < sizes.Length - 1) - { - order++; - len = len / 1024; - } - // Adjust the format string to your preferences. For example "{0:0.#}{1}" would - // show a single decimal place, and no space. - string res = String.Format("{0:0.##} {1}", len, sizes[order]); - return res; - } - - public static string ExtractPascalCasingLetters(string src) - { - // access - src = src?.Trim(); - if (src == null || src.Length < 1) - return null; - - // walk through - var res = ""; - var arm = true; - foreach (var c in src) - { - // take? - if (arm && Char.IsUpper(c)) - res += c; - // state for next iteration - arm = !Char.IsUpper(c); - } - - // result - return res; - } - - public static int CountHeadingSpaces(string line) - { - if (line == null) - return 0; - int j; - for (j = 0; j < line.Length; j++) - if (!Char.IsWhiteSpace(line[j])) - break; - return j; - } - - /// - /// Used to re-reformat a C# here string, which is multiline string introduced by @" ... "; - /// - public static string[] CleanHereStringToArray(string here) - { - if (here == null) - return null; - - // convert all weird breaks to pure new lines - here = here.Replace("\r\n", "\n"); - here = here.Replace("\n\r", "\n"); - - // convert all tabs to spaces - here = here.Replace("\t", " "); - - // split these - var lines = new List(here.Split('\n')); - if (lines.Count < 1) - return lines.ToArray(); - - // the first line could be special - string firstLine = null; - if (lines[0].Trim() != "") - { - firstLine = lines[0].Trim(); - lines.RemoveAt(0); - } - - // detect an constant amount of heading spaces - var headSpaces = int.MaxValue; - foreach (var line in lines) - if (line.Trim() != "") - headSpaces = Math.Min(headSpaces, CountHeadingSpaces(line)); - - // multi line trim possible? - if (headSpaces != int.MaxValue && headSpaces > 0) - for (int i = 0; i < lines.Count; i++) - if (lines[i].Length > headSpaces) - lines[i] = lines[i].Substring(headSpaces); - - // re-compose again - if (firstLine != null) - lines.Insert(0, firstLine); - - // return - return lines.ToArray(); - } - - /// - /// Used to re-reformat a C# here string, which is multiline string introduced by @" ... "; - /// - public static string CleanHereStringWithNewlines(string here, string nl = null) - { - if (nl == null) - nl = System.Environment.NewLine; - var lines = CleanHereStringToArray(here); - if (lines == null) - return null; - return String.Join(nl, lines); - } - - public static string ShortLocation(Exception ex) - { - if (ex == null || ex.StackTrace == null) - return ""; - string[] lines = ex.StackTrace.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None); - if (lines.Length < 1) - return ""; - // search for " in " - // as the most actual stacktrace might be a built-in function, this might not work and therefore - // go down in the stack - int currLine = 0; - while (true) - { - // nothing found at all - if (currLine >= lines.Length) - return ""; - // access current line - /* TODO (MIHO, 2020-11-12): replace with Regex for multi language. Ideally have Exception messages - always as English. */ - var p = lines[currLine].IndexOf(" in ", StringComparison.Ordinal); - if (p < 0) - p = lines[currLine].IndexOf(" bei ", StringComparison.Ordinal); - if (p < 0) - { - // advance to next oldest line - currLine++; - continue; - } - // search last "\" or "/", to get only filename portion and position - p = lines[currLine].LastIndexOfAny(new[] { '\\', '/' }); - if (p < 0) - { - // advance to next oldest line - currLine++; - continue; - } - // return this - return lines[currLine].Substring(p); - } - } - - public enum ConstantFoundEnum { No, AnyCase, ExactCase } - - public static ConstantFoundEnum CheckIfInConstantStringArray(string[] arr, string str) - { - if (arr == null || str == null) - return ConstantFoundEnum.No; - - bool anyCaseFound = false; - bool exactCaseFound = false; - foreach (var a in arr) - { - anyCaseFound = anyCaseFound || str.ToLower() == a.ToLower(); - exactCaseFound = exactCaseFound || str == a; - } - if (exactCaseFound) - return ConstantFoundEnum.ExactCase; - if (anyCaseFound) - return ConstantFoundEnum.AnyCase; - return ConstantFoundEnum.No; - } - - public static string CorrectCasingForConstantStringArray(string[] arr, string str) - { - if (arr == null || str == null) - return str; - - foreach (var a in arr) - if (str.ToLower() == a.ToLower()) - return a; - - return str; - } - - // - // - // - // - // - - public static void PrintSearchableProperties(object obj, int indent) - { - if (obj == null) return; - string indentString = new string(' ', indent); - Type objType = obj.GetType(); - PropertyInfo[] properties = objType.GetProperties(); - foreach (PropertyInfo property in properties) - { - object propValue = property.GetValue(obj, null); - var elems = propValue as IList; - if (elems != null) - { - foreach (var item in elems) - { - PrintSearchableProperties(item, indent + 3); - } - } - else - { - // This will not cut-off System.Collections because of the first check - if (property.PropertyType.Assembly == objType.Assembly) - { - Console.WriteLine("{0}{1}:", indentString, property.Name); - - PrintSearchableProperties(propValue, indent + 2); - } - else - { - Console.WriteLine("{0}{1}: {2}", indentString, property.Name, propValue); - } - } - } - } - - public class SearchOptions - { - public Assembly[] allowedAssemblies = null; - public int maxDepth = int.MaxValue; - public bool findFirst = false; - public int skipFirstResults = 0; - public string findText = null; - public bool isIgnoreCase = false; - public bool isRegex = false; - } - - public class SearchResultItem : IEquatable - { - public SearchOptions searchOptions; - public string qualifiedNameHead; - public string metaModelName; - public object businessObject; - public string foundText; - public object foundObject; - public object containingObject; - public int foundHash; - - public bool Equals(SearchResultItem other) - { - if (other == null) - return false; - - return this.qualifiedNameHead == other.qualifiedNameHead && - this.metaModelName == other.metaModelName && - this.businessObject == other.businessObject && - this.containingObject == other.containingObject && - this.foundText == other.foundText && - this.foundHash == other.foundHash; - } - } - - public class SearchResults - { - public int foundIndex = 0; - public List foundResults = new List(); - - public void Clear() - { - foundIndex = -1; - foundResults.Clear(); - } - } - - public static void CheckSearchable( - SearchResults results, SearchOptions options, string qualifiedNameHead, object businessObject, - MemberInfo mi, object memberValue, object containingObject, Func getMemberHash) - { - // try get a speaking name - var metaModelName = ""; - var x1 = mi.GetCustomAttribute(); - if (x1 != null && x1.name != null) - metaModelName = x1.name; - - // check if this object is searchable - var x2 = mi.GetCustomAttribute(); - if (x2 != null) - { - // what to check? - string foundText = "" + memberValue?.ToString(); - - // find options - var found = true; - if (options.findText != null) - found = foundText.IndexOf( - options.findText, options.isIgnoreCase ? StringComparison.CurrentCultureIgnoreCase : 0) >= 0; - - // add? - if (found) - { - var sri = new SearchResultItem(); - sri.searchOptions = options; - sri.qualifiedNameHead = qualifiedNameHead; - sri.metaModelName = metaModelName; - sri.businessObject = businessObject; - sri.foundText = foundText; - sri.foundObject = memberValue; - sri.containingObject = containingObject; - if (getMemberHash != null) - sri.foundHash = getMemberHash(); - - // avoid duplicates - if (!results.foundResults.Contains(sri)) - results.foundResults.Add(sri); - } - } - } - - public static void EnumerateSearchable( - SearchResults results, object obj, string qualifiedNameHead, int depth, SearchOptions options, - object businessObject = null) - { - // access - if (results == null || obj == null || options == null) - return; - Type objType = obj.GetType(); - - // depth - if (depth > options.maxDepth) - return; - - // try to get element name of an AAS entity - string elName = null; - if (obj is AdminShell.Referable) - { - elName = (obj as AdminShell.Referable).GetElementName(); - businessObject = obj; - } - - // enrich qualified name, accordingly - var qualifiedName = qualifiedNameHead; - if (elName != null) - qualifiedName = qualifiedName + (qualifiedName.Length > 0 ? "." : "") + elName; - - // do NOT dive into objects, which are not in the reight assembly - if (options.allowedAssemblies == null || !options.allowedAssemblies.Contains(objType.Assembly)) - return; - - // do not dive into enums - if (objType.IsEnum) - return; - - // look at fields, first - var fields = objType.GetFields(); - foreach (var fi in fields) - { - // is the object marked to be skipped? - var x3 = fi.GetCustomAttribute(); - if (x3 != null) - continue; - - var x4 = fi.GetCustomAttribute(); - if (x4 != null) - continue; - - // get value(s) - var fieldValue = fi.GetValue(obj); - if (fieldValue == null) - continue; - var valueElems = fieldValue as IList; - if (valueElems != null) - { - // field is a collection .. dive deeper, if allowed - foreach (var el in valueElems) - EnumerateSearchable(results, el, qualifiedName, depth + 1, options, businessObject); - } - else - { - // field is a single entity .. check it - CheckSearchable( - results, options, qualifiedName, businessObject, fi, fieldValue, obj, - () => { return fieldValue.GetHashCode(); }); - - // dive deeper .. - EnumerateSearchable(results, fieldValue, qualifiedName, depth + 1, options, businessObject); - } - } - - // properties & objects behind - var properties = objType.GetProperties(); - foreach (var pi in properties) - { - var gip = pi.GetIndexParameters(); - if (gip.Length > 0) - // no indexed properties, yet - continue; - - // is the object marked to be skipped? - var x3 = pi.GetCustomAttribute(); - if (x3 != null) - continue; - - var x4 = pi.GetCustomAttribute(); - if (x4 != null) - continue; - - // get value(s) - var propValue = pi.GetValue(obj, null); - if (propValue == null) - continue; - var valueElems = propValue as IList; - if (valueElems != null) - { - // property is a collection .. dive deeper, if allowed - foreach (var el in valueElems) - EnumerateSearchable(results, el, qualifiedName, depth + 1, options, businessObject); - } - else - { - // field is a single entity .. check it - CheckSearchable( - results, options, qualifiedName, businessObject, pi, propValue, obj, - () => { return propValue.GetHashCode(); }); - - // dive deeper .. - EnumerateSearchable(results, propValue, qualifiedName, depth + 1, options, businessObject); - } - } - } - - // - // String manipulations - // - - public static string ReplacePercentPlaceholder( - string input, - string searchFor, - Func substLamda, - StringComparison comparisonType = StringComparison.InvariantCulture) - { - // access - if (input == null || searchFor == null || searchFor == "") - return input; - - // find - while (true) - { - // any occurence - var p = input.IndexOf(searchFor, comparisonType); - if (p < 0) - break; - - // split - var left = input.Substring(0, p); - var right = ""; - var rp = p + searchFor.Length; - if (rp < input.Length) - right = input.Substring(rp); - - // lambda - var repl = "" + substLamda?.Invoke(); - - // build new - input = left + repl + right; - } - - // ok - return input; - } - - // - // Base 64 - // - - public static string Base64Encode(string plainText) - { - var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText); - return System.Convert.ToBase64String(plainTextBytes); - } - - public static string Base64Decode(string base64EncodedData) - { - var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData); - return System.Text.Encoding.UTF8.GetString(base64EncodedBytes); - } - - // - // Generation of Ids - // - - private static Random MyRnd = new Random(); - - public static string GenerateIdAccordingTemplate(string tpl) - { - // generate a deterministic decimal digit string - var decimals = String.Format("{0:ffffyyMMddHHmmss}", DateTime.UtcNow); - decimals = new string(decimals.Reverse().ToArray()); - // convert this to an int - if (!Int64.TryParse(decimals, out Int64 decii)) - decii = MyRnd.Next(Int32.MaxValue); - // make an hex out of this - string hexamals = decii.ToString("X"); - // make an alphanumeric string out of this - string alphamals = ""; - var dii = decii; - while (dii >= 1) - { - var m = dii % 26; - alphamals += Convert.ToChar(65 + m); - dii = dii / 26; - } - - // now, "salt" the strings - for (int i = 0; i < 32; i++) - { - var c = Convert.ToChar(48 + MyRnd.Next(10)); - decimals += c; - hexamals += c; - alphamals += c; - } - - // now, can just use the template - var id = ""; - foreach (var tpli in tpl) - { - if (tpli == 'D' && decimals.Length > 0) - { - id += decimals[0]; - decimals = decimals.Remove(0, 1); - } - else - if (tpli == 'X' && hexamals.Length > 0) - { - id += hexamals[0]; - hexamals = hexamals.Remove(0, 1); - } - else - if (tpli == 'A' && alphamals.Length > 0) - { - id += alphamals[0]; - alphamals = alphamals.Remove(0, 1); - } - else - id += tpli; - } - - // ok - return id; - } - - } -} diff --git a/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellValidate.cs b/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellValidate.cs deleted file mode 100644 index 1119c235e..000000000 --- a/src/AasxCsharpLibrary/AasxCompatibilityModels/V20/AdminShellValidate.cs +++ /dev/null @@ -1,320 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using JetBrains.Annotations; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Text.RegularExpressions; -using System.Xml; -using System.Xml.Schema; - -//namespace AdminShellNS -namespace AdminShell_V20 -{ - /// - /// validates the XML content against the AASX XML schema. - /// - /// Please produce instances with . - /// - public class XmlValidator - { - private System.Xml.Schema.XmlSchemaSet xmlSchemaSet; - - internal XmlValidator(XmlSchemaSet xmlSchemaSet) - { - this.xmlSchemaSet = xmlSchemaSet; - } - - /// - /// validates the given XML content and stores the results in the . - /// - /// Validation records - /// Content to be validated - public void Validate(AasValidationRecordList recs, Stream xmlContent) - { - if (recs == null) - throw new ArgumentException($"Unexpected null {nameof(recs)}"); - - if (xmlContent == null) - throw new ArgumentException($"Unexpected null {nameof(xmlContent)}"); - - // load/ validate on same records - var settings = new System.Xml.XmlReaderSettings(); - settings.ValidationType = System.Xml.ValidationType.Schema; - settings.Schemas = xmlSchemaSet; - - settings.ValidationEventHandler += - (object sender, System.Xml.Schema.ValidationEventArgs e) => - { - recs.Add( - new AasValidationRecord( - AasValidationSeverity.Serialization, null, - $"XML: {e?.Exception?.LineNumber}, {e?.Exception?.LinePosition}: {e?.Message}")); - }; - - // use the xml stream - using (var reader = System.Xml.XmlReader.Create(xmlContent, settings)) - { - while (reader.Read()) - { - // Invoke callbacks - }; - } - } - } - - public enum AasValidationSeverity - { - Hint, Warning, SpecViolation, SchemaViolation, Serialization - } - - [UsedImplicitlyAttribute] // for eventual use - public enum AasValidationAction - { - No, ToBeDeleted - } - - public class AasValidationRecord - { - public AasValidationSeverity Severity = AasValidationSeverity.Hint; - public AasxCompatibilityModels.AdminShellV20.Referable Source = null; - public string Message = ""; - - public Action Fix = null; - - public AasValidationRecord(AasValidationSeverity Severity, AasxCompatibilityModels.AdminShellV20.Referable Source, - string Message, Action Fix = null) - { - this.Severity = Severity; - this.Source = Source; - this.Message = Message; - this.Fix = Fix; - } - - public override string ToString() - { - return $"[{Severity.ToString()}] in {"" + Source?.ToString()}: {"" + Message}"; - } - - public string DisplaySeverity { get { return "" + Severity.ToString(); } } - public string DisplaySource - { - get - { - return "" + ((Source != null) ? Source.ToString() : "(whole content)"); - } - } - public string DisplayMessage { get { return "" + Message?.ToString(); } } - } - - public class AasValidationRecordList : List - { - } - - public static class AasSchemaValidation - { - public enum SerializationFormat { XML, JSON } - - public static string[] GetSchemaResources(SerializationFormat fmt) - { - if (fmt == SerializationFormat.XML) - { - return new[] - { - "AdminShellNS.Resources.schemaV201.AAS.xsd", - "AdminShellNS.Resources.schemaV201.AAS_ABAC.xsd", - "AdminShellNS.Resources.schemaV201.IEC61360.xsd" - }; - } - if (fmt == SerializationFormat.JSON) - { - return new[] - { - "AdminShellNS.Resources.schemaV201.aas.json" - }; - } - return null; - } - - /// - /// produces a validator which validates XML AASX files. - /// - /// initialized validator - public static XmlValidator NewXmlValidator() - { - // Load the schema files - var files = GetSchemaResources(SerializationFormat.XML); - if (files == null) - throw new InvalidOperationException("No XML schema files could be found in the resources."); - - var xmlSchemaSet = new System.Xml.Schema.XmlSchemaSet(); - xmlSchemaSet.XmlResolver = new System.Xml.XmlUrlResolver(); - - try - { - Assembly myAssembly = Assembly.GetExecutingAssembly(); - foreach (var schemaFn in files) - { - using (Stream schemaStream = myAssembly.GetManifestResourceStream(schemaFn)) - { - using (XmlReader schemaReader = XmlReader.Create(schemaStream)) - { - xmlSchemaSet.Add(null, schemaReader); - } - } - } - } - catch (Exception ex) - { - throw new FileNotFoundException( - $"Error accessing embedded resource schema files: {ex.Message}"); - } - - var newRecs = new AasValidationRecordList(); - - // set up messages - xmlSchemaSet.ValidationEventHandler += (object sender, System.Xml.Schema.ValidationEventArgs e) => - { - newRecs.Add( - new AasValidationRecord( - AasValidationSeverity.Serialization, null, - $"{e?.Exception?.LineNumber}, {e?.Exception?.LinePosition}: {e?.Message}")); - }; - - // compile - try - { - xmlSchemaSet.Compile(); - } - catch (Exception ex) - { - throw new InvalidOperationException( - $"Error compiling schema files: {ex.Message}"); - } - - if (newRecs.Count > 0) - { - var parts = new List { $"Failed to compile the schema files:" }; - parts.AddRange(newRecs.Select((r) => r.Message)); - throw new InvalidOperationException(string.Join(System.Environment.NewLine, parts)); - } - - return new XmlValidator(xmlSchemaSet); - } - - /// - /// creates an XML validator and applies it on the given content. - /// - /// If you repeatedly need to validate XML against a schema, re-use an instance of - /// produced with . - /// - /// Validation records - /// Content to be validated - public static void ValidateXML(AasValidationRecordList recs, Stream xmlContent) - { - var validator = NewXmlValidator(); - validator.Validate(recs, xmlContent); - } - - public static int ValidateJSONAlternative(AasValidationRecordList recs, Stream jsonContent) - { - // see: https://github.com/RicoSuter/NJsonSchema/wiki/JsonSchemaValidator - var newRecs = new AasValidationRecordList(); - - // access - if (recs == null || jsonContent == null) - return -1; - - // Load the schema files - // right now: exactly ONE schema file - var files = GetSchemaResources(SerializationFormat.JSON); - if (files == null || files.Length != 1) - return -1; - - NJsonSchema.JsonSchema schema = null; - - try - { - Assembly myAssembly = Assembly.GetExecutingAssembly(); - foreach (var schemaFn in files) - { - using (Stream schemaStream = myAssembly.GetManifestResourceStream(schemaFn)) - { - using (var streamReader = new StreamReader(schemaStream)) - { - var allTxt = streamReader.ReadToEnd(); - schema = NJsonSchema.JsonSchema.FromJsonAsync(allTxt).GetAwaiter().GetResult(); - break; - } - } - } - } - catch (Exception ex) - { - throw new FileNotFoundException("ValidateJSON: Error loading schema: " + - ex.Message); - } - - if (schema == null) - { - throw new FileNotFoundException("ValidateJSON: Schema not found properly."); - } - - // create validator - var validator = new NJsonSchema.Validation.JsonSchemaValidator(); - - // load the JSON content - string jsonTxt = null; - try - { - using (var streamReader = new StreamReader(jsonContent)) - { - jsonTxt = streamReader.ReadToEnd(); - } - } - catch (Exception ex) - { - throw new InvalidOperationException("ValidateJSON: Error loading JSON content: " + - ex.Message); - } - - if (jsonTxt == null || jsonTxt == "") - throw new InvalidOperationException("ValidateJSON: Error loading JSON content gave null."); - - // validate - ICollection errors; - try - { - errors = validator.Validate(jsonTxt, schema); - } - catch (Exception ex) - { - throw new InvalidOperationException("ValidateJSON: Error when validating: " + - ex.Message); - } - - // re-format messages - if (errors != null) - foreach (var ve in errors) - { - var msg = ("" + ve.ToString()); - msg = Regex.Replace(msg, @"\s+", " "); - newRecs.Add(new AasValidationRecord(AasValidationSeverity.Serialization, null, - $"JSON: {ve.LineNumber,5},{ve.LinePosition:3}: {msg}")); - } - - // result - recs.AddRange(newRecs); - return newRecs.Count; - } - } -} diff --git a/src/AasxCsharpLibrary/AasxCsharpLibrary.csproj b/src/AasxCsharpLibrary/AasxCsharpLibrary.csproj deleted file mode 100644 index e195fc0ba..000000000 --- a/src/AasxCsharpLibrary/AasxCsharpLibrary.csproj +++ /dev/null @@ -1,43 +0,0 @@ - - - net6.0 - Library - AdminShellNS - false - - - TRACE;UseAasxCompatibilityModels - - - - - - - PreserveNewest - - - - - Designer - PreserveNewest - - - Designer - PreserveNewest - - - Designer - PreserveNewest - - - - - - - - - - - - - diff --git a/src/AasxCsharpLibrary/AdminShellCollections.cs b/src/AasxCsharpLibrary/AdminShellCollections.cs deleted file mode 100644 index 32e6774ab..000000000 --- a/src/AasxCsharpLibrary/AdminShellCollections.cs +++ /dev/null @@ -1,92 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System.Collections.Generic; - -namespace AdminShellNS -{ - /// - /// Just add some convenience methods to Dictionary - /// Note: Not an extension class in order to not interfere with really - /// commonly used standard class. - /// - public class ConvenientDictionary : Dictionary - { - public V GetValueOrDefault(K key) - { - if (key != null && this.ContainsKey(key)) - return this[key]; - return default(V); - } - } - - public class MultiValueDictionary - { - private Dictionary> dict = new Dictionary>(); - public void Add(K key, V value) - { - if (dict.TryGetValue(key, out var list)) - list.Add(value); - else - dict.Add(key, new List { value }); - } - - public bool ContainsKey(K key) => dict.ContainsKey(key); - - public List this[K key] => dict[key]; - - public IEnumerable> Keys - { - get - { - return dict.Values; - } - } - } - - public class DoubleSidedDict - { - private Dictionary _forward = new Dictionary(); - private Dictionary _backward = new Dictionary(); - - public void AddPair(T1 item1, T2 item2) - { - _forward.Add(item1, item2); - _backward.Add(item2, item1); - } - - public bool Contains1(T1 key1) => _forward.ContainsKey(key1); - public bool Contains2(T2 key2) => _backward.ContainsKey(key2); - - public T2 Get2(T1 key1) => _forward[key1]; - public T1 Get1(T2 key2) => _backward[key2]; - - public T2 Get2OrDefault(T1 key1) - => (key1 != null && _forward.ContainsKey(key1)) ? _forward[key1] : default(T2); - public T1 Get1OrDefault(T2 key2) - => (key2 != null && _backward.ContainsKey(key2)) ? _backward[key2] : default(T1); - - public void Clear() { _forward.Clear(); _backward.Clear(); } - } - - public class IntValueDictionary : Dictionary - { - public void IncKey(K key) - { - if (!this.ContainsKey(key)) - this.Add(key, 1); - else - { - var i = this[key]; - this.Remove(key); - this.Add(key, i + 1); - } - } - } -} diff --git a/src/AasxCsharpLibrary/AdminShellConverters.cs b/src/AasxCsharpLibrary/AdminShellConverters.cs deleted file mode 100644 index f75a1588c..000000000 --- a/src/AasxCsharpLibrary/AdminShellConverters.cs +++ /dev/null @@ -1,327 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using Extensions; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using Newtonsoft.Json.Serialization; -using System; -using System.IO; -using System.Reflection; - -namespace AdminShellNS -{ - public static class AdminShellConverters - { - /// - /// This converter is used for reading JSON files; it claims to be responsible for - /// "Referable" (the base class) - /// and decides, which sub-class of the base class shall be populated. - /// If the object is SubmodelElement, the decision, shich special sub-class to create is done in a factory - /// SubmodelElementWrapper.CreateAdequateType(), - /// in order to have all sub-class specific decisions in one place (SubmodelElementWrapper) - /// Remark: There is a NuGet package JsonSubTypes, which could have done the job, except the fact of having - /// "modelType" being a class property with a contained property "name". - /// - public class JsonAasxConverter : JsonConverter - { - private string UpperClassProperty = "modelType"; - private string LowerClassProperty = "name"; - - public JsonAasxConverter() : base() - { - } - - public JsonAasxConverter(string UpperClassProperty, string LowerClassProperty) : base() - { - this.UpperClassProperty = UpperClassProperty; - this.LowerClassProperty = LowerClassProperty; - } - - public override bool CanConvert(Type objectType) - { - // Info MIHO 21 APR 2020: changed this from SubmodelElement to Referable - if (typeof(IReferable).IsAssignableFrom(objectType)) - return true; - return false; - } - - public override bool CanWrite - { - get { return false; } - } - - public override object ReadJson(JsonReader reader, - Type objectType, - object existingValue, - JsonSerializer serializer) - { - // Load JObject from stream - JObject jObject = JObject.Load(reader); - - // Create target object based on JObject - IReferable target = null; - - if (jObject.ContainsKey(UpperClassProperty)) - { - var j2 = jObject[UpperClassProperty]; - if (j2 != null) - foreach (var c in j2.Children()) - { - var cprop = c as Newtonsoft.Json.Linq.JProperty; - if (cprop == null) - continue; - if (cprop.Name == LowerClassProperty && cprop.Value.Type.ToString() == "String") - { - var cpval = cprop.Value.ToObject(); - if (cpval == null) - continue; - // Info MIHO 21 APR 2020: use Referable.CreateAdequateType instead of SMW... - var o = CreateAdequateType(cpval); - if (o != null) - target = o; - } - } - } - - // Populate the object properties - serializer.Populate(jObject.CreateReader(), target); - - return target; - } - - public static IReferable CreateAdequateType(string elementName) - { - if (elementName == KeyTypes.AssetAdministrationShell.ToString()) - return new AssetAdministrationShell("", null); - // dead-csharp off - //TODO (jtikekar, 0000-00-00): refactor default - //if (elementName == "Asset") - //TODO (jtikekar, 0000-00-00): Change - // return new AssetInformation(AssetKind.Instance); - if (elementName == KeyTypes.ConceptDescription.ToString()) - return new ConceptDescription(""); - if (elementName == KeyTypes.Submodel.ToString()) - return new Submodel(""); - //if (elementName == KeyTypes.View) - // return new View(); - // dead-csharp on - return CreateSubmodelElementIstance(elementName); - } - - private static ISubmodelElement CreateSubmodelElementIstance(string typeName) - { - //TODO (jtikekar, 0000-00-00): Need to test - Type type = Type.GetType(typeName); - if (type == null || !type.IsSubclassOf(typeof(ISubmodelElement))) - return null; - var sme = Activator.CreateInstance(type) as ISubmodelElement; - return sme; - } - - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) - { - throw new NotImplementedException(); - } - } - - /// - /// This converter / contract resolver for Json.NET adaptively filters different levels of depth - /// of nested AASX structures. - /// - public class AdaptiveFilterContractResolver : DefaultContractResolver - { - public bool AasHasViews = true; - public bool BlobHasValue = true; - public bool SubmodelHasElements = true; - public bool SmcHasValue = true; - public bool OpHasVariables = true; - - public AdaptiveFilterContractResolver() { } - - public AdaptiveFilterContractResolver(bool deep = true, bool complete = true) - { - if (!deep) - { - this.SubmodelHasElements = false; - this.SmcHasValue = false; - this.OpHasVariables = false; - } - if (!complete) - { - this.AasHasViews = false; - this.BlobHasValue = false; - } - - } - - // see: https://stackoverflow.com/questions/4963160/ - // how-to-determine-if-a-type-implements-an-interface-with-c-sharp-reflection - - protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) - { - JsonProperty property = base.CreateProperty(member, memberSerialization); - var icic = StringComparison.InvariantCultureIgnoreCase; - - if (!BlobHasValue && typeof(IBlob).IsAssignableFrom(property.DeclaringType) - && property.PropertyName.Equals("value", icic)) - property.ShouldSerialize = instance => { return false; }; - - if (!SubmodelHasElements && typeof(ISubmodel).IsAssignableFrom(property.DeclaringType) - && property.PropertyName.Equals("submodelElements", icic)) - property.ShouldSerialize = instance => { return false; }; - - if (!SmcHasValue && typeof(ISubmodelElementCollection).IsAssignableFrom(property.DeclaringType) - && property.PropertyName.Equals("value", icic)) - property.ShouldSerialize = instance => { return false; }; - - if (!OpHasVariables && typeof(IOperation).IsAssignableFrom(property.DeclaringType) - && (property.PropertyName.Equals("in", icic) - || property.PropertyName.Equals("out", icic))) - property.ShouldSerialize = instance => { return false; }; - - if (!AasHasViews && typeof(IAssetAdministrationShell).IsAssignableFrom(property.DeclaringType) - && property.PropertyName.Equals("views", icic)) - property.ShouldSerialize = instance => { return false; }; - - return property; - } - } - - public class AdaptiveAasIClassConverter : JsonConverter - { - public enum ConversionMode - { - /// - /// For (known) nodes of the AAS meta model, the converison of Newtonsoft.Json - /// is used. This is done by invoking creation of the real data type for the - /// desired interface types. - /// Assumption: fast, sloppy, fault-tolerant - /// - - Typecast, - /// - /// For (known) nodes of the AAS meta model, the sub-node content is converted - /// to string representation and subsequently converted by the AAS core deserialization. - /// Assumption: slow, precise but provide maximum compatibility. - /// - AasCore - }; - - public ConversionMode Mode = ConversionMode.Typecast; - - public bool WriteRawAasCore = false; - - /// - /// For **SERIALIZATION** and **JsonConverter attribute** a parameterless - /// constructor is needed. - /// - public AdaptiveAasIClassConverter() : base() - { - Mode = ConversionMode.AasCore; - } - - public AdaptiveAasIClassConverter(ConversionMode mode) : base() - { - Mode = mode; - } - - public override bool CanConvert(Type objectType) - { - if (typeof(IReference).IsAssignableFrom(objectType) - || typeof(IKey).IsAssignableFrom(objectType)) - return true; - return false; - } - - public override bool CanWrite - { - get { return true; } - } - - public override object ReadJson(JsonReader reader, - Type objectType, - object existingValue, - JsonSerializer serializer) - { - // check - if (reader.TokenType == JsonToken.Null) - return null; - - // spooky? - if (Mode == ConversionMode.AasCore) - { - var json = JRaw.Create(reader).ToString(); - var node = System.Text.Json.Nodes.JsonNode.Parse(json); - return ExtendIClass.IClassFrom(objectType, node); - } - - // Load JObject from stream - JObject jObject = JObject.Load(reader); - - // Create target object based on JObject - object target = null; - if (typeof(IReference).IsAssignableFrom(objectType)) - target = new Reference(ReferenceTypes.ExternalReference, null); - if (typeof(IKey).IsAssignableFrom(objectType)) - target = new Key(KeyTypes.GlobalReference, ""); - - // Populate the object properties - serializer.Populate(jObject.CreateReader(), target); - - return target; - } - - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) - { - if (value is IClass ic) - { - // serialize by AAS core - var jsonStr = Jsonization.Serialize.ToJsonObject(ic) - .ToJsonString(new System.Text.Json.JsonSerializerOptions() - { - WriteIndented = true - }); - - // how to write - if (WriteRawAasCore) - { - // directly write raw string into serializer - // drawback: no indentation - writer.WriteStartObject(); - jsonStr = jsonStr.TrimStart('{').TrimEnd('}'); - writer.WriteRaw(jsonStr); - writer.WriteEndObject(); - } - else - { - // double-digest by a text reader and rewrite token stream - // pro: indentation - // con: run time performance, chance of de-serialization issues - using (var reader = new JsonTextReader(new StringReader(jsonStr)) - { - DateParseHandling = DateParseHandling.None, - FloatParseHandling = FloatParseHandling.Decimal - }) - { - writer.WriteToken(reader); - } - } - } - else - { - // normal serialization - var jo = JObject.FromObject(value); - jo.WriteTo(writer); - } - } - } - - } -} diff --git a/src/AasxCsharpLibrary/AdminShellPackageEnv.cs b/src/AasxCsharpLibrary/AdminShellPackageEnv.cs deleted file mode 100644 index 1d726e98a..000000000 --- a/src/AasxCsharpLibrary/AdminShellPackageEnv.cs +++ /dev/null @@ -1,1695 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using Extensions; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using System; -using System.Collections.Generic; -using System.IO; -using System.IO.Packaging; -using System.Linq; -using System.Net; -using System.Net.Http; -using System.Text.RegularExpressions; -using System.Threading.Tasks; -using System.Xml; -using System.Xml.Serialization; - -namespace AdminShellNS -{ - /// - /// This class lets an outer functionality keep track on the supplementary files, which are in or - /// are pending to be added or deleted to an Package. - /// - public class AdminShellPackageSupplementaryFile /*: IReferable*/ - { - public delegate byte[] SourceGetByteChunk(); - - public enum LocationType { InPackage, AddPending, DeletePending } - - public enum SpecialHandlingType { None, EmbedAsThumbnail } - - public readonly Uri Uri = null; - - public readonly string UseMimeType = null; - - public readonly string SourceLocalPath = null; - public readonly SourceGetByteChunk SourceGetBytesDel = null; - - public LocationType Location; - public readonly SpecialHandlingType SpecialHandling; - - public AdminShellPackageSupplementaryFile( - Uri uri, string sourceLocalPath = null, LocationType location = LocationType.InPackage, - SpecialHandlingType specialHandling = SpecialHandlingType.None, - SourceGetByteChunk sourceGetBytesDel = null, string useMimeType = null) - { - Uri = uri; - UseMimeType = useMimeType; - SourceLocalPath = sourceLocalPath; - SourceGetBytesDel = sourceGetBytesDel; - Location = location; - SpecialHandling = specialHandling; - } - - // class derives from Referable in order to provide GetElementName - public string GetElementName() - { - return "File"; - } - - } - - public class ListOfAasSupplementaryFile : List - { - public AdminShellPackageSupplementaryFile FindByUri(string path) - { - if (path == null) - return null; - - return this.FirstOrDefault( - x => x?.Uri?.ToString().Trim() == path.Trim()); - } - } - - /// - /// Provides (static?) helpers for serializing AAS.. - /// - public static class AdminShellSerializationHelper - { - - public static string TryReadXmlFirstElementNamespaceURI(Stream s) - { - string res = null; - try - { - var xr = System.Xml.XmlReader.Create(s); - int i = 0; - while (xr.Read()) - { - // limit amount of read - i++; - if (i > 99) - // obviously not found - break; - - // find element - if (xr.NodeType == System.Xml.XmlNodeType.Element) - { - res = xr.NamespaceURI; - break; - } - } - xr.Close(); - } - catch (Exception ex) - { - LogInternally.That.SilentlyIgnoredError(ex); - } - - // return to zero pos - s.Seek(0, SeekOrigin.Begin); - - // give back - return res; - } - - /// - /// Skips first few tokens of an XML content until first "real" element is encountered - /// - /// - public static void XmlSkipHeader(XmlReader xmlReader) - { - while (xmlReader.NodeType == XmlNodeType.XmlDeclaration || - xmlReader.NodeType == XmlNodeType.Whitespace || - xmlReader.NodeType == XmlNodeType.Comment || - xmlReader.NodeType == XmlNodeType.None) - xmlReader.Read(); - } - - /// - /// De-serialize an open stream into Environment. Does version/ compatibility management. - /// - /// Open for read stream - /// - public static AasCore.Aas3_0.Environment DeserializeXmlFromStreamWithCompat(Stream s) - { - // not sure - AasCore.Aas3_0.Environment res = null; - - // try get first element - var nsuri = TryReadXmlFirstElementNamespaceURI(s); - - // read V1.0? - if (nsuri != null && nsuri.Trim() == "http://www.admin-shell.io/aas/1/0") - { -#if !DoNotUseAasxCompatibilityModels - XmlSerializer serializer = new XmlSerializer( - typeof(AasxCompatibilityModels.AdminShellV10.AdministrationShellEnv), - "http://www.admin-shell.io/aas/1/0"); - var v10 = serializer.Deserialize(s) as AasxCompatibilityModels.AdminShellV10.AdministrationShellEnv; - res = new AasCore.Aas3_0.Environment(new List(), new List(), new List()); - res.ConvertFromV10(v10); - return res; -#else - throw (new Exception("Cannot handle AAS file format http://www.admin-shell.io/aas/1/0 !")); -#endif - } - - // read V2.0? - if (nsuri != null && nsuri.Trim() == "http://www.admin-shell.io/aas/2/0") - { -#if !DoNotUseAasxCompatibilityModels - XmlSerializer serializer = new XmlSerializer( - typeof(AasxCompatibilityModels.AdminShellV20.AdministrationShellEnv), - "http://www.admin-shell.io/aas/2/0"); - var v20 = serializer.Deserialize(s) as AasxCompatibilityModels.AdminShellV20.AdministrationShellEnv; - res = new AasCore.Aas3_0.Environment(new List(), new List(), new List()); - res.ConvertFromV20(v20); - return res; -#else - throw (new Exception("Cannot handle AAS file format http://www.admin-shell.io/aas/1/0 !")); -#endif - } - - // read V3.0? - if (nsuri != null && nsuri.Trim() == Xmlization.NS) - { - // dead-csharp off - //XmlSerializer serializer = new XmlSerializer( - // typeof(AasCore.Aas3_0_RC02.Environment), "http://www.admin-shell.io/aas/3/0"); - //res = serializer.Deserialize(s) as AasCore.Aas3_0_RC02.Environment; - // dead-csharp on - using (var xmlReader = XmlReader.Create(s)) - { - // TODO (MIHO, 2022-12-26): check if could be feature of AAS core - XmlSkipHeader(xmlReader); - res = Xmlization.Deserialize.EnvironmentFrom(xmlReader); - return res; - } - } - - // nope! - return null; - } - // dead-csharp off - //public static JsonSerializer BuildDefaultAasxJsonSerializer() - //{ - // var serializer = new JsonSerializer(); - // serializer.Converters.Add( - // new AdminShellConverters.JsonAasxConverter( - // "modelType", "name")); - // return serializer; - //} - public static T DeserializeFromJSON(string data) where T : IReferable - { - //using (var tr = new StringReader(data)) - //{ - //var serializer = BuildDefaultAasxJsonSerializer(); - //var rf = (T)serializer.Deserialize(tr, typeof(T)); - - var node = System.Text.Json.Nodes.JsonNode.Parse(data); - var rf = Jsonization.Deserialize.IReferableFrom(node); - - return (T)rf; - //} - } - - //public static T DeserializeFromJSON(JToken obj) where T : IReferable - //{ - // if (obj == null) - // return default(T); - // var serializer = BuildDefaultAasxJsonSerializer(); - // var rf = obj.ToObject(serializer); - // return rf; - //} - - ///// - ///// Use this, if DeserializeFromJSON is too tight. - ///// - //public static T DeserializePureObjectFromJSON(string data) - //{ - // using (var tr = new StringReader(data)) - // { - // //var serializer = BuildDefaultAasxJsonSerializer(); - // //var rf = (T)serializer.Deserialize(tr, typeof(T)); - // return null; - // } - //} - // dead-csharp on - } - - /// - /// This class encapsulates an AdminShellEnvironment and supplementary files into an AASX Package. - /// Specifically has the capability to load, update and store .XML, .JSON and .AASX packages. - /// - public class AdminShellPackageEnv : IDisposable - { - private string _fn = "New Package"; - - private string _tempFn = null; - - private AasCore.Aas3_0.Environment _aasEnv = new AasCore.Aas3_0.Environment(new List(), new List(), new List()); - private Package _openPackage = null; - private readonly ListOfAasSupplementaryFile _pendingFilesToAdd = new ListOfAasSupplementaryFile(); - private readonly ListOfAasSupplementaryFile _pendingFilesToDelete = new ListOfAasSupplementaryFile(); - - public AdminShellPackageEnv() { } - - public AdminShellPackageEnv(AasCore.Aas3_0.Environment env) - { - if (env != null) - _aasEnv = env; - } - - public AdminShellPackageEnv(string fn, bool indirectLoadSave = false) - { - Load(fn, indirectLoadSave); - } - - public bool IsOpen - { - get - { - return _openPackage != null; - } - } - - public void SetFilename(string fileName) - { - _fn = fileName; - } - - public string Filename - { - get - { - return _fn; - } - } - - public AasCore.Aas3_0.Environment AasEnv - { - get - { - return _aasEnv; - } - } - - private static AasCore.Aas3_0.Environment LoadXml(string fn) - { - try - { - using (var reader = new StreamReader(fn)) - { - var aasEnv = AdminShellSerializationHelper.DeserializeXmlFromStreamWithCompat( - reader.BaseStream); - - if (aasEnv == null) - throw new Exception("Type error for XML file"); - - return aasEnv; - } - } - catch (Exception ex) - { - throw new Exception( - $"While reading AAS {fn} at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); - } - } - - private static AasCore.Aas3_0.Environment LoadJson(string fn) - { - try - { - using (var file = System.IO.File.OpenRead(fn)) - { - // dead-csharp off - //// TODO (Michael Hoffmeister, 2020-08-01): use a unified function to create a serializer - //var serializer = new JsonSerializer(); - //serializer.Converters.Add( - // new AdminShellConverters.JsonAasxConverter( - // "modelType", "name")); - - //var aasEnv = (AasCore.Aas3_0_RC02.Environment)serializer.Deserialize( - // file, typeof(AasCore.Aas3_0_RC02.Environment)); - // dead-csharp on - var node = System.Text.Json.Nodes.JsonNode.Parse(file); - var aasEnv = Jsonization.Deserialize.EnvironmentFrom(node); - - return aasEnv; - } - } - catch (Exception ex) - { - throw new Exception( - $"While reading AAS {fn} at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); - } - } - - /// is unequal if indirectLoadSave is used. - private static (AasCore.Aas3_0.Environment, Package) LoadPackageAasx(string fn, string fnToLoad) - { - AasCore.Aas3_0.Environment aasEnv; - Package openPackage = null; - - Package package; - try - { - package = Package.Open(fnToLoad, FileMode.Open); - } - catch (Exception ex) - { - throw new Exception( - fn == fnToLoad - ? $"While opening the package to read AASX {fn} " + - $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}" - : $"While opening the package to read AASX {fn} indirectly from {fnToLoad} " + - $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); - } - - try - { - // get the origin from the package - PackagePart originPart = null; - var xs = package.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aasx-origin"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/") - { - //originPart = package.GetPart(x.TargetUri); - var absoluteURI = PackUriHelper.ResolvePartUri(x.SourceUri, x.TargetUri); - if (package.PartExists(absoluteURI)) - { - originPart = package.GetPart(absoluteURI); - } - break; - } - - if (originPart == null) - throw (new Exception("Unable to find AASX origin. Aborting!")); - - // get the specs from the package - PackagePart specPart = null; - xs = originPart.GetRelationshipsByType("http://www.admin-shell.io/aasx/relationships/aas-spec"); - foreach (var x in xs) - { - //specPart = package.GetPart(x.TargetUri); - var absoluteURI = PackUriHelper.ResolvePartUri(x.SourceUri, x.TargetUri); - if (package.PartExists(absoluteURI)) - { - specPart = package.GetPart(absoluteURI); - } - break; - } - - if (specPart == null) - throw (new Exception("Unable to find AASX spec(s). Aborting!")); - - // open spec part to read - try - { - if (specPart.Uri.ToString().ToLower().Trim().EndsWith("json")) - { - using (var s = specPart.GetStream(FileMode.Open)) - { - // dead-csharp off - //using (var file = new StreamReader(s)) - //{ - //JsonSerializer serializer = new JsonSerializer(); - //serializer.Converters.Add( - // new AdminShellConverters.JsonAasxConverter( - // "modelType", "name")); - - //aasEnv = (AasCore.Aas3_0_RC02.Environment)serializer.Deserialize( - // file, typeof(AasCore.Aas3_0_RC02.Environment)); - - var node = System.Text.Json.Nodes.JsonNode.Parse(s); - aasEnv = Jsonization.Deserialize.EnvironmentFrom(node); - //} - // dead-csharp on - } - } - else - { - using (var s = specPart.GetStream(FileMode.Open)) - { - // own catch loop to be more specific - aasEnv = AdminShellSerializationHelper.DeserializeXmlFromStreamWithCompat(s); - openPackage = package; - - if (aasEnv == null) - throw new Exception("Type error for XML file!"); - } - } - } - catch (Exception ex) - { - throw new Exception( - fn == fnToLoad - ? $"While reading spec from the AASX {fn} " + - $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}" - : $"While reading spec from the {fn} (and indirectly over {fnToLoad}) " + - $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); - } - } - catch (Exception ex) - { - throw new Exception( - fn == fnToLoad - ? $"While reading the AASX {fn} " + - $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}" - : $"While reading the {fn} (and indirectly over {fnToLoad}) " + - $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); - } - finally - { - if (openPackage == null) - { - package.Close(); - } - } - - return (aasEnv, openPackage); - } - - public void Load(string fn, bool indirectLoadSave = false) - { - _fn = fn; - _openPackage?.Close(); - _openPackage = null; - - string extension = Path.GetExtension(fn).ToLower(); - switch (extension) - { - case ".xml": - { - _aasEnv = LoadXml(fn); - break; - } - case ".json": - { - _aasEnv = LoadJson(fn); - break; - } - case ".aasx": - { - var fnToLoad = fn; - _tempFn = null; - if (indirectLoadSave) - { - try - { - _tempFn = System.IO.Path.GetTempFileName().Replace(".tmp", ".aasx"); - System.IO.File.Copy(fn, _tempFn); - fnToLoad = _tempFn; - - } - catch (Exception ex) - { - throw new Exception( - $"While copying AASX {fn} for indirect load to {fnToLoad} " + - $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); - } - } - - // load package AASX - (_aasEnv, _openPackage) = LoadPackageAasx(fn, fnToLoad); - break; - } - default: - throw new Exception( - $"Does not know how to handle the extension {extension} of the file: {fn}"); - } - } - - public void SetTempFn(string fn) - { - try - { - _tempFn = System.IO.Path.GetTempFileName().Replace(".tmp", ".aasx"); - System.IO.File.Copy(fn, _tempFn); - - } - catch (Exception ex) - { - throw new Exception( - $"While copying AASX {fn}" + - $"at {AdminShellUtil.ShortLocation(ex)} gave: {ex.Message}"); - } - } - - public void LoadFromAasEnvString(string content) - { - try - { - // dead-csharp off - //using (var file = new StringReader(content)) - //{ - // TODO (Michael Hoffmeister, 2020-08-01): use a unified function to create a serializer - //JsonSerializer serializer = new JsonSerializer(); - //serializer.Converters.Add(new AdminShellConverters.JsonAasxConverter("modelType", "name")); - //_aasEnv = (AasCore.Aas3_0_RC02.Environment)serializer.Deserialize( - // file, typeof(AasCore.Aas3_0_RC02.Environment)); - - var node = System.Text.Json.Nodes.JsonNode.Parse(content); - _aasEnv = Jsonization.Deserialize.EnvironmentFrom(node); - //} - // dead-csharp on - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While reading AASENV string {0} gave: {1}", - AdminShellUtil.ShortLocation(ex), ex.Message))); - } - } - - public enum SerializationFormat { None, Xml, Json }; - // dead-csharp off - //public static XmlSerializerNamespaces GetXmlDefaultNamespaces() - //{ - // var nss = new XmlSerializerNamespaces(); - // nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace); - // nss.Add("aas", "http://www.admin-shell.io/aas/2/0"); - // nss.Add("IEC", "http://www.admin-shell.io/IEC61360/2/0"); - // nss.Add("abac", "http://www.admin-shell.io/aas/abac/2/0"); - // return nss; - //} - // dead-csharp on - public bool SaveAs(string fn, bool writeFreshly = false, SerializationFormat prefFmt = SerializationFormat.None, - MemoryStream useMemoryStream = null, bool saveOnlyCopy = false) - { - // silently fix flaws - _aasEnv?.SilentFix30(); - - // ok, which format? - if (fn.ToLower().EndsWith(".xml")) - { - // save only XML - if (!saveOnlyCopy) - _fn = fn; - try - { - Stream s = (useMemoryStream != null) - ? (Stream)useMemoryStream - : System.IO.File.Open(fn, FileMode.Create, FileAccess.Write); - - try - { - // dead-csharp off - // TODO (Michael Hoffmeister, 2020-08-01): use a unified function to create a serializer - //var serializer = new XmlSerializer(typeof(AasCore.Aas3_0_RC02.Environment)); - //var nss = GetXmlDefaultNamespaces(); - //serializer.Serialize(s, _aasEnv, nss); - // dead-csharp on - var writer = XmlWriter.Create(s, new XmlWriterSettings() - { - Indent = true, - OmitXmlDeclaration = true - }); - Xmlization.Serialize.To( - _aasEnv, writer); - writer.Flush(); - writer.Close(); - s.Flush(); - } - finally - { - // close? - if (useMemoryStream == null) - s.Close(); - } - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While writing AAS {0} at {1} gave: {2}", - fn, AdminShellUtil.ShortLocation(ex), ex.Message))); - } - return true; - } - - if (fn.ToLower().EndsWith(".json")) - { - // save only JSON - // This functionality is an initial test. - if (!saveOnlyCopy) - _fn = fn; - try - { - Stream s = (useMemoryStream != null) ? (Stream)useMemoryStream - : System.IO.File.Open(fn, FileMode.Create, FileAccess.Write); - - try - { - // dead-csharp off - //// TODO (Michael Hoffmeister, 2020-08-01): use a unified function to create a serializer - //JsonSerializer serializer = new JsonSerializer() - //{ - // NullValueHandling = NullValueHandling.Ignore, - // ReferenceLoopHandling = ReferenceLoopHandling.Serialize, - // Formatting = Newtonsoft.Json.Formatting.Indented - //}; - - //var sw = new StreamWriter(s); - //var writer = new JsonTextWriter(sw); - - //serializer.Serialize(writer, _aasEnv); - //writer.Flush(); - //sw.Flush(); - //s.Flush(); - - //if (useMemoryStream == null) - //{ - // writer.Close(); - // sw.Close(); - //} - // dead-csharp on - using (var wr = new System.Text.Json.Utf8JsonWriter(s)) - { - Jsonization.Serialize.ToJsonObject(_aasEnv).WriteTo(wr, - new System.Text.Json.JsonSerializerOptions() - { - WriteIndented = true - }); - wr.Flush(); - s.Flush(); - } - } - finally - { - // close? - if (useMemoryStream == null) - s.Close(); - } - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While writing AAS {0} at {1} gave: {2}", - fn, AdminShellUtil.ShortLocation(ex), ex.Message))); - } - return true; - } - - if (fn.ToLower().EndsWith(".aasx")) - { - // save package AASX - try - { - // We want existing contents to be preserved, but do not want to allow the change of the file name. - // Therefore: copy the file to a new name, then re-open. - // fn could be changed, therefore close "old" package first - if (_openPackage != null) - { - try - { - _openPackage.Close(); - if (!writeFreshly) - { - if (_tempFn != null) - System.IO.File.Copy(_tempFn, fn); - else - { - /* TODO (MIHO, 2021-01-02): check again. - * Revisiting this code after a while, and after - * the code has undergo some changes by MR, the following copy command needed - * to be amended with a if to protect against self-copy. */ - if (_fn != fn) - System.IO.File.Copy(_fn, fn); - } - } - } - catch (Exception ex) - { - LogInternally.That.SilentlyIgnoredError(ex); - } - _openPackage = null; - } - - // approach is to utilize the existing package, if possible. If not, create from scratch - Package package = null; - if (useMemoryStream != null) - { - package = Package.Open( - useMemoryStream, (writeFreshly) ? FileMode.Create : FileMode.OpenOrCreate); - } - else - { - package = Package.Open( - (_tempFn != null) ? _tempFn : fn, - (writeFreshly) ? FileMode.Create : FileMode.OpenOrCreate); - } - _fn = fn; - - // get the origin from the package - PackagePart originPart = null; - var xs = package.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aasx-origin"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/") - { - //originPart = package.GetPart(x.TargetUri); - var absoluteURI = PackUriHelper.ResolvePartUri(x.SourceUri, x.TargetUri); - if (package.PartExists(absoluteURI)) - { - originPart = package.GetPart(absoluteURI); - } - break; - } - if (originPart == null) - { - // create, as not existing - originPart = package.CreatePart( - new Uri("/aasx/aasx-origin", UriKind.RelativeOrAbsolute), - System.Net.Mime.MediaTypeNames.Text.Plain, CompressionOption.Maximum); - using (var s = originPart.GetStream(FileMode.Create)) - { - var bytes = System.Text.Encoding.ASCII.GetBytes("Intentionally empty"); - s.Write(bytes, 0, bytes.Length); - } - package.CreateRelationship( - originPart.Uri, TargetMode.Internal, - "http://www.admin-shell.io/aasx/relationships/aasx-origin"); - } - - // get the specs from the package - PackagePart specPart = null; - PackageRelationship specRel = null; - xs = originPart.GetRelationshipsByType("http://www.admin-shell.io/aasx/relationships/aas-spec"); - foreach (var x in xs) - { - specRel = x; - //specPart = package.GetPart(x.TargetUri); - var absoluteURI = PackUriHelper.ResolvePartUri(x.SourceUri, x.TargetUri); - if (package.PartExists(absoluteURI)) - { - specPart = package.GetPart(absoluteURI); - } - break; - } - - // check, if we have to change the spec part - if (specPart != null && specRel != null) - { - var name = System.IO.Path.GetFileNameWithoutExtension( - specPart.Uri.ToString()).ToLower().Trim(); - var ext = System.IO.Path.GetExtension(specPart.Uri.ToString()).ToLower().Trim(); - if ((ext == ".json" && prefFmt == SerializationFormat.Xml) - || (ext == ".xml" && prefFmt == SerializationFormat.Json) - || (name.StartsWith("aasenv-with-no-id"))) - { - // try kill specpart - try - { - originPart.DeleteRelationship(specRel.Id); - package.DeletePart(specPart.Uri); - } - catch (Exception ex) - { - LogInternally.That.SilentlyIgnoredError(ex); - } - finally { specPart = null; specRel = null; } - } - } - - if (specPart == null) - { - // create, as not existing - var frn = "aasenv-with-no-id"; - if (_aasEnv.AssetAdministrationShells.Count > 0) - frn = _aasEnv.AssetAdministrationShells[0].GetFriendlyName() ?? frn; - var aas_spec_fn = "/aasx/#/#.aas"; - if (prefFmt == SerializationFormat.Json) - aas_spec_fn += ".json"; - else - aas_spec_fn += ".xml"; - aas_spec_fn = aas_spec_fn.Replace("#", "" + frn); - specPart = package.CreatePart( - new Uri(aas_spec_fn, UriKind.RelativeOrAbsolute), - System.Net.Mime.MediaTypeNames.Text.Xml, CompressionOption.Maximum); - originPart.CreateRelationship( - specPart.Uri, TargetMode.Internal, - "http://www.admin-shell.io/aasx/relationships/aas-spec"); - } - - // now, specPart shall be != null! - if (specPart.Uri.ToString().ToLower().Trim().EndsWith("json")) - { - using (var s = specPart.GetStream(FileMode.Create)) - { - JsonSerializer serializer = new JsonSerializer(); - serializer.NullValueHandling = NullValueHandling.Ignore; - serializer.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; - serializer.Formatting = Newtonsoft.Json.Formatting.Indented; - using (var sw = new StreamWriter(s)) - { - using (JsonWriter writer = new JsonTextWriter(sw)) - { - serializer.Serialize(writer, _aasEnv); - } - } - } - } - else - { - using (var s = specPart.GetStream(FileMode.Create)) - { - - var writer = XmlWriter.Create(s, new XmlWriterSettings() - { - Indent = true, - OmitXmlDeclaration = true - }); - Xmlization.Serialize.To( - _aasEnv, writer); - writer.Flush(); - writer.Close(); - s.Flush(); - } - } - - // there might be pending files to be deleted (first delete, then add, - // in case of identical files in both categories) - foreach (var psfDel in _pendingFilesToDelete) - { - // try find an existing part for that file .. - var found = false; - - // normal files - xs = specPart.GetRelationshipsByType("http://www.admin-shell.io/aasx/relationships/aas-suppl"); - foreach (var x in xs) - if (x.TargetUri == psfDel.Uri) - { - // try to delete - specPart.DeleteRelationship(x.Id); - package.DeletePart(psfDel.Uri); - found = true; - break; - } - - // thumbnails - xs = package.GetRelationshipsByType( - "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); - foreach (var x in xs) - if (x.TargetUri == psfDel.Uri) - { - // try to delete - package.DeleteRelationship(x.Id); - package.DeletePart(psfDel.Uri); - found = true; - break; - } - - if (!found) - throw (new Exception( - $"Not able to delete pending file {psfDel.Uri} in saving package {fn}")); - } - - // after this, there are no more pending for delete files - _pendingFilesToDelete.Clear(); - - // write pending supplementary files - foreach (var psfAdd in _pendingFilesToAdd) - { - // make sure .. - if ((psfAdd.SourceLocalPath == null && psfAdd.SourceGetBytesDel == null) || - psfAdd.Location != AdminShellPackageSupplementaryFile.LocationType.AddPending) - continue; - - // normal file? - if (psfAdd.SpecialHandling == AdminShellPackageSupplementaryFile.SpecialHandlingType.None || - psfAdd.SpecialHandling == - AdminShellPackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail) - { - - // try find an existing part for that file .. - PackagePart filePart = null; - if (psfAdd.SpecialHandling == AdminShellPackageSupplementaryFile.SpecialHandlingType.None) - { - xs = specPart.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aas-suppl"); - foreach (var x in xs) - if (x.TargetUri == psfAdd.Uri) - { - //filePart = package.GetPart(x.TargetUri); - var absoluteURI = PackUriHelper.ResolvePartUri(x.SourceUri, x.TargetUri); - if (package.PartExists(absoluteURI)) - { - filePart = package.GetPart(absoluteURI); - } - break; - } - } - if (psfAdd.SpecialHandling == - AdminShellPackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail) - { - xs = package.GetRelationshipsByType( - "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/" && x.TargetUri == psfAdd.Uri) - { - //filePart = package.GetPart(x.TargetUri); - var absoluteURI = PackUriHelper.ResolvePartUri(x.SourceUri, x.TargetUri); - if (package.PartExists(absoluteURI)) - { - filePart = package.GetPart(absoluteURI); - } - break; - } - } - - if (filePart == null) - { - // determine mimeType - var mimeType = psfAdd.UseMimeType; - // reconcile mime - if (mimeType == null && psfAdd.SourceLocalPath != null) - mimeType = AdminShellPackageEnv.GuessMimeType(psfAdd.SourceLocalPath); - // still null? - if (mimeType == null) - // see: https://stackoverflow.com/questions/6783921/ - // which-mime-type-to-use-for-a-binary-file-thats-specific-to-my-program - mimeType = "application/octet-stream"; - - // create new part and link - filePart = package.CreatePart(psfAdd.Uri, mimeType, CompressionOption.Maximum); - if (psfAdd.SpecialHandling == - AdminShellPackageSupplementaryFile.SpecialHandlingType.None) - specPart.CreateRelationship( - filePart.Uri, TargetMode.Internal, - "http://www.admin-shell.io/aasx/relationships/aas-suppl"); - if (psfAdd.SpecialHandling == - AdminShellPackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail) - package.CreateRelationship( - filePart.Uri, TargetMode.Internal, - "http://schemas.openxmlformats.org/package/2006/" + - "relationships/metadata/thumbnail"); - } - - // now should be able to write - using (var s = filePart.GetStream(FileMode.Create)) - { - if (psfAdd.SourceLocalPath != null) - { - var bytes = System.IO.File.ReadAllBytes(psfAdd.SourceLocalPath); - s.Write(bytes, 0, bytes.Length); - } - - if (psfAdd.SourceGetBytesDel != null) - { - var bytes = psfAdd.SourceGetBytesDel(); - if (bytes != null) - s.Write(bytes, 0, bytes.Length); - } - } - } - } - - // after this, there are no more pending for add files - _pendingFilesToAdd.Clear(); - - // flush, but leave open - package.Flush(); - _openPackage = package; - - // if in temp fn, close the package, copy to original fn, re-open the package - if (_tempFn != null) - try - { - package.Close(); - System.IO.File.Copy(_tempFn, _fn, overwrite: true); - _openPackage = Package.Open(_tempFn, FileMode.OpenOrCreate); - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While write AASX {0} indirectly at {1} gave: {2}", - fn, AdminShellUtil.ShortLocation(ex), ex.Message))); - } - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While write AASX {0} at {1} gave: {2}", - fn, AdminShellUtil.ShortLocation(ex), ex.Message))); - } - return true; - } - - // Don't know to handle - throw new Exception($"Does not know how to handle the file: {fn}"); - } - - /// - /// Temporariyl saves & closes package and executes lambda. Afterwards, the package is re-opened - /// under the same file name - /// - /// Action which is to be executed while the file is CLOSED - /// Format for the saved file - public void TemporarilySaveCloseAndReOpenPackage( - Action lambda, - AdminShellPackageEnv.SerializationFormat prefFmt = AdminShellPackageEnv.SerializationFormat.None) - { - // access - if (!this.IsOpen) - throw (new Exception( - string.Format("Could not temporarily close and re-open AASX {0}, because package" + - "not open as expected!", Filename))); - - try - { - // save (it will be open, still) - SaveAs(this.Filename, prefFmt: prefFmt); - - // close - _openPackage.Flush(); - _openPackage.Close(); - - // execute lambda - lambda?.Invoke(); - } - catch (Exception ex) - { - throw (new Exception( - string.Format("While temporarily close and re-open AASX {0} at {1} gave: {2}", - Filename, AdminShellUtil.ShortLocation(ex), ex.Message))); - } - finally - { - // even after failing of the lambda, the package shall be re-opened - if (Filename.ToLower().EndsWith(".aasx")) - { - _openPackage = Package.Open(Filename, FileMode.OpenOrCreate); - - } - } - } - - private int BackupIndex = 0; - - public void BackupInDir(string backupDir, int maxFiles) - { - // access - if (backupDir == null || maxFiles < 1) - return; - - // we do it not caring on any errors - try - { - // get index in form - if (BackupIndex == 0) - { - // do not always start at 0!! - var rnd = new Random(); - BackupIndex = rnd.Next(maxFiles); - } - var ndx = BackupIndex % maxFiles; - BackupIndex += 1; - - // build a filename - var bdfn = Path.Combine(backupDir, $"backup{ndx:000}.xml"); - - // raw save - using (var s = new StreamWriter(bdfn)) - { - // dead-csharp off - //var serializer = new XmlSerializer(typeof(AasCore.Aas3_0_RC02.Environment)); - //var nss = new XmlSerializerNamespaces(); - //nss.Add("xsi", System.Xml.Schema.XmlSchema.InstanceNamespace); - //nss.Add("aas", "http://www.admin-shell.io/aas/2/0"); - //nss.Add("IEC61360", "http://www.admin-shell.io/IEC61360/2/0"); - //serializer.Serialize(s, _aasEnv, nss); - // dead-csharp on - var writer = XmlWriter.Create(s, new XmlWriterSettings() - { - Indent = true, - OmitXmlDeclaration = true - }); - Xmlization.Serialize.To( - _aasEnv, writer); - writer.Flush(); - writer.Close(); - s.Flush(); - } - } - catch (Exception ex) - { - LogInternally.That.SilentlyIgnoredError(ex); - } - } - - public Stream GetStreamFromUriOrLocalPackage(string uriString, - FileMode mode = FileMode.Open, - FileAccess access = FileAccess.Read) - { - // local - if (IsLocalFile(uriString)) - return GetLocalStreamFromPackage(uriString, mode, access); - - // no .. - return System.IO.File.Open(uriString, mode, access); - } - - public byte[] GetByteArrayFromUriOrLocalPackage(string uriString) - { - try - { - using (var input = GetStreamFromUriOrLocalPackage(uriString)) - { - using (MemoryStream ms = new MemoryStream()) - { - input.CopyTo(ms); - return ms.ToArray(); - } - } - } - catch (Exception ex) - { - AdminShellNS.LogInternally.That.SilentlyIgnoredError(ex); - return null; - } - } - - public bool IsLocalFile(string uriString) - { - // access - if (_openPackage == null) - return false; - if (uriString == null || uriString == "" || !uriString.StartsWith("/")) - return false; - - // check - var isLocal = _openPackage.PartExists(new Uri(uriString, UriKind.RelativeOrAbsolute)); - return isLocal; - } - - private static WebProxy proxy = null; - - public Stream GetLocalStreamFromPackage(string uriString, FileMode mode = FileMode.Open, FileAccess access = FileAccess.Read) - { - // Check, if remote - if (uriString.ToLower().Substring(0, 4) == "http") - { - if (proxy == null) - { - string proxyAddress = ""; - string username = ""; - string password = ""; - - string proxyFile = "proxy.txt"; - if (System.IO.File.Exists(proxyFile)) - { - try - { // Open the text file using a stream reader. - using (StreamReader sr = new StreamReader(proxyFile)) - { - proxyFile = sr.ReadLine(); - } - } - catch (IOException e) - { - Console.WriteLine("proxy.txt could not be read:"); - Console.WriteLine(e.Message); - } - } - - try - { - using (StreamReader sr = new StreamReader(proxyFile)) - { - proxyAddress = sr.ReadLine(); - username = sr.ReadLine(); - password = sr.ReadLine(); - } - } - catch (Exception e) - { - Console.WriteLine(e.Message); - Console.WriteLine(proxyFile + " not found!"); - } - - if (proxyAddress != "") - { - proxy = new WebProxy(); - Uri newUri = new Uri(proxyAddress); - proxy.Address = newUri; - proxy.Credentials = new NetworkCredential(username, password); - Console.WriteLine("Using proxy: " + proxyAddress); - } - } - - var handler = new HttpClientHandler(); - - if (proxy != null) - handler.Proxy = proxy; - else - handler.DefaultProxyCredentials = CredentialCache.DefaultCredentials; - var hc = new HttpClient(handler); - - var response = hc.GetAsync(uriString).GetAwaiter().GetResult(); - - // if you call response.EnsureSuccessStatusCode here it will throw an exception - if (response.StatusCode == HttpStatusCode.Moved - || response.StatusCode == HttpStatusCode.Found) - { - var location = response.Headers.Location; - response = hc.GetAsync(location).GetAwaiter().GetResult(); - } - - response.EnsureSuccessStatusCode(); - var s = response.Content.ReadAsStreamAsync().GetAwaiter().GetResult(); - - if (s.Length < 500) // indirect load? - { - StreamReader reader = new StreamReader(s); - string json = reader.ReadToEnd(); - var parsed = JObject.Parse(json); - try - { - string url = parsed.SelectToken("url").Value(); - response = hc.GetAsync(url).GetAwaiter().GetResult(); - response.EnsureSuccessStatusCode(); - s = response.Content.ReadAsStreamAsync().GetAwaiter().GetResult(); - } - catch - { - } - } - - return s; - } - - // access - if (_openPackage == null) - throw (new Exception(string.Format($"AASX Package {_fn} not opened. Aborting!"))); - - // exist - var puri = new Uri(uriString, UriKind.RelativeOrAbsolute); - if (!_openPackage.PartExists(puri)) - throw (new Exception(string.Format($"AASX Package has no part {uriString}. Aborting!"))); - - // get part - var part = _openPackage.GetPart(puri); - if (part == null) - throw (new Exception( - string.Format($"Cannot access part {uriString} in {_fn}. Aborting!"))); - return part.GetStream(mode, access); - } - - public async Task ReplaceSupplementaryFileInPackageAsync(string sourceUri, string targetFile, string targetContentType, Stream fileContent) - { - // access - if (_openPackage == null) - throw (new Exception(string.Format($"AASX Package {_fn} not opened. Aborting!"))); - - if (!string.IsNullOrEmpty(sourceUri)) - { - _openPackage.DeletePart(new Uri(sourceUri, UriKind.RelativeOrAbsolute)); - - } - var targetUri = PackUriHelper.CreatePartUri(new Uri(targetFile, UriKind.RelativeOrAbsolute)); - PackagePart packagePart = _openPackage.CreatePart(targetUri, targetContentType); - fileContent.Position = 0; - using (Stream dest = packagePart.GetStream()) - { - fileContent.CopyTo(dest); - } - } - - public long GetStreamSizeFromPackage(string uriString) - { - long res = 0; - try - { - if (_openPackage == null) - return 0; - - PackagePart part = null; - var uri = new Uri(uriString, UriKind.RelativeOrAbsolute); - if (_openPackage.PartExists(uri)) - { - part = _openPackage.GetPart(uri); - } - if (part != null) - { - using (var s = part.GetStream(FileMode.Open)) - { - res = s.Length; - } - } - } - catch (Exception ex) - { - LogInternally.That.SilentlyIgnoredError(ex); - return 0; - } - return res; - } - - /// - /// Ensures: - ///
  • result == null || result.CanRead
- ///
- public Stream GetLocalThumbnailStream(ref Uri thumbUri) - { - // access - if (_openPackage == null) - throw (new Exception(string.Format($"AASX Package {_fn} not opened. Aborting!"))); - // get the thumbnail over the relationship - PackagePart thumbPart = null; - var xs = _openPackage.GetRelationshipsByType( - "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/") - { - //thumbPart = _openPackage.GetPart(x.TargetUri); - var absoluteURI = PackUriHelper.ResolvePartUri(x.SourceUri, x.TargetUri); - if (_openPackage.PartExists(absoluteURI)) - { - thumbPart = _openPackage.GetPart(absoluteURI); - } - thumbUri = x.TargetUri; - break; - } - if (thumbPart == null) - throw (new Exception("Unable to find AASX thumbnail. Aborting!")); - - var result = thumbPart.GetStream(FileMode.Open); - - // Post-condition - if (!(result == null || result.CanRead)) - { - throw new InvalidOperationException("Unexpected unreadable result stream"); - } - - return result; - } - - /// - /// Ensures: - ///
  • result == null || result.CanRead
- ///
- public Stream GetLocalThumbnailStream() - { - Uri dummy = null; - var result = GetLocalThumbnailStream(ref dummy); - - // Post-condition - if (!(result == null || result.CanRead)) - { - throw new InvalidOperationException("Unexpected unreadable result stream"); - } - - return result; - } - - public ListOfAasSupplementaryFile GetListOfSupplementaryFiles() - { - // new result - var result = new ListOfAasSupplementaryFile(); - - // access - if (_openPackage != null) - { - - // get the thumbnail(s) from the package - var xs = _openPackage.GetRelationshipsByType( - "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/") - { - result.Add(new AdminShellPackageSupplementaryFile( - x.TargetUri, - location: AdminShellPackageSupplementaryFile.LocationType.InPackage, - specialHandling: AdminShellPackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail)); - } - - // get the origin from the package - PackagePart originPart = null; - xs = _openPackage.GetRelationshipsByType( - "http://www.admin-shell.io/aasx/relationships/aasx-origin"); - foreach (var x in xs) - if (x.SourceUri.ToString() == "/") - { - //originPart = _openPackage.GetPart(x.TargetUri); - var absoluteURI = PackUriHelper.ResolvePartUri(x.SourceUri, x.TargetUri); - if (_openPackage.PartExists(absoluteURI)) - { - originPart = _openPackage.GetPart(absoluteURI); - } - break; - } - - if (originPart != null) - { - // get the specs from the origin - PackagePart specPart = null; - xs = originPart.GetRelationshipsByType("http://www.admin-shell.io/aasx/relationships/aas-spec"); - foreach (var x in xs) - { - //specPart = _openPackage.GetPart(x.TargetUri); - var absoluteURI = PackUriHelper.ResolvePartUri(x.SourceUri, x.TargetUri); - if (_openPackage.PartExists(absoluteURI)) - { - specPart = _openPackage.GetPart(absoluteURI); - } - break; - } - - if (specPart != null) - { - // get the supplementaries from the package, derived from spec - xs = specPart.GetRelationshipsByType("http://www.admin-shell.io/aasx/relationships/aas-suppl"); - foreach (var x in xs) - { - result.Add( - new AdminShellPackageSupplementaryFile( - x.TargetUri, location: AdminShellPackageSupplementaryFile.LocationType.InPackage)); - } - } - } - } - - // add or modify the files to delete - foreach (var psfDel in _pendingFilesToDelete) - { - // already in - var found = result.Find(x => { return x.Uri == psfDel.Uri; }); - if (found != null) - found.Location = AdminShellPackageSupplementaryFile.LocationType.DeletePending; - else - { - psfDel.Location = AdminShellPackageSupplementaryFile.LocationType.DeletePending; - result.Add(psfDel); - } - } - - // add the files to store as well - foreach (var psfAdd in _pendingFilesToAdd) - { - // already in (should not happen ?!) - var found = result.Find(x => { return x.Uri == psfAdd.Uri; }); - if (found != null) - found.Location = AdminShellPackageSupplementaryFile.LocationType.AddPending; - else - { - psfAdd.Location = AdminShellPackageSupplementaryFile.LocationType.AddPending; - result.Add(psfAdd); - } - } - - // done - return result; - } - - public static string GuessMimeType(string fn) - { - var file_ext = System.IO.Path.GetExtension(fn).ToLower().Trim(); - var content_type = System.Net.Mime.MediaTypeNames.Text.Plain; - if (file_ext == ".pdf") content_type = System.Net.Mime.MediaTypeNames.Application.Pdf; - if (file_ext == ".xml") content_type = System.Net.Mime.MediaTypeNames.Text.Xml; - if (file_ext == ".txt") content_type = System.Net.Mime.MediaTypeNames.Text.Plain; - if (file_ext == ".igs") content_type = "application/iges"; - if (file_ext == ".iges") content_type = "application/iges"; - if (file_ext == ".stp") content_type = "application/step"; - if (file_ext == ".step") content_type = "application/step"; - if (file_ext == ".jpg") content_type = System.Net.Mime.MediaTypeNames.Image.Jpeg; - if (file_ext == ".jpeg") content_type = System.Net.Mime.MediaTypeNames.Image.Jpeg; - if (file_ext == ".png") content_type = "image/png"; - if (file_ext == ".gif") content_type = System.Net.Mime.MediaTypeNames.Image.Gif; - return content_type; - } - - public void PrepareSupplementaryFileParameters(ref string targetDir, ref string targetFn) - { - // re-work target dir - if (targetDir != null) - targetDir = targetDir.Replace(@"\", "/"); - - // rework targetFn - if (targetFn != null) - targetFn = Regex.Replace(targetFn, @"[^A-Za-z0-9-.]+", "_"); - } - - /// - /// Add a file as supplementary file to package. Operation will be pending, package needs to be saved in order - /// materialize embedding. - /// - /// Target path of file in package - public string AddSupplementaryFileToStore( - string sourcePath, string targetDir, string targetFn, bool embedAsThumb, - AdminShellPackageSupplementaryFile.SourceGetByteChunk sourceGetBytesDel = null, string useMimeType = null) - { - // beautify parameters - if ((sourcePath == null && sourceGetBytesDel == null) || targetDir == null || targetFn == null) - return null; - - // build target path - targetDir = targetDir.Trim(); - if (!targetDir.EndsWith("/")) - targetDir += "/"; - targetFn = targetFn.Trim(); - if (sourcePath == "" || targetDir == "" || targetFn == "") - throw (new Exception("Trying add supplementary file with empty name or path!")); - - var targetPath = "" + targetDir.Trim() + targetFn.Trim(); - - // base function - AddSupplementaryFileToStore(sourcePath, targetPath, embedAsThumb, sourceGetBytesDel, useMimeType); - - // return target path - return targetPath; - } - - public void AddSupplementaryFileToStore(string sourcePath, string targetPath, bool embedAsThumb, - AdminShellPackageSupplementaryFile.SourceGetByteChunk sourceGetBytesDel = null, string useMimeType = null) - { - // beautify parameters - if ((sourcePath == null && sourceGetBytesDel == null) || targetPath == null) - return; - - sourcePath = sourcePath?.Trim(); - targetPath = targetPath.Trim(); - - // add record - _pendingFilesToAdd.Add( - new AdminShellPackageSupplementaryFile( - new Uri(targetPath, UriKind.RelativeOrAbsolute), - sourcePath, - location: AdminShellPackageSupplementaryFile.LocationType.AddPending, - specialHandling: (embedAsThumb - ? AdminShellPackageSupplementaryFile.SpecialHandlingType.EmbedAsThumbnail - : AdminShellPackageSupplementaryFile.SpecialHandlingType.None), - sourceGetBytesDel: sourceGetBytesDel, - useMimeType: useMimeType) - ); - - } - - public void DeleteSupplementaryFile(AdminShellPackageSupplementaryFile psf) - { - if (psf == null) - throw (new Exception("No supplementary file given!")); - - if (psf.Location == AdminShellPackageSupplementaryFile.LocationType.AddPending) - { - // is still pending in add list -> remove - _pendingFilesToAdd.RemoveAll((x) => { return x.Uri == psf.Uri; }); - } - - if (psf.Location == AdminShellPackageSupplementaryFile.LocationType.InPackage) - { - // add to pending delete list - _pendingFilesToDelete.Add(psf); - } - } - - public void Close() - { - _openPackage?.Close(); - _openPackage = null; - _fn = ""; - _aasEnv = null; - } - - public void Flush() - { - if (_openPackage != null) - _openPackage.Flush(); - } - - public void Dispose() - { - Close(); - } - - public string MakePackageFileAvailableAsTempFile(string packageUri, bool keepFilename = false) - { - // access - if (packageUri == null) - return null; - - // get input stream - using (var input = GetLocalStreamFromPackage(packageUri)) - { - // generate tempfile name - string tempext = System.IO.Path.GetExtension(packageUri); - string temppath = System.IO.Path.GetTempFileName().Replace(".tmp", tempext); - - // maybe modify tempfile name? - if (keepFilename) - { - var masterFn = System.IO.Path.GetFileNameWithoutExtension(packageUri); - var tmpDir = System.IO.Path.GetDirectoryName(temppath); - var tmpFnExt = System.IO.Path.GetFileName(temppath); - - temppath = System.IO.Path.Combine(tmpDir, "" + masterFn + "_" + tmpFnExt); - } - - // copy to temp file - using (var temp = System.IO.File.OpenWrite(temppath)) - { - input.CopyTo(temp); - return temppath; - } - } - } - - public void EmbeddAssetInformationThumbnail(IResource defaultThumbnail, Stream fileContent) - { - // access - if (_openPackage == null) - throw (new Exception(string.Format($"AASX Package {_fn} not opened. Aborting!"))); - - if (!string.IsNullOrEmpty(defaultThumbnail.Path)) - { - var sourceUri = defaultThumbnail.Path.Replace(Path.DirectorySeparatorChar, '/'); - _openPackage.DeletePart(new Uri(sourceUri, UriKind.RelativeOrAbsolute)); - - } - var targetUri = PackUriHelper.CreatePartUri(new Uri(defaultThumbnail.Path, UriKind.RelativeOrAbsolute)); - - PackagePart packagePart = _openPackage.CreatePart(targetUri, defaultThumbnail.ContentType, compressionOption: CompressionOption.Maximum); - - _openPackage.CreateRelationship(packagePart.Uri, TargetMode.Internal, - "http://schemas.openxmlformats.org/package/2006/" + - "relationships/metadata/thumbnail"); - - //Write to the part - fileContent.Position = 0; - using (Stream dest = packagePart.GetStream()) - { - fileContent.CopyTo(dest); - } - } - } -} \ No newline at end of file diff --git a/src/AasxCsharpLibrary/AdminShellUtil.cs b/src/AasxCsharpLibrary/AdminShellUtil.cs deleted file mode 100644 index 34ba39821..000000000 --- a/src/AasxCsharpLibrary/AdminShellUtil.cs +++ /dev/null @@ -1,1129 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using AasxCompatibilityModels; -using Extensions; -using System; -using System.Collections; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.IO.Packaging; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Text.RegularExpressions; - -namespace AdminShellNS -{ - public static class AdminShellUtil - { - - #region Various utilities - // ------------------------------------------------------------------------------------ - - public static T[] GetEnumValues() where T : Enum - => (T[])Enum.GetValues(typeof(T)); - - public static IEnumerable GetEnumValues(T[] excludes) where T : Enum - { - foreach (var v in (T[])Enum.GetValues(typeof(T))) - if (!excludes.Contains(v)) - yield return v; - } - - #endregion - - #region V3 Methods - - public static void EnumerateSearchable( - SearchResults results, object obj, string qualifiedNameHead, int depth, SearchOptions options, - object businessObject = null) - { - // access - if (results == null || obj == null || options == null) - return; - Type objType = obj.GetType(); - - // depth - if (depth > options.maxDepth) - return; - - // try to get element name of an AAS entity - string elName = null; - if (obj is IReferable) - { - elName = (obj as IReferable).GetType().Name; - businessObject = obj; - } - - // enrich qualified name, accordingly - var qualifiedName = qualifiedNameHead; - if (elName != null) - qualifiedName = qualifiedName + (qualifiedName.Length > 0 ? "." : "") + elName; - - // do NOT dive into objects, which are not in the reight assembly - if (options.allowedAssemblies == null || !options.allowedAssemblies.Contains(objType.Assembly)) - return; - - // do not dive into enums - if (objType.IsEnum) - return; - - // look at fields, first - var fields = objType.GetFields(); - foreach (var fi in fields) - { - // is the object marked to be skipped? - var x3 = fi.GetCustomAttribute(); - if (x3 != null) - continue; - - var x4 = fi.GetCustomAttribute(); - if (x4 != null) - continue; - - // get value(s) - var fieldValue = fi.GetValue(obj); - if (fieldValue == null) - continue; - var valueElems = fieldValue as IList; - if (valueElems != null) - { - // field is a collection .. dive deeper, if allowed - foreach (var el in valueElems) - EnumerateSearchable(results, el, qualifiedName, depth + 1, options, businessObject); - } - else - { - // field is a single entity .. check it - CheckSearchable( - results, options, qualifiedName, businessObject, fi, fieldValue, obj, - () => { return fieldValue.GetHashCode(); }); - - // dive deeper .. - EnumerateSearchable(results, fieldValue, qualifiedName, depth + 1, options, businessObject); - } - } - - // properties & objects behind - var properties = objType.GetProperties(); - foreach (var pi in properties) - { - var gip = pi.GetIndexParameters(); - if (gip.Length > 0) - // no indexed properties, yet - continue; - - // is the object marked to be skipped? - var x3 = pi.GetCustomAttribute(); - if (x3 != null) - continue; - - var x4 = pi.GetCustomAttribute(); - if (x4 != null) - continue; - - // get value(s) - var propValue = pi.GetValue(obj, null); - if (propValue == null) - continue; - var valueElems = propValue as IList; - if (valueElems != null) - { - // property is a collection .. dive deeper, if allowed - foreach (var el in valueElems) - EnumerateSearchable(results, el, qualifiedName, depth + 1, options, businessObject); - } - else - { - // field is a single entity .. check it - CheckSearchable( - results, options, qualifiedName, businessObject, pi, propValue, obj, - () => { return propValue.GetHashCode(); }); - - // dive deeper .. - EnumerateSearchable(results, propValue, qualifiedName, depth + 1, options, businessObject); - } - } - } - - public static void CheckSearchable( - SearchResults results, SearchOptions options, string qualifiedNameHead, object businessObject, - MemberInfo mi, object memberValue, object containingObject, Func getMemberHash) - { - // try get a speaking name - var metaModelName = ""; - var x1 = mi.GetCustomAttribute(); - if (x1 != null && x1.name != null) - metaModelName = x1.name; - - // check if this object is searchable - var x2 = mi.GetCustomAttribute(); - if (x2 != null) - { - // what to check? - string foundText = "" + memberValue?.ToString(); - - // find options - var found = true; - if (options.findText != null) - found = foundText.IndexOf( - options.findText, options.isIgnoreCase ? StringComparison.CurrentCultureIgnoreCase : 0) >= 0; - - // add? - if (found) - { - var sri = new SearchResultItem(); - sri.searchOptions = options; - sri.qualifiedNameHead = qualifiedNameHead; - sri.metaModelName = metaModelName; - sri.businessObject = businessObject; - sri.foundText = foundText; - sri.foundObject = memberValue; - sri.containingObject = containingObject; - if (getMemberHash != null) - sri.foundHash = getMemberHash(); - - // avoid duplicates - if (!results.foundResults.Contains(sri)) - results.foundResults.Add(sri); - } - } - } - - public class SearchResultItem : IEquatable - { - public SearchOptions searchOptions; - public string qualifiedNameHead; - public string metaModelName; - public object businessObject; - public string foundText; - public object foundObject; - public object containingObject; - public int foundHash; - - public bool Equals(SearchResultItem other) - { - if (other == null) - return false; - - return this.qualifiedNameHead == other.qualifiedNameHead && - this.metaModelName == other.metaModelName && - this.businessObject == other.businessObject && - this.containingObject == other.containingObject && - this.foundText == other.foundText && - this.foundHash == other.foundHash; - } - } - - public class SearchResults - { - public int foundIndex = 0; - public List foundResults = new List(); - - public void Clear() - { - foundIndex = -1; - foundResults.Clear(); - } - } - - public class SearchOptions - { - public Assembly[] allowedAssemblies = null; - public int maxDepth = int.MaxValue; - public bool findFirst = false; - public int skipFirstResults = 0; - public string findText = null; - public bool isIgnoreCase = false; - public bool isRegex = false; - } - - public static string[] GetPopularMimeTypes() - { - return - new[] { - System.Net.Mime.MediaTypeNames.Text.Plain, - System.Net.Mime.MediaTypeNames.Text.Xml, - System.Net.Mime.MediaTypeNames.Text.Html, - "text/markdown", - "text/asciidoc", - "application/json", - "application/rdf+xml", - System.Net.Mime.MediaTypeNames.Application.Pdf, - System.Net.Mime.MediaTypeNames.Image.Jpeg, - "image/png", - System.Net.Mime.MediaTypeNames.Image.Gif, - "application/iges", - "application/step" - }; - } - - public static bool CheckForTextContentType(string input) - { - if (input == null) - return false; - input = input.Trim().ToLower(); - foreach (var tst in new[] { - System.Net.Mime.MediaTypeNames.Text.Plain, - System.Net.Mime.MediaTypeNames.Text.Xml, - System.Net.Mime.MediaTypeNames.Text.Html, - "text/markdown", - "text/asciidoc", - "application/json", - "application/rdf+xml" - }) - if (input.Contains(tst.ToLower())) - return true; - return false; - } - - public static IEnumerable GetAdequateEnums(AasSubmodelElements[] excludeValues = null, AasSubmodelElements[] includeValues = null) - { - if (includeValues != null) - { - foreach (var en in includeValues) - yield return en; - } - else - { - foreach (var en in (AasSubmodelElements[])Enum.GetValues(typeof(AasSubmodelElements))) - { - if (en == AasSubmodelElements.SubmodelElement) - continue; - if (excludeValues != null && excludeValues.Contains(en)) - continue; - yield return en; - } - } - } - - public static AasSubmodelElements? AasSubmodelElementsFrom() where T : ISubmodelElement - { - if (typeof(T) == typeof(Property)) - return AasSubmodelElements.Property; - if (typeof(T) == typeof(MultiLanguageProperty)) - return AasSubmodelElements.MultiLanguageProperty; - if (typeof(T) == typeof(AasCore.Aas3_0.Range)) - return AasSubmodelElements.Range; - if (typeof(T) == typeof(AasCore.Aas3_0.File)) - return AasSubmodelElements.File; - if (typeof(T) == typeof(Blob)) - return AasSubmodelElements.Blob; - if (typeof(T) == typeof(ReferenceElement)) - return AasSubmodelElements.ReferenceElement; - if (typeof(T) == typeof(RelationshipElement)) - return AasSubmodelElements.RelationshipElement; - if (typeof(T) == typeof(AnnotatedRelationshipElement)) - return AasSubmodelElements.AnnotatedRelationshipElement; - if (typeof(T) == typeof(Capability)) - return AasSubmodelElements.Capability; - if (typeof(T) == typeof(SubmodelElementCollection)) - return AasSubmodelElements.SubmodelElementCollection; - if (typeof(T) == typeof(Operation)) - return AasSubmodelElements.Operation; - if (typeof(T) == typeof(BasicEventElement)) - return AasSubmodelElements.BasicEventElement; - if (typeof(T) == typeof(Entity)) - return AasSubmodelElements.Entity; - return null; - } - - public static ISubmodelElement CreateSubmodelElementFromEnum(AasSubmodelElements smeEnum, ISubmodelElement sourceSme = null) - { - switch (smeEnum) - { - case AasSubmodelElements.Property: - { - return new Property(DataTypeDefXsd.String).UpdateFrom(sourceSme); - } - case AasSubmodelElements.MultiLanguageProperty: - { - return new MultiLanguageProperty().UpdateFrom(sourceSme); - } - case AasSubmodelElements.Range: - { - return new AasCore.Aas3_0.Range(DataTypeDefXsd.String).UpdateFrom(sourceSme); - } - case AasSubmodelElements.File: - { - return new AasCore.Aas3_0.File("").UpdateFrom(sourceSme); - } - case AasSubmodelElements.Blob: - { - return new Blob("").UpdateFrom(sourceSme); - } - case AasSubmodelElements.ReferenceElement: - { - // TODO (??, 0000-00-00): AAS core crashes without this - return new ReferenceElement( - value: new Reference(ReferenceTypes.ExternalReference, new List()) - ).UpdateFrom(sourceSme); - } - case AasSubmodelElements.RelationshipElement: - { - return new RelationshipElement( - new Reference(ReferenceTypes.ExternalReference, new List()), - new Reference(ReferenceTypes.ExternalReference, new List())) - .UpdateFrom(sourceSme); - } - case AasSubmodelElements.AnnotatedRelationshipElement: - { - return new AnnotatedRelationshipElement( - new Reference(ReferenceTypes.ExternalReference, new List()), - new Reference(ReferenceTypes.ExternalReference, new List())) - .UpdateFrom(sourceSme); - } - case AasSubmodelElements.Capability: - { - return new Capability().UpdateFrom(sourceSme); - } - case AasSubmodelElements.SubmodelElementCollection: - { - return new SubmodelElementCollection().UpdateFrom(sourceSme); - } - case AasSubmodelElements.SubmodelElementList: - { - return new SubmodelElementList(AasSubmodelElements.SubmodelElement).UpdateFrom(sourceSme); - } - case AasSubmodelElements.Operation: - { - return new Operation().UpdateFrom(sourceSme); - } - case AasSubmodelElements.BasicEventElement: - { - return new BasicEventElement(null, Direction.Input, StateOfEvent.Off).UpdateFrom(sourceSme); - } - case AasSubmodelElements.Entity: - { - return new Entity(EntityType.SelfManagedEntity).UpdateFrom(sourceSme); - } - default: - { - return null; - } - } - } - - #endregion - public static string EvalToNonNullString(string fmt, object o, string elseString = "") - { - if (o == null) - return elseString; - return string.Format(fmt, o); - } - - public static string EvalToNonEmptyString(string fmt, string o, string elseString = "") - { - if (o == null || o == "") - return elseString; - return string.Format(fmt, o); - } - - /// - /// If len of exceeds then - /// string is shortened and returned with an ellipsis(…) at the end. - /// - /// Shortened string - public static string ShortenWithEllipses(string str, int maxLen) - { - if (str == null) - return null; - if (maxLen >= 0 && str.Length > maxLen) - str = str.Substring(0, maxLen) + "\u2026"; - return str; - } - - /// - /// Returns a string without newlines and shortened (with ellipsis) - /// to a certain length - /// - /// Single-line, shortened string - public static string ToSingleLineShortened(string str, int maxLen, string textNewLine = " ") - { - str = str.ReplaceLineEndings(textNewLine); - return ShortenWithEllipses(str, maxLen); - } - - /// Creates a filter-friendly name from the source. - /// - /// Assert.AreEqual("", AdminShellUtil.FilterFriendlyName("")); - /// Assert.AreEqual("someName", AdminShellUtil.FilterFriendlyName("someName")); - /// Assert.AreEqual("some__name", AdminShellUtil.FilterFriendlyName("some!;name")); - /// - public static string FilterFriendlyName(string src) - { - if (src == null) - return null; - return Regex.Replace(src, @"[^a-zA-Z0-9\-_]", "_"); - } - - /// - /// Assert.IsFalse(AdminShellUtil.HasWhitespace("")); - /// Assert.IsTrue(AdminShellUtil.HasWhitespace(" ")); - /// Assert.IsTrue(AdminShellUtil.HasWhitespace("aa bb")); - /// Assert.IsTrue(AdminShellUtil.HasWhitespace(" aabb")); - /// Assert.IsTrue(AdminShellUtil.HasWhitespace("aabb ")); - /// Assert.IsFalse(AdminShellUtil.HasWhitespace("aabb")); - /// - public static bool HasWhitespace(string src) - { - if (src == null) - throw new ArgumentNullException(nameof(src)); - foreach (var s in src) - if (char.IsWhiteSpace(s)) - return true; - return false; - } - - /// Assert.IsTrue(AdminShellUtil.ComplyIdShort("")); - public static bool ComplyIdShort(string src) - { - if (src == null) - throw new ArgumentNullException(nameof(src)); - var res = true; - foreach (var s in src) - if (!Char.IsLetterOrDigit(s) && s != '_') - res = false; - if (src.Length > 0 && !Char.IsLetter(src[0])) - res = false; - return res; - } - - public static string ByteSizeHumanReadable(long len) - { - // see: https://stackoverflow.com/questions/281640/ - // how-do-i-get-a-human-readable-file-size-in-bytes-abbreviation-using-net - string[] sizes = { "B", "KB", "MB", "GB", "TB" }; - int order = 0; - while (len >= 1024 && order < sizes.Length - 1) - { - order++; - len = len / 1024; - } - // Adjust the format string to your preferences. For example "{0:0.#}{1}" would - // show a single decimal place, and no space. - string res = String.Format("{0:0.##} {1}", len, sizes[order]); - return res; - } - - public static string ExtractPascalCasingLetters(string src) - { - // access - src = src?.Trim(); - if (src == null || src.Length < 1) - return null; - - // walk through - var res = ""; - var arm = true; - foreach (var c in src) - { - // take? - if (arm && Char.IsUpper(c)) - res += c; - // state for next iteration - arm = !Char.IsUpper(c); - } - - // result - return res; - } - - public static string FromDouble(double input, string format) - { - return string.Format(CultureInfo.InvariantCulture, format, input); - } - - public static int CountHeadingSpaces(string line) - { - if (line == null) - return 0; - int j; - for (j = 0; j < line.Length; j++) - if (!Char.IsWhiteSpace(line[j])) - break; - return j; - } - - /// - /// Used to re-reformat a C# here string, which is multiline string introduced by @" ... "; - /// - public static string[] CleanHereStringToArray(string here) - { - if (here == null) - return null; - - // convert all weird breaks to pure new lines - here = here.Replace("\r\n", "\n"); - here = here.Replace("\n\r", "\n"); - - // convert all tabs to spaces - here = here.Replace("\t", " "); - - // split these - var lines = new List(here.Split('\n')); - if (lines.Count < 1) - return lines.ToArray(); - - // the first line could be special - string firstLine = null; - if (lines[0].Trim() != "") - { - firstLine = lines[0].Trim(); - lines.RemoveAt(0); - } - - // detect an constant amount of heading spaces - var headSpaces = int.MaxValue; - foreach (var line in lines) - if (line.Trim() != "") - headSpaces = Math.Min(headSpaces, CountHeadingSpaces(line)); - - // multi line trim possible? - if (headSpaces != int.MaxValue && headSpaces > 0) - for (int i = 0; i < lines.Count; i++) - if (lines[i].Length > headSpaces) - lines[i] = lines[i].Substring(headSpaces); - - // re-compose again - if (firstLine != null) - lines.Insert(0, firstLine); - - // return - return lines.ToArray(); - } - - /// - /// Used to re-reformat a C# here string, which is multiline string introduced by @" ... "; - /// - public static string CleanHereStringWithNewlines(string here, string nl = null) - { - if (nl == null) - nl = System.Environment.NewLine; - var lines = CleanHereStringToArray(here); - if (lines == null) - return null; - return String.Join(nl, lines); - } - - public static string ShortLocation(Exception ex) - { - if (ex == null || ex.StackTrace == null) - return ""; - string[] lines = ex.StackTrace.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None); - if (lines.Length < 1) - return ""; - // search for " in " - // as the most actual stacktrace might be a built-in function, this might not work and therefore - // go down in the stack - int currLine = 0; - while (true) - { - // nothing found at all - if (currLine >= lines.Length) - return ""; - // access current line - /* TODO (MIHO, 2020-11-12): replace with Regex for multi language. Ideally have Exception messages - always as English. */ - var p = lines[currLine].IndexOf(" in ", StringComparison.Ordinal); - if (p < 0) - p = lines[currLine].IndexOf(" bei ", StringComparison.Ordinal); - if (p < 0) - { - // advance to next oldest line - currLine++; - continue; - } - // search last "\" or "/", to get only filename portion and position - p = lines[currLine].LastIndexOfAny(new[] { '\\', '/' }); - if (p < 0) - { - // advance to next oldest line - currLine++; - continue; - } - // return this - return lines[currLine].Substring(p); - } - } - - public static string MapIntToStringArray(int? input, string ifNull, string[] choices) - { - if (input == null || choices == null || choices.Length < 1) - return ifNull; - int i = input ?? 0; - if (i < 0 || i >= choices.Length) - return ifNull; - return choices[i]; - } - - public static string MapBoolToStringArray(bool? input, string ifNull, string[] choices) - { - if (input == null || choices == null || choices.Length != 2) - return ifNull; - bool b = input ?? false; - return choices[b ? 1 : 0]; - } - - public enum ConstantFoundEnum { No, AnyCase, ExactCase } - - public static ConstantFoundEnum CheckIfInConstantStringArray(string[] arr, string str) - { - if (arr == null || str == null) - return ConstantFoundEnum.No; - - bool anyCaseFound = false; - bool exactCaseFound = false; - foreach (var a in arr) - { - anyCaseFound = anyCaseFound || str.ToLower() == a.ToLower(); - exactCaseFound = exactCaseFound || str == a; - } - if (exactCaseFound) - return ConstantFoundEnum.ExactCase; - if (anyCaseFound) - return ConstantFoundEnum.AnyCase; - return ConstantFoundEnum.No; - } - - public static string CorrectCasingForConstantStringArray(string[] arr, string str) - { - if (arr == null || str == null) - return str; - - foreach (var a in arr) - if (str.ToLower() == a.ToLower()) - return a; - - return str; - } - - // - // String manipulations - // - - public static string ReplacePercentPlaceholder( - string input, - string searchFor, - Func substLamda, - StringComparison comparisonType = StringComparison.InvariantCulture) - { - // access - if (input == null || searchFor == null || searchFor == "") - return input; - - // find - while (true) - { - // any occurence - var p = input.IndexOf(searchFor, comparisonType); - if (p < 0) - break; - - // split - var left = input.Substring(0, p); - var right = ""; - var rp = p + searchFor.Length; - if (rp < input.Length) - right = input.Substring(rp); - - // lambda - var repl = "" + substLamda?.Invoke(); - - // build new - input = left + repl + right; - } - - // ok - return input; - } - - public static string WrapLinesAtColumn(string text, int columnLimit) - { - // access - if (text == null) - return null; - if (columnLimit < 10) - return text; - - // idea: - // https://stackoverflow.com/questions/3961278/word-wrap-a-string-in-multiple-lines - // but: outer loop to handle line breaks, inner loop to handle words - - // split lines, preserving empty lines - var lines = Regex.Split(text, "\r\n|\r|\n"); - var outLines = new StringBuilder(); - foreach (var textLine in lines) - { - // now words. In future, may use regex? - var words = text.Split(new string[] { " " }, StringSplitOptions.None); - var sumLine = ""; - foreach (var word in words) - { - sumLine += word + " "; - if (sumLine.Length >= columnLimit) - { - outLines.AppendLine(sumLine); - sumLine = ""; - } - } - } - - // ok, result - return outLines.ToString(); - } - - // - // Reflection - // - - public static void SetFieldLazyValue(FieldInfo f, object obj, object value) - { - // access - if (f == null || obj == null) - return; - - switch (Type.GetTypeCode(f.FieldType)) - { - case TypeCode.String: - f.SetValue(obj, "" + value); - break; - - case TypeCode.Byte: - if (Byte.TryParse("" + value, out var ui8)) - f.SetValue(obj, ui8); - break; - - case TypeCode.SByte: - if (SByte.TryParse("" + value, out var i8)) - f.SetValue(obj, i8); - break; - - case TypeCode.Int16: - if (Int16.TryParse("" + value, out var i16)) - f.SetValue(obj, i16); - break; - - case TypeCode.Int32: - if (Int32.TryParse("" + value, out var i32)) - f.SetValue(obj, i32); - break; - - case TypeCode.Int64: - if (Int64.TryParse("" + value, out var i64)) - f.SetValue(obj, i64); - break; - - case TypeCode.UInt16: - if (UInt16.TryParse("" + value, out var ui16)) - f.SetValue(obj, ui16); - break; - - case TypeCode.UInt32: - if (UInt32.TryParse("" + value, out var ui32)) - f.SetValue(obj, ui32); - break; - - case TypeCode.UInt64: - if (UInt64.TryParse("" + value, out var ui64)) - f.SetValue(obj, ui64); - break; - - case TypeCode.Single: - if (Single.TryParse("" + value, NumberStyles.Float, - CultureInfo.InvariantCulture, out var sgl)) - f.SetValue(obj, sgl); - break; - - case TypeCode.Double: - if (Double.TryParse("" + value, NumberStyles.Float, - CultureInfo.InvariantCulture, out var dbl)) - f.SetValue(obj, dbl); - break; - - case TypeCode.Boolean: - var isFalse = value == null - || (value is int vi && vi == 0) - || (value is string vs && (vs == "" || vs == "false")) - || (value is bool vb && !vb); - f.SetValue(obj, !isFalse); - break; - } - } - - // - // temp file utilities - // - - // see: https://stackoverflow.com/questions/278439/creating-a-temporary-directory-in-windows - public static string GetTemporaryDirectory() - { - string tempDirectory = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); - Directory.CreateDirectory(tempDirectory); - return tempDirectory; - } - - // see: https://stackoverflow.com/questions/6386113/using-system-io-packaging-to-generate-a-zip-file - public static void AddFileToZip( - string zipFilename, string fileToAdd, - CompressionOption compression = CompressionOption.Normal, - FileMode fileMode = FileMode.OpenOrCreate) - { - using (Package zip = System.IO.Packaging.Package.Open(zipFilename, FileMode.OpenOrCreate)) - { - string destFilename = ".\\" + Path.GetFileName(fileToAdd); - Uri uri = PackUriHelper.CreatePartUri(new Uri(destFilename, UriKind.Relative)); - if (zip.PartExists(uri)) - { - zip.DeletePart(uri); - } - PackagePart part = zip.CreatePart(uri, "", compression); - using (FileStream fileStream = new FileStream(fileToAdd, FileMode.Open, FileAccess.Read)) - { - using (Stream dest = part.GetStream()) - { - fileStream.CopyTo(dest); - } - } - } - } - - // - // some URL enabled path handling - // - - /// - /// Uses System.IO.Path.GetExtension() to determine the extension part - /// of a path. If a URL based query is added to the extension, remove this. - /// - public static string GetExtensionWoQuery(string fn) - { - // access - if (fn == null) - return null; - - // use system function - var ext = System.IO.Path.GetExtension(fn).ToLower().Trim(); - - // as URLs *might* have an extension, but a loto f query string afterwards, - // lets try to cut of it - var extMatch = Regex.Match(ext, @"([._A-Za-z0-9]+)"); - if (extMatch.Success) - ext = extMatch.Groups[1].ToString(); - - // ok - return ext; - } - - // - // Base 64 - // - - public static string Base64Encode(string plainText) - { - var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText); - return System.Convert.ToBase64String(plainTextBytes); - } - - public static string Base64Decode(string base64EncodedData) - { - var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData); - return System.Text.Encoding.UTF8.GetString(base64EncodedBytes); - } - - public static bool CheckIfAsciiOnly(byte[] data, int bytesToCheck = int.MaxValue) - { - if (data == null) - return true; - - var ascii = true; - for (int i = 0; i < Math.Min(data.Length, bytesToCheck); i++) - if (data[i] >= 128) - ascii = false; - return ascii; - } - - // see: https://stackoverflow.com/questions/5209506/how-can-i-know-what-image-format-i-get-from-a-stream - // based on https://devblogs.microsoft.com/scripting/psimaging-part-1-test-image/ - // see https://en.wikipedia.org/wiki/List_of_file_signatures - /* Bytes in c# have a range of 0 to 255 so each byte can be represented as - * a two digit hex string. */ - private static readonly Dictionary SignatureTable = new Dictionary - { - { - ".jpg", - new[] - { - new[] {"FF", "D8", "FF", "DB"}, - new[] {"FF", "D8", "FF", "EE"}, - new[] {"FF", "D8", "FF", "E0", "00", "10", "4A", "46", "49", "46", "00", "01"} - } - }, - { - ".gif", - new[] - { - new [] { "47", "49", "46", "38", "37", "61" }, - new [] { "47", "49", "46", "38", "39", "61" } - } - }, - { - ".png", - new[] - { - new[] {"89", "50", "4E", "47", "0D", "0A", "1A", "0A"} - } - }, - { - ".bmp", - new [] - { - new[] { "42", "4D" } - } - } - }; - - /// - /// Takes a byte array and determines the image file type by - /// comparing the first few bytes of the file to a list of known - /// image file signatures. - /// - public static string GuessImageTypeExtension(byte[] imageData) - { - foreach (KeyValuePair signatureEntry in SignatureTable) - { - foreach (string[] signature in signatureEntry.Value) - { - bool isMatch = true; - for (int i = 0; i < signature.Length; i++) - { - string signatureByte = signature[i]; - - // ToString("X") gets the hex representation and pads it to always be length 2 - string imageByte = imageData[i] - .ToString("X2"); - - if (signatureByte == imageByte) - continue; - isMatch = false; - break; - } - - if (isMatch) - { - return signatureEntry.Key; - } - } - } - - return null; - } - - // - // Generation of Ids - // - - private static Random MyRnd = new Random(); - - public static string GenerateIdAccordingTemplate(string tpl) - { - // generate a deterministic decimal digit string - var decimals = String.Format("{0:ffffyyMMddHHmmss}", DateTime.UtcNow); - decimals = new string(decimals.Reverse().ToArray()); - // convert this to an int - if (!Int64.TryParse(decimals, out Int64 decii)) - decii = MyRnd.Next(Int32.MaxValue); - // make an hex out of this - string hexamals = decii.ToString("X"); - // make an alphanumeric string out of this - string alphamals = ""; - var dii = decii; - while (dii >= 1) - { - var m = dii % 26; - alphamals += Convert.ToChar(65 + m); - dii = dii / 26; - } - - // now, "salt" the strings - for (int i = 0; i < 32; i++) - { - var c = Convert.ToChar(48 + MyRnd.Next(10)); - decimals += c; - hexamals += c; - alphamals += c; - } - - // now, can just use the template - var id = ""; - foreach (var tpli in tpl) - { - if (tpli == 'D' && decimals.Length > 0) - { - id += decimals[0]; - decimals = decimals.Remove(0, 1); - } - else - if (tpli == 'X' && hexamals.Length > 0) - { - id += hexamals[0]; - hexamals = hexamals.Remove(0, 1); - } - else - if (tpli == 'A' && alphamals.Length > 0) - { - id += alphamals[0]; - alphamals = alphamals.Remove(0, 1); - } - else - id += tpli; - } - - // ok - return id; - } - - public static string RemoveNewLinesAndLimit(string input, int maxLength = -1, string ellipsis = "..") - { - // access - if (input == null) - return null; - - // maybe do a generouse limit first - if (maxLength >= 1 && input.Length > 2 * maxLength) - input = input.Substring(0, 2 * maxLength); - - // now do expensive operations - input = input.Replace('\r', ' '); - input = input.Replace('\n', ' '); - input = Regex.Replace(input, @"\s+", " ", RegexOptions.Compiled); - - // now apply exact limit - if (maxLength >= 1 && input.Length > maxLength) - input = input.Substring(0, maxLength) + ellipsis; - - // ok - return input; - } - - // - // language handling - // (used by some function on this basic level) - // - - public static string DefaultLngIso639 = "en?"; - - public static string GetDefaultLngIso639() - { - return DefaultLngIso639; - } - } -} diff --git a/src/AasxCsharpLibrary/AdminShellValidate.cs b/src/AasxCsharpLibrary/AdminShellValidate.cs deleted file mode 100644 index 028062908..000000000 --- a/src/AasxCsharpLibrary/AdminShellValidate.cs +++ /dev/null @@ -1,320 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using JetBrains.Annotations; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Text.RegularExpressions; -using System.Xml; -using System.Xml.Schema; -using Environment = System.Environment; - -namespace AdminShellNS -{ - /// - /// validates the XML content against the AASX XML schema. - /// - /// Please produce instances with . - /// - public class XmlValidator - { - private System.Xml.Schema.XmlSchemaSet xmlSchemaSet; - - internal XmlValidator(XmlSchemaSet xmlSchemaSet) - { - this.xmlSchemaSet = xmlSchemaSet; - } - - /// - /// validates the given XML content and stores the results in the . - /// - /// Validation records - /// Content to be validated - public void Validate(AasValidationRecordList recs, Stream xmlContent) - { - if (recs == null) - throw new ArgumentException($"Unexpected null {nameof(recs)}"); - - if (xmlContent == null) - throw new ArgumentException($"Unexpected null {nameof(xmlContent)}"); - - // load/ validate on same records - var settings = new System.Xml.XmlReaderSettings(); - settings.ValidationType = System.Xml.ValidationType.Schema; - settings.Schemas = xmlSchemaSet; - - settings.ValidationEventHandler += - (object sender, System.Xml.Schema.ValidationEventArgs e) => - { - recs.Add( - new AasValidationRecord( - AasValidationSeverity.Serialization, null, - $"XML: {e?.Exception?.LineNumber}, {e?.Exception?.LinePosition}: {e?.Message}")); - }; - - // use the xml stream - using (var reader = System.Xml.XmlReader.Create(xmlContent, settings)) - { - while (reader.Read()) - { - // Invoke callbacks - }; - } - } - } - - public enum AasValidationSeverity - { - Hint, Warning, SpecViolation, SchemaViolation, Serialization - } - - [UsedImplicitlyAttribute] // for eventual use - public enum AasValidationAction - { - No, ToBeDeleted - } - - public class AasValidationRecord - { - public AasValidationSeverity Severity = AasValidationSeverity.Hint; - public IReferable Source = null; - public string Message = ""; - - public Action Fix = null; - - public AasValidationRecord(AasValidationSeverity Severity, IReferable Source, - string Message, Action Fix = null) - { - this.Severity = Severity; - this.Source = Source; - this.Message = Message; - this.Fix = Fix; - } - - public override string ToString() - { - return $"[{Severity.ToString()}] in {"" + Source?.ToString()}: {"" + Message}"; - } - - public string DisplaySeverity { get { return "" + Severity.ToString(); } } - public string DisplaySource - { - get - { - return "" + ((Source != null) ? Source.ToString() : "(whole content)"); - } - } - public string DisplayMessage { get { return "" + Message?.ToString(); } } - } - - public class AasValidationRecordList : List - { - } - - public static class AasSchemaValidation - { - public enum SerializationFormat { XML, JSON } - - public static string[] GetSchemaResources(SerializationFormat fmt) - { - if (fmt == SerializationFormat.XML) - { - return new[] - { - "AdminShellNS.Resources.schemaV201.AAS.xsd", - "AdminShellNS.Resources.schemaV201.AAS_ABAC.xsd", - "AdminShellNS.Resources.schemaV201.IEC61360.xsd" - }; - } - if (fmt == SerializationFormat.JSON) - { - return new[] - { - "AdminShellNS.Resources.schemaV201.aas.json" - }; - } - return null; - } - - /// - /// produces a validator which validates XML AASX files. - /// - /// initialized validator - public static XmlValidator NewXmlValidator() - { - // Load the schema files - var files = GetSchemaResources(SerializationFormat.XML); - if (files == null) - throw new InvalidOperationException("No XML schema files could be found in the resources."); - - var xmlSchemaSet = new System.Xml.Schema.XmlSchemaSet(); - xmlSchemaSet.XmlResolver = new System.Xml.XmlUrlResolver(); - - try - { - Assembly myAssembly = Assembly.GetExecutingAssembly(); - foreach (var schemaFn in files) - { - using (Stream schemaStream = myAssembly.GetManifestResourceStream(schemaFn)) - { - using (XmlReader schemaReader = XmlReader.Create(schemaStream)) - { - xmlSchemaSet.Add(null, schemaReader); - } - } - } - } - catch (Exception ex) - { - throw new FileNotFoundException( - $"Error accessing embedded resource schema files: {ex.Message}"); - } - - var newRecs = new AasValidationRecordList(); - - // set up messages - xmlSchemaSet.ValidationEventHandler += (object sender, System.Xml.Schema.ValidationEventArgs e) => - { - newRecs.Add( - new AasValidationRecord( - AasValidationSeverity.Serialization, null, - $"{e?.Exception?.LineNumber}, {e?.Exception?.LinePosition}: {e?.Message}")); - }; - - // compile - try - { - xmlSchemaSet.Compile(); - } - catch (Exception ex) - { - throw new InvalidOperationException( - $"Error compiling schema files: {ex.Message}"); - } - - if (newRecs.Count > 0) - { - var parts = new List { $"Failed to compile the schema files:" }; - parts.AddRange(newRecs.Select((r) => r.Message)); - throw new InvalidOperationException(string.Join(Environment.NewLine, parts)); - } - - return new XmlValidator(xmlSchemaSet); - } - - /// - /// creates an XML validator and applies it on the given content. - /// - /// If you repeatedly need to validate XML against a schema, re-use an instance of - /// produced with . - /// - /// Validation records - /// Content to be validated - public static void ValidateXML(AasValidationRecordList recs, Stream xmlContent) - { - var validator = NewXmlValidator(); - validator.Validate(recs, xmlContent); - } - - public static int ValidateJSONAlternative(AasValidationRecordList recs, Stream jsonContent) - { - // see: https://github.com/RicoSuter/NJsonSchema/wiki/JsonSchemaValidator - var newRecs = new AasValidationRecordList(); - - // access - if (recs == null || jsonContent == null) - return -1; - - // Load the schema files - // right now: exactly ONE schema file - var files = GetSchemaResources(SerializationFormat.JSON); - if (files == null || files.Length != 1) - return -1; - - NJsonSchema.JsonSchema schema = null; - - try - { - Assembly myAssembly = Assembly.GetExecutingAssembly(); - foreach (var schemaFn in files) - { - using (Stream schemaStream = myAssembly.GetManifestResourceStream(schemaFn)) - { - using (var streamReader = new StreamReader(schemaStream)) - { - var allTxt = streamReader.ReadToEnd(); - schema = NJsonSchema.JsonSchema.FromJsonAsync(allTxt).GetAwaiter().GetResult(); - break; - } - } - } - } - catch (Exception ex) - { - throw new FileNotFoundException("ValidateJSON: Error loading schema: " + - ex.Message); - } - - if (schema == null) - { - throw new FileNotFoundException("ValidateJSON: Schema not found properly."); - } - - // create validator - var validator = new NJsonSchema.Validation.JsonSchemaValidator(); - - // load the JSON content - string jsonTxt = null; - try - { - using (var streamReader = new StreamReader(jsonContent)) - { - jsonTxt = streamReader.ReadToEnd(); - } - } - catch (Exception ex) - { - throw new InvalidOperationException("ValidateJSON: Error loading JSON content: " + - ex.Message); - } - - if (jsonTxt == null || jsonTxt == "") - throw new InvalidOperationException("ValidateJSON: Error loading JSON content gave null."); - - // validate - ICollection errors; - try - { - errors = validator.Validate(jsonTxt, schema); - } - catch (Exception ex) - { - throw new InvalidOperationException("ValidateJSON: Error when validating: " + - ex.Message); - } - - // re-format messages - if (errors != null) - foreach (var ve in errors) - { - var msg = ("" + ve.ToString()); - msg = Regex.Replace(msg, @"\s+", " "); - newRecs.Add(new AasValidationRecord(AasValidationSeverity.Serialization, null, - $"JSON: {ve.LineNumber,5},{ve.LinePosition:3}: {msg}")); - } - - // result - recs.AddRange(newRecs); - return newRecs.Count; - } - } -} diff --git a/src/AasxCsharpLibrary/Display/EnumerationPlacmentBase.cs b/src/AasxCsharpLibrary/Display/EnumerationPlacmentBase.cs deleted file mode 100644 index cabfedcf0..000000000 --- a/src/AasxCsharpLibrary/Display/EnumerationPlacmentBase.cs +++ /dev/null @@ -1,15 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -namespace AdminShellNS -{ - public class EnumerationPlacmentBase - { - - } -} diff --git a/src/AasxCsharpLibrary/Display/EnumerationPlacmentOperationVariable.cs b/src/AasxCsharpLibrary/Display/EnumerationPlacmentOperationVariable.cs deleted file mode 100644 index 39e005483..000000000 --- a/src/AasxCsharpLibrary/Display/EnumerationPlacmentOperationVariable.cs +++ /dev/null @@ -1,16 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -namespace AdminShellNS -{ - public class EnumerationPlacmentOperationVariable : EnumerationPlacmentBase - { - public OperationVariableDirection Direction; - public OperationVariable OperationVariable; - } -} diff --git a/src/AasxCsharpLibrary/Display/OperationVariableDirection.cs b/src/AasxCsharpLibrary/Display/OperationVariableDirection.cs deleted file mode 100644 index 479344aa0..000000000 --- a/src/AasxCsharpLibrary/Display/OperationVariableDirection.cs +++ /dev/null @@ -1,17 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -namespace AdminShellNS -{ - public enum OperationVariableDirection - { - In, - Out, - InOut - } -} diff --git a/src/AasxCsharpLibrary/Exceptions/MetamodelVerificationException.cs b/src/AasxCsharpLibrary/Exceptions/MetamodelVerificationException.cs deleted file mode 100644 index c392c6441..000000000 --- a/src/AasxCsharpLibrary/Exceptions/MetamodelVerificationException.cs +++ /dev/null @@ -1,26 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System; -using System.Collections.Generic; -using static AasCore.Aas3_0.Reporting; - -namespace AdminShellNS.Exceptions -{ - public class MetamodelVerificationException : Exception - { - public List ErrorList { get; } - - public MetamodelVerificationException(List errorList) : base($"The request body not conformant with the metamodel. Found {errorList.Count} errors !!") - { - ErrorList = errorList; - } - - - } -} diff --git a/src/AasxCsharpLibrary/Exceptions/NullValueException.cs b/src/AasxCsharpLibrary/Exceptions/NullValueException.cs deleted file mode 100644 index bd6eea201..000000000 --- a/src/AasxCsharpLibrary/Exceptions/NullValueException.cs +++ /dev/null @@ -1,20 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System; - -namespace AdminShellNS.Exceptions -{ - public class NullValueException : Exception - { - public NullValueException(string field) : base($"The field {field} is null!!") - { - - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/AasElementSelfDescription.cs b/src/AasxCsharpLibrary/Extensions/AasElementSelfDescription.cs deleted file mode 100644 index 30f50dee3..000000000 --- a/src/AasxCsharpLibrary/Extensions/AasElementSelfDescription.cs +++ /dev/null @@ -1,30 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -namespace Extensions -{ - public class AasElementSelfDescription - { - public string AasElementName { get; set; } - - public string ElementAbbreviation { get; set; } - - public KeyTypes? KeyType { get; set; } - - public AasSubmodelElements? SmeType { get; set; } - - public AasElementSelfDescription(string aasElementName, string elementAbbreviation, - KeyTypes? keyType, AasSubmodelElements? smeType) - { - AasElementName = aasElementName; - ElementAbbreviation = elementAbbreviation; - KeyType = keyType; - SmeType = smeType; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ComparerUtils.cs b/src/AasxCsharpLibrary/Extensions/ComparerUtils.cs deleted file mode 100644 index b3cf12662..000000000 --- a/src/AasxCsharpLibrary/Extensions/ComparerUtils.cs +++ /dev/null @@ -1,69 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System.Collections.Generic; -using System.Globalization; - -namespace Extensions -{ - public static class CompareUtils - { - public static bool Compare(T x, T y) - { - return EqualityComparer.Default.Equals(x, y); - } - } - public class ComparerIdShort : IComparer - { - public int Compare(IReferable a, IReferable b) - { - return string.Compare(a?.IdShort, b?.IdShort, - CultureInfo.InvariantCulture, CompareOptions.IgnoreCase); - } - } - - public class ComparerIdentification : IComparer - { - public int Compare(IIdentifiable a, IIdentifiable b) - { - return string.Compare(a.Id, b.Id, - CultureInfo.InvariantCulture, CompareOptions.IgnoreCase | CompareOptions.IgnoreNonSpace); - } - } - - - - public class ComparerIndexed : IComparer - { - public int NullIndex = int.MaxValue; - public Dictionary Index = new(); - - public int Compare(IReferable a, IReferable b) - { - var ca = Index.ContainsKey(a); - var cb = Index.ContainsKey(b); - - if (!ca && !cb) - return 0; - // make CDs without usage to appear at end of list - if (!ca) - return +1; - if (!cb) - return -1; - - var ia = Index[a]; - var ib = Index[b]; - - if (ia == ib) - return 0; - if (ia < ib) - return -1; - return +1; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendAnnotatedRelationshipElement.cs b/src/AasxCsharpLibrary/Extensions/ExtendAnnotatedRelationshipElement.cs deleted file mode 100644 index 3538adfa1..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendAnnotatedRelationshipElement.cs +++ /dev/null @@ -1,132 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using AdminShellNS; -using AdminShellNS.Extensions; -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Extensions -{ - public static class ExtendAnnotatedRelationshipElement - { - #region AasxPackageExplorer - - public static void Add(this AnnotatedRelationshipElement annotatedRelationshipElement, ISubmodelElement submodelElement) - { - if (annotatedRelationshipElement != null) - { - annotatedRelationshipElement.Annotations ??= new(); - - submodelElement.Parent = annotatedRelationshipElement; - - annotatedRelationshipElement.Annotations.Add((IDataElement)submodelElement); - } - } - - public static void Remove(this AnnotatedRelationshipElement annotatedRelationshipElement, ISubmodelElement submodelElement) - { - if (annotatedRelationshipElement != null) - { - if (annotatedRelationshipElement.Annotations != null) - { - annotatedRelationshipElement.Annotations.Remove((IDataElement)submodelElement); - } - } - } - - public static object AddChild( - this AnnotatedRelationshipElement annotatedRelationshipElement, - ISubmodelElement childSubmodelElement, - EnumerationPlacmentBase placement = null) - { - if (childSubmodelElement == null || childSubmodelElement is not IDataElement) - return null; - - annotatedRelationshipElement.Annotations ??= new(); - - if (childSubmodelElement != null) - childSubmodelElement.Parent = annotatedRelationshipElement; - - annotatedRelationshipElement.Annotations.Add((IDataElement)childSubmodelElement); - return childSubmodelElement; - } - - #endregion - public static AnnotatedRelationshipElement ConvertAnnotationsFromV20(this AnnotatedRelationshipElement annotatedRelationshipElement, AasxCompatibilityModels.AdminShellV20.AnnotatedRelationshipElement sourceAnnotedRelElement) - { - if (sourceAnnotedRelElement == null) - { - return null; - } - - if (!sourceAnnotedRelElement.annotations.IsNullOrEmpty()) - { - annotatedRelationshipElement.Annotations ??= new List(); - foreach (var submodelElementWrapper in sourceAnnotedRelElement.annotations) - { - var sourceSubmodelElement = submodelElementWrapper.submodelElement; - ISubmodelElement outputSubmodelElement = null; - if (sourceSubmodelElement != null) - { - outputSubmodelElement = outputSubmodelElement.ConvertFromV20(sourceSubmodelElement); - } - annotatedRelationshipElement.Annotations.Add((IDataElement)outputSubmodelElement); - } - } - - return annotatedRelationshipElement; - } - - public static T FindFirstIdShortAs(this AnnotatedRelationshipElement annotedRelationshipElement, string idShort) where T : ISubmodelElement - { - - var submodelElements = annotedRelationshipElement.Annotations.Where(sme => sme != null && sme is T && sme.IdShort.Equals(idShort, StringComparison.OrdinalIgnoreCase)); - - if (submodelElements.Any()) - { - return (T)submodelElements.First(); - } - - return default; - } - - public static AnnotatedRelationshipElement Set(this AnnotatedRelationshipElement elem, - Reference first, Reference second) - { - elem.First = first; - elem.Second = second; - return elem; - } - - public static AnnotatedRelationshipElement UpdateFrom( - this AnnotatedRelationshipElement elem, ISubmodelElement source) - { - if (source == null) - return elem; - - ((ISubmodelElement)elem).UpdateFrom(source); - - if (source is ReferenceElement srcRef) - { - if (srcRef.Value != null) - elem.First = srcRef.Value.Copy(); - } - - if (source is RelationshipElement srcRel) - { - if (srcRel.First != null) - elem.First = srcRel.First.Copy(); - } - - return elem; - } - - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendAssetAdministrationShell.cs b/src/AasxCsharpLibrary/Extensions/ExtendAssetAdministrationShell.cs deleted file mode 100644 index b2d2407b8..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendAssetAdministrationShell.cs +++ /dev/null @@ -1,271 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using AdminShellNS; -using AdminShellNS.Extensions; -using System; -using System.Collections.Generic; -using System.Text.RegularExpressions; - -namespace Extensions -{ - public static class ExtendAssetAdministrationShell - { - #region AasxPackageExplorer - - public static Tuple ToCaptionInfo(this IAssetAdministrationShell assetAdministrationShell) - { - var caption = AdminShellUtil.EvalToNonNullString("\"{0}\" ", assetAdministrationShell.IdShort, "\"AAS\""); - if (assetAdministrationShell.Administration != null) - caption += "V" + assetAdministrationShell.Administration.Version + "." + assetAdministrationShell.Administration.Revision; - - var info = ""; - if (assetAdministrationShell.Id != null) - info = $"[{assetAdministrationShell.Id}]"; - return Tuple.Create(caption, info); - } - - public static IEnumerable FindAllReferences(this IAssetAdministrationShell assetAdministrationShell) - { - // dead-csharp off - // Asset - //TODO (jtikekar, 0000-00-00): support asset - //if (assetAdministrationShell.AssetInformation != null) - // yield return new LocatedReference(assetAdministrationShell, assetAdministrationShell.AssetInformation); - // dead-csharp on - // Submodel references - if (assetAdministrationShell.Submodels != null) - foreach (var r in assetAdministrationShell.Submodels) - yield return new LocatedReference(assetAdministrationShell, r); - - } - - #endregion - - public static bool HasSubmodelReference(this IAssetAdministrationShell assetAdministrationShell, Reference submodelReference) - { - if (submodelReference == null) - { - return false; - } - - foreach (var aasSubmodelReference in assetAdministrationShell.Submodels) - { - if (aasSubmodelReference.Matches(submodelReference)) - { - return true; - } - } - - return false; - } - - public static void AddSubmodelReference(this IAssetAdministrationShell assetAdministrationShell, IReference newSubmodelReference) - { - if (assetAdministrationShell.Submodels == null) - { - assetAdministrationShell.Submodels = new List(); - } - - assetAdministrationShell.Submodels.Add(newSubmodelReference); - } - - //TODO (jtikekar, 0000-00-00): Change the name, currently based on older implementation - public static string GetFriendlyName(this IAssetAdministrationShell assetAdministrationShell) - { - if (string.IsNullOrEmpty(assetAdministrationShell.IdShort)) - { - return null; - } - - return Regex.Replace(assetAdministrationShell.IdShort, @"[^a-zA-Z0-9\-_]", "_"); - } - - public static AssetAdministrationShell ConvertFromV10(this AssetAdministrationShell assetAdministrationShell, AasxCompatibilityModels.AdminShellV10.AdministrationShell sourceAas) - { - if (sourceAas == null) - { - return null; - } - - if (string.IsNullOrEmpty(sourceAas.idShort)) - { - assetAdministrationShell.IdShort = ""; - } - else - { - assetAdministrationShell.IdShort = sourceAas.idShort; - } - - if (sourceAas.description != null) - { - assetAdministrationShell.Description = ExtensionsUtil.ConvertDescriptionFromV10(sourceAas.description); - } - - if (sourceAas.administration != null) - { - assetAdministrationShell.Administration = new AdministrativeInformation(version: sourceAas.administration.version, revision: sourceAas.administration.revision); - } - - if (sourceAas.derivedFrom != null) - { - var newKeyList = new List(); - - foreach (var sourceKey in sourceAas.derivedFrom.Keys) - { - var keyType = Stringification.KeyTypesFromString(sourceKey.type); - if (keyType != null) - { - newKeyList.Add(new Key((KeyTypes)keyType, sourceKey.value)); - } - else - { - Console.WriteLine($"KeyType value {sourceKey.type} not found."); - } - } - assetAdministrationShell.DerivedFrom = new Reference(ReferenceTypes.ExternalReference, newKeyList); - } - - if (!sourceAas.submodelRefs.IsNullOrEmpty()) - { - foreach (var submodelRef in sourceAas.submodelRefs) - { - if (!submodelRef.IsEmpty) - { - var keyList = new List(); - foreach (var refKey in submodelRef.Keys) - { - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {refKey.type} not found."); - } - } - assetAdministrationShell.Submodels ??= new List(); - assetAdministrationShell.Submodels.Add(new Reference(ReferenceTypes.ModelReference, keyList)); - } - } - } - - if (sourceAas.hasDataSpecification != null && sourceAas.hasDataSpecification.reference.Count > 0) - { - //TODO (jtikekar, 0000-00-00): EmbeddedDataSpecification?? (as per old implementation) - assetAdministrationShell.EmbeddedDataSpecifications ??= new List(); - foreach (var dataSpecification in sourceAas.hasDataSpecification.reference) - { - if (!dataSpecification.IsEmpty) - { - assetAdministrationShell.EmbeddedDataSpecifications.Add(new EmbeddedDataSpecification( - ExtensionsUtil.ConvertReferenceFromV10(dataSpecification, ReferenceTypes.ExternalReference), - null)); - } - } - } - - return assetAdministrationShell; - } - - public static AssetAdministrationShell ConvertFromV20(this AssetAdministrationShell assetAdministrationShell, AasxCompatibilityModels.AdminShellV20.AdministrationShell sourceAas) - { - if (sourceAas == null) - { - return null; - } - - if (string.IsNullOrEmpty(sourceAas.idShort)) - { - assetAdministrationShell.IdShort = ""; - } - else - { - assetAdministrationShell.IdShort = sourceAas.idShort; - } - - if (sourceAas.description != null) - { - assetAdministrationShell.Description = ExtensionsUtil.ConvertDescriptionFromV20(sourceAas.description); - } - - if (sourceAas.administration != null) - { - assetAdministrationShell.Administration = new AdministrativeInformation(version: sourceAas.administration.version, revision: sourceAas.administration.revision); - } - - if (sourceAas.derivedFrom != null) - { - var newKeyList = new List(); - - foreach (var sourceKey in sourceAas.derivedFrom.Keys) - { - var keyType = Stringification.KeyTypesFromString(sourceKey.type); - if (keyType != null) - { - newKeyList.Add(new Key((KeyTypes)keyType, sourceKey.value)); - } - else - { - Console.WriteLine($"KeyType value {sourceKey.type} not found."); - } - } - assetAdministrationShell.DerivedFrom = new Reference(ReferenceTypes.ExternalReference, newKeyList); - } - - if (!sourceAas.submodelRefs.IsNullOrEmpty()) - { - foreach (var submodelRef in sourceAas.submodelRefs) - { - if (!submodelRef.IsEmpty) - { - var keyList = new List(); - foreach (var refKey in submodelRef.Keys) - { - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {refKey.type} not found."); - } - } - assetAdministrationShell.Submodels ??= new List(); - assetAdministrationShell.Submodels.Add(new Reference(ReferenceTypes.ModelReference, keyList)); - } - } - } - - if (sourceAas.hasDataSpecification != null && sourceAas.hasDataSpecification.Count > 0) - { - //TODO (jtikekar, 0000-00-00): EmbeddedDataSpecification?? (as per old implementation) - if (assetAdministrationShell.EmbeddedDataSpecifications == null) - { - assetAdministrationShell.EmbeddedDataSpecifications = new List(); - } - - //TODO (jtikekar, 0000-00-00): DataSpecificationContent?? (as per old implementation) - foreach (var sourceDataSpec in sourceAas.hasDataSpecification) - { - if (sourceDataSpec.dataSpecification != null) - { - assetAdministrationShell.EmbeddedDataSpecifications.Add( - new EmbeddedDataSpecification( - ExtensionsUtil.ConvertReferenceFromV20(sourceDataSpec.dataSpecification, ReferenceTypes.ExternalReference), - null)); - } - } - } - - return assetAdministrationShell; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendAssetInformation.cs b/src/AasxCsharpLibrary/Extensions/ExtendAssetInformation.cs deleted file mode 100644 index 29250c4c3..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendAssetInformation.cs +++ /dev/null @@ -1,65 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System; - -namespace Extensions -{ - public static class ExtendAssetInformation - { - #region AasxPackageExplorer - - public static Tuple ToCaptionInfo(this IAssetInformation assetInformation) - { - // dead-csharp off - //TODO (jtikekar, 0000-00-00): support KeyType.AssetInformation - //var caption = Key.AssetInformation; - // dead-csharp on - var caption = "AssetInformation"; - var info = "" + assetInformation.GlobalAssetId; - return Tuple.Create(caption, info); - } - - #endregion - public static AssetInformation ConvertFromV10(this AssetInformation assetInformation, AasxCompatibilityModels.AdminShellV10.Asset sourceAsset) - { - //Determine AssetKind - var assetKind = AssetKind.Instance; - if (sourceAsset.kind.IsType) - { - assetKind = AssetKind.Type; - } - - assetInformation.AssetKind = assetKind; - - - //Assign GlobalAssetId - assetInformation.GlobalAssetId = sourceAsset.identification.id; - - return assetInformation; - } - - public static AssetInformation ConvertFromV20(this AssetInformation assetInformation, AasxCompatibilityModels.AdminShellV20.Asset sourceAsset) - { - //Determine AssetKind - var assetKind = AssetKind.Instance; - if (sourceAsset.kind.IsType) - { - assetKind = AssetKind.Type; - } - - assetInformation.AssetKind = assetKind; - - - //Assign GlobalAssetId - assetInformation.GlobalAssetId = sourceAsset.identification.id; - - return assetInformation; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendBlob.cs b/src/AasxCsharpLibrary/Extensions/ExtendBlob.cs deleted file mode 100644 index d8ee065e8..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendBlob.cs +++ /dev/null @@ -1,75 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System.Text; - -namespace Extensions -{ - public static class ExtendBlob - { - public static void Set(this Blob blob, - string contentType = "", byte[]? value = null) - { - blob.ContentType = contentType; - blob.Value = value; - } - - public static Blob ConvertFromV10(this Blob blob, AasxCompatibilityModels.AdminShellV10.Blob sourceBlob) - { - blob.ContentType = sourceBlob.mimeType; - blob.Value = Encoding.ASCII.GetBytes(sourceBlob.value); - return blob; - } - - public static Blob ConvertFromV20(this Blob blob, AasxCompatibilityModels.AdminShellV20.Blob sourceBlob) - { - blob.ContentType = sourceBlob.mimeType; - if (!string.IsNullOrEmpty(sourceBlob.value)) - { - blob.Value = Encoding.ASCII.GetBytes(sourceBlob.value); - } - return blob; - } - - public static Blob UpdateFrom(this Blob elem, ISubmodelElement source) - { - if (source == null) - return elem; - - ((ISubmodelElement)elem).UpdateFrom(source); - - if (source is Property srcProp) - { - if (srcProp.Value != null) - elem.Value = Encoding.Default.GetBytes(srcProp.Value); - } - - if (source is AasCore.Aas3_0.Range srcRng) - { - if (srcRng.Min != null) - elem.Value = Encoding.Default.GetBytes(srcRng.Min); - } - - if (source is MultiLanguageProperty srcMlp) - { - var s = srcMlp.Value?.GetDefaultString(); - if (s != null) - elem.Value = Encoding.Default.GetBytes(s); - } - - if (source is File srcFile) - { - if (srcFile.Value != null) - elem.Value = Encoding.Default.GetBytes(srcFile.Value); - } - - return elem; - } - - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendCollection.cs b/src/AasxCsharpLibrary/Extensions/ExtendCollection.cs deleted file mode 100644 index 3acde94a4..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendCollection.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Collections.Generic; - -namespace AdminShellNS.Extensions -{ - public static class ExtendCollection - { - public static bool IsNullOrEmpty(this List list) - { - if (list != null && list.Count != 0) - { - return false; - } - - return true; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendConceptDescription.cs b/src/AasxCsharpLibrary/Extensions/ExtendConceptDescription.cs deleted file mode 100644 index 7bb64c7e8..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendConceptDescription.cs +++ /dev/null @@ -1,320 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using AdminShellNS; -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Extensions -{ - public static class ExtendConceptDescription - { - #region AasxPackageExplorer - - public static string GetDefaultPreferredName(this IConceptDescription conceptDescription, string defaultLang = null) - { - return "" + - conceptDescription.GetIEC61360()? - .PreferredName?.GetDefaultString(defaultLang); - } - - public static EmbeddedDataSpecification SetIEC61360Spec(this IConceptDescription conceptDescription, - string[] preferredNames = null, - string shortName = "", - string unit = "", - Reference unitId = null, - string valueFormat = null, - string sourceOfDefinition = null, - string symbol = null, - string dataType = "", - string[] definition = null - ) - { - var eds = new EmbeddedDataSpecification( - new Reference(ReferenceTypes.ExternalReference, - new List { ExtendIDataSpecificationContent.GetKeyForIec61360() }), - new DataSpecificationIec61360( - ExtendLangStringSet.CreateManyPreferredNamesFromStringArray(preferredNames), - new List { - new LangStringShortNameTypeIec61360(AdminShellUtil.GetDefaultLngIso639(), shortName) }, - unit, - unitId, - sourceOfDefinition, - symbol, - Stringification.DataTypeIec61360FromString(dataType), - ExtendLangStringSet.CreateManyDefinitionFromStringArray(definition) - )); - - conceptDescription.EmbeddedDataSpecifications = new List { eds }; - // dead-csharp off - // TODO (MIHO, 2022-12-22): Check, but I think it makes no sense - // conceptDescription.IsCaseOf ??= new List(); - // conceptDescription.IsCaseOf.Add(new Reference(ReferenceTypes.ModelReference, new List() { new Key(KeyTypes.ConceptDescription, conceptDescription.Id) })); - - return eds; - } - - /* - - public static DataSpecificationIec61360 CreateDataSpecWithContentIec61360(this ConceptDescription conceptDescription) - { - var eds = EmbeddedDataSpecification.CreateIEC61360WithContent(); - conceptDescription.EmbeddedDataSpecification ??= new HasDataSpecification(); - conceptDescription.EmbeddedDataSpecification.Add(eds); - return eds.DataSpecificationContent?.DataSpecificationIEC61360; - } - - */ - // dead-csharp on - - public static Tuple ToCaptionInfo(this IConceptDescription conceptDescription) - { - var caption = ""; - if (!string.IsNullOrEmpty(conceptDescription.IdShort)) - caption = $"\"{conceptDescription.IdShort.Trim()}\""; - if (conceptDescription.Id != null) - caption = (caption + " " + conceptDescription.Id).Trim(); - - var info = "" + conceptDescription.GetDefaultShortName(); - - return Tuple.Create(caption, info); - } - - public static string GetDefaultShortName(this IConceptDescription conceptDescription, string defaultLang = null) - { - return "" + - conceptDescription.GetIEC61360()? - .ShortName?.GetDefaultString(defaultLang); - } - - public static DataSpecificationIec61360 GetIEC61360(this IConceptDescription conceptDescription) - { - return conceptDescription.EmbeddedDataSpecifications?.GetIEC61360Content(); - } - - //TODO (jtikekar, 0000-00-00): DataSpecificationPhysicalUnit -#if SupportDataSpecificationPhysicalUnit - public static DataSpecificationPhysicalUnit GetPhysicalUnit(this ConceptDescription conceptDescription) - { - return conceptDescription.EmbeddedDataSpecifications?.GetPhysicalUnitContent(); - } -#endif - - public static IEnumerable FindAllReferences(this IConceptDescription conceptDescription) - { - yield break; - } - - #endregion - #region ListOfConceptDescription - public static IConceptDescription AddConceptDescriptionOrReturnExisting(this List conceptDescriptions, ConceptDescription newConceptDescription) - { - if (newConceptDescription == null) - { - return null; - } - if (conceptDescriptions != null) - { - var existingCd = conceptDescriptions.Where(c => c.Id == newConceptDescription.Id).FirstOrDefault(); - if (existingCd != null) - { - return existingCd; - } - else - { - conceptDescriptions.Add(newConceptDescription); - } - } - - return newConceptDescription; - } - #endregion - - public static void Validate( - this IConceptDescription conceptDescription, AasValidationRecordList results) - { - // access - if (results == null) - return; - - // dead-csharp off - // check CD itself - //Handled by BaseValidation Method - //conceptDescription.Validate(results); - - // check IEC61360 spec - - //TODO (jtikekar, 0000-00-00): Temporarily Removed - //var eds61360 = this.IEC61360DataSpec; - //if (eds61360 != null) - //{ - // // check data spec - // if (eds61360.dataSpecification == null || - // !(eds61360.dataSpecification.MatchesExactlyOneKey(DataSpecificationIEC61360.GetKey()))) - // results.Add(new AasValidationRecord( - // AasValidationSeverity.SpecViolation, this, - // "HasDataSpecification: data specification content set to IEC61360, but no " + - // "data specification reference set!", - // () => - // { - // eds61360.dataSpecification = new DataSpecificationRef( - // new Reference( - // DataSpecificationIEC61360.GetKey())); - // })); - - // // validate content - // if (eds61360.dataSpecificationContent?.dataSpecificationIEC61360 == null) - // { - // results.Add(new AasValidationRecord( - // AasValidationSeverity.SpecViolation, this, - // "HasDataSpecification: data specification reference set to IEC61360, but no " + - // "data specification content set!", - // () => - // { - // eds61360.dataSpecificationContent = new DataSpecificationContent(); - // eds61360.dataSpecificationContent.dataSpecificationIEC61360 = - // new DataSpecificationIEC61360(); - // })); - // } - // else - // { - // // validate - // eds61360.dataSpecificationContent.dataSpecificationIEC61360.Validate(results, this); - // } - // dead-csharp on - } - - public static Key GetSingleKey(this IConceptDescription conceptDescription) - { - return new Key(KeyTypes.ConceptDescription, conceptDescription.Id); - } - - public static ConceptDescription ConvertFromV10( - this ConceptDescription conceptDescription, AasxCompatibilityModels.AdminShellV10.ConceptDescription sourceConceptDescription) - { - if (sourceConceptDescription == null) - { - return null; - } - - if (string.IsNullOrEmpty(sourceConceptDescription.idShort)) - { - conceptDescription.IdShort = ""; - } - else - { - conceptDescription.IdShort = sourceConceptDescription.idShort; - } - - if (sourceConceptDescription.description != null) - { - conceptDescription.Description = ExtensionsUtil.ConvertDescriptionFromV10(sourceConceptDescription.description); - } - - if (sourceConceptDescription.administration != null) - { - conceptDescription.Administration = new AdministrativeInformation(version: sourceConceptDescription.administration.version, revision: sourceConceptDescription.administration.revision); - } - - if (sourceConceptDescription.IsCaseOf != null && sourceConceptDescription.IsCaseOf.Count != 0) - { - if (conceptDescription.IsCaseOf == null) - { - conceptDescription.IsCaseOf = new List(); - } - foreach (var caseOf in sourceConceptDescription.IsCaseOf) - { - conceptDescription.IsCaseOf.Add(ExtensionsUtil.ConvertReferenceFromV10(caseOf, ReferenceTypes.ModelReference)); - } - } - - return conceptDescription; - } - - public static ConceptDescription ConvertFromV20( - this ConceptDescription cd, AasxCompatibilityModels.AdminShellV20.ConceptDescription srcCD) - { - if (srcCD == null) - return null; - - if (string.IsNullOrEmpty(srcCD.idShort)) - cd.IdShort = ""; - else - cd.IdShort = srcCD.idShort; - - if (srcCD.identification?.id != null) - cd.Id = srcCD.identification.id; - - if (srcCD.description != null && srcCD.description.langString.Count >= 1) - cd.Description = ExtensionsUtil.ConvertDescriptionFromV20(srcCD.description); - - if (srcCD.administration != null) - cd.Administration = new AdministrativeInformation( - version: srcCD.administration.version, revision: srcCD.administration.revision); - - if (srcCD.IsCaseOf != null && srcCD.IsCaseOf.Count != 0) - { - foreach (var caseOf in srcCD.IsCaseOf) - { - IReference newCaseOf = null; - if(caseOf != null && !caseOf.IsEmpty) - { - newCaseOf = ExtensionsUtil.ConvertReferenceFromV20(caseOf, ReferenceTypes.ModelReference); - } - - if(newCaseOf != null) - { - cd.IsCaseOf ??= new List(); - cd.IsCaseOf.Add(newCaseOf); - } - } - } - - //jtikekar:as per old implementation - if (srcCD.embeddedDataSpecification != null && srcCD.embeddedDataSpecification.Count > 0) - { - foreach (var sourceEds in srcCD.embeddedDataSpecification) - { - var eds = new EmbeddedDataSpecification(null, null); - eds.ConvertFromV20(sourceEds); - cd.AddEmbeddedDataSpecification(eds); - } - } - - return cd; - } - - public static EmbeddedDataSpecification AddEmbeddedDataSpecification( - this IConceptDescription cd, EmbeddedDataSpecification eds) - { - if (cd == null) - return null; - if (cd.EmbeddedDataSpecifications == null) - cd.EmbeddedDataSpecifications = new List(); - if (eds == null) - return null; - cd.EmbeddedDataSpecifications.Add(eds); - return eds; - } - - public static Reference GetCdReference(this IConceptDescription conceptDescription) - { - var key = new Key(KeyTypes.GlobalReference, conceptDescription.Id); - return new Reference(ReferenceTypes.ExternalReference, new List { key }); - } - - public static void AddIsCaseOf(this IConceptDescription cd, - Reference ico) - { - if (cd.IsCaseOf == null) - cd.IsCaseOf = new List(); - cd.IsCaseOf.Add(ico); - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendDataElement.cs b/src/AasxCsharpLibrary/Extensions/ExtendDataElement.cs deleted file mode 100644 index 717fcefcb..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendDataElement.cs +++ /dev/null @@ -1,20 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -namespace Extensions -{ - public static class ExtendDataElement - { - public static DataTypeDefXsd[] ValueTypes_Number = - new[] { DataTypeDefXsd.Decimal, DataTypeDefXsd.Double, DataTypeDefXsd.Float, - DataTypeDefXsd.Integer, DataTypeDefXsd.Long, DataTypeDefXsd.Int, DataTypeDefXsd.Short, - DataTypeDefXsd.Byte, DataTypeDefXsd.NonNegativeInteger, DataTypeDefXsd.NonPositiveInteger, - DataTypeDefXsd.UnsignedInt, DataTypeDefXsd.Integer, DataTypeDefXsd.UnsignedByte, - DataTypeDefXsd.UnsignedLong, DataTypeDefXsd.UnsignedShort, DataTypeDefXsd.NegativeInteger }; - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendDataSpecificationIEC61360.cs b/src/AasxCsharpLibrary/Extensions/ExtendDataSpecificationIEC61360.cs deleted file mode 100644 index 85f3cdee2..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendDataSpecificationIEC61360.cs +++ /dev/null @@ -1,50 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System.Collections.Generic; - -namespace Extensions -{ - public static class ExtendDataSpecificationIEC61360 - { - public static DataSpecificationIec61360 ConvertFromV20(this DataSpecificationIec61360 ds61360, AasxCompatibilityModels.AdminShellV20.DataSpecificationIEC61360 src616360) - { - if (src616360.preferredName != null) - ds61360.PreferredName = new List().ConvertFromV20(src616360.preferredName); - - if (src616360.shortName != null) - ds61360.ShortName = new List().ConvertFromV20(src616360.shortName); - - if (!string.IsNullOrEmpty(src616360.unit)) - { - ds61360.Unit = src616360.unit; - } - - if (src616360.unitId != null) - ds61360.UnitId = ExtensionsUtil.ConvertReferenceFromV20(AasxCompatibilityModels.AdminShellV20.Reference.CreateNew(src616360.unitId.keys), ReferenceTypes.ExternalReference); - - ds61360.ValueFormat = src616360.valueFormat; - ds61360.SourceOfDefinition = src616360.sourceOfDefinition; - ds61360.Symbol = src616360.symbol; - if (!(string.IsNullOrEmpty(src616360.dataType))) - { - var dt = src616360.dataType; - if (!dt.StartsWith("xs:")) - dt = "xs:" + dt; - ds61360.DataType = Stringification.DataTypeIec61360FromString(dt); - } - if (src616360.definition != null) - ds61360.Definition = new List().ConvertFromV20(src616360.definition); - - //TODO (jtikekar, 0000-00-00): check with Andreas - ds61360.Value = ""; - - return ds61360; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendEmbeddedDataSpecification.cs b/src/AasxCsharpLibrary/Extensions/ExtendEmbeddedDataSpecification.cs deleted file mode 100644 index f914e75f8..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendEmbeddedDataSpecification.cs +++ /dev/null @@ -1,118 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System.Collections.Generic; - -namespace Extensions -{ - // TODO (Jui, 2022-12-21): I do not know, if to put the List<> extension here or in a separate file - public static class ExtendListOfEmbeddedDataSpecification - { - public static IEmbeddedDataSpecification FindFirstIEC61360Spec(this List list) - { - foreach (var eds in list) - if (eds?.DataSpecificationContent is DataSpecificationIec61360 - || eds?.DataSpecification?.MatchesExactlyOneKey( - ExtendIDataSpecificationContent.GetKeyForIec61360()) == true) - return eds; - return null; - } - - public static DataSpecificationIec61360 GetIEC61360Content(this List list) - { - foreach (var eds in list) - if (eds?.DataSpecificationContent is DataSpecificationIec61360 dsiec) - return dsiec; - return null; - } - - //TODO (jtikekar, 0000-00-00): DataSpecificationPhysicalUnit -#if SupportDataSpecificationPhysicalUnit - public static DataSpecificationPhysicalUnit GetPhysicalUnitContent(this List list) - { - foreach (var eds in list) - if (eds?.DataSpecificationContent is DataSpecificationPhysicalUnit dspu) - return dspu; - return null; - } -#endif - } - - public static class ExtendEmbeddedDataSpecification - { - public static EmbeddedDataSpecification ConvertFromV20(this EmbeddedDataSpecification embeddedDataSpecification, AasxCompatibilityModels.AdminShellV20.EmbeddedDataSpecification sourceEmbeddedSpec) - { - if (sourceEmbeddedSpec != null) - { - if (sourceEmbeddedSpec.dataSpecification != null) - { - embeddedDataSpecification.DataSpecification = ExtensionsUtil.ConvertReferenceFromV20(sourceEmbeddedSpec.dataSpecification, ReferenceTypes.ExternalReference); - - // TODO (MIHO, 2022-19-12): check again, see questions - var oldid = new[] { - "http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/2/0", - "http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360", - "www.admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360" - }; - var newid = "http://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"; - - // map all "usable" old ids to new one .. - foreach (var oi in oldid) - if (sourceEmbeddedSpec.dataSpecification?.Matches("", false, "IRI", oi, - AasxCompatibilityModels.AdminShellV20.Key.MatchMode.Identification) == true) - { - embeddedDataSpecification.DataSpecification.Keys[0].Value = newid; - } - } - - if (sourceEmbeddedSpec.dataSpecificationContent != null) - { - if (sourceEmbeddedSpec.dataSpecificationContent?.dataSpecificationIEC61360 != null) - { - embeddedDataSpecification.DataSpecificationContent = - new DataSpecificationIec61360(null).ConvertFromV20( - sourceEmbeddedSpec.dataSpecificationContent.dataSpecificationIEC61360); - } - } - } - - return embeddedDataSpecification; - } - - public static EmbeddedDataSpecification CreateIec61360WithContent(DataSpecificationIec61360 content = null) - { - if (content == null) - content = new DataSpecificationIec61360( - new List()); - - var res = new EmbeddedDataSpecification( - new Reference(ReferenceTypes.ExternalReference, - new List(new[] { ExtendIDataSpecificationContent.GetKeyForIec61360() })), - content); - return res; - } - - public static bool FixReferenceWrtContent(this IEmbeddedDataSpecification eds) - { - // does content tell something? - var ctc = ExtendIDataSpecificationContent.GuessContentTypeFor(eds?.DataSpecificationContent); - var ctr = ExtendIDataSpecificationContent.GuessContentTypeFor(eds?.DataSpecification); - - if (ctc == ExtendIDataSpecificationContent.ContentTypes.NoInfo) - return false; - - if (ctr == ctc) - return false; - - // ok, fix - eds.DataSpecification = new Reference(ReferenceTypes.ExternalReference, - new List { ExtendIDataSpecificationContent.GetKeyFor(ctc) }); - return true; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendEntity.cs b/src/AasxCsharpLibrary/Extensions/ExtendEntity.cs deleted file mode 100644 index 7d0376105..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendEntity.cs +++ /dev/null @@ -1,117 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using AdminShellNS; -using AdminShellNS.Extensions; -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Extensions -{ - public static class ExtendEntity - { - #region AasxPackageExplorer - - public static void Add(this Entity entity, ISubmodelElement submodelElement) - { - if (entity != null) - { - entity.Statements ??= new(); - - submodelElement.Parent = entity; - - entity.Statements.Add(submodelElement); - } - } - - public static void Remove(this Entity entity, ISubmodelElement submodelElement) - { - if (entity != null) - { - if (entity.Statements != null) - { - entity.Statements.Remove(submodelElement); - } - } - } - - public static object AddChild(this Entity entity, ISubmodelElement childSubmodelElement, EnumerationPlacmentBase placement = null) - { - if (childSubmodelElement == null) - return null; - if (entity.Statements == null) - entity.Statements = new(); - if (childSubmodelElement != null) - childSubmodelElement.Parent = entity; - entity.Statements.Add(childSubmodelElement); - return childSubmodelElement; - } - - #endregion - public static Entity ConvertFromV20(this Entity entity, AasxCompatibilityModels.AdminShellV20.Entity sourceEntity) - { - if (sourceEntity == null) - { - return null; - } - - if (!sourceEntity.statements.IsNullOrEmpty()) - { - entity.Statements ??= new List(); - foreach (var submodelElementWrapper in sourceEntity.statements) - { - var sourceSubmodelElement = submodelElementWrapper.submodelElement; - ISubmodelElement outputSubmodelElement = null; - if (sourceSubmodelElement != null) - { - outputSubmodelElement = outputSubmodelElement.ConvertFromV20(sourceSubmodelElement); - } - entity.Statements.Add(outputSubmodelElement); - } - } - - if (sourceEntity.assetRef != null) - { - //TODO (jtikekar, 0000-00-00): whether to convert to Global or specific asset id - var assetRef = ExtensionsUtil.ConvertReferenceFromV20(sourceEntity.assetRef, ReferenceTypes.ExternalReference); - if (assetRef != null) - { - entity.GlobalAssetId = assetRef.GetAsIdentifier(); - } - } - - return entity; - } - - public static T FindFirstIdShortAs(this Entity entity, string idShort) where T : ISubmodelElement - { - - var submodelElements = entity.Statements.Where(sme => (sme != null) && (sme is T) && sme.IdShort.Equals(idShort, StringComparison.OrdinalIgnoreCase)); - - if (submodelElements.Any()) - { - return (T)submodelElements.First(); - } - - return default; - } - - public static T CreateSMEForCD( - this Entity ent, - ConceptDescription conceptDescription, string category = null, string idShort = null, - string idxTemplate = null, int maxNum = 999, bool addSme = false, bool isTemplate = false) - where T : ISubmodelElement - { - if (ent.Statements == null) - ent.Statements = new List(); - return ent.Statements.CreateSMEForCD( - conceptDescription, category, idShort, idxTemplate, maxNum, addSme, isTemplate); - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendEnvironment.cs b/src/AasxCsharpLibrary/Extensions/ExtendEnvironment.cs deleted file mode 100644 index 7440d83d3..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendEnvironment.cs +++ /dev/null @@ -1,1092 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using AdminShellNS; -using AdminShellNS.Extensions; -using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; - -namespace Extensions -{ - public static class ExtendEnvironment - { - #region Environment - - #region AasxPackageExplorer - - public static void RecurseOnReferables(this AasCore.Aas3_0.Environment environment, - object state, Func, IReferable, bool> lambda, bool includeThis = false) - { - // includeThis does not make sense, as no Referable - // just use the others - foreach (var idf in environment.FindAllReferable(onlyIdentifiables: true)) - idf?.RecurseOnReferables(state, lambda, includeThis); - } - - #endregion - - /// - /// Deprecated? Not compatible with AAS core? - /// - public static AasValidationRecordList ValidateAll(this AasCore.Aas3_0.Environment environment) - { - // collect results - var results = new AasValidationRecordList(); - - // all entities - foreach (var rf in environment.FindAllReferable()) - rf.Validate(results); - - // give back - return results; - } - - /// - /// Deprecated? Not compatible with AAS core? - /// - public static int AutoFix(this AasCore.Aas3_0.Environment environment, IEnumerable records) - { - // access - if (records == null) - return -1; - - // collect Referables (expensive safety measure) - var allowedReferables = environment.FindAllReferable().ToList(); - - // go thru records - int res = 0; - foreach (var rec in records) - { - // access - if (rec == null || rec.Fix == null || rec.Source == null) - continue; - - // minimal safety measure - if (!allowedReferables.Contains(rec.Source)) - continue; - - // apply fix - res++; - try - { - rec.Fix.Invoke(); - } - catch - { - res--; - } - } - - // return number of applied fixes - return res; - } - - /// - /// This function tries to silently fix some issues preventing the environment - /// are parts of it to be properly serilaized. - /// - /// Number of fixes taken - public static int SilentFix30(this AasCore.Aas3_0.Environment env) - { - // access - int res = 0; - if (env == null) - return res; - - // AAS core crashes without AssetInformation - if (env.AssetAdministrationShells != null) - foreach (var aas in env.AssetAdministrationShells) - if (aas.AssetInformation == null) - { - aas.AssetInformation = new AssetInformation(assetKind: AssetKind.NotApplicable); - res++; - } - - // AAS core crashes without EmbeddedDataSpecification.DataSpecificationContent - // AAS core crashes without EmbeddedDataSpecification.DataSpecificationContent.PreferredName - foreach (var rf in env.FindAllReferable()) - if (rf is IHasDataSpecification hds) - if (hds.EmbeddedDataSpecifications != null) - foreach (var eds in hds.EmbeddedDataSpecifications) - { - if (eds.DataSpecificationContent == null) - eds.DataSpecificationContent = - new DataSpecificationIec61360( - new List()); - } - - // ok - return res; - } - - public static IEnumerable FindAllReferable(this AasCore.Aas3_0.Environment environment, bool onlyIdentifiables = false) - { - if (environment.AssetAdministrationShells != null) - foreach (var aas in environment.AssetAdministrationShells) - if (aas != null) - { - // AAS itself - yield return aas; - } - - if (environment.Submodels != null) - foreach (var sm in environment.Submodels) - if (sm != null) - { - yield return sm; - - if (!onlyIdentifiables) - { - // TODO (MIHO, 2020-08-26): not very elegant, yet. Avoid temporary collection - var allsme = new List(); - sm.RecurseOnSubmodelElements(null, (state, parents, sme) => - { - allsme.Add(sme); return true; - }); - foreach (var sme in allsme) - yield return sme; - } - } - - if (environment.ConceptDescriptions != null) - foreach (var cd in environment.ConceptDescriptions) - if (cd != null) - yield return cd; - } - -#if !DoNotUseAasxCompatibilityModels - - public static AasCore.Aas3_0.Environment ConvertFromV10(this AasCore.Aas3_0.Environment environment, AasxCompatibilityModels.AdminShellV10.AdministrationShellEnv sourceEnvironement) - { - //Convert Administration Shells - if (!sourceEnvironement.AdministrationShells.IsNullOrEmpty()) - { - environment.AssetAdministrationShells ??= new List(); - foreach (var sourceAas in sourceEnvironement.AdministrationShells) - { - var sourceAsset = sourceEnvironement?.FindAsset(sourceAas.assetRef); - if (sourceAsset != null) - { - var newAssetInformation = new AssetInformation(AssetKind.Instance); - newAssetInformation = newAssetInformation.ConvertFromV10(sourceAsset); - - var newAas = new AssetAdministrationShell(id: sourceAas.identification.id, newAssetInformation); - newAas = newAas.ConvertFromV10(sourceAas); - - environment.AssetAdministrationShells.Add(newAas); - } - - } - } - - //Convert Submodels - if (!sourceEnvironement.Submodels.IsNullOrEmpty()) - { - environment.Submodels ??= new List(); - foreach (var sourceSubmodel in sourceEnvironement.Submodels) - { - var newSubmodel = new Submodel(sourceSubmodel.identification.id); - newSubmodel = newSubmodel.ConvertFromV10(sourceSubmodel); - environment.Submodels.Add(newSubmodel); - } - } - - if (!sourceEnvironement.ConceptDescriptions.IsNullOrEmpty()) - { - environment.ConceptDescriptions ??= new List(); - foreach (var sourceConceptDescription in sourceEnvironement.ConceptDescriptions) - { - var newConceptDescription = new ConceptDescription(sourceConceptDescription.identification.id); - newConceptDescription = newConceptDescription.ConvertFromV10(sourceConceptDescription); - environment.ConceptDescriptions.Add(newConceptDescription); - } - } - - return environment; - } - - - public static AasCore.Aas3_0.Environment ConvertFromV20(this AasCore.Aas3_0.Environment environment, AasxCompatibilityModels.AdminShellV20.AdministrationShellEnv sourceEnvironement) - { - //Convert Administration Shells - if (!sourceEnvironement.AdministrationShells.IsNullOrEmpty()) - { - environment.AssetAdministrationShells ??= new List(); - foreach (var sourceAas in sourceEnvironement.AdministrationShells) - { - // first make the AAS - var newAas = new AssetAdministrationShell(id: sourceAas.identification.id, null); - newAas = newAas.ConvertFromV20(sourceAas); - environment.AssetAdministrationShells.Add(newAas); - - var sourceAsset = sourceEnvironement?.FindAsset(sourceAas.assetRef); - if (sourceAsset != null) - { - var newAssetInformation = new AssetInformation(AssetKind.Instance); - newAssetInformation = newAssetInformation.ConvertFromV20(sourceAsset); - newAas.AssetInformation = newAssetInformation; - } - - } - } - - //Convert Submodels - if (!sourceEnvironement.Submodels.IsNullOrEmpty()) - { - environment.Submodels ??= new List(); - foreach (var sourceSubmodel in sourceEnvironement.Submodels) - { - var newSubmodel = new Submodel(sourceSubmodel.identification.id); - newSubmodel = newSubmodel.ConvertFromV20(sourceSubmodel); - environment.Submodels.Add(newSubmodel); - } - } - - if (!sourceEnvironement.ConceptDescriptions.IsNullOrEmpty()) - { - environment.ConceptDescriptions ??= new List(); - foreach (var sourceConceptDescription in sourceEnvironement.ConceptDescriptions) - { - var newConceptDescription = new ConceptDescription(sourceConceptDescription.identification.id); - newConceptDescription = newConceptDescription.ConvertFromV20(sourceConceptDescription); - environment.ConceptDescriptions.Add(newConceptDescription); - } - } - - return environment; - } - -#endif - - //TODO (jtikekar, 0000-00-00): to test - public static AasCore.Aas3_0.Environment CreateFromExistingEnvironment(this AasCore.Aas3_0.Environment environment, - AasCore.Aas3_0.Environment sourceEnvironment, List filterForAas = null, List filterForAssets = null, List filterForSubmodel = null, - List filterForConceptDescriptions = null) - { - if (filterForAas == null) - { - filterForAas = new List(); - } - - if (filterForAssets == null) - { - filterForAssets = new List(); - } - - if (filterForSubmodel == null) - { - filterForSubmodel = new List(); - } - - if (filterForConceptDescriptions == null) - { - filterForConceptDescriptions = new List(); - } - - //Copy AssetAdministrationShells - foreach (var aas in sourceEnvironment.AssetAdministrationShells) - { - if (filterForAas.Contains(aas)) - { - environment.AssetAdministrationShells.Add(aas); - - if (aas.Submodels != null && aas.Submodels.Count > 0) - { - foreach (var submodelReference in aas.Submodels) - { - var submodel = sourceEnvironment.FindSubmodel(submodelReference); - if (submodel != null) - { - filterForSubmodel.Add(submodel); - } - } - } - } - } - - //Copy Submodel - foreach (var submodel in sourceEnvironment.Submodels) - { - if (filterForSubmodel.Contains(submodel)) - { - environment.Submodels.Add(submodel); - - //Find Used CDs - environment.CreateFromExistingEnvRecurseForCDs(sourceEnvironment, submodel.SubmodelElements, ref filterForConceptDescriptions); - } - } - - //Copy ConceptDescription - foreach (var conceptDescription in sourceEnvironment.ConceptDescriptions) - { - if (filterForConceptDescriptions.Contains(conceptDescription)) - { - environment.ConceptDescriptions.Add(conceptDescription); - } - } - - return environment; - - } - - public static void CreateFromExistingEnvRecurseForCDs(this AasCore.Aas3_0.Environment environment, AasCore.Aas3_0.Environment sourceEnvironment, - List submodelElements, ref List filterForConceptDescription) - { - if (submodelElements == null || submodelElements.Count == 0 || filterForConceptDescription == null || filterForConceptDescription.Count == 0) - { - return; - } - - foreach (var submodelElement in submodelElements) - { - if (submodelElement == null) - { - return; - } - - if (submodelElement.SemanticId != null) - { - var conceptDescription = sourceEnvironment.FindConceptDescriptionByReference(submodelElement.SemanticId); - if (conceptDescription != null) - { - filterForConceptDescription.Add(conceptDescription); - } - } - - if (submodelElement is SubmodelElementCollection smeColl) - { - environment.CreateFromExistingEnvRecurseForCDs(sourceEnvironment, smeColl.Value, ref filterForConceptDescription); - } - - if (submodelElement is SubmodelElementList smeList) - { - environment.CreateFromExistingEnvRecurseForCDs(sourceEnvironment, smeList.Value, ref filterForConceptDescription); - } - - if (submodelElement is Entity entity) - { - environment.CreateFromExistingEnvRecurseForCDs(sourceEnvironment, entity.Statements, ref filterForConceptDescription); - } - - if (submodelElement is AnnotatedRelationshipElement annotatedRelationshipElement) - { - var annotedELements = new List(); - foreach (var annotation in annotatedRelationshipElement.Annotations) - { - annotedELements.Add(annotation); - } - environment.CreateFromExistingEnvRecurseForCDs(sourceEnvironment, annotedELements, ref filterForConceptDescription); - } - - if (submodelElement is Operation operation) - { - var operationELements = new List(); - foreach (var inputVariable in operation.InputVariables) - { - operationELements.Add(inputVariable.Value); - } - - foreach (var outputVariable in operation.OutputVariables) - { - operationELements.Add(outputVariable.Value); - } - - foreach (var inOutVariable in operation.InoutputVariables) - { - operationELements.Add(inOutVariable.Value); - } - - environment.CreateFromExistingEnvRecurseForCDs(sourceEnvironment, operationELements, ref filterForConceptDescription); - - } - } - } - - public static ConceptDescription Add(this AasCore.Aas3_0.Environment env, ConceptDescription cd) - { - if (cd == null) - return null; - if (env.ConceptDescriptions == null) - env.ConceptDescriptions = new(); - env.ConceptDescriptions.Add(cd); - return cd; - } - - public static Submodel Add(this AasCore.Aas3_0.Environment env, Submodel sm) - { - if (sm == null) - return null; - if (env.Submodels == null) - env.Submodels = new(); - env.Submodels.Add(sm); - return sm; - } - - public static AssetAdministrationShell Add(this AasCore.Aas3_0.Environment env, AssetAdministrationShell aas) - { - if (aas == null) - return null; - if (env.AssetAdministrationShells == null) - env.AssetAdministrationShells = new(); - env.AssetAdministrationShells.Add(aas); - return aas; - } - - public static JsonWriter SerialiazeJsonToStream(this AasCore.Aas3_0.Environment environment, StreamWriter streamWriter, bool leaveJsonWriterOpen = false) - { - streamWriter.AutoFlush = true; - - JsonSerializer serializer = new JsonSerializer() - { - NullValueHandling = NullValueHandling.Ignore, - ReferenceLoopHandling = ReferenceLoopHandling.Serialize, - Formatting = Newtonsoft.Json.Formatting.Indented - }; - - JsonWriter writer = new JsonTextWriter(streamWriter); - serializer.Serialize(writer, environment); - if (leaveJsonWriterOpen) - return writer; - writer.Close(); - return null; - } - - #endregion - - #region Submodel Queries - - public static IEnumerable FindAllSubmodelGroupedByAAS(this AasCore.Aas3_0.Environment environment, Func p = null) - { - if (environment.AssetAdministrationShells == null || environment.Submodels == null) - yield break; - foreach (var aas in environment.AssetAdministrationShells) - { - if (aas?.Submodels == null) - continue; - foreach (var smref in aas.Submodels) - { - var sm = environment.FindSubmodel(smref); - if (sm != null && (p == null || p(aas, sm))) - yield return sm; - } - } - } - public static ISubmodel FindSubmodel(this AasCore.Aas3_0.Environment environment, IReference submodelReference) - { - if (environment == null || submodelReference == null) - { - return null; - } - - if (submodelReference.Keys.Count != 1) // Can have only one reference key - { - return null; - } - - var key = submodelReference.Keys[0]; - if (key.Type != KeyTypes.Submodel) - { - return null; - } - - var submodels = environment.Submodels.Where(s => s.Id.Equals(key.Value, StringComparison.OrdinalIgnoreCase)); - if (submodels.Any()) - { - return submodels.First(); - } - - return null; - } - - public static ISubmodel FindSubmodelById(this AasCore.Aas3_0.Environment environment, string submodelId) - { - if (string.IsNullOrEmpty(submodelId)) - { - return null; - } - - var submodels = environment.Submodels.Where(s => s.Id.Equals(submodelId)); - if (submodels.Any()) - { - return submodels.First(); - } - - return null; - } - // dead-csharp off - //public static IEnumerable FindAllSubmodelsGroupedByAAS(this AasCore.Aas3_0.Environment environment, Func p = null) - //{ - // if (environment.AssetAdministrationShells == null || environment.Submodels == null) - // yield break; - // foreach (var aas in environment.AssetAdministrationShells) - // { - // if (aas?.Submodels == null) - // continue; - // foreach (var submodelReference in aas.Submodels) - // { - // var submodel = environment.FindSubmodel(submodelReference); - // if (submodel != null && (p == null || p(aas, submodel))) - // yield return submodel; - // } - // } - //} - // dead-csharp on - public static IEnumerable FindAllSubmodelBySemanticId(this AasCore.Aas3_0.Environment environment, string semanticId) - { - if (semanticId == null) - yield break; - - foreach (var submodel in environment.Submodels) - if (true == submodel.SemanticId?.Matches(semanticId)) - yield return submodel; - } - - #endregion - - #region AssetAdministrationShell Queries - public static IAssetAdministrationShell FindAasWithSubmodelId(this AasCore.Aas3_0.Environment environment, string submodelId) - { - if (submodelId == null) - { - return null; - } - - var aas = environment.AssetAdministrationShells.Where(a => (a.Submodels?.Where(s => s.Matches(submodelId)).FirstOrDefault()) != null).FirstOrDefault(); - - return aas; - } - - public static IAssetAdministrationShell FindAasById(this AasCore.Aas3_0.Environment environment, string aasId) - { - if (string.IsNullOrEmpty(aasId)) - { - return null; - } - - var aas = environment.AssetAdministrationShells.Where(a => a.Id.Equals(aasId)).First(); - - return aas; - } - - #endregion - - #region ConceptDescription Queries - - public static IConceptDescription FindConceptDescriptionById( - this AasCore.Aas3_0.Environment env, string cdId) - { - if (string.IsNullOrEmpty(cdId)) - return null; - - if (env.ConceptDescriptions == null || env.ConceptDescriptions.Count == 0) - return null; - - var conceptDescription = env.ConceptDescriptions.Where(c => c.Id.Equals(cdId)).FirstOrDefault(); - return conceptDescription; - } - - public static IConceptDescription FindConceptDescriptionByReference( - this AasCore.Aas3_0.Environment env, IReference rf) - { - if (rf == null) - return null; - - return env.FindConceptDescriptionById(rf.GetAsIdentifier()); - } - - #endregion - - #region Referable Queries - - /// - /// Result of FindReferable in Environment - /// - public class ReferableRootInfo - { - public AssetAdministrationShell AAS = null; - public AssetInformation Asset = null; - public Submodel Submodel = null; - public ConceptDescription CD = null; - - public int NrOfRootKeys = 0; - - public bool IsValid - { - get - { - return NrOfRootKeys > 0 && (AAS != null || Submodel != null || Asset != null); - } - } - } - - //TODO (jtikekar, 0000-00-00): Need to test - public static IReferable FindReferableByReference( - this AasCore.Aas3_0.Environment environment, - IReference reference, - int keyIndex = 0, - IEnumerable submodelElems = null, - ReferableRootInfo rootInfo = null) - { - // access - var keyList = reference?.Keys; - if (keyList == null || keyList.Count == 0 || keyIndex >= keyList.Count) - return null; - - // shortcuts - var firstKeyType = keyList[keyIndex].Type; - var firstKeyId = keyList[keyIndex].Value; - - // different pathes - switch (firstKeyType) - { - case KeyTypes.AssetAdministrationShell: - { - var aas = environment.FindAasById(firstKeyId); - - // side info? - if (rootInfo != null) - { - rootInfo.AAS = aas as AssetAdministrationShell; - rootInfo.NrOfRootKeys = 1 + keyIndex; - } - - //Not found or already at the end of our search - if (aas == null || keyIndex >= keyList.Count - 1) - { - return aas; - } - - return environment.FindReferableByReference(reference, ++keyIndex); - } - // dead-csharp off - // TODO (MIHO, 2023-01-01): stupid generalization :-( - case KeyTypes.GlobalReference: - case KeyTypes.ConceptDescription: - { - // In meta model V3, multiple important things might by identified - // by a flat GlobalReference :-( - - // find an Asset by that id? - - var keyedAas = environment.FindAasWithAssetInformation(firstKeyId); - if (keyedAas?.AssetInformation != null) - { - // found an Asset - - // side info? - if (rootInfo != null) - { - rootInfo.AAS = keyedAas as AssetAdministrationShell; - rootInfo.Asset = (AssetInformation)(keyedAas?.AssetInformation); - rootInfo.NrOfRootKeys = 1 + keyIndex; - } - - // give back the AAS - return keyedAas; - } - - // Concept?Description - var keyedCd = environment.FindConceptDescriptionById(firstKeyId); - if (keyedCd != null) - { - // side info? - if (rootInfo != null) - { - rootInfo.CD = keyedCd as ConceptDescription; - rootInfo.NrOfRootKeys = 1 + keyIndex; - } - - // give back the CD - return keyedCd; - } - - // Nope - return null; - } - // dead-csharp on - case KeyTypes.Submodel: - { - var submodel = environment.FindSubmodelById(firstKeyId); - // No? - if (submodel == null) - return null; - - // notice in side info - if (rootInfo != null) - { - rootInfo.Submodel = submodel as Submodel; - rootInfo.NrOfRootKeys = 1 + keyIndex; - - // add even more info - if (rootInfo.AAS == null) - { - foreach (var aas2 in environment.AssetAdministrationShells) - { - var smref2 = environment.FindSubmodelById(submodel.Id); - if (smref2 != null) - { - rootInfo.AAS = (AssetAdministrationShell)aas2; - break; - } - } - } - } - - // at the end of the journey? - if (keyIndex >= keyList.Count - 1) - return submodel; - - return environment.FindReferableByReference(reference, ++keyIndex, submodel.SubmodelElements); - } - } - - - - if (firstKeyType.IsSME() && submodelElems != null) - { - ISubmodelElement submodelElement; - //check if key.value is index - bool isIndex = int.TryParse(firstKeyId, out int index); - if (isIndex) - { - var smeList = submodelElems.ToList(); - submodelElement = smeList[index]; - } - else - { - submodelElement = submodelElems.Where( - sme => sme.IdShort.Equals(keyList[keyIndex].Value, - StringComparison.OrdinalIgnoreCase)).First(); - } - - //This is required element - if (keyIndex + 1 >= keyList.Count) - { - return submodelElement; - } - - //Recurse again - if (submodelElement?.EnumeratesChildren() == true) - return environment.FindReferableByReference(reference, ++keyIndex, submodelElement.EnumerateChildren()); - } - - //Nothing in this environment - return null; - } - - #endregion - - #region AasxPackageExplorer - - public static IEnumerable FindAllSubmodelElements(this AasCore.Aas3_0.Environment environment, - Predicate match = null, AssetAdministrationShell onlyForAAS = null) where T : ISubmodelElement - { - // more or less two different schemes - if (onlyForAAS != null) - { - if (onlyForAAS.Submodels == null) - yield break; - foreach (var smr in onlyForAAS.Submodels) - { - var sm = environment.FindSubmodel(smr); - if (sm?.SubmodelElements != null) - foreach (var x in sm.SubmodelElements.FindDeep(match)) - yield return x; - } - } - else - { - if (environment.Submodels != null) - foreach (var sm in environment.Submodels) - if (sm?.SubmodelElements != null) - foreach (var x in sm.SubmodelElements.FindDeep(match)) - yield return x; - } - } - - public static IEnumerable FindAllReferences(this AasCore.Aas3_0.Environment environment) - { - if (environment.AssetAdministrationShells != null) - foreach (var aas in environment.AssetAdministrationShells) - if (aas != null) - foreach (var r in aas.FindAllReferences()) - yield return r; - - if (environment.Submodels != null) - foreach (var sm in environment.Submodels) - if (sm != null) - foreach (var r in sm.FindAllReferences()) - yield return r; - - if (environment.ConceptDescriptions != null) - foreach (var cd in environment.ConceptDescriptions) - if (cd != null) - foreach (var r in cd.FindAllReferences()) - yield return new LocatedReference(cd, r); - } - - /// - /// Tries renaming an Identifiable, specifically: the identification of an Identifiable and - /// all references to it. - /// Currently supported: ConceptDescriptions - /// Returns a list of Referables, which were changed or null in case of error - /// - public static List RenameIdentifiable(this AasCore.Aas3_0.Environment environment, string oldId, string newId) - where T : IClass - { - // access - if (oldId == null || newId == null || oldId.Equals(newId)) - return null; - - var res = new List(); - - if (typeof(T) == typeof(ConceptDescription)) - { - // check, if exist or not exist - var cdOld = environment.FindConceptDescriptionById(oldId); - if (cdOld == null || environment.FindConceptDescriptionById(newId) != null) - return null; - - // rename old cd - cdOld.Id = newId; - res.Add(cdOld); - - // search all SMEs referring to this CD - foreach (var sme in environment.FindAllSubmodelElements(match: (s) => - { - return (s != null && s.SemanticId != null && s.SemanticId.Matches(oldId)); - })) - { - sme.SemanticId.Keys[0].Value = newId; - res.Add(sme); - } - - // seems fine - return res; - } - else - if (typeof(T) == typeof(Submodel)) - { - // check, if exist or not exist - var smOld = environment.FindSubmodelById(oldId); - if (smOld == null || environment.FindSubmodelById(newId) != null) - return null; - - // recurse all possible Referenes in the aas env - foreach (var lr in environment.FindAllReferences()) - { - var r = lr?.Reference; - if (r != null) - for (int i = 0; i < r.Keys.Count; i++) - if (r.Keys[i].Matches(KeyTypes.Submodel, oldId, MatchMode.Relaxed)) - { - // directly replace - r.Keys[i].Value = newId; - if (res.Contains(lr.Identifiable)) - res.Add(lr.Identifiable); - } - } - - // rename old Submodel - smOld.Id = newId; - - // seems fine - return res; - } - else - if (typeof(T) == typeof(AssetAdministrationShell)) - { - // check, if exist or not exist - var aasOld = environment.FindAasById(oldId); - if (aasOld == null || environment.FindAasById(newId) != null) - return null; - - // recurse? -> no? - - // rename old Asset - aasOld.Id = newId; - - // seems fine - return res; - } - else - //TODO (jtikekar, 0000-00-00): support asset - if (typeof(T) == typeof(AssetInformation)) - { - // check, if exist or not exist - var assetOld = environment.FindAasWithAssetInformation(oldId); - if (assetOld == null || environment.FindAasWithAssetInformation(newId) != null) - return null; - - // recurse all possible Referenes in the aas env - foreach (var lr in environment.FindAllReferences()) - { - var r = lr?.Reference; - if (r != null) - for (int i = 0; i < r.Keys.Count; i++) - if (r.Keys[i].Matches(KeyTypes.GlobalReference, oldId)) - { - // directly replace - r.Keys[i].Value = newId; - if (res.Contains(lr.Identifiable)) - res.Add(lr.Identifiable); - } - } - - // rename old Asset - assetOld.AssetInformation.GlobalAssetId = newId; - - // seems fine - return res; - } - - // no result is false, as well - return null; - } - - public static IAssetAdministrationShell FindAasWithAssetInformation(this AasCore.Aas3_0.Environment environment, string globalAssetId) - { - if (string.IsNullOrEmpty(globalAssetId)) - { - return null; - } - - foreach (var aas in environment.AssetAdministrationShells) - { - if (aas.AssetInformation.GlobalAssetId.Equals(globalAssetId)) - { - return aas; - } - } - - return null; - } - - public static ComparerIndexed CreateIndexedComparerCdsForSmUsage(this AasCore.Aas3_0.Environment environment) - { - var cmp = new ComparerIndexed(); - int nr = 0; - foreach (var sm in environment.FindAllSubmodelGroupedByAAS()) - foreach (var sme in sm.FindDeep()) - { - if (sme.SemanticId == null) - continue; - var cd = environment.FindConceptDescriptionByReference(sme.SemanticId); - if (cd == null) - continue; - if (cmp.Index.ContainsKey(cd)) - continue; - cmp.Index[cd] = nr++; - } - return cmp; - } - - public static ISubmodelElement CopySubmodelElementAndCD(this AasCore.Aas3_0.Environment environment, - AasCore.Aas3_0.Environment srcEnv, ISubmodelElement srcElem, bool copyCD = false, bool shallowCopy = false) - { - // access - if (srcEnv == null || srcElem == null) - return null; - - // 1st result pretty easy (calling function will add this to the appropriate Submodel) - var res = srcElem.Copy(); - - // copy the CDs.. - if (copyCD) - environment.CopyConceptDescriptionsFrom(srcEnv, srcElem, shallowCopy); - - // give back - return res; - } - - public static IReference CopySubmodelRefAndCD(this AasCore.Aas3_0.Environment environment, - AasCore.Aas3_0.Environment srcEnv, IReference srcSubRef, bool copySubmodel = false, bool copyCD = false, - bool shallowCopy = false) - { - // access - if (srcEnv == null || srcSubRef == null) - return null; - - // need to have the source Submodel - var srcSub = srcEnv.FindSubmodel(srcSubRef); - if (srcSub == null) - return null; - - // 1st result pretty easy (calling function will add this to the appropriate AAS) - var dstSubRef = srcSubRef.Copy(); - - // get the destination and shall src != dst - var dstSub = environment.FindSubmodel(dstSubRef); - if (srcSub == dstSub) - return null; - - // maybe we need the Submodel in our environment, as well - if (dstSub == null && copySubmodel) - { - dstSub = srcSub.Copy(); - environment.Submodels.Add(dstSub); - } - else - if (dstSub != null) - { - // there is already an submodel, just add members - if (!shallowCopy && srcSub.SubmodelElements != null) - { - if (dstSub.SubmodelElements == null) - dstSub.SubmodelElements = new List(); - foreach (var smw in srcSub.SubmodelElements) - dstSub.SubmodelElements.Add( - smw.Copy()); - } - } - - // copy the CDs.. - if (copyCD && srcSub.SubmodelElements != null) - foreach (var smw in srcSub.SubmodelElements) - environment.CopyConceptDescriptionsFrom(srcEnv, smw, shallowCopy); - - // give back - return dstSubRef; - } - - private static void CopyConceptDescriptionsFrom(this AasCore.Aas3_0.Environment environment, - AasCore.Aas3_0.Environment srcEnv, ISubmodelElement src, bool shallowCopy = false) - { - // access - if (srcEnv == null || src == null || src.SemanticId == null) - return; - - // check for this SubmodelElement in Source - var cdSrc = srcEnv.FindConceptDescriptionByReference(src.SemanticId); - if (cdSrc == null) - return; - - // check for this SubmodelElement in Destnation (this!) - var cdDest = environment.FindConceptDescriptionByReference(src.SemanticId); - if (cdDest == null) - { - // copy new - environment.ConceptDescriptions.Add(cdSrc.Copy()); - } - - // recurse? - if (!shallowCopy) - foreach (var m in src.EnumerateChildren()) - environment.CopyConceptDescriptionsFrom(srcEnv, m, shallowCopy: false); - - } - #endregion - - } - - - -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendFile.cs b/src/AasxCsharpLibrary/Extensions/ExtendFile.cs deleted file mode 100644 index d2fbf79b0..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendFile.cs +++ /dev/null @@ -1,69 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -namespace Extensions -{ - public static class ExtendFile - { - public static string ValueAsText(this File file) - { - return "" + file.Value; - } - - public static void Set(this File file, - string contentType = "", string value = "") - { - file.ContentType = contentType; - file.Value = value; - } - - public static File ConvertFromV10(this File file, AasxCompatibilityModels.AdminShellV10.File sourceFile) - { - file.ContentType = sourceFile.mimeType; - file.Value = sourceFile.value; - return file; - } - public static File ConvertFromV20(this File file, AasxCompatibilityModels.AdminShellV20.File sourceFile) - { - file.ContentType = sourceFile.mimeType; - file.Value = sourceFile.value; - return file; - } - - public static File UpdateFrom(this File elem, ISubmodelElement source) - { - if (source == null) - return elem; - - ((ISubmodelElement)elem).UpdateFrom(source); - - if (source is Property srcProp) - { - elem.Value = srcProp.Value; - } - - if (source is AasCore.Aas3_0.Range srcRng) - { - elem.Value = srcRng.Min; - } - - if (source is MultiLanguageProperty srcMlp) - { - elem.Value = "" + srcMlp.Value?.GetDefaultString(); - } - - if (source is File srcFile) - { - elem.Value = "" + srcFile.Value; - } - - return elem; - } - - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendHasDataSpecification.cs b/src/AasxCsharpLibrary/Extensions/ExtendHasDataSpecification.cs deleted file mode 100644 index ca440e3cb..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendHasDataSpecification.cs +++ /dev/null @@ -1,25 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -namespace Extensions -{ - public static class ExtendHasDataSpecification - { - public static IHasDataSpecification ConvertFromV20(this IHasDataSpecification embeddedDataSpecifications, AasxCompatibilityModels.AdminShellV20.HasDataSpecification sourceSpecification) - { - foreach (var sourceSpec in sourceSpecification) - { - var newEmbeddedSpec = new EmbeddedDataSpecification(null, null); - newEmbeddedSpec.ConvertFromV20(sourceSpec); - embeddedDataSpecifications.EmbeddedDataSpecifications.Add(newEmbeddedSpec); - } - - return embeddedDataSpecifications; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendIAdministrativeInformation.cs b/src/AasxCsharpLibrary/Extensions/ExtendIAdministrativeInformation.cs deleted file mode 100644 index bb5617a66..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendIAdministrativeInformation.cs +++ /dev/null @@ -1,25 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Extensions -{ - public static class ExtendIAdministrativeInformation - { - public static string ToStringExtended(this IAdministrativeInformation ls, int fmt) - { - if (fmt == 2) - return String.Format("/{0}/{1}", ls.Version, ls.Revision); - return String.Format("[ver={0}, rev={1}, tmpl={2}, crea={3}]", - ls.Version, ls.Revision, ls.TemplateId, ls.Creator?.ToStringExtended(fmt)); - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendIClass.cs b/src/AasxCsharpLibrary/Extensions/ExtendIClass.cs deleted file mode 100644 index 0db74f58a..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendIClass.cs +++ /dev/null @@ -1,41 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System.Collections.Generic; -using System.Linq; - -namespace Extensions -{ - public static class ExtendIClass - { - // TODO (MIHO, 2023-05-28): liase with AAS core team to provide a general desrialization - /// - /// Deserializes a given objectType from its given JSON node representation. - /// Operates on a range of known AAS IClass subtypes (not all!!) - /// - /// Hint for IClass subtype - /// JSON representation - /// Null, if not a known IClass subtype - public static IClass IClassFrom(System.Type objectType, System.Text.Json.Nodes.JsonNode node) - { - if (typeof(IReference).IsAssignableFrom(objectType)) - return Jsonization.Deserialize.ReferenceFrom(node); - - if (typeof(IKey).IsAssignableFrom(objectType)) - return Jsonization.Deserialize.KeyFrom(node); - - if (typeof(IReferable).IsAssignableFrom(objectType)) - return Jsonization.Deserialize.IReferableFrom(node); - - if (typeof(IIdentifiable).IsAssignableFrom(objectType)) - return Jsonization.Deserialize.IIdentifiableFrom(node); - - return null; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendIDataSpecificationContent.cs b/src/AasxCsharpLibrary/Extensions/ExtendIDataSpecificationContent.cs deleted file mode 100644 index 8e76f302e..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendIDataSpecificationContent.cs +++ /dev/null @@ -1,77 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using AdminShellNS; -using System.Collections.Generic; - -namespace Extensions -{ - public static class ExtendIDataSpecificationContent - { - public enum ContentTypes { NoInfo, Iec61360, PhysicalUnit } - - public static Key GetKeyForIec61360() - { - return new Key(KeyTypes.GlobalReference, - "https://admin-shell.io/DataSpecificationTemplates/DataSpecificationIEC61360/3/0"); - } - - public static Reference GetReferencForIec61360() - { - return new Reference(ReferenceTypes.ExternalReference, new List { GetKeyForIec61360() }); - } - - public static Key GetKeyForPhysicalUnit() - { - return new Key(KeyTypes.GlobalReference, - "https://admin-shell.io/DataSpecificationTemplates/DataSpecificationPhysicalUnit/3/0"); - } - - public static Key GetKeyFor(ContentTypes ct) - { - if (ct == ContentTypes.Iec61360) - return GetKeyForIec61360(); - if (ct == ContentTypes.PhysicalUnit) - return GetKeyForPhysicalUnit(); - return null; - } - - public static IDataSpecificationContent ContentFactoryFor(ContentTypes ct) - { - if (ct == ContentTypes.Iec61360) - return new DataSpecificationIec61360( - new List()); - //TODO (jtikekar, 0000-00-00): DataSpecificationPhysicalUnit -#if SupportDataSpecificationPhysicalUnit - if (ct == ContentTypes.PhysicalUnit) - return new DataSpecificationPhysicalUnit("", "", null); -#endif - return null; - } - - public static ContentTypes GuessContentTypeFor(IReference rf) - { - foreach (var v in AdminShellUtil.GetEnumValues(new[] { ContentTypes.NoInfo })) - if (rf?.MatchesExactlyOneKey(GetKeyFor(v)) == true) - return v; - return ContentTypes.NoInfo; - } - - public static ContentTypes GuessContentTypeFor(IDataSpecificationContent content) - { - if (content is DataSpecificationIec61360) - return ContentTypes.Iec61360; - //TODO (jtikekar, 0000-00-00): DataSpecificationPhysicalUnit -#if SupportDataSpecificationPhysicalUnit - if (content is DataSpecificationPhysicalUnit) - return ContentTypes.PhysicalUnit; -#endif - return ContentTypes.NoInfo; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendIIdentifiable.cs b/src/AasxCsharpLibrary/Extensions/ExtendIIdentifiable.cs deleted file mode 100644 index 97aa254c9..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendIIdentifiable.cs +++ /dev/null @@ -1,33 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System.Collections.Generic; -using System.Linq; - -namespace Extensions -{ - public static class ExtendIIdentifiable - { - #region List of Identifiers - - public static string ToStringExtended(this List identifiables, string delimiter = ",") - { - return string.Join(delimiter, identifiables.Select((x) => x.Id)); - } - - #endregion - public static IReference GetReference(this IIdentifiable identifiable) - { - var key = new Key(ExtensionsUtil.GetKeyType(identifiable), identifiable.Id); - //TODO (jtikekar, 0000-00-00): if model or Global reference? - var outputReference = new Reference(ReferenceTypes.ModelReference, new List() { key }); - - return outputReference; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendILangStringDefinitionTypeIec61360.cs b/src/AasxCsharpLibrary/Extensions/ExtendILangStringDefinitionTypeIec61360.cs deleted file mode 100644 index 46062fade..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendILangStringDefinitionTypeIec61360.cs +++ /dev/null @@ -1,66 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System; -using System.Collections.Generic; - -namespace Extensions -{ - public static class ExtendILangStringDefinitionTypeIec61360 - { - public static List CreateLangStringDefinitionType(string language, string text) - { - return new List { new LangStringDefinitionTypeIec61360(language, text) }; - } - public static string GetDefaultString(this List langStringSet, string defaultLang = null) - { - // start - if (defaultLang == null) - defaultLang = "en"; //Default Lang in old implementation is en - - string res = null; - - // search - foreach (var langString in langStringSet) - if (langString.Language.Equals(defaultLang, StringComparison.OrdinalIgnoreCase)) - res = langString.Text; - - if (res == null && langStringSet.Count > 0) - res = langStringSet[0].Text; - - // found? - return res; - } - public static List ConvertFromV20( - this List lss, - AasxCompatibilityModels.AdminShellV20.LangStringSetIEC61360 src) - { - lss = new List(); - if (src != null && src.Count != 0) - { - foreach (var sourceLangString in src) - { - //Remove ? in the end added by AdminShellV20, to avoid verification error - string lang = sourceLangString.lang; - if (!string.IsNullOrEmpty(sourceLangString.lang) && sourceLangString.lang.EndsWith("?")) - { - lang = sourceLangString.lang.Remove(sourceLangString.lang.Length - 1); - } - var langString = new LangStringDefinitionTypeIec61360(lang, sourceLangString.str); - lss.Add(langString); - } - } - else - { - //set default preferred name - lss.Add(new LangStringDefinitionTypeIec61360("en", "")); - } - return lss; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendILangStringNameType.cs b/src/AasxCsharpLibrary/Extensions/ExtendILangStringNameType.cs deleted file mode 100644 index e222b5c20..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendILangStringNameType.cs +++ /dev/null @@ -1,30 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Extensions -{ - public static class ExtendILangStringNameType - { - public static string ToStringExtended(this ILangStringNameType ls, int fmt) - { - if (fmt == 2) - return String.Format("{0}@{1}", ls.Text, ls.Language); - return String.Format("[{0},{1}]", ls.Language, ls.Text); - } - - public static string ToStringExtended(this List elems, - int format = 1, string delimiter = ",") - { - return string.Join(delimiter, elems.Select((k) => k.ToStringExtended(format))); - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendILangStringPreferredNameTypeIec61360.cs b/src/AasxCsharpLibrary/Extensions/ExtendILangStringPreferredNameTypeIec61360.cs deleted file mode 100644 index abff939d3..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendILangStringPreferredNameTypeIec61360.cs +++ /dev/null @@ -1,71 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System; -using System.Collections.Generic; - -namespace Extensions -{ - public static class ExtendILangStringPreferredNameTypeIec61360 - { - public static List CreateLangStringPreferredNameType(string language, string text) - { - return new List { new LangStringPreferredNameTypeIec61360(language, text) }; - } - - public static string GetDefaultString(this List langStringSet, string defaultLang = null) - { - return ExtendLangString.GetDefaultStringGen(langStringSet, defaultLang); - // dead-csharp off - //// start - //if (defaultLang == null) - // defaultLang = "en"; //Default Lang in old implementation is en - - //string res = null; - - //// search - //foreach (var langString in langStringSet) - // if (langString.Language.Equals(defaultLang, StringComparison.OrdinalIgnoreCase)) - // res = langString.Text; - - //if (res == null && langStringSet.Count > 0) - // res = langStringSet[0].Text; - - //// found? - //return res; - // dead-csharp on - } - - public static List ConvertFromV20( - this List lss, - AasxCompatibilityModels.AdminShellV20.LangStringSetIEC61360 src) - { - lss = new List(); - if (src != null && src.Count != 0) - { - foreach (var sourceLangString in src) - { - //Remove ? in the end added by AdminShellV20, to avoid verification error - string lang = sourceLangString.lang; - if (!string.IsNullOrEmpty(sourceLangString.lang) && sourceLangString.lang.EndsWith("?")) - { - lang = sourceLangString.lang.Remove(sourceLangString.lang.Length - 1); - } - var langString = new LangStringPreferredNameTypeIec61360(lang, sourceLangString.str); - lss.Add(langString); - } - } - else - { - //set default preferred name - lss.Add(new LangStringPreferredNameTypeIec61360("en", "")); - } - return lss; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendILangStringShortNameTypeIec61360.cs b/src/AasxCsharpLibrary/Extensions/ExtendILangStringShortNameTypeIec61360.cs deleted file mode 100644 index 8cdb0e3e3..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendILangStringShortNameTypeIec61360.cs +++ /dev/null @@ -1,71 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System; -using System.Collections.Generic; - -namespace Extensions -{ - public static class ExtendILangStringShortNameTypeIec61360 - { - public static List CreateLangStringShortNameType(string language, string text) - { - return new List { new LangStringShortNameTypeIec61360(language, text) }; - } - - public static string GetDefaultString(this List langStringSet, string defaultLang = null) - { - return ExtendLangString.GetDefaultStringGen(langStringSet, defaultLang); - // dead-csharp off - //// start - //if (defaultLang == null) - // defaultLang = "en"; //Default Lang in old implementation is en - - //string res = null; - - //// search - //foreach (var langString in langStringSet) - // if (langString.Language.Equals(defaultLang, StringComparison.OrdinalIgnoreCase)) - // res = langString.Text; - - //if (res == null && langStringSet.Count > 0) - // res = langStringSet[0].Text; - - //// found? - //return res; - // dead-csharp on - } - - public static List ConvertFromV20( - this List lss, - AasxCompatibilityModels.AdminShellV20.LangStringSetIEC61360 src) - { - lss = new List(); - if (src != null && src.Count != 0) - { - foreach (var sourceLangString in src) - { - //Remove ? in the end added by AdminShellV20, to avoid verification error - string lang = sourceLangString.lang; - if (!string.IsNullOrEmpty(sourceLangString.lang) && sourceLangString.lang.EndsWith("?")) - { - lang = sourceLangString.lang.Remove(sourceLangString.lang.Length - 1); - } - var langString = new LangStringShortNameTypeIec61360(lang, sourceLangString.str); - lss.Add(langString); - } - } - else - { - //set default preferred name - lss.Add(new LangStringShortNameTypeIec61360("en", "")); - } - return lss; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendILangStringTextType.cs b/src/AasxCsharpLibrary/Extensions/ExtendILangStringTextType.cs deleted file mode 100644 index bb5dfd3eb..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendILangStringTextType.cs +++ /dev/null @@ -1,35 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Extensions -{ - public static class ExtendILangStringTextType - { - public static string GetDefaultString(this List langStringSet, string defaultLang = null) - { - return ExtendLangString.GetDefaultStringGen(langStringSet, defaultLang); - } - - public static string ToStringExtended(this ILangStringTextType ls, int fmt) - { - if (fmt == 2) - return String.Format("{0}@{1}", ls.Text, ls.Language); - return String.Format("[{0},{1}]", ls.Language, ls.Text); - } - - public static string ToStringExtended(this List elems, - int format = 1, string delimiter = ",") - { - return string.Join(delimiter, elems.Select((k) => k.ToStringExtended(format))); - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendIReferable.cs b/src/AasxCsharpLibrary/Extensions/ExtendIReferable.cs deleted file mode 100644 index 1c0e0597b..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendIReferable.cs +++ /dev/null @@ -1,624 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using AdminShellNS; -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Extensions -{ - public static class ExtendIReferable - { - #region AasxPackageExplorer - - /// - /// Recurses on all Submodel elements of a Submodel or SME, which allows children. - /// The state object will be passed to the lambda function in order to provide - /// stateful approaches. Include this element, as well. - /// - /// State object to be provided to lambda. Could be null. - /// The lambda function as (state, parents, SME) - /// The lambda shall return TRUE in order to deep into recursion. - /// Include this element as well. parents will then - /// include this element as well! - public static void RecurseOnReferables(this IReferable referable, - object state, Func, IReferable, bool> lambda, - bool includeThis = false) - { - // TODO (MIHO, 2023-07-28): not all elements are covered - if (referable is Submodel submodel) - { - submodel.RecurseOnReferables(state, lambda, includeThis); - } - else if (referable is SubmodelElementCollection submodelElementCollection) - { - submodelElementCollection.RecurseOnReferables(state, lambda, includeThis); - } - else if (referable is SubmodelElementList submodelElementList) - { - submodelElementList.RecurseOnReferables(state, lambda, includeThis); - } - else if (includeThis) - lambda(state, null, referable); - } - - public static void Remove(this IReferable referable, ISubmodelElement submodelElement) - { - if (referable is Submodel submodel) - { - submodel.Remove(submodelElement); - } - else if (referable is AnnotatedRelationshipElement annotatedRelationshipElement) - { - annotatedRelationshipElement.Remove(submodelElement); - } - else if (referable is SubmodelElementCollection submodelElementCollection) - { - submodelElementCollection.Remove(submodelElement); - } - else if (referable is SubmodelElementList submodelElementList) - { - submodelElementList.Remove(submodelElement); - } - else if (referable is Entity entity) - { - entity.Remove(submodelElement); - } - } - - public static void Add(this IReferable referable, ISubmodelElement submodelElement) - { - if (referable is Submodel submodel) - { - submodel.Add(submodelElement); - } - else if (referable is AnnotatedRelationshipElement annotatedRelationshipElement) - { - annotatedRelationshipElement.Add(submodelElement); - } - else if (referable is SubmodelElementCollection submodelElementCollection) - { - submodelElementCollection.Add(submodelElement); - } - else if (referable is SubmodelElementList submodelElementList) - { - submodelElementList.Add(submodelElement); - } - else if (referable is Entity entity) - { - entity.Add(submodelElement); - } - } - - #region Display - - public static EnumerationPlacmentBase GetChildrenPlacement(this IReferable referable, ISubmodelElement submodelElement) - { - if (referable is Operation operation) - { - return operation.GetChildrenPlacement(submodelElement); - } - - return null; - } - - #endregion - - public static IIdentifiable FindParentFirstIdentifiable(this IReferable referable) - { - IReferable curr = referable; - while (curr != null) - { - if (curr is IIdentifiable curri) - return curri; - curr = curr.Parent as IReferable; - } - return null; - } - - #endregion - - #region ListOfReferables - public static Reference GetReference(this List referables) - { - return new Reference(ReferenceTypes.ExternalReference, referables.ToKeyList()); - } - - public static List ToKeyList(this List referables) - { - var res = new List(); - foreach (var rf in referables) - res.Add(new Key(rf.GetSelfDescription()?.KeyType ?? KeyTypes.GlobalReference, rf.IdShort)); - return res; - } - #endregion - - public static string ToIdShortString(this IReferable rf) - { - if (rf.IdShort == null || rf.IdShort.Trim().Length < 1) - return (""); - return rf.IdShort.Trim(); - } - - public static IReference GetReference(this IReferable referable) - { - if (referable is IIdentifiable identifiable) - { - return identifiable.GetReference(); - } - else if (referable is ISubmodelElement submodelElement) - { - return submodelElement.GetModelReference(); - } - else - return null; - } - - public static void Validate(this IReferable referable, AasValidationRecordList results) - { - referable.BaseValidation(results); - - if (referable is ConceptDescription conceptDescription) - { - conceptDescription.Validate(results); - } - else if (referable is Submodel submodel) - { - submodel.Validate(results); - } - else if (referable is ISubmodelElement submodelElement) - { - // No further validation for SME - } - } - - public static void BaseValidation(this IReferable referable, AasValidationRecordList results) - { - // access - if (results == null) - return; - - // check - if (string.IsNullOrEmpty(referable.IdShort)) - results.Add(new AasValidationRecord( - AasValidationSeverity.SpecViolation, referable, - "Referable: missing idShort", - () => - { - referable.IdShort = "TO_FIX"; - })); - - if (referable.Description != null && (referable.Description.Count < 1)) - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, referable, - "Referable: existing description with missing langString", - () => - { - referable.Description = null; - })); - } - - /// - /// Tells, if the IReferable is used with an index instead of idShort. - /// - public static bool IsIndexed(this IReferable rf) - { - return rf is SubmodelElementList; - } - - public static AasElementSelfDescription GetSelfDescription(this IReferable referable) - { - if (referable is AssetAdministrationShell) - { - return new AasElementSelfDescription("AssetAdministrationShell", "AAS", - KeyTypes.AssetAdministrationShell, null); - } - else if (referable is ConceptDescription) - { - return new AasElementSelfDescription("ConceptDescription", "CD", - KeyTypes.ConceptDescription, null); - } - else if (referable is Submodel) - { - return new AasElementSelfDescription("Submodel", "SM", - KeyTypes.Submodel, null); - } - else if (referable is Property) - { - return new AasElementSelfDescription("Property", "Prop", - KeyTypes.Property, AasSubmodelElements.Property); - } - else if (referable is MultiLanguageProperty) - { - return new AasElementSelfDescription("MultiLanguageProperty", "MLP", - KeyTypes.MultiLanguageProperty, AasSubmodelElements.MultiLanguageProperty); - } - else if (referable is AasCore.Aas3_0.Range) - { - return new AasElementSelfDescription("Range", "Range", - KeyTypes.Range, AasSubmodelElements.Range); - } - else if (referable is Blob) - { - return new AasElementSelfDescription("Blob", "Blob", - KeyTypes.Blob, AasSubmodelElements.Blob); - } - else if (referable is AasCore.Aas3_0.File) - { - return new AasElementSelfDescription("File", "File", - KeyTypes.File, AasSubmodelElements.File); - } - else if (referable is ReferenceElement) - { - return new AasElementSelfDescription("ReferenceElement", "Ref", - KeyTypes.ReferenceElement, AasSubmodelElements.ReferenceElement); - } - else if (referable is RelationshipElement) - { - return new AasElementSelfDescription("RelationshipElement", "Rel", - KeyTypes.RelationshipElement, AasSubmodelElements.RelationshipElement); - } - else if (referable is AnnotatedRelationshipElement) - { - return new AasElementSelfDescription("AnnotatedRelationshipElement", "RelA", - KeyTypes.AnnotatedRelationshipElement, AasSubmodelElements.AnnotatedRelationshipElement); - } - else if (referable is Capability) - { - return new AasElementSelfDescription("Capability", "Cap", - KeyTypes.Capability, AasSubmodelElements.Capability); - } - else if (referable is SubmodelElementCollection) - { - return new AasElementSelfDescription("SubmodelElementCollection", "SMC", - KeyTypes.SubmodelElementCollection, AasSubmodelElements.SubmodelElementCollection); - } - else if (referable is SubmodelElementList) - { - return new AasElementSelfDescription("SubmodelElementList", "SML", - KeyTypes.SubmodelElementList, AasSubmodelElements.SubmodelElementList); - } - else if (referable is Operation) - { - return new AasElementSelfDescription("Operation", "Opr", - KeyTypes.Operation, AasSubmodelElements.Operation); - } - else if (referable is Entity) - { - return new AasElementSelfDescription("Entity", "Ent", - KeyTypes.Entity, AasSubmodelElements.Entity); - } - else if (referable is BasicEventElement) - { - return new AasElementSelfDescription("BasicEventElement", "Evt", - - KeyTypes.BasicEventElement, AasSubmodelElements.BasicEventElement); - } - else if (referable is IDataElement) - { - return new AasElementSelfDescription("DataElement", "DE", - KeyTypes.DataElement, AasSubmodelElements.DataElement); - } - else if (referable is ISubmodelElement) - { - return new AasElementSelfDescription("SubmodelElement", "SME", - KeyTypes.SubmodelElement, AasSubmodelElements.SubmodelElement); - } - else - { - return new AasElementSelfDescription("Referable", "Ref", - KeyTypes.Referable, null); - } - } - public static void CollectReferencesByParent(this IReferable referable, List refs) - { - // access - if (refs == null) - return; - - // check, if this is identifiable - if (referable is IIdentifiable) - { - var idf = referable as IIdentifiable; - if (idf != null) - { - - var key = new Key((KeyTypes)Stringification.KeyTypesFromString(idf.GetType().Name), idf.Id); - refs.Insert(0, key); - } - } - else - { - var key = new Key((KeyTypes)Stringification.KeyTypesFromString(referable.GetType().Name), referable.IdShort); - refs.Insert(0, key); - // recurse upwards! - if (referable.Parent is IReferable prf) - prf.CollectReferencesByParent(refs); - } - } - public static void SetTimeStamp(this IReferable referable, DateTime timeStamp) - { - IReferable newReferable = referable; - do - { - newReferable.TimeStamp = timeStamp; - if (newReferable != newReferable.Parent) - { - newReferable = (IReferable)newReferable.Parent; - } - else - newReferable = null; - } - while (newReferable != null); - } - - public static bool EnumeratesChildren(this ISubmodelElement elem) - { - var num = elem.EnumerateChildren().Count(); - return (num > 0); - } - - public static IEnumerable EnumerateChildren(this IReferable rf) - { - // the code below was done by Jui - // MIHO: I think, we should now use the methods of AAS core - - if (rf == null) - yield break; - - foreach (var desc in rf.DescendOnce()) - if (desc is ISubmodelElement sme) - yield return sme; - -#if __old - if (referable is Submodel submodel && submodel.SubmodelElements != null) - { - if (submodel.SubmodelElements != null) - { - foreach (var submodelElement in submodel.SubmodelElements) - { - yield return submodelElement; - } - } - } - else if (referable is SubmodelElementCollection submodelElementCollection) - { - if (submodelElementCollection.Value != null) - { - foreach (var submodelElement in submodelElementCollection.Value) - { - yield return submodelElement; - } - } - } - else if (referable is SubmodelElementList submodelElementList) - { - if (submodelElementList.Value != null) - { - foreach (var submodelElement in submodelElementList.Value) - { - yield return submodelElement; - } - } - } - else if (referable is AnnotatedRelationshipElement annotatedRelationshipElement) - { - if (annotatedRelationshipElement.Annotations != null) - { - foreach (var submodelElement in annotatedRelationshipElement.Annotations) - { - yield return submodelElement; - } - } - } - else if (referable is Entity entity) - { - if (entity.Statements != null) - { - foreach (var submodelElement in entity.Statements) - { - yield return submodelElement; - } - } - } - else if (referable is Operation operation) - { - if (operation.InputVariables != null) - foreach (var inputVariable in operation.InputVariables) - { - yield return inputVariable.Value; - } - - if (operation.OutputVariables != null) - foreach (var outputVariable in operation.OutputVariables) - { - yield return outputVariable.Value; - } - - if (operation.InoutputVariables != null) - foreach (var inOutVariable in operation.InoutputVariables) - { - yield return inOutVariable.Value; - } - } - else - { - yield break; - } -#endif - } - - - public static void SetAllParentsAndTimestamps(this IReferable referable, IReferable parent, DateTime timeStamp, DateTime timeStampCreate) - { - if (parent == null) - return; - - referable.Parent = parent; - referable.TimeStamp = timeStamp; - referable.TimeStampCreate = timeStampCreate; - - foreach (var submodelElement in referable.EnumerateChildren()) - { - submodelElement.SetAllParentsAndTimestamps(referable, timeStamp, timeStampCreate); - } - } - - public static Submodel GetParentSubmodel(this IReferable referable) - { - IReferable parent = referable; - while (parent is not Submodel && parent != null) - parent = (IReferable)parent.Parent; - return parent as Submodel; - } - - public static string CollectIdShortByParent(this IReferable referable) - { - // recurse first - var head = ""; - if (referable is not IIdentifiable && referable.Parent is IReferable parentReferable) - // can go up - head = parentReferable.CollectIdShortByParent() + "/"; - // add own - var myid = ""; - if (!string.IsNullOrEmpty(referable.IdShort)) - myid = referable.IdShort.Trim(); - // together - return head + myid; - } - - public static void AddDescription(this IReferable referable, string language, string Text) - { - if (referable.Description == null) - referable.Description = new List(); - referable.Description.Add(new LangStringTextType(language, Text)); - } - - public static List ListOfIReferableFrom( - System.Text.Json.Nodes.JsonNode node) - { - var res = new List(); - if (node == null) - return res; - var array = node.AsArray(); - foreach (var it in array) - { - var ir = Jsonization.Deserialize.IReferableFrom(it); - res.Add(ir); - } - return res; - } - - public static Key ToKey(this IReferable rf) - { - var sd = rf.GetSelfDescription(); - if (sd == null || !sd.KeyType.HasValue) - return null; - if (rf is IIdentifiable rfi) - return new Key(sd.KeyType.Value, rfi.Id); - return new Key(sd.KeyType.Value, rf.IdShort); - } - - public static System.Text.Json.Nodes.JsonNode ToJsonObject(List classes) - { - var jar = new System.Text.Json.Nodes.JsonArray(); - if (classes != null) - foreach (var c in classes) - jar.Add(Jsonization.Serialize.ToJsonObject(c)); - return jar; - } - - public static IEnumerable FindAllQualifierType(this IReferable rf, string qualifierType) - { - if (!(rf is IQualifiable rfq) || rfq.Qualifiers == null || qualifierType == null) - yield break; - foreach (var q in rfq.Qualifiers) - if (q.Type.Trim().ToLower() == qualifierType.Trim().ToLower()) - yield return q; - } - - public static IQualifier HasQualifierOfType(this IReferable rf, string qualifierType) - { - if (!(rf is IQualifiable rfq) || rfq.Qualifiers == null) - return null; - foreach (var q in rfq.Qualifiers) - if (q.Type?.Trim().ToLower() == qualifierType?.Trim().ToLower()) - return q; - return null; - } - - public static Qualifier Add(this IReferable rf, Qualifier q) - { - if (!(rf is IQualifiable rfq)) - return null; - if (rfq.Qualifiers == null) - rfq.Qualifiers = new List(); - rfq.Qualifiers.Add(q); - return q; - } - - public static IEnumerable FindAllExtensionName(this IReferable rf, string extensionName) - { - if (!(rf is IHasExtensions rfe) || rfe.Extensions == null) - yield break; - foreach (var e in rfe.Extensions) - if (e.Name?.Trim().ToLower() == extensionName?.Trim().ToLower()) - yield return e; - } - - - public static IExtension HasExtensionOfName(this IReferable rf, string extensionName) - { - if (!(rf is IHasExtensions rfe) || rfe.Extensions == null) - return null; - foreach (var e in rfe.Extensions) - if (e.Name?.Trim().ToLower() == extensionName?.Trim().ToLower()) - return e; - return null; - } - - public static Extension Add(this IReferable rf, Extension ext) - { - if (rf.Extensions == null) - rf.Extensions = new List(); - rf.Extensions.Add(ext); - return ext; - } - - public static void MigrateV20QualifiersToExtensions(this IReferable rf) - { - // access - if (!(rf is IQualifiable iq) || iq.Qualifiers == null || !(rf is IHasExtensions ihe)) - return; - - // Qualifiers to migrate - var toMigrate = new[] { - "Animate.Args", "Plotting.Args", "TimeSeries.Args", "BOM.Args", "ImageMap.Args" - }; - - List toMove = new List(); - foreach (var q in iq.Qualifiers) - foreach (var tm in toMigrate) - if (q?.Type?.Equals(tm, StringComparison.InvariantCultureIgnoreCase) == true) - toMove.Add(q); - - // now move these - for (int i = 0; i < toMove.Count; i++) - { - var q = toMove[i]; - var ext = new Extension( - name: q.Type, semanticId: q.SemanticId, - valueType: q.ValueType, value: q.Value); - rf.Add(ext); - iq.Qualifiers.Remove(q); - } - } - - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendISubmodelElement.cs b/src/AasxCsharpLibrary/Extensions/ExtendISubmodelElement.cs deleted file mode 100644 index 1d8e9fa37..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendISubmodelElement.cs +++ /dev/null @@ -1,1551 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using AasxCompatibilityModels; -using AdminShellNS; -using AdminShellNS.Extensions; -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Extensions -{ - public static class ExtendISubmodelElement - { - // constants - public static Type[] PROP_MLP = new Type[] { - typeof(MultiLanguageProperty), typeof(Property) }; - - #region AasxPackageExplorer - - public static List Copy(this List original) - { - var res = new List(); - if (original != null) - foreach (var o in original) - res.Add(o.Copy()); - return res; - } - - public static object AddChild(this ISubmodelElement submodelElement, ISubmodelElement childSubmodelElement, EnumerationPlacmentBase placement = null) - { - if (submodelElement is AnnotatedRelationshipElement annotatedRelationshipElement) - { - return annotatedRelationshipElement.AddChild(childSubmodelElement, placement); - } - else if (submodelElement is SubmodelElementCollection submodelElementCollection) - { - return submodelElementCollection.AddChild(childSubmodelElement, placement); - } - else if (submodelElement is SubmodelElementList submodelElementList) - { - return submodelElementList.AddChild(childSubmodelElement, placement); - } - else if (submodelElement is Operation operation) - { - return operation.AddChild(childSubmodelElement, placement); - } - else if (submodelElement is Entity entity) - { - return entity.AddChild(childSubmodelElement, placement); - } - else - return childSubmodelElement; - } - - public static List GetChildsAsList(this ISubmodelElement sme) - { - return sme.DescendOnce().Where((x) => x is ISubmodelElement).Cast().ToList(); - } - - public static Tuple ToCaptionInfo(this ISubmodelElement submodelElement) - { - var caption = AdminShellUtil.EvalToNonNullString("\"{0}\" ", submodelElement.IdShort, ""); - var info = ""; - // TODO (MIHO, 2021-07-08): obvious error .. info should receive semanticId .. but would change - // display presentation .. therefore to be checked again - if (submodelElement.SemanticId != null) - AdminShellUtil.EvalToNonEmptyString("\u21e8 {0}", submodelElement.SemanticId.ToStringExtended(), ""); - return Tuple.Create(caption, info); - } - - public static void ValueFromText(this ISubmodelElement submodelElement, string text, string defaultLang = null) - { - switch (submodelElement) - { - case Property property: - { - property.ValueFromText(text); - break; - } - case MultiLanguageProperty multiLanguageProperty: - { - multiLanguageProperty.ValueFromText(text, defaultLang); - break; - } - default: - { - throw new Exception("Unhandled submodel element type"); - } - } - } - - #endregion - public static IEnumerable FindAllParents(this ISubmodelElement submodelElement, - Predicate p, - bool includeThis = false, bool includeSubmodel = false, - bool passOverMiss = false) - { - // call for this? - if (includeThis) - { - if (p == null || p.Invoke(submodelElement)) - yield return submodelElement; - else - if (!passOverMiss) - yield break; - } - - // daisy chain all parents .. - if (submodelElement.Parent != null) - { - if (submodelElement.Parent is ISubmodelElement psme) - { - foreach (var q in psme.FindAllParents(p, includeThis: true, - passOverMiss: passOverMiss)) - yield return q; - } - else if (includeSubmodel && submodelElement.Parent is Submodel psm) - { - if (p == null || p.Invoke(psm)) - yield return submodelElement; - } - } - } - - public static IEnumerable FindAllParentsWithSemanticId( - this ISubmodelElement submodelElement, IReference semId, - bool includeThis = false, bool includeSubmodel = false, bool passOverMiss = false) - { - return (FindAllParents(submodelElement, - (rf) => (true == (rf as IHasSemantics)?.SemanticId?.Matches(semId, - matchMode: MatchMode.Relaxed)), - includeThis: includeThis, includeSubmodel: includeSubmodel, passOverMiss: passOverMiss)); - } - - public static string ValueAsText(this ISubmodelElement submodelElement, string defaultLang = null) - { - //TODO (??, 0000-00-00): Need to check/test this logic again - if (submodelElement is Property property) - { - return property.ValueAsText(); - } - - if (submodelElement is MultiLanguageProperty multiLanguageProperty) - { - return multiLanguageProperty.ValueAsText(defaultLang); - } - - if (submodelElement is AasCore.Aas3_0.Range range) - { - return range.ValueAsText(); - } - - if (submodelElement is File file) - { - return file.ValueAsText(); - } - - return ""; - } - - public static IQualifier FindQualifierOfType(this ISubmodelElement submodelElement, string qualifierType) - { - if (submodelElement.Qualifiers == null || submodelElement.Qualifiers.Count == 0) - { - return null; - } - - foreach (var qualifier in submodelElement.Qualifiers) - { - if (qualifier.Type.Equals(qualifierType, StringComparison.OrdinalIgnoreCase)) - { - return qualifier; - } - } - - return null; - - } - - public static IReference GetModelReference(this ISubmodelElement sme, bool includeParents = true) - { - // this will be the tail of our chain - var keyList = new List(); - var keyType = ExtensionsUtil.GetKeyType(sme); - var key = new Key(keyType, sme.IdShort); - keyList.Add(key); - - // keys for Parents will be INSERTED in front, iteratively - var currentParent = sme.Parent; - while (includeParents && currentParent != null) - { - if (currentParent is IIdentifiable identifiable) - { - var currentParentKey = new Key(ExtensionsUtil.GetKeyType(identifiable), identifiable.Id); - keyList.Insert(0, currentParentKey); - currentParent = null; - } - else if (currentParent is IReferable referable) - { - var currentParentKey = new Key(ExtensionsUtil.GetKeyType(referable), referable.IdShort); - keyList.Insert(0, currentParentKey); - currentParent = referable.Parent; - } - - } - - var outputReference = new Reference(ReferenceTypes.ModelReference, keyList); - outputReference.ReferredSemanticId = sme.SemanticId; - return outputReference; - } - - public static IEnumerable FindDeep(this ISubmodelElement submodelElement) - { - if (submodelElement is T) - { - yield return (T)submodelElement; - } - - foreach (var x in submodelElement.Descend().OfType()) - yield return x; - } - - public static ISubmodelElement ConvertFromV10(this ISubmodelElement submodelElement, AdminShellV10.SubmodelElement sourceSubmodelElement, bool shallowCopy = false) - { - ISubmodelElement outputSubmodelElement = null; - if (sourceSubmodelElement != null) - { - if (sourceSubmodelElement is AdminShellV10.SubmodelElementCollection collection) - { - var newSmeCollection = new SubmodelElementCollection(); - outputSubmodelElement = newSmeCollection.ConvertFromV10(collection, shallowCopy); - } - else if (sourceSubmodelElement is AdminShellV10.Property sourceProperty) - { - var newProperty = new Property(DataTypeDefXsd.String); - outputSubmodelElement = newProperty.ConvertFromV10(sourceProperty); - } - else if (sourceSubmodelElement is AdminShellV10.File sourceFile) - { - var newFile = new File(""); - outputSubmodelElement = newFile.ConvertFromV10(sourceFile); - } - else if (sourceSubmodelElement is AdminShellV10.Blob blob) - { - var newBlob = new Blob(""); - outputSubmodelElement = newBlob.ConvertFromV10(blob); - } - else if (sourceSubmodelElement is AdminShellV10.ReferenceElement sourceReferenceElement) - { - outputSubmodelElement = new ReferenceElement(); - } - else if (sourceSubmodelElement is AdminShellV10.RelationshipElement sourceRelationshipElement) - { - var newFirst = ExtensionsUtil.ConvertReferenceFromV10(sourceRelationshipElement.first, ReferenceTypes.ModelReference); - var newSecond = ExtensionsUtil.ConvertReferenceFromV10(sourceRelationshipElement.second, ReferenceTypes.ModelReference); - outputSubmodelElement = new RelationshipElement(newFirst, newSecond); - } - else if (sourceSubmodelElement is AdminShellV10.Operation sourceOperation) - { - var newInputVariables = new List(); - var newOutputVariables = new List(); - if (!sourceOperation.valueIn.IsNullOrEmpty()) - { - - foreach (var inputVariable in sourceOperation.valueIn) - { - if (inputVariable.value.submodelElement != null) - { - ISubmodelElement newSubmodelElement = null; - newSubmodelElement = newSubmodelElement.ConvertFromV10(inputVariable.value.submodelElement); - var newOpVariable = new OperationVariable(newSubmodelElement); - newInputVariables.Add(newOpVariable); - } - } - } - - if (!sourceOperation.valueOut.IsNullOrEmpty()) - { - foreach (var outputVariable in sourceOperation.valueOut) - { - if (outputVariable.value.submodelElement != null) - { - ISubmodelElement newSubmodelElement = null; - newSubmodelElement = newSubmodelElement.ConvertFromV10(outputVariable.value.submodelElement); - var newOpVariable = new OperationVariable(newSubmodelElement); - newOutputVariables.Add(newOpVariable); - } - } - } - - outputSubmodelElement = new Operation(inputVariables: newInputVariables, outputVariables: newOutputVariables); - } - - if (outputSubmodelElement != null) - { - outputSubmodelElement.BasicConversionFromV10(sourceSubmodelElement); - } - } - - return outputSubmodelElement; - } - - private static void BasicConversionFromV10(this ISubmodelElement submodelElement, AdminShellV10.SubmodelElement sourceSubmodelElement) - { - if (!string.IsNullOrEmpty(sourceSubmodelElement.idShort)) - { - submodelElement.IdShort = sourceSubmodelElement.idShort; - } - - if (!string.IsNullOrEmpty(sourceSubmodelElement.category)) - { - submodelElement.Category = sourceSubmodelElement.category; - } - - if (sourceSubmodelElement.description != null) - { - submodelElement.Description = ExtensionsUtil.ConvertDescriptionFromV10(sourceSubmodelElement.description); - } - - if (sourceSubmodelElement.semanticId != null && !sourceSubmodelElement.semanticId.IsEmpty) - { - var keyList = new List(); - foreach (var refKey in sourceSubmodelElement.semanticId.Keys) - { - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {refKey.type} not found."); - } - } - submodelElement.SemanticId = new Reference(ReferenceTypes.ExternalReference, keyList); - } - - if (sourceSubmodelElement.kind != null) - { - //SubmodelElement does not have kind anymore - } - - if (!sourceSubmodelElement.qualifiers.IsNullOrEmpty()) - { - if (submodelElement.Qualifiers == null && submodelElement.Qualifiers.Count != 0) - { - submodelElement.Qualifiers = new List(); - } - - foreach (var sourceQualifier in sourceSubmodelElement.qualifiers) - { - var newQualifier = new Qualifier("", DataTypeDefXsd.String); - newQualifier = newQualifier.ConvertFromV10(sourceQualifier); - submodelElement.Qualifiers.Add(newQualifier); - } - } - - if (sourceSubmodelElement.hasDataSpecification != null && !sourceSubmodelElement.hasDataSpecification.reference.IsNullOrEmpty()) - { - //TODO (jtikekar, 0000-00-00): EmbeddedDataSpecification?? (as per old implementation) - submodelElement.EmbeddedDataSpecifications ??= new List(); - foreach (var dataSpecification in sourceSubmodelElement.hasDataSpecification.reference) - { - if (!dataSpecification.IsEmpty) - { - submodelElement.EmbeddedDataSpecifications.Add( - new EmbeddedDataSpecification( - ExtensionsUtil.ConvertReferenceFromV10(dataSpecification, ReferenceTypes.ExternalReference), - null)); - } - } - } - } - - public static ISubmodelElement ConvertFromV20(this ISubmodelElement submodelElement, AdminShellV20.SubmodelElement sourceSubmodelElement, bool shallowCopy = false) - { - ISubmodelElement outputSubmodelElement = null; - if (sourceSubmodelElement != null) - { - if (sourceSubmodelElement is AdminShellV20.SubmodelElementCollection collection) - { - var newSmeCollection = new SubmodelElementCollection(); - outputSubmodelElement = newSmeCollection.ConvertFromV20(collection, shallowCopy); - } - else if (sourceSubmodelElement is AdminShellV20.Property sourceProperty) - { - var newProperty = new Property(DataTypeDefXsd.String); - outputSubmodelElement = newProperty.ConvertFromV20(sourceProperty); - } - else if (sourceSubmodelElement is AdminShellV20.MultiLanguageProperty sourceMultiLangProp) - { - var newMultiLangProperty = new MultiLanguageProperty(); - outputSubmodelElement = newMultiLangProperty.ConvertFromV20(sourceMultiLangProp); - } - else if (sourceSubmodelElement is AdminShellV20.Range sourceRange) - { - var newRange = new AasCore.Aas3_0.Range(DataTypeDefXsd.String); - outputSubmodelElement = newRange.ConvertFromV20(sourceRange); - } - else if (sourceSubmodelElement is AdminShellV20.File sourceFile) - { - var newFile = new File(""); - outputSubmodelElement = newFile.ConvertFromV20(sourceFile); - } - else if (sourceSubmodelElement is AdminShellV20.Blob blob) - { - var newBlob = new Blob(""); - outputSubmodelElement = newBlob.ConvertFromV20(blob); - } - else if (sourceSubmodelElement is AdminShellV20.ReferenceElement sourceReferenceElement) - { - var newReference = ExtensionsUtil.ConvertReferenceFromV20(sourceReferenceElement.value, ReferenceTypes.ModelReference); - outputSubmodelElement = new ReferenceElement(value: newReference); - } - else if (sourceSubmodelElement is AdminShellV20.AnnotatedRelationshipElement sourceAnnotedRelationshipElement) - { - var newFirst = ExtensionsUtil.ConvertReferenceFromV20(sourceAnnotedRelationshipElement.first, ReferenceTypes.ModelReference); - var newSecond = ExtensionsUtil.ConvertReferenceFromV20(sourceAnnotedRelationshipElement.second, ReferenceTypes.ModelReference); - var newAnnotedRelElement = new AnnotatedRelationshipElement(newFirst, newSecond); - outputSubmodelElement = newAnnotedRelElement.ConvertAnnotationsFromV20(sourceAnnotedRelationshipElement); - } - else if (sourceSubmodelElement is AdminShellV20.RelationshipElement sourceRelationshipElement) - { - var newFirst = ExtensionsUtil.ConvertReferenceFromV20(sourceRelationshipElement.first, ReferenceTypes.ModelReference); - var newSecond = ExtensionsUtil.ConvertReferenceFromV20(sourceRelationshipElement.second, ReferenceTypes.ModelReference); - outputSubmodelElement = new RelationshipElement(newFirst, newSecond); - } - else if (sourceSubmodelElement is AdminShellV20.BasicEvent sourceBasicEvent) - { - var newObserved = ExtensionsUtil.ConvertReferenceFromV20(sourceBasicEvent.observed, ReferenceTypes.ModelReference); - - outputSubmodelElement = new BasicEventElement(newObserved, Direction.Input, StateOfEvent.Off); - //TODO (jtikekar, 0000-00-00): default values of enums - } - else if (sourceSubmodelElement is AdminShellV20.Entity sourceEntity) - { - var entityType = Stringification.EntityTypeFromString(sourceEntity.entityType); - var newEntity = new Entity(entityType ?? EntityType.CoManagedEntity); - outputSubmodelElement = newEntity.ConvertFromV20(sourceEntity); - } - else if (sourceSubmodelElement is AdminShellV20.Operation sourceOperation) - { - var newInputVariables = new List(); - var newOutputVariables = new List(); - var newInOutVariables = new List(); - if (!sourceOperation.inputVariable.IsNullOrEmpty()) - { - - foreach (var inputVariable in sourceOperation.inputVariable) - { - if (inputVariable.value.submodelElement != null) - { - ISubmodelElement newSubmodelElement = null; - newSubmodelElement = newSubmodelElement.ConvertFromV20(inputVariable.value.submodelElement); - var newOpVariable = new OperationVariable(newSubmodelElement); - newInputVariables.Add(newOpVariable); - } - } - } - if (!sourceOperation.outputVariable.IsNullOrEmpty()) - { - foreach (var outputVariable in sourceOperation.outputVariable) - { - if (outputVariable.value.submodelElement != null) - { - ISubmodelElement newSubmodelElement = null; - newSubmodelElement = newSubmodelElement.ConvertFromV20(outputVariable.value.submodelElement); - var newOpVariable = new OperationVariable(newSubmodelElement); - newOutputVariables.Add(newOpVariable); - } - } - } - - if (!sourceOperation.inoutputVariable.IsNullOrEmpty()) - { - foreach (var inOutVariable in sourceOperation.inoutputVariable) - { - if (inOutVariable.value.submodelElement != null) - { - ISubmodelElement newSubmodelElement = null; - newSubmodelElement = newSubmodelElement.ConvertFromV20(inOutVariable.value.submodelElement); - var newOpVariable = new OperationVariable(newSubmodelElement); - newInOutVariables.Add(newOpVariable); - } - } - } - - outputSubmodelElement = new Operation(inputVariables: newInputVariables, outputVariables: newOutputVariables, inoutputVariables: newInOutVariables); - } - else if (sourceSubmodelElement is AdminShellV20.Capability) - { - outputSubmodelElement = new Capability(); - } - - if (outputSubmodelElement != null) - { - outputSubmodelElement.BasicConversionFromV20(sourceSubmodelElement); - } - } - - return outputSubmodelElement; - } - - private static void BasicConversionFromV20(this ISubmodelElement submodelElement, AdminShellV20.SubmodelElement sourceSubmodelElement) - { - if (!string.IsNullOrEmpty(sourceSubmodelElement.idShort)) - submodelElement.IdShort = sourceSubmodelElement.idShort; - - if (!string.IsNullOrEmpty(sourceSubmodelElement.category)) - submodelElement.Category = sourceSubmodelElement.category; - - if (sourceSubmodelElement.description != null) - submodelElement.Description = ExtensionsUtil.ConvertDescriptionFromV20(sourceSubmodelElement.description); - - if (sourceSubmodelElement.semanticId != null && !sourceSubmodelElement.semanticId.IsEmpty) - { - var keyList = new List(); - foreach (var refKey in sourceSubmodelElement.semanticId.Keys) - { - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - // DECISION: After phone call with Birgit, set all CD to GlobalReference - // assuming it is always a external concept - if (keyType == KeyTypes.ConceptDescription) - keyType = KeyTypes.GlobalReference; - - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {refKey.type} not found."); - } - } - submodelElement.SemanticId = new Reference(ReferenceTypes.ExternalReference, keyList); - } - - - if (!sourceSubmodelElement.qualifiers.IsNullOrEmpty()) - { - if (submodelElement.Qualifiers == null || submodelElement.Qualifiers.Count == 0) - submodelElement.Qualifiers = new List(); - - foreach (var sourceQualifier in sourceSubmodelElement.qualifiers) - { - var newQualifier = new Qualifier("", DataTypeDefXsd.String); - newQualifier = newQualifier.ConvertFromV20(sourceQualifier); - submodelElement.Qualifiers.Add(newQualifier); - } - } - - if (sourceSubmodelElement.hasDataSpecification != null && sourceSubmodelElement.hasDataSpecification.Count > 0) - { - foreach (var sourceEmbeddedDataSpec in sourceSubmodelElement.hasDataSpecification) - { - var newEmbeddedDataSpec = new EmbeddedDataSpecification (null, null); - newEmbeddedDataSpec.ConvertFromV20(sourceEmbeddedDataSpec); - if(newEmbeddedDataSpec.DataSpecification != null || newEmbeddedDataSpec.DataSpecificationContent != null) - { - submodelElement.EmbeddedDataSpecifications ??= new List(); - submodelElement.EmbeddedDataSpecifications.Add(newEmbeddedDataSpec); - } - } - } - - // move Qualifiers to Extensions - submodelElement.MigrateV20QualifiersToExtensions(); - } - - #region List - - public static IReferable FindReferableByReference( - this List submodelElements, Reference rf, int keyIndex) - { - return FindReferableByReference(submodelElements, rf?.Keys, keyIndex); - } - - public static IReferable FindReferableByReference( - this List submodelElements, List keys, int keyIndex) - { - // first index needs to exist .. - if (submodelElements == null || keys == null || keyIndex >= keys.Count) - return null; - - - // over all wrappers - foreach (var smw in submodelElements) - if (smw != null && smw.IdShort.Equals(keys[keyIndex].Value, StringComparison.OrdinalIgnoreCase)) - { - // match on this level. Did we find a leaf element? - if ((keyIndex + 1) >= keys.Count) - return smw; - - // dive into SMC? - if (smw is SubmodelElementCollection smc) - { - var found = FindReferableByReference(smc.Value, keys, keyIndex + 1); - if (found != null) - return found; - } - // dive into SML? - if (smw is SubmodelElementList submodelElementList) - { - var found = FindReferableByReference(submodelElementList.Value, keys, keyIndex + 1); - if (found != null) - return found; - } - - // dive into AnnotedRelationshipElement? - if (smw is AnnotatedRelationshipElement annotatedRelationshipElement) - { - var annotations = new List(annotatedRelationshipElement.Annotations); - var found = FindReferableByReference(annotations, keys, keyIndex + 1); - if (found != null) - return found; - } - - // dive into Entity statements? - if (smw is Entity ent) - { - var found = FindReferableByReference(ent.Statements, keys, keyIndex + 1); - if (found != null) - return found; - } - - // else: - return null; - } - - // no? - return null; - } - - public static IEnumerable FindDeep(this IEnumerable submodelElements, Predicate match = null) where T : ISubmodelElement - { - foreach (var smw in submodelElements) - { - var current = smw; - if (current == null) - continue; - - // call lambda for this element - if (current is T) - if (match == null || match.Invoke((T)current)) - yield return (T)current; - - // dive into? - // TODO (MIHO, 2020-07-31): would be nice to use IEnumerateChildren for this .. - // TODO (MIHO, 2023-01-01): would be nice to use AasCore.DescendOnce() for this .. -#if __old__ - if (current is SubmodelElementCollection smc && smc.Value != null) - foreach (var x in smc.Value.FindDeep(match)) - yield return x; - - if (current is AnnotatedRelationshipElement are && are.Annotations != null) - { - var annotationsList = new List(are.Annotations); - foreach (var x in annotationsList.FindDeep(match)) - yield return x; - } - - if (current is Entity ent && ent.Statements != null) - foreach (var x in ent.Statements.FindDeep(match)) - yield return x; - - if (current is Operation op) - { - var operationVariables = new List(); - foreach (var opVariable in op.InputVariables) - { - operationVariables.Add(opVariable.Value); - } - - foreach (var opVariable in op.InoutputVariables) - { - operationVariables.Add(opVariable.Value); - } - - foreach (var opVariable in op.OutputVariables) - { - operationVariables.Add(opVariable.Value); - } - - foreach (var x in operationVariables.FindDeep(match)) - yield return x; - } -#else - var smeChilds = current.DescendOnce().Where((ic) => ic is ISubmodelElement) - .Cast(); - foreach (var x in smeChilds.FindDeep(match)) - yield return x; -#endif - } - } - - public static void CopyManySMEbyCopy(this List submodelElements, ConceptDescription destCD, - List sourceSmc, ConceptDescription sourceCD, - bool createDefault = false, Action setDefault = null, - MatchMode matchMode = MatchMode.Relaxed) where T : ISubmodelElement - { - submodelElements.CopyManySMEbyCopy(destCD.GetSingleKey(), sourceSmc, sourceCD.GetSingleKey(), - createDefault ? destCD : null, setDefault, matchMode); - } - - public static void CopyManySMEbyCopy(this List submodelElements, Key destSemanticId, - List sourceSmc, Key sourceSemanticId, - ConceptDescription createDefault = null, Action setDefault = null, - MatchMode matchMode = MatchMode.Relaxed) where T : ISubmodelElement - { - // bool find possible sources - bool foundSrc = false; - if (sourceSmc == null) - return; - foreach (var src in sourceSmc.FindAllSemanticIdAs(sourceSemanticId, matchMode)) - { - // type of found src? - AasSubmodelElements aeSrc = (AasSubmodelElements)Enum.Parse(typeof(AasSubmodelElements), src.GetType().Name); - - // ok? - if (src == null || aeSrc == AasSubmodelElements.SubmodelElement) - continue; - foundSrc = true; - - // ok, create new one - var dst = AdminShellNS.AdminShellUtil.CreateSubmodelElementFromEnum(aeSrc, src); - if (dst != null) - { - // make same things sure - dst.IdShort = src.IdShort; - dst.Category = src.Category; - dst.SemanticId = new Reference(ReferenceTypes.ModelReference, new List() { destSemanticId }); - - // instantanously add it? - submodelElements.Add(dst); - } - } - - // default? - if (createDefault != null && !foundSrc) - { - // ok, default - var dflt = submodelElements.CreateSMEForCD(createDefault, addSme: true); - - // set default? - setDefault?.Invoke(dflt); - } - } - - public static T CopyOneSMEbyCopy(this List submodelElements, ConceptDescription destCD, - List sourceSmc, Key[] sourceKeys, - bool createDefault = false, Action setDefault = null, - MatchMode matchMode = MatchMode.Relaxed, - string idShort = null, bool addSme = false) where T : ISubmodelElement - { - return submodelElements.CopyOneSMEbyCopy(destCD?.GetSingleKey(), sourceSmc, sourceKeys, - createDefault ? destCD : null, setDefault, matchMode, idShort, addSme); - } - - public static T CopyOneSMEbyCopy(this List submodelELements, ConceptDescription destCD, - List sourceSmc, ConceptDescription sourceCD, - bool createDefault = false, Action setDefault = null, - MatchMode matchMode = MatchMode.Relaxed, - string idShort = null, bool addSme = false) where T : ISubmodelElement - { - return submodelELements.CopyOneSMEbyCopy(destCD?.GetSingleKey(), sourceSmc, new[] { sourceCD?.GetSingleKey() }, - createDefault ? destCD : null, setDefault, matchMode, idShort, addSme); - } - - public static T CopyOneSMEbyCopy(this List submodelElements, Key destSemanticId, - List sourceSmc, Key[] sourceSemanticId, - ConceptDescription createDefault = null, Action setDefault = null, - MatchMode matchMode = MatchMode.Relaxed, - string idShort = null, bool addSme = false) where T : ISubmodelElement - { - // get source - var src = sourceSmc.FindFirstAnySemanticIdAs(sourceSemanticId, matchMode); - - // may be make an adaptive conversion - if (src == null) - { - var anySrc = sourceSmc?.FindFirstAnySemanticId(sourceSemanticId, matchMode: matchMode); - src = submodelElements.AdaptiveConvertTo(anySrc, createDefault, - idShort: idShort, addSme: false); - } - - // proceed - AasSubmodelElements aeSrc = (AasSubmodelElements)Enum.Parse(typeof(AasSubmodelElements), src?.GetType().Name); - if (src == null || aeSrc == AasSubmodelElements.SubmodelElement) - { - // create a default? - if (createDefault == null) - return default(T); - - // ok, default - var dflt = submodelElements.CreateSMEForCD(createDefault, idShort: idShort, addSme: addSme); - - // set default? - setDefault?.Invoke(dflt); - - // return - return dflt; - } - - // ok, create new one - var dst = AdminShellNS.AdminShellUtil.CreateSubmodelElementFromEnum(aeSrc, src); - if (dst == null) - return default(T); - - // make same things sure - dst.IdShort = src.IdShort; - dst.Category = src.Category; - dst.SemanticId = new Reference(ReferenceTypes.ModelReference, new List() { destSemanticId }); - - // instantanously add it? - if (addSme) - submodelElements.Add(dst); - - // give back - return (T)dst; - } - - public static T AdaptiveConvertTo(this List submodelElements, - ISubmodelElement anySrc, - ConceptDescription createDefault = null, - string idShort = null, bool addSme = false) where T : ISubmodelElement - { - if (typeof(T) == typeof(MultiLanguageProperty) - && anySrc is Property srcProp) - { - var res = submodelElements.CreateSMEForCD(createDefault, idShort: idShort, addSme: addSme); - if (res is MultiLanguageProperty mlp) - { - mlp.Value = new List() { - new LangStringTextType(AdminShellUtil.GetDefaultLngIso639(), srcProp.Value) }; - mlp.ValueId = srcProp.ValueId; - return res; - } - } - - if (typeof(T) == typeof(Property) - && anySrc is MultiLanguageProperty srcMlp) - { - var res = submodelElements.CreateSMEForCD(createDefault, idShort: idShort, addSme: addSme); - if (res is Property prp) - { - prp.Value = "" + srcMlp.Value?.GetDefaultString(); - prp.ValueId = srcMlp.ValueId; - return res; - } - } - - return default(T); - } - - public static IEnumerable FindAllIdShort(this List submodelElements, - string idShort) - { - foreach (var smw in submodelElements) - if (smw != null) - if (smw.IdShort.Trim().ToLower() == idShort.Trim().ToLower()) - yield return smw; - } - - public static IEnumerable FindAllIdShortAs(this List submodelElements, - string idShort) where T : class, ISubmodelElement - { - foreach (var smw in submodelElements) - if (smw is T) - if (smw.IdShort.Trim().ToLower() == idShort.Trim().ToLower()) - yield return smw as T; - } - - public static ISubmodelElement FindFirstIdShort(this List submodelElements, - string idShort) - { - return submodelElements.FindAllIdShort(idShort)?.FirstOrDefault(); - } - - public static T FindFirstIdShortAs(this List submodelElements, - string idShort) where T : class, ISubmodelElement - { - return submodelElements.FindAllIdShortAs(idShort)?.FirstOrDefault(); - } - - - public static ISubmodelElement FindFirstAnySemanticId(this List submodelElements, - Key[] semId, Type[] allowedTypes = null, MatchMode matchMode = MatchMode.Strict) - { - if (semId == null) - return null; - foreach (var si in semId) - { - var found = submodelElements.FindAllSemanticId(si, allowedTypes, matchMode)? - .FirstOrDefault(); - if (found != null) - return found; - } - return null; - } - - public static T FindFirstAnySemanticIdAs( - this List submodelElements, IKey[] semId, MatchMode matchMode = MatchMode.Strict) - where T : ISubmodelElement - { - if (semId == null) - return default(T); - foreach (var si in semId) - { - var found = submodelElements.FindAllSemanticIdAs(si, matchMode).FirstOrDefault(); - if (found != null) - return found; - } - return default(T); - } - - public static T CreateNew( - string idShort = null, string category = null, IReference semanticId = null) - where T : ISubmodelElement, new() - { - var res = new T(); - if (idShort != null) - res.IdShort = idShort; - if (category != null) - res.Category = category; - if (semanticId != null) - res.SemanticId = semanticId.Copy(); - return res; - } - - public static T CreateSMEForCD(this List submodelELements, IConceptDescription conceptDescription, string category = null, string idShort = null, - string idxTemplate = null, int maxNum = 999, bool addSme = false, bool isTemplate = false) - where T : ISubmodelElement - { - // access - if (conceptDescription == null) - return default(T); - - // fin type enum - var smeType = AdminShellUtil.AasSubmodelElementsFrom(); - if (!smeType.HasValue) - return default(T); - - // try to potentially figure out idShort - var ids = conceptDescription.IdShort; - - //TODO (jtikekar, 0000-00-00): Temporarily removed - if ((ids == null || ids.Trim() == "") && conceptDescription.GetIEC61360() != null) - ids = conceptDescription.GetIEC61360().ShortName? - .GetDefaultString(); - - if (idShort != null) - ids = idShort; - - if (ids == null) - return default(T); - - // unique? - if (idxTemplate != null) - ids = submodelELements.IterateIdShortTemplateToBeUnique(idxTemplate, maxNum); - - // make a new instance - var semanticId = conceptDescription.GetCdReference(); - ISubmodelElement sme = AdminShellUtil.CreateSubmodelElementFromEnum(smeType.Value); - if (sme == null) - return default(T); - sme.IdShort = ids; - sme.SemanticId = semanticId.Copy(); - if (category != null) - sme.Category = category; - - // if its a SMC, make sure its accessible - if (sme is SubmodelElementCollection smc) - smc.Value = new List(); - - // instantanously add it? - if (addSme) - submodelELements.Add(sme); - - // give back - return (T)sme; - } - - public static IEnumerable FindAllSemanticIdAs(this List submodelELements, - IKey semId, MatchMode matchMode = MatchMode.Strict) - where T : ISubmodelElement - { - if (submodelELements.IsNullOrEmpty()) - yield return default(T); - foreach (var submodelElement in submodelELements) - if (submodelElement != null && submodelElement is T - && submodelElement.SemanticId != null) - if (submodelElement.SemanticId.MatchesExactlyOneKey(semId, matchMode)) - yield return (T)submodelElement; - } - - public static IEnumerable FindAllSemanticIdAs(this List submodelELements, - IReference semId, MatchMode matchMode = MatchMode.Strict) - where T : ISubmodelElement - { - foreach (var submodelElement in submodelELements) - if (submodelElement != null && submodelElement is T - && submodelElement.SemanticId != null) - if (submodelElement.SemanticId.Matches(semId, matchMode)) - yield return (T)submodelElement; - } - - public static T FindFirstSemanticIdAs(this List submodelElements, - IKey semId, MatchMode matchMode = MatchMode.Strict) - where T : ISubmodelElement - { - return submodelElements.FindAllSemanticIdAs(semId, matchMode).FirstOrDefault(); - } - - public static T FindFirstSemanticIdAs(this List submodelElements, - IReference semId, MatchMode matchMode = MatchMode.Strict) - where T : ISubmodelElement - { - return submodelElements.FindAllSemanticIdAs(semId, matchMode).FirstOrDefault(); - } - - public static List GetChildListFromFirstSemanticId( - this List submodelElements, - IKey semKey, MatchMode matchMode = MatchMode.Strict) - { - return FindFirstSemanticIdAs(submodelElements, semKey, matchMode)?.GetChildsAsList(); - } - - public static List GetChildListFromFirstSemanticId( - this List submodelElements, - IReference semId, MatchMode matchMode = MatchMode.Strict) - { - return FindFirstSemanticIdAs(submodelElements, semId, matchMode)?.GetChildsAsList(); - } - - public static IEnumerable> GetChildListsFromAllSemanticId( - this List submodelElements, - IKey semKey, MatchMode matchMode = MatchMode.Strict) - { - foreach (var child in FindAllSemanticIdAs(submodelElements, semKey, matchMode)) - yield return child.GetChildsAsList()?.ToList(); - } - - public static IEnumerable> GetChildListsFromAllSemanticId( - this List submodelElements, - IReference semId, MatchMode matchMode = MatchMode.Strict) - { - foreach (var child in FindAllSemanticIdAs(submodelElements, semId, matchMode)) - yield return child.GetChildsAsList()?.ToList(); - } - - public static IEnumerable Join(params IEnumerable[] lists) - { - if (lists == null || lists.Length < 1) - yield break; - foreach (var l in lists) - foreach (var sme in l) - yield return sme; - } - - public static void RecurseOnReferables( - this List submodelElements, object state, List parents, - Func, IReferable, bool> lambda) - { - if (lambda == null) - return; - if (parents == null) - parents = new List(); - - // over all elements - foreach (var submodelElement in submodelElements) - { - var current = submodelElement; - if (current == null) - continue; - - // call lambda for this element - // AND decide, if to recurse! - var goDeeper = lambda(state, parents, current); - - if (goDeeper) - { - // add to parents - parents.Add(current); - - // dive into? - if (current is SubmodelElementCollection smc) - smc.Value?.RecurseOnReferables(state, parents, lambda); - - if (current is Entity ent) - ent.Statements?.RecurseOnReferables(state, parents, lambda); - - if (current is Operation operation) - { - SubmodelElementCollection opVariableCollection = new SubmodelElementCollection(); - opVariableCollection.Value = new List(); - foreach (var inputVariable in operation.InputVariables) - { - opVariableCollection.Value.Add(inputVariable.Value); - } - - foreach (var outputVariable in operation.OutputVariables) - { - opVariableCollection.Value.Add(outputVariable.Value); - } - - foreach (var inOutVariable in operation.InoutputVariables) - { - opVariableCollection.Value.Add(inOutVariable.Value); - } - - opVariableCollection.Value.RecurseOnReferables(state, parents, lambda); - } - - if (current is AnnotatedRelationshipElement annotatedRelationshipElement) - { - var annotationElements = new List(); - if (annotatedRelationshipElement.Annotations != null) - foreach (var annotation in annotatedRelationshipElement.Annotations) - { - annotationElements.Add(annotation); - } - annotationElements.RecurseOnReferables(state, parents, lambda); - } - - // remove from parents - parents.RemoveAt(parents.Count - 1); - } - } - } - - public static void RecurseOnSubmodelElements( - this List submodelElements, object state, - List parents, Action, ISubmodelElement> lambda) - { - // trivial - if (lambda == null) - return; - if (parents == null) - parents = new List(); - - // over all elements - foreach (var smw in submodelElements) - { - var current = smw; - if (current == null) - continue; - - // call lambda for this element - lambda(state, parents, current); - - // add to parents - parents.Add(current); - - // dive into? - if (current is SubmodelElementCollection smc) - smc.Value?.RecurseOnSubmodelElements(state, parents, lambda); - - if (current is Entity ent) - ent.Statements?.RecurseOnSubmodelElements(state, parents, lambda); - - if (current is Operation operation) - { - SubmodelElementCollection opVariableCollection = new SubmodelElementCollection(); - foreach (var inputVariable in operation.InputVariables) - { - opVariableCollection.Value.Add(inputVariable.Value); - } - - foreach (var outputVariable in operation.OutputVariables) - { - opVariableCollection.Value.Add(outputVariable.Value); - } - - foreach (var inOutVariable in operation.InoutputVariables) - { - opVariableCollection.Value.Add(inOutVariable.Value); - } - - opVariableCollection.Value.RecurseOnSubmodelElements(state, parents, lambda); - } - - if (current is AnnotatedRelationshipElement annotatedRelationshipElement) - { - var annotationElements = new List(); - foreach (var annotation in annotatedRelationshipElement.Annotations) - { - annotationElements.Add(annotation); - } - annotationElements.RecurseOnSubmodelElements(state, parents, lambda); - } - - // remove from parents - parents.RemoveAt(parents.Count - 1); - } - } - - public static IEnumerable FindAllSemanticIdAs( - this List submodelELements, string semanticId) where T : ISubmodelElement - { - foreach (var submodelElement in submodelELements) - { - if (submodelElement != null && submodelElement is T && submodelElement.SemanticId != null) - { - if (submodelElement.SemanticId.Matches(semanticId)) - { - yield return (T)submodelElement; - } - } - } - } - - public static T FindFirstSemanticIdAs( - this List submodelELements, string semanticId) where T : ISubmodelElement - { - return submodelELements.FindAllSemanticIdAs(semanticId).FirstOrDefault(); - } - - public static T FindFirstAnySemanticIdAs( - this List submodelELements, string[] semanticIds) where T : ISubmodelElement - { - if (semanticIds == null) - return default; - foreach (var semanticId in semanticIds) - { - var found = submodelELements.FindFirstSemanticIdAs(semanticId); - if (found != null) - return found; - } - return default; - } - - public static IEnumerable FindAllSemanticId( - this List smes, - string[] allowedSemanticIds, - bool invertedAllowed = false) where T : ISubmodelElement - { - if (allowedSemanticIds == null || allowedSemanticIds.Length < 1) - yield break; - - foreach (var sme in smes) - { - if (sme == null || !(sme is T)) - continue; - - if (sme.SemanticId == null || sme.SemanticId.Keys.Count < 1) - { - if (invertedAllowed) - yield return (T)sme; - continue; - } - - var found = false; - foreach (var semanticId in allowedSemanticIds) - if (sme.SemanticId.Matches(semanticId)) - { - found = true; - break; - } - - if (invertedAllowed) - found = !found; - - if (found) - yield return (T)sme; - } - } - - public static T FindFirstAnySemanticId( - this List submodelElements, string[] allowedSemanticIds, - bool invertAllowed = false) where T : ISubmodelElement - { - return submodelElements.FindAllSemanticId(allowedSemanticIds, invertAllowed).FirstOrDefault(); - } - - public static IEnumerable FindAllSemanticId( - this List smes, - IKey[] allowedSemanticIds, MatchMode mm = MatchMode.Strict, - bool invertedAllowed = false) where T : ISubmodelElement - { - if (allowedSemanticIds == null || allowedSemanticIds.Length < 1) - yield break; - - foreach (var sme in smes) - { - if (sme == null || !(sme is T)) - continue; - - if (sme.SemanticId == null || sme.SemanticId.Keys.Count < 1) - { - if (invertedAllowed) - yield return (T)sme; - continue; - } - - var found = false; - foreach (var semanticId in allowedSemanticIds) - if (sme.SemanticId.MatchesExactlyOneKey(semanticId, mm)) - { - found = true; - break; - } - - if (invertedAllowed) - found = !found; - - if (found) - yield return (T)sme; - } - } - - public static T FindFirstAnySemanticId( - this List submodelElements, - IKey[] allowedSemanticIds, MatchMode mm = MatchMode.Strict, - bool invertAllowed = false) where T : ISubmodelElement - { - return submodelElements.FindAllSemanticId(allowedSemanticIds, mm, invertAllowed).FirstOrDefault(); - } - - public static IEnumerable FindAllSemanticId( - this List submodelElements, IKey semId, - Type[] allowedTypes = null, - MatchMode matchMode = MatchMode.Strict) - { - foreach (var smw in submodelElements) - if (smw != null && smw.SemanticId != null) - { - if (smw == null) - continue; - - if (allowedTypes != null) - { - var smwt = smw.GetType(); - if (!allowedTypes.Contains(smwt)) - continue; - } - - if (smw.SemanticId.MatchesExactlyOneKey(semId, matchMode)) - yield return smw; - } - } - - public static ISubmodelElement FindFirstSemanticId( - this List submodelElements, - IKey semId, Type[] allowedTypes = null, MatchMode matchMode = MatchMode.Strict) - { - return submodelElements.FindAllSemanticId(semId, allowedTypes, matchMode)?.FirstOrDefault(); - } - - public static IEnumerable FindAllSemanticIdAs( - this List smes, - ConceptDescription cd, MatchMode matchMode = MatchMode.Strict) - where T : ISubmodelElement - { - foreach (var x in FindAllSemanticIdAs(smes, cd.GetReference(), matchMode)) - yield return x; - } - - public static T FindFirstSemanticIdAs( - this List smes, - ConceptDescription cd, MatchMode matchMode = MatchMode.Strict) - where T : ISubmodelElement - { - return smes.FindAllSemanticIdAs(cd, matchMode).FirstOrDefault(); - } - - public static string IterateIdShortTemplateToBeUnique(this List submodelElements, string idShortTemplate, int maxNum) - { - if (idShortTemplate == null || maxNum < 1 || !idShortTemplate.Contains("{0")) - return null; - - int i = 1; - while (i < maxNum) - { - var ids = string.Format(idShortTemplate, i); - if (submodelElements.CheckIdShortIsUnique(ids)) - return ids; - i++; - } - - return null; - } - - /// - /// Returns false, if there is another element with same idShort in the list - /// - public static bool CheckIdShortIsUnique(this List submodelElements, string idShort) - { - idShort = idShort?.Trim(); - if (idShort == null || idShort.Length < 1) - return false; - - var res = true; - foreach (var smw in submodelElements) - if (smw != null && smw.IdShort != null && smw.IdShort == idShort) - { - res = false; - break; - } - - return res; - } - - #endregion - - public static ISubmodelElement UpdateFrom(this ISubmodelElement elem, ISubmodelElement source) - { - if (source == null) - return elem; - - // IReferable - elem.Category = source.Category; - elem.IdShort = source.IdShort; - elem.DisplayName = source.DisplayName?.Copy(); - elem.Description = source.Description?.Copy(); - - - // IHasSemantics - if (source.SemanticId != null) - elem.SemanticId = source.SemanticId.Copy(); - if (source.SupplementalSemanticIds != null) - elem.SupplementalSemanticIds = source.SupplementalSemanticIds.Copy(); - - // IQualifiable - if (source.Qualifiers != null) - elem.Qualifiers = source.Qualifiers.Copy(); - - // IHasDataSpecification - if (source.EmbeddedDataSpecifications != null) - elem.EmbeddedDataSpecifications = source.EmbeddedDataSpecifications.Copy(); - - return elem; - } - - // - // Factories - // - - private static readonly Dictionary AasSubmodelElementsToAbbrev = ( - new Dictionary() - { - { AasSubmodelElements.AnnotatedRelationshipElement, "RelA" }, - { AasSubmodelElements.BasicEventElement, "BEvt" }, - { AasSubmodelElements.Blob, "Blob" }, - { AasSubmodelElements.Capability, "Cap" }, - { AasSubmodelElements.DataElement, "DE" }, - { AasSubmodelElements.Entity, "Ent" }, - { AasSubmodelElements.EventElement, "Evt" }, - { AasSubmodelElements.File, "File" }, - { AasSubmodelElements.MultiLanguageProperty, "MLP" }, - { AasSubmodelElements.Operation, "Opr" }, - { AasSubmodelElements.Property, "Prop" }, - { AasSubmodelElements.Range, "Range" }, - { AasSubmodelElements.ReferenceElement, "Ref" }, - { AasSubmodelElements.RelationshipElement, "Rel" }, - { AasSubmodelElements.SubmodelElement, "SME" }, - { AasSubmodelElements.SubmodelElementList, "SML" }, - { AasSubmodelElements.SubmodelElementCollection, "SMC" } - }); - - /// - /// Retrieve the string abbreviation of . - /// - /// - /// If is not a valid literal, return null. - /// - public static string? ToString(AasSubmodelElements? that) - { - if (!that.HasValue) - { - return null; - } - else - { - if (AasSubmodelElementsToAbbrev.TryGetValue(that.Value, out string? value)) - { - return value; - } - else - { - return null; - } - } - } - - private static readonly Dictionary _aasSubmodelElementsFromAbbrev = ( - new Dictionary() - { - { "RelA", AasSubmodelElements.AnnotatedRelationshipElement }, - { "BEvt", AasSubmodelElements.BasicEventElement }, - { "Blob", AasSubmodelElements.Blob }, - { "Cap", AasSubmodelElements.Capability }, - { "DE", AasSubmodelElements.DataElement }, - { "Ent", AasSubmodelElements.Entity }, - { "Evt", AasSubmodelElements.EventElement }, - { "File", AasSubmodelElements.File }, - { "MLP", AasSubmodelElements.MultiLanguageProperty }, - { "Opr", AasSubmodelElements.Operation }, - { "Prop", AasSubmodelElements.Property }, - { "Range", AasSubmodelElements.Range }, - { "Ref", AasSubmodelElements.ReferenceElement }, - { "Rel", AasSubmodelElements.RelationshipElement }, - { "SME", AasSubmodelElements.SubmodelElement }, - { "SML", AasSubmodelElements.SubmodelElementList }, - { "SMC", AasSubmodelElements.SubmodelElementCollection } - }); - - /// - /// Parse the string abbreviation of . - /// - /// - /// If is not a valid string representation - /// of a literal of , - /// return null. - /// - public static AasSubmodelElements? AasSubmodelElementsFromAbbrev(string text) - { - if (_aasSubmodelElementsFromAbbrev.TryGetValue(text, out AasSubmodelElements value)) - { - return value; - } - else - { - return null; - } - } - - /// - /// Parse the string representation or the abbreviation of . - /// - /// - /// If is not a valid string representation - /// of a literal of , - /// return null. - /// - public static AasSubmodelElements? AasSubmodelElementsFromStringOrAbbrev(string text) - { - var res = Stringification.AasSubmodelElementsFromString(text); - if (res.HasValue) - return res; - - return AasSubmodelElementsFromAbbrev(text); - } - - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendKey.cs b/src/AasxCsharpLibrary/Extensions/ExtendKey.cs deleted file mode 100644 index f2c09ffa6..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendKey.cs +++ /dev/null @@ -1,268 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using AdminShellNS; -using System; -using System.Collections.Generic; -using System.Runtime.CompilerServices; -using System.Text.RegularExpressions; - -namespace Extensions -{ - public static class ExtendKey - { - public static IKey CreateFrom(Reference r) - { - if (r == null || r.Count() != 1) - return null; - return r.Keys[0].Copy(); - } - - public static bool Matches(this IKey key, - KeyTypes type, string id, MatchMode matchMode = MatchMode.Strict) - { - key.Value = key.Value.Trim(); - id = id.Trim(); - - if (matchMode == MatchMode.Strict) - return key.Type == type && key.Value.Replace("*01", "") == id.Replace("*01", ""); - - if (matchMode == MatchMode.Relaxed) - return (key.Type == type || key.Type == KeyTypes.GlobalReference || type == KeyTypes.GlobalReference) - && key.Value.Replace("*01", "") == id.Replace("*01", ""); - - if (matchMode == MatchMode.Identification) - return key.Value.Replace("*01", "") == id.Replace("*01", ""); - - return false; - } - public static bool Matches(this IKey key, IKey otherKey) - { - key.Value = key.Value.Trim(); - otherKey.Value = otherKey.Value.Trim(); - - if (otherKey == null) - { - return false; - } - - if (key.Type == otherKey.Type && key.Value.Replace("*01", "").Equals(otherKey.Value.Replace("*01", ""))) - { - return true; - } - - return false; - } - - public static bool Matches(this IKey key, IKey otherKey, MatchMode matchMode = MatchMode.Strict) - { - key.Value = key.Value.Trim(); - otherKey.Value = otherKey.Value.Trim(); - - if (matchMode == MatchMode.Strict) - return key.Type == otherKey.Type && key.Value.Replace("*01", "") == otherKey.Value.Replace("*01", ""); - - if (matchMode == MatchMode.Relaxed) - return (key.Type == otherKey.Type || key.Type == KeyTypes.GlobalReference || otherKey.Type == KeyTypes.GlobalReference) - && (key.Value.Replace("*01", "") == otherKey.Value.Replace("*01", "")); - - if (matchMode == MatchMode.Identification) - return key.Value.Replace("*01", "") == otherKey.Value.Replace("*01", ""); - - return false; - } - - public static bool MatchesSetOfTypes(this IKey key, IEnumerable set) - { - foreach (var kt in set) - if (key.Type == kt) - return true; - return false; - } - - public static AasValidationAction Validate(this IKey key, AasValidationRecordList results, IReferable container) - { - // access - if (results == null || container == null) - return AasValidationAction.No; - - var res = AasValidationAction.No; - - // check - if (key == null) - { - // violation case - results.Add(new AasValidationRecord( - AasValidationSeverity.SpecViolation, container, - "Key: is null", - () => - { - res = AasValidationAction.ToBeDeleted; - })); - } - else - { - - // check type - var tf = AdminShellUtil.CheckIfInConstantStringArray(Enum.GetNames(typeof(KeyTypes)), Stringification.ToString(key.Type)); - if (tf == AdminShellUtil.ConstantFoundEnum.No) - // violation case - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, container, - "Key: type is not in allowed enumeration values", - () => - { - key.Type = KeyTypes.GlobalReference; - })); - if (tf == AdminShellUtil.ConstantFoundEnum.AnyCase) - // violation case - // dead-csharp off - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, container, - "Key: type in wrong casing", - () => - { - //NO IdType in V3 - //key.idType = AdminShellUtil.CorrectCasingForConstantStringArray( - // KeyElements, key.type); - })); - // dead-csharp on - } - - // may give result "to be deleted" - return res; - } - - public static string ToStringExtended(this IKey key, int format = 1) - { - if (format == 2) - return "" + key.Value; - return $"[{key.Type}, {key.Value}]"; - } - - public static bool IsAbsolute(this IKey key) - { - return key.Type == KeyTypes.GlobalReference || key.Type == KeyTypes.AssetAdministrationShell || key.Type == KeyTypes.Submodel; - } - - public static Key Parse(string cell, KeyTypes typeIfNotSet = KeyTypes.GlobalReference, - bool allowFmtAll = false, bool allowFmt0 = false, - bool allowFmt1 = false, bool allowFmt2 = false) - { - // access and defaults? - if (cell == null || cell.Trim().Length < 1) - return null; - - // format == 1 - if (allowFmtAll || allowFmt1) - { - var m = Regex.Match(cell, @"\((\w+)\)( ?)(.*)$"); - if (m.Success) - { - return new Key( - Stringification.KeyTypesFromString(m.Groups[1].ToString()) ?? KeyTypes.GlobalReference, - m.Groups[3].ToString()); - } - } - - // format == 2 - if (allowFmtAll || allowFmt2) - { - var m = Regex.Match(cell, @"( ?)(.*)$"); - if (m.Success) - { - return new Key( - typeIfNotSet, m.Groups[2].ToString()); - } - } - - // format == 0 - if (allowFmtAll || allowFmt0) - { - var m = Regex.Match(cell, @"\[(\w+),( ?)(.*)\]"); - if (m.Success) - { - return new Key( - Stringification.KeyTypesFromString(m.Groups[1].ToString()) ?? KeyTypes.GlobalReference, - m.Groups[3].ToString()); - } - } - - // no - return null; - } - - #region Guess identification types - - public enum IdType { Unknown = 0, IRI, IRDI }; - - public static IdType GuessIdType(string id) - { - // start - if (id == null) - return IdType.Unknown; - id = id.Trim().ToLower(); - - // IRDI? - if (Regex.IsMatch(id, @"(\d{3,4})\W+")) - return IdType.IRDI; - - // IRI? - // TODO (??, 0000-00-00): check for escaping - if (Regex.IsMatch(id, @"(\w{3,5})://")) - return IdType.IRI; - - // unsure - return IdType.Unknown; - } - - #endregion - - // dead-csharp off - // ------------------------------------------------------------------------------------------------------------- - #region Handling with enums for KeyTypes - - // see: https://stackoverflow.com/questions/27372816/how-to-read-the-value-for-an-enummember-attribute - //public static string? GetEnumMemberValue(this T value) - // where T : Enum - //{ - // return typeof(T) - // .GetTypeInfo() - // .DeclaredMembers - // .SingleOrDefault(x => x.Name == value.ToString()) - // ?.GetCustomAttribute(false) - // ?.Value; - //} - - //public static KeyTypes? MapFrom(AasReferables input) - //{ - // var st = input.GetEnumMemberValue(); - // var res = Stringification.KeyTypesFromString(st); - // return res; - //} - - //public static List MapFrom(IEnumerable input) - //{ - // List res = new(); - // foreach (var i in input) - // { - // var x = MapFrom(i); - // if (x.HasValue) - // res.Add(x.Value); - // } - // return res; - //} - - //public static List GetAllKeyTypesForAasReferables() - // => ExtendKey.MapFrom(Enum.GetValues(typeof(AasReferables)).OfType()); - - #endregion - // dead-csharp on - - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendKeyList.cs b/src/AasxCsharpLibrary/Extensions/ExtendKeyList.cs deleted file mode 100644 index d33903f44..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendKeyList.cs +++ /dev/null @@ -1,194 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using Extensions; -using System.Collections.Generic; -using System.Linq; -using AdminShellNS; -using Aas = AasCore.Aas3_0; - -namespace Extensions -{ - public static class ExtendKeyList - { - public static bool IsEmpty(this List keys) - { - return keys.Count < 1; - } - - public static bool Matches(this List keys, List other, MatchMode matchMode = MatchMode.Strict) - { - if (other == null || other.Count != keys.Count) - return false; - - var same = true; - for (int i = 0; i < keys.Count; i++) - same = same && keys[i].Matches(other[i], matchMode); - - return same; - } - - public static List ReplaceLastKey(this List keys, List newKeys) - { - var res = new List(keys); - if (res.Count < 1 || newKeys == null || newKeys.Count < 1) - return res; - - res.Remove(res.Last()); - res.AddRange(newKeys); - return res; - } - - public static bool StartsWith(this List keyList, List otherKeyList) - { - if (otherKeyList == null || otherKeyList.Count == 0) - return false; - - // simply test element-wise - for (int i = 0; i < otherKeyList.Count; i++) - { - // does head have more elements than this list? - if (i >= keyList.Count) - return false; - - if (!otherKeyList[i].Matches(keyList[i])) - return false; - } - - // ok! - return true; - } - - public static bool StartsWith(this List keyList, List head, bool emptyIsTrue = false, - MatchMode matchMode = MatchMode.Relaxed) - { - // access - if (head == null) - return false; - if (head.Count == 0) - return emptyIsTrue; - - // simply test element-wise - for (int i = 0; i < head.Count; i++) - { - // does head have more elements than this list? - if (i >= keyList.Count) - return false; - - if (!head[i].Matches(keyList[i], matchMode)) - return false; - } - - // ok! - return true; - } - - public static string ToStringExtended(this List keys, int format = 1, string delimiter = ",") - { - return string.Join(delimiter, keys.Select((k) => k.ToStringExtended(format))); - } - - public static void Validate(this List keys, AasValidationRecordList results, - IReferable container) - { - // access - if (results == null || keys == null || container == null) - return; - - // iterate thru - var idx = 0; - while (idx < keys.Count) - { - var act = keys[idx].Validate(results, container); - if (act == AasValidationAction.ToBeDeleted) - { - keys.RemoveAt(idx); - continue; - } - idx++; - } - } - - public static bool MatchesSetOfTypes(this List key, IEnumerable set) - { - var res = true; - foreach (var kt in key) - if (!key.MatchesSetOfTypes(set)) - res = false; - return res; - } - - public static List Parse(string input) - { - // access - if (input == null) - return null; - - // split - var parts = input.Split(',', ';'); - var kl = new List(); - - foreach (var p in parts) - { - var k = ExtendKey.Parse(p); - if (k != null) - kl.Add(k); - } - - return kl; - } - - /// - /// Take only idShort from Referables, ignore all other key-types and create a '/'-separated list - /// - /// Empty string or list of idShorts - public static string BuildIdShortPath(this List keyList, - int startPos = 0, int count = int.MaxValue) - { - if (keyList == null || startPos >= keyList.Count) - return ""; - int nr = 0; - var res = ""; - for (int i = startPos; i < keyList.Count && nr < count; i++) - { - nr++; - //// if (keyList[i].Type.Trim().ToLower() == Key.IdShort.Trim().ToLower()) - if (Aas.Constants.AasReferableNonIdentifiables.Contains(keyList[i].Type)) - { - if (res != "") - res += "/"; - res += keyList[i].Value; - } - } - return res; - } - - public static List SubList(this List keyList, - int startPos, int count = int.MaxValue) - { - var res = new List(); - if (startPos >= keyList.Count()) - return res; - int nr = 0; - for (int i = startPos; i < keyList.Count() && nr < count; i++) - { - nr++; - res.Add(keyList[i]); - } - return res; - } - - public static List ToKeyList(this List keyList) - { - var res = new List(); - foreach (var ki in keyList) - res.Add(new Key(ki.Type, ki.Value)); - return res; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendKeyTypes.cs b/src/AasxCsharpLibrary/Extensions/ExtendKeyTypes.cs deleted file mode 100644 index c8dc4ae40..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendKeyTypes.cs +++ /dev/null @@ -1,21 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -namespace Extensions -{ - public static class ExtendKeyTypes - { - public static bool IsSME(this KeyTypes keyType) - { - foreach (var kt in Constants.AasSubmodelElementsAsKeys) - if (kt.HasValue && kt.Value == keyType) - return true; - return false; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendLangString.cs b/src/AasxCsharpLibrary/Extensions/ExtendLangString.cs deleted file mode 100644 index 24f54f9af..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendLangString.cs +++ /dev/null @@ -1,66 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System.Collections.Generic; - -namespace Extensions -{ - //TODO (jtikekar, 0000-00-00): remove - public static class ExtendLangString - { - // constants - public static string LANG_DEFAULT = "en"; - - // new version - public static string GetDefaultStringGen(List langStrings, string defaultLang = null) - where T : IAbstractLangString - { - // start - if (defaultLang == null) - defaultLang = "en"; - defaultLang = defaultLang.Trim().ToLower(); - string res = null; - - // search - foreach (var ls in langStrings) - if (ls.Language.Trim().ToLower() == defaultLang) - res = ls.Text; - if (res == null && langStrings.Count > 0) - res = langStrings[0].Text; - - // found? - return res; - } - - public static IAbstractLangString Create(string language, string text) where T : IAbstractLangString - { - if (typeof(T).IsAssignableFrom(typeof(ILangStringTextType))) - { - return new LangStringTextType(language, text); - } - else if (typeof(T).IsAssignableFrom(typeof(ILangStringNameType))) - { - return new LangStringNameType(language, text); - } - else if (typeof(T).IsAssignableFrom(typeof(ILangStringPreferredNameTypeIec61360))) - { - return new LangStringPreferredNameTypeIec61360(language, text); - } - else if (typeof(T).IsAssignableFrom(typeof(ILangStringShortNameTypeIec61360))) - { - return new LangStringShortNameTypeIec61360(language, text); - } - else if (typeof(T).IsAssignableFrom(typeof(ILangStringDefinitionTypeIec61360))) - { - return new LangStringDefinitionTypeIec61360(language, text); - } - else - return null; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendLangStringSet.cs b/src/AasxCsharpLibrary/Extensions/ExtendLangStringSet.cs deleted file mode 100644 index de4477e3f..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendLangStringSet.cs +++ /dev/null @@ -1,199 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System; -using System.Collections.Generic; -using System.Text.RegularExpressions; - -namespace Extensions -{ - //TODO (jtikekar, 0000-00-00): remove or seperate - public static class ExtendLangStringSet - { - #region AasxPackageExplorer - - public static bool IsValid(this List langStringSet) - { - if (langStringSet != null && langStringSet.Count >= 1) - { - return true; - } - - return false; - } - - #endregion - public static bool IsEmpty(this List langStringSet) - { - if (langStringSet == null || langStringSet.Count == 0) - { - return true; - } - - return false; - } - // dead-csharp off - //public static string GetDefaultString(this List langStringSet, string defaultLang = null) - //{ - // return ExtendLangString.GetDefaultStringGen(langStringSet, defaultLang); - //// start - //if (defaultLang == null) - // defaultLang = "en"; //Default Lang in old implementation is en - - //string res = null; - - //// search - //foreach (var langString in langStringSet) - // if (langString.Language.Equals(defaultLang, StringComparison.OrdinalIgnoreCase)) - // res = langString.Text; - - //if (res == null && langStringSet.Count > 0) - // res = langStringSet[0].Text; - - //// found? - //return res; - //} - // dead-csharp on - public static List Create(string language, string text) where T : IAbstractLangString, new() - { - return new List { new T { Language = language, Text = text } }; - } - - public static List CreateLangStringNameType(string language, string text) - { - return new List { new LangStringNameType(language, text) }; - } - - public static List CreateLangStringTextType(string language, string text) - { - return new List { new LangStringTextType(language, text) }; - } - - public static List CreateManyPreferredNamesFromStringArray(string[] s) - { - if (s == null) - return null; - var r = new List(); - var i = 0; - while ((i + 1) < s.Length) - { - r.Add(new LangStringPreferredNameTypeIec61360(s[i], s[i + 1])); - i += 2; - } - return r; - } - public static List CreateManyDefinitionFromStringArray(string[] s) - { - if (s == null) - return null; - var r = new List(); - var i = 0; - while ((i + 1) < s.Length) - { - r.Add(new LangStringDefinitionTypeIec61360(s[i], s[i + 1])); - i += 2; - } - return r; - } - - public static List Set(this List lss, string lang, string text) - { - foreach (var ls in lss) - if (ls.Language.Trim().ToLower() == lang?.Trim().ToLower()) - { - ls.Text = text; - return lss; - } - lss.Add(new LangStringTextType(lang, text)); - return lss; - } - - public static List ConvertFromV20( - this List langStringSet, - AasxCompatibilityModels.AdminShellV20.LangStringSet sourceLangStrings) - { - - if (sourceLangStrings.langString != null && sourceLangStrings.langString.Count != 0) - { - langStringSet = new List(); - foreach (var sourceLangString in sourceLangStrings.langString) - { - var langString = new LangStringTextType(sourceLangString.lang, sourceLangString.str); - langStringSet.Add(langString); - } - } - return langStringSet; - } - - public static List Parse(string cell, - Func createLs) where T : class - { - // access - if (cell == null || createLs == null) - return null; - - // iterative approach - var res = new List(); - while (true) - { - // trivial case and finite end - if (!cell.Contains("@")) - { - if (cell.Trim() != "") - { - res.Add(createLs(ExtendLangString.LANG_DEFAULT, cell)); - } - break; - } - - // OK, pick the next couple - var m = Regex.Match(cell, @"(.*?)@(\w+)", RegexOptions.Singleline); - if (!m.Success) - { - // take emergency exit? - res.Add(createLs("??", cell)); - } - - // use the match and shorten cell .. - res.Add(createLs(m.Groups[2].ToString(), m.Groups[1].ToString().Trim())); - cell = cell.Substring(m.Index + m.Length); - } - - return res; - } - - public static void Add(this List list, string language, string text) where T : IAbstractLangString - { - if (typeof(T).IsAssignableFrom(typeof(ILangStringTextType))) - { - (list as List) - .Add(new LangStringTextType(language, text)); - } - else if (typeof(T).IsAssignableFrom(typeof(ILangStringNameType))) - { - (list as List) - .Add(new LangStringNameType(language, text)); - } - else if (typeof(T).IsAssignableFrom(typeof(ILangStringPreferredNameTypeIec61360))) - { - (list as List) - .Add(new LangStringPreferredNameTypeIec61360(language, text)); - } - else if (typeof(T).IsAssignableFrom(typeof(ILangStringShortNameTypeIec61360))) - { - (list as List) - .Add(new LangStringShortNameTypeIec61360(language, text)); - } - else if (typeof(T).IsAssignableFrom(typeof(ILangStringDefinitionTypeIec61360))) - { - (list as List) - .Add(new LangStringDefinitionTypeIec61360(language, text)); - } - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendModelKind.cs b/src/AasxCsharpLibrary/Extensions/ExtendModelKind.cs deleted file mode 100644 index 75ad82fba..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendModelKind.cs +++ /dev/null @@ -1,35 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using AdminShellNS; - -namespace Extensions -{ - public static class ExtendModelKind - { - public static void Validate(this ModellingKind modelingKind, AasValidationRecordList results, IReferable container) - { - // access - if (results == null || container == null) - return; - - // check - if (modelingKind != ModellingKind.Template && modelingKind != ModellingKind.Instance) - { - // violation case - results.Add(new AasValidationRecord( - AasValidationSeverity.SchemaViolation, container, - $"ModelingKind: enumeration value neither Template nor Instance", - () => - { - modelingKind = ModellingKind.Instance; - })); - } - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendMultiLanguageProperty.cs b/src/AasxCsharpLibrary/Extensions/ExtendMultiLanguageProperty.cs deleted file mode 100644 index 4d0c9f65b..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendMultiLanguageProperty.cs +++ /dev/null @@ -1,140 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using AdminShellNS; -using System; -using System.Collections.Generic; - -namespace Extensions -{ - public static class ExtendMultiLanguageProperty - { - #region AasxPackageExplorer - - public static void ValueFromText(this MultiLanguageProperty multiLanguageProperty, string text, string defaultLang) - { - multiLanguageProperty.Value ??= new List(); - - multiLanguageProperty.Value.Add(new LangStringTextType(defaultLang == null ? "en" : defaultLang, text)); - } - - #endregion - - public static string ValueAsText(this MultiLanguageProperty multiLanguageProperty, string defaultLang = null) - { - // dead-csharp off - //TODO (jtikekar, 0000-00-00): need to check/test again - //return "" + multiLanguageProperty.Value?.LangStrings.FirstOrDefault().Text; - // dead-csharp on - return "" + multiLanguageProperty.Value?.GetDefaultString(defaultLang); - } - - public static MultiLanguageProperty ConvertFromV20(this MultiLanguageProperty property, AasxCompatibilityModels.AdminShellV20.MultiLanguageProperty sourceProperty) - { - if (sourceProperty == null) - { - return null; - } - - if (sourceProperty.valueId != null) - { - var keyList = new List(); - foreach (var refKey in sourceProperty.valueId.Keys) - { - - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value not found for property {property.IdShort}"); - } - } - property.ValueId = new Reference(ReferenceTypes.ExternalReference, keyList); - } - - if (sourceProperty.value != null && !sourceProperty.value.IsEmpty) - { - var newLangStrings = new List(); - - List newLangStringSet = new(newLangStrings); - - property.Value = newLangStringSet.ConvertFromV20(sourceProperty.value); - } - - return property; - - } - - public static MultiLanguageProperty UpdateFrom( - this MultiLanguageProperty elem, ISubmodelElement source) - { - if (source == null) - return elem; - - ((ISubmodelElement)elem).UpdateFrom(source); - - if (source is Property srcProp) - { - elem.Value = new List { - new LangStringTextType(AdminShellUtil.GetDefaultLngIso639(), srcProp.Value) }; - if (srcProp.ValueId != null) - elem.ValueId = srcProp.ValueId.Copy(); - } - - if (source is MultiLanguageProperty srcMlp) - { - if (srcMlp.Value != null) - elem.Value = srcMlp.Value.Copy(); - if (srcMlp.ValueId != null) - elem.ValueId = srcMlp.ValueId.Copy(); - } - - if (source is AasCore.Aas3_0.Range srcRng) - { - if (srcRng.Min != null) - elem.Value = new List { - new LangStringTextType(AdminShellUtil.GetDefaultLngIso639(), srcRng.Min) }; - } - - if (source is File srcFile) - { - elem.Value = new List { - new LangStringTextType(AdminShellUtil.GetDefaultLngIso639(), srcFile.Value) }; - } - - return elem; - } - - public static MultiLanguageProperty Set(this MultiLanguageProperty mlp, - List ls) - { - mlp.Value = ls; - return mlp; - } - - public static MultiLanguageProperty Set(this MultiLanguageProperty mlp, - LangStringTextType ls) - { - if (ls == null) - return mlp; - if (mlp.Value == null) - mlp.Value = new List(); - mlp.Value.Set(ls.Language, ls.Text); - return mlp; - } - - public static MultiLanguageProperty Set(this MultiLanguageProperty mlp, - string lang, string str) - { - return mlp.Set(new LangStringTextType(lang, str)); - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendObject.cs b/src/AasxCsharpLibrary/Extensions/ExtendObject.cs deleted file mode 100644 index ccc968476..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendObject.cs +++ /dev/null @@ -1,144 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System; -using System.Collections.Generic; -using System.Reflection; -using Extensions.ArrayExtensions; - -namespace Extensions -{ - public static class ExtendObject - { - private static readonly MethodInfo CloneMethod = typeof(Object).GetMethod("MemberwiseClone", BindingFlags.NonPublic | BindingFlags.Instance); - - public static bool IsPrimitive(this Type type) - { - if (type == typeof(String)) return true; - return (type.IsValueType & type.IsPrimitive); - } - - public static Object Copy(this Object originalObject) - { - return InternalCopy(originalObject, new Dictionary(new ReferenceEqualityComparer())); - } - - private static Object InternalCopy(Object originalObject, IDictionary visited) - { - if (originalObject == null) return null; - var typeToReflect = originalObject.GetType(); - if (IsPrimitive(typeToReflect)) return originalObject; - if (visited.ContainsKey(originalObject)) return visited[originalObject]; - if (typeof(Delegate).IsAssignableFrom(typeToReflect)) return null; - var cloneObject = CloneMethod.Invoke(originalObject, null); - if (typeToReflect.IsArray) - { - var arrayType = typeToReflect.GetElementType(); - if (IsPrimitive(arrayType) == false) - { - Array clonedArray = (Array)cloneObject; - clonedArray.ForEach((array, indices) => array.SetValue(InternalCopy(clonedArray.GetValue(indices), visited), indices)); - } - - } - visited.Add(originalObject, cloneObject); - CopyFields(originalObject, visited, cloneObject, typeToReflect); - RecursiveCopyBaseTypePrivateFields(originalObject, visited, cloneObject, typeToReflect); - return cloneObject; - } - - private static void RecursiveCopyBaseTypePrivateFields(object originalObject, IDictionary visited, object cloneObject, Type typeToReflect) - { - if (typeToReflect.BaseType != null) - { - RecursiveCopyBaseTypePrivateFields(originalObject, visited, cloneObject, typeToReflect.BaseType); - CopyFields(originalObject, visited, cloneObject, typeToReflect.BaseType, BindingFlags.Instance | BindingFlags.NonPublic, info => info.IsPrivate); - } - } - - private static void CopyFields(object originalObject, IDictionary visited, object cloneObject, Type typeToReflect, - BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.FlattenHierarchy, - Func filter = null) - { - foreach (FieldInfo fieldInfo in typeToReflect.GetFields(bindingFlags)) - { - if (filter != null && filter(fieldInfo) == false) continue; - if (IsPrimitive(fieldInfo.FieldType)) continue; - var originalFieldValue = fieldInfo.GetValue(originalObject); - var clonedFieldValue = InternalCopy(originalFieldValue, visited); - fieldInfo.SetValue(cloneObject, clonedFieldValue); - } - } - public static T Copy(this T original) - { - return (T)Copy((Object)original); - } - } - - public class ReferenceEqualityComparer : EqualityComparer - { - public override bool Equals(object x, object y) - { - return ReferenceEquals(x, y); - } - public override int GetHashCode(object obj) - { - if (obj == null) return 0; - return obj.GetHashCode(); - } - } - - namespace ArrayExtensions - { - public static class ArrayExtensions - { - public static void ForEach(this Array array, Action action) - { - if (array.LongLength == 0) return; - ArrayTraverse walker = new ArrayTraverse(array); - do action(array, walker.Position); - while (walker.Step()); - } - } - - internal class ArrayTraverse - { - public int[] Position; - private int[] maxLengths; - - public ArrayTraverse(Array array) - { - maxLengths = new int[array.Rank]; - for (int i = 0; i < array.Rank; ++i) - { - maxLengths[i] = array.GetLength(i) - 1; - } - Position = new int[array.Rank]; - } - - public bool Step() - { - for (int i = 0; i < Position.Length; ++i) - { - if (Position[i] < maxLengths[i]) - { - Position[i]++; - for (int j = 0; j < i; j++) - { - Position[j] = 0; - } - return true; - } - } - return false; - } - } - } - -} - diff --git a/src/AasxCsharpLibrary/Extensions/ExtendOperation.cs b/src/AasxCsharpLibrary/Extensions/ExtendOperation.cs deleted file mode 100644 index d6ff4e2c1..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendOperation.cs +++ /dev/null @@ -1,157 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using AdminShellNS; -using System.Collections.Generic; -using System.Linq; - -namespace Extensions -{ - public static class ExtendOperation - { - #region AasxPackageExplorer - - public static object AddChild(this IOperation operation, ISubmodelElement childSubmodelElement, EnumerationPlacmentBase placement = null) - { - // not enough information to select list of children? - var pl = placement as EnumerationPlacmentOperationVariable; - if (childSubmodelElement == null || pl == null) - return null; - - // ok, use information - var ov = new OperationVariable(childSubmodelElement); - - if (childSubmodelElement != null) - childSubmodelElement.Parent = operation; - - if (pl.Direction == OperationVariableDirection.In) - { - operation.InputVariables ??= new List(); - operation.InputVariables.Add(ov); - } - - if (pl.Direction == OperationVariableDirection.Out) - { - operation.OutputVariables ??= new List(); - operation.OutputVariables.Add(ov); - } - - if (pl.Direction == OperationVariableDirection.InOut) - { - operation.InoutputVariables ??= new List(); - operation.InoutputVariables.Add(ov); - } - - return ov; - } - - public static EnumerationPlacmentBase GetChildrenPlacement(this IOperation operation, ISubmodelElement child) - { - // trivial - if (child == null) - return null; - - // search - OperationVariableDirection? dir = null; - IOperationVariable opvar = null; - if (operation.InputVariables != null) - foreach (var ov in operation.InputVariables) - if (ov?.Value == child) - { - dir = OperationVariableDirection.In; - opvar = ov; - } - - if (operation.OutputVariables != null) - foreach (var ov in operation.OutputVariables) - if (ov?.Value == child) - { - dir = OperationVariableDirection.Out; - opvar = ov; - } - - if (operation.InoutputVariables != null) - foreach (var ov in operation.InoutputVariables) - if (ov?.Value == child) - { - dir = OperationVariableDirection.InOut; - opvar = ov; - } - - // found - if (!dir.HasValue) - return null; - return new EnumerationPlacmentOperationVariable() - { - Direction = dir.Value, - OperationVariable = opvar as OperationVariable - }; - } - - public static List GetVars(this IOperation op, OperationVariableDirection dir) - { - if (dir == OperationVariableDirection.In) - return op.InputVariables; - if (dir == OperationVariableDirection.Out) - return op.OutputVariables; - return op.InoutputVariables; - } - - public static List SetVars( - this IOperation op, OperationVariableDirection dir, List value) - { - if (dir == OperationVariableDirection.In) - { - op.InputVariables = value; - return op.InputVariables; - } - if (dir == OperationVariableDirection.Out) - { - op.OutputVariables = value; - return op.OutputVariables; - } - - op.InoutputVariables = value; - return op.InoutputVariables; - } - - #endregion - - public static IOperation UpdateFrom( - this IOperation elem, ISubmodelElement source) - { - if (source == null) - return elem; - - ((ISubmodelElement)elem).UpdateFrom(source); - - if (source is SubmodelElementCollection srcColl) - { - if (srcColl.Value != null) - { - List operationVariables = srcColl.Value.Copy().Select( - (isme) => new OperationVariable(isme)).ToList(); - elem.InputVariables = operationVariables.ConvertAll(op => (IOperationVariable)op); - } - - } - - if (source is SubmodelElementCollection srcList) - { - if (srcList.Value != null) - { - List operationVariables = srcList.Value.Copy().Select( - (isme) => new OperationVariable(isme)).ToList(); - elem.InputVariables = operationVariables.ConvertAll(op => (IOperationVariable)op); - } - } - - return elem; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendProperty.cs b/src/AasxCsharpLibrary/Extensions/ExtendProperty.cs deleted file mode 100644 index f77a3765f..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendProperty.cs +++ /dev/null @@ -1,269 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; - -namespace Extensions -{ - public static class ExtendProperty - { - #region AasxPackageExplorer - - public static void ValueFromText(this Property property, string text) - { - property.Value = text; - } - - #endregion - public static bool IsValueTrue(this Property property) - { - if (property.ValueType == DataTypeDefXsd.Boolean) - { - if (property.Value.Equals("true", StringComparison.OrdinalIgnoreCase)) - { - return true; - } - } - - return false; - } - - public static string ValueAsText(this Property property) - { - return "" + property.Value; - } - - public static double? ValueAsDouble(this Property prop) - { - // pointless - if (prop.Value == null || prop.Value.Trim() == "") - return null; - - // type? - if (!ExtendDataElement.ValueTypes_Number.Contains(prop.ValueType)) - return null; - - // try convert - if (double.TryParse(prop.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out double dbl)) - return dbl; - - // no - return null; - } - public static Property ConvertFromV10(this Property property, AasxCompatibilityModels.AdminShellV10.Property sourceProperty) - { - if (sourceProperty == null) - { - return null; - } - var propertyType = Stringification.DataTypeDefXsdFromString("xs:" + sourceProperty.valueType); - if (propertyType != null) - { - property.ValueType = (DataTypeDefXsd)propertyType; - } - else - { - Console.WriteLine($"ValueType {sourceProperty.valueType} not found for property {sourceProperty.idShort}"); - } - property.Value = sourceProperty.value; - if (sourceProperty.valueId != null && !sourceProperty.valueId.IsEmpty) - { - var keyList = new List(); - foreach (var refKey in sourceProperty.valueId.Keys) - { - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {sourceProperty.valueType} not found for property {property.IdShort}"); - } - } - property.ValueId = new Reference(ReferenceTypes.ExternalReference, keyList); - } - - return property; - } - - public static Property ConvertFromV20(this Property property, AasxCompatibilityModels.AdminShellV20.Property sourceProperty) - { - if (sourceProperty == null) - { - return null; - } - - var propertyType = Stringification.DataTypeDefXsdFromString("xs:" + sourceProperty.valueType); - if (propertyType != null) - { - property.ValueType = (DataTypeDefXsd)propertyType; - } - else - { - Console.WriteLine($"ValueType {sourceProperty.valueType} not found for property {sourceProperty.idShort}"); - } - property.Value = sourceProperty.value; - if (sourceProperty.valueId != null && !sourceProperty.valueId.IsEmpty) - { - var keyList = new List(); - foreach (var refKey in sourceProperty.valueId.Keys) - { - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {sourceProperty.valueType} not found for property {property.IdShort}"); - } - } - property.ValueId = new Reference(ReferenceTypes.ExternalReference, keyList); - } - - return property; - } - - public static Property UpdateFrom(this Property elem, ISubmodelElement source) - { - if (source == null) - return elem; - - ((ISubmodelElement)elem).UpdateFrom(source); - - if (source is Property srcProp) - { - elem.ValueType = srcProp.ValueType; - elem.Value = srcProp.Value; - if (srcProp.ValueId != null) - elem.ValueId = srcProp.ValueId.Copy(); - } - - if (source is AasCore.Aas3_0.Range srcRng) - { - elem.ValueType = srcRng.ValueType; - elem.Value = srcRng.Min; - } - - if (source is MultiLanguageProperty srcMlp) - { - elem.ValueType = DataTypeDefXsd.String; - elem.Value = "" + srcMlp.Value?.GetDefaultString(); - if (srcMlp.ValueId != null) - elem.ValueId = srcMlp.ValueId.Copy(); - } - - if (source is File srcFile) - { - elem.ValueType = DataTypeDefXsd.String; - elem.Value = "" + srcFile.Value; - } - - return elem; - } - - // MIHO: Jui, why was this required? -#if OLD - - public static void UpdatePropertyFrom(this Property property, Property sourceProperty) - { - if (sourceProperty.Extensions != null) - { - property.Extensions = sourceProperty.Extensions; - } - if (sourceProperty.Category != null) - { - property.Category = sourceProperty.Category; - } - if (sourceProperty.IdShort != null) - { - property.IdShort = sourceProperty.IdShort; - } - if (sourceProperty.DisplayName != null) - { - property.DisplayName = sourceProperty.DisplayName; - } - if (sourceProperty.Description != null) - { - property.Description = sourceProperty.Description; - } - if (sourceProperty.Checksum != null) - { - property.Checksum = sourceProperty.Checksum; - } - if (sourceProperty.Kind != null) - { - property.Kind = sourceProperty.Kind; - } - if (sourceProperty.SemanticId != null) - { - property.SemanticId = sourceProperty.SemanticId; - } - if (sourceProperty.SupplementalSemanticIds != null) - { - property.SupplementalSemanticIds = sourceProperty.SupplementalSemanticIds; - } - if (sourceProperty.Qualifiers != null) - { - property.Qualifiers = sourceProperty.Qualifiers; - } - if (sourceProperty.EmbeddedDataSpecifications != null) - { - property.EmbeddedDataSpecifications = sourceProperty.EmbeddedDataSpecifications; - } - if (true) - { - property.ValueType = sourceProperty.ValueType; - } - if (sourceProperty.ValueId != null) - { - property.ValueId = sourceProperty.ValueId; - } - if (sourceProperty.Value != null) - { - property.Value = sourceProperty.Value; - } - } -#endif - - public static Property Set(this Property prop, - DataTypeDefXsd valueType = DataTypeDefXsd.String, string value = "") - { - prop.ValueType = valueType; - prop.Value = value; - return prop; - } - - public static Property Set(this Property prop, - KeyTypes type, string value) - { - prop.ValueId = ExtendReference.CreateFromKey(new Key(type, value)); - return prop; - } - - public static Property Set(this Property prop, - Qualifier q) - { - if (q != null) - prop.Add(q); - return prop; - } - - public static Property Set(this Property prop, - Extension ext) - { - if (ext != null) - prop.Add(ext); - return prop; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendQualifier.cs b/src/AasxCsharpLibrary/Extensions/ExtendQualifier.cs deleted file mode 100644 index 1851d4f06..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendQualifier.cs +++ /dev/null @@ -1,195 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System; -using System.Collections.Generic; -using System.Text.RegularExpressions; - -namespace Extensions -{ - public static class ExtendQualifier - { - public static Qualifier ConvertFromV10(this Qualifier qualifier, AasxCompatibilityModels.AdminShellV10.Qualifier sourceQualifier) - { - if (sourceQualifier.semanticId != null && !sourceQualifier.semanticId.IsEmpty) - { - var keyList = new List(); - foreach (var refKey in sourceQualifier.semanticId.Keys) - { - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {refKey.type} not found."); - } - } - qualifier.SemanticId = new Reference(ReferenceTypes.ExternalReference, keyList); - } - - qualifier.Type = sourceQualifier.qualifierType; - qualifier.Value = sourceQualifier.qualifierValue; - - if (sourceQualifier.qualifierValueId != null && !sourceQualifier.qualifierValueId.IsEmpty) - { - var keyList = new List(); - foreach (var refKey in sourceQualifier.qualifierValueId.Keys) - { - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {refKey.type} not found."); - } - } - qualifier.ValueId = new Reference(ReferenceTypes.ExternalReference, keyList); - } - - return qualifier; - } - - public static Qualifier ConvertFromV20(this Qualifier qualifier, AasxCompatibilityModels.AdminShellV20.Qualifier sourceQualifier) - { - if (sourceQualifier.semanticId != null && !sourceQualifier.semanticId.IsEmpty) - { - var keyList = new List(); - foreach (var refKey in sourceQualifier.semanticId.Keys) - { - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {refKey.type} not found."); - } - - } - qualifier.SemanticId = new Reference(ReferenceTypes.ExternalReference, keyList); - } - - qualifier.Type = sourceQualifier.type; - qualifier.Value = sourceQualifier.value; - - if (sourceQualifier.valueId != null && !sourceQualifier.valueId.IsEmpty) - { - var keyList = new List(); - foreach (var refKey in sourceQualifier.valueId.Keys) - { - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {refKey.type} not found."); - } - } - qualifier.ValueId = new Reference(ReferenceTypes.ExternalReference, keyList); - } - - return qualifier; - } - - // ReSharper disable MethodOverloadWithOptionalParameter .. this seems to work, anyhow - // ReSharper disable RedundantArgumentDefaultValue - public static string ToStringExtended(this IQualifier q, - int format = 0, string delimiter = ",") - { - var res = "" + q.Type; - if (res == "") - res += "" + q.SemanticId?.ToStringExtended(format, delimiter); - - if (q.Value != null) - res += " = " + q.Value; - else if (q.ValueId != null) - res += " = " + q.ValueId?.ToStringExtended(format, delimiter); - - return res; - } - // ReSharper enable MethodOverloadWithOptionalParameter - // ReSharper enable RedundantArgumentDefaultValue - - // - // - // List - // - // - - #region QualifierCollection - - public static IQualifier FindQualifierOfType(this List qualifiers, string qualifierType) - { - if (qualifierType == null) - { - return null; - } - - foreach (var qualifier in qualifiers) - { - if (qualifier != null && qualifierType.Equals(qualifier.Type)) - { - return qualifier; - } - } - - return null; - } - - // ReSharper disable MethodOverloadWithOptionalParameter .. this seems to work, anyhow - // ReSharper disable RedundantArgumentDefaultValue - public static string ToStringExtended(this List qualifiers, - int format = 0, string delimiter = ";", string referencesDelimiter = ",") - { - var res = ""; - foreach (var q in qualifiers) - { - if (res != "") - res += delimiter; - res += q.ToStringExtended(format, referencesDelimiter); - } - return res; - } - // ReSharper enable MethodOverloadWithOptionalParameter - // ReSharper enable RedundantArgumentDefaultValue - - public static IQualifier FindType(this List qualifiers, string type) - { - if (type == null || qualifiers == null) - return null; - foreach (var q in qualifiers) - if (q != null && q.Type != null && q.Type.Trim() == type.Trim()) - return q; - return null; - } - - public static Qualifier Parse(string input) - { - var m = Regex.Match(input, @"\s*([^,]*)(,[^=]+){0,1}\s*=\s*([^,]*)(,.+){0,1}\s*"); - if (!m.Success) - return null; - - return new Qualifier( - valueType: DataTypeDefXsd.String, - type: m.Groups[1].ToString().Trim(), - semanticId: ExtendReference.Parse(m.Groups[1].ToString().Trim()), - value: m.Groups[3].ToString().Trim(), - valueId: ExtendReference.Parse(m.Groups[1].ToString().Trim()) - ); - } - - #endregion - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendRange.cs b/src/AasxCsharpLibrary/Extensions/ExtendRange.cs deleted file mode 100644 index e3317b77a..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendRange.cs +++ /dev/null @@ -1,75 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System; -using AAS = AasCore.Aas3_0; - -namespace Extensions -{ - public static class ExtendRange - { - public static string ValueAsText(this AasCore.Aas3_0.Range range) - { - return "" + range.Min + " .. " + range.Max; - } - - public static AasCore.Aas3_0.Range ConvertFromV20(this AasCore.Aas3_0.Range range, AasxCompatibilityModels.AdminShellV20.Range sourceRange) - { - if (sourceRange == null) - { - return null; - } - - var propertyType = AAS.Stringification.DataTypeDefXsdFromString("xs:" + sourceRange.valueType); - if (propertyType != null) - { - range.ValueType = (AAS.DataTypeDefXsd)propertyType; - } - else - { - Console.WriteLine($"ValueType {sourceRange.valueType} not found for property {range.IdShort}"); - } - - range.Max = sourceRange.max; - range.Min = sourceRange.min; - - return range; - } - - public static AAS.Range UpdateFrom(this AAS.Range elem, AAS.ISubmodelElement source) - { - if (source == null) - return elem; - - ((AAS.ISubmodelElement)elem).UpdateFrom(source); - - if (source is AAS.Property srcProp) - { - elem.ValueType = srcProp.ValueType; - elem.Min = srcProp.Value; - elem.Max = elem.Min; - } - - if (source is AAS.MultiLanguageProperty srcMlp) - { - elem.ValueType = AAS.DataTypeDefXsd.String; - elem.Min = "" + srcMlp.Value?.GetDefaultString(); - elem.Max = elem.Min; - } - - if (source is AAS.File srcFile) - { - elem.ValueType = AAS.DataTypeDefXsd.String; - elem.Min = "" + srcFile.Value; - elem.Max = elem.Min; - } - - return elem; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendReference.cs b/src/AasxCsharpLibrary/Extensions/ExtendReference.cs deleted file mode 100644 index 61bb53df6..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendReference.cs +++ /dev/null @@ -1,309 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using AdminShellNS.Exceptions; -using System.Collections.Generic; -using System.Linq; - -namespace Extensions -{ - public static class ExtendReference - { - #region AasxPackageExplorer - - public static AasElementSelfDescription GetSelfDescription(this Reference reference) - { - return new AasElementSelfDescription("Reference", "Rfc", null, null); - } - - public static bool IsValid(this IReference reference) - { - return reference.Keys != null && !reference.Keys.IsEmpty(); - } - - public static bool IsValid(this List references) - { - bool isValid = false; - foreach (var reference in references) - { - isValid = IsValid(reference); - if (!isValid) - { - return false; - } - } - return isValid; - } - - /// - /// Formaly a static constructor. - /// Creates a Reference from a key, guessing Reference.Type. - /// - /// Given single Key - /// Reference with guessed type - public static Reference CreateFromKey(IKey k) - { - var res = new Reference(ReferenceTypes.ExternalReference, new List { k }); - res.Type = res.GuessType(); - return res; - } - - /// - /// Formaly a static constructor. - /// Creates a Reference from a key, guessing Reference.Type. - /// - public static Reference CreateFromKey(KeyTypes type, - string value) - { - var res = new Reference(ReferenceTypes.ExternalReference, - new List { new Key(type, value) }); - res.Type = res.GuessType(); - return res; - } - - /// - /// Formaly a static constructor. - /// Creates a Reference from a list of keys, guessing Reference.Type. - /// - /// - /// - public static Reference CreateNew(List lk) - { - var res = new Reference(ReferenceTypes.ExternalReference, new List()); - if (lk == null) - return res; - res.Keys.AddRange(lk.Copy()); - res.Type = res.GuessType(); - return res; - } - - // TODO (Jui, 2023-01-05): Check why the generic Copy does not apply here?! - public static Reference Copy(this Reference original) - { - var res = new Reference(original.Type, new List()); - if (original != null) - foreach (var o in original.Keys) - res.Add(o.Copy()); - return res; - } - - - public static Reference Parse(string input) - { - var res = new Reference(ReferenceTypes.ExternalReference, new List()); - if (input == null) - return res; - - res.Keys = ExtendKeyList.Parse(input); - res.Type = res.GuessType(); - return res; - } - - //This is alternative for operator overloding method +, as operator overloading cannot be done in extension classes - public static IReference Add(this IReference a, IReference b) - { - a.Keys?.AddRange(b?.Keys); - return a; - } - - public static IReference Add(this IReference a, IKey k) - { - if (k != null) - a.Keys?.Add(k); - return a; - } - - public static bool IsEmpty(this IReference reference) - { - if (reference == null || reference.Keys == null || reference.Keys.Count < 1) - { - return true; - } - - return false; - } - - #endregion - - public static bool Matches(this IReference reference, KeyTypes keyType, string id, MatchMode matchMode = MatchMode.Strict) - { - if (reference.IsEmpty()) - { - return false; - } - - if (reference.Keys.Count == 1) - { - var key = reference.Keys[0]; - return key.Matches(new Key(keyType, id), matchMode); - } - - return false; - } - - public static bool Matches(this IReference reference, string id) - { - if (string.IsNullOrEmpty(id)) - { - return false; - } - - if (reference.Keys.Count == 1) // As per old implementation - { - if (reference.Keys[0].Value == id) - return true; - } - - return false; - } - - public static bool Matches(this IReference reference, IReference otherReference, MatchMode matchMode = MatchMode.Strict) - { - if (reference.Keys == null || reference.Keys.Count == 0 - || otherReference?.Keys == null || otherReference.Keys.Count == 0 - || reference.Keys.Count != otherReference.Keys.Count) - { - return false; - } - - bool match = true; - for (int i = 0; i < reference.Keys.Count; i++) - { - match = match && reference.Keys[i].Matches(otherReference.Keys[i], matchMode); - } - - return match; - } - - public static bool MatchesExactlyOneKey(this IReference reference, IKey key, MatchMode matchMode = MatchMode.Strict) - { - if (key == null || reference.Keys == null || reference.Keys.Count != 1) - { - return false; - } - - var referenceKey = reference.Keys[0]; - return referenceKey.Matches(key, matchMode); - } - - public static string GetAsIdentifier(this IReference reference) - { - - if (reference != null && reference.Type == ReferenceTypes.ExternalReference) // Applying only to Global Reference, based on older implementation, TODO:Make it Generic - { - if (reference.Keys == null || reference.Keys.Count < 1) - { - return null; - } - - return reference.Keys[0].Value; - } - - //TODO (jtikekar, 2024-03-06): Refactor, added w.r.t. GitHub issue 11 - if(reference.Type == ReferenceTypes.ModelReference) - { - if (reference.Keys == null || reference.Keys.Count < 1) - { - return null; - } - - return reference.Keys[0].Value; - } - - return null; - } - - public static string MostSignificantInfo(this IReference reference) - { - if (reference.Keys.Count < 1) - { - return "-"; - } - - var i = reference.Keys.Count - 1; - var output = reference.Keys[i].Value; - if (reference.Keys[i].Type == KeyTypes.FragmentReference && i > 0) - output += reference.Keys[i - 1].Value; - return output; - } - - public static Key GetAsExactlyOneKey(this IReference reference) - { - if (reference.Keys == null || reference.Keys.Count != 1) - { - return null; - } - - var key = reference.Keys[0]; - return new Key(key.Type, key.Value); - } - - /// - /// Formats: 1 = [key, value] 2 = value - /// - public static string ToStringExtended(this IReference reference, int format = 1, string delimiter = ",") - { - if (reference.Keys == null) - { - throw new NullValueException("Keys"); - } - - return reference.Keys.ToStringExtended(format, delimiter); - } - - public static ReferenceTypes GuessType(this IReference reference) - { - var setAasRefs = Constants.AasReferables.Where((kt) => kt != null).Select(kt => kt.Value).ToArray(); - var allAasRefs = true; - foreach (var k in reference.Keys) - if (!k.MatchesSetOfTypes(setAasRefs)) - allAasRefs = false; - if (allAasRefs) - return ReferenceTypes.ModelReference; - else - return ReferenceTypes.ExternalReference; - } - - public static int Count(this IReference rf) - { - return rf.Keys.Count; - } - // dead-csharp off - //TODO (??, 0000-00-00): check if required - //public static int Count(this Reference rf) - //{ - // return rf.Keys.Count; - //} - // dead-csharp on - public static IKey Last(this IReference rf) - { - return rf.Keys.Last(); - } - // dead-csharp off - //TODO (??, 0000-00-00): check if required - //public static IKey Last(this Reference rf) - //{ - // return rf.Keys.Last(); - //} - // dead-csharp on - public static string ListOfValues(this Reference rf, string delim) - { - string res = ""; - if (rf.Keys != null) - foreach (var x in rf.Keys) - { - if (x == null) - continue; - if (res != "") res += delim; - res += x.Value; - } - return res; - } - } - -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendReferenceElement.cs b/src/AasxCsharpLibrary/Extensions/ExtendReferenceElement.cs deleted file mode 100644 index e68d0065d..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendReferenceElement.cs +++ /dev/null @@ -1,45 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using AAS = AasCore.Aas3_0; - -namespace Extensions -{ - public static class ExtendReferenceElement - { - public static AAS.ReferenceElement Set(this AAS.ReferenceElement elem, - Reference rf) - { - elem.Value = rf; - return elem; - } - - public static AAS.ReferenceElement UpdateFrom( - this AAS.ReferenceElement elem, AAS.ISubmodelElement source) - { - if (source == null) - return elem; - - ((AAS.ISubmodelElement)elem).UpdateFrom(source); - - if (source is AAS.RelationshipElement srcRel) - { - if (srcRel.First != null) - elem.Value = srcRel.First.Copy(); - } - - if (source is AAS.AnnotatedRelationshipElement srcRelA) - { - if (srcRelA.First != null) - elem.Value = srcRelA.First.Copy(); - } - - return elem; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendRelationshipElement.cs b/src/AasxCsharpLibrary/Extensions/ExtendRelationshipElement.cs deleted file mode 100644 index 04634059a..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendRelationshipElement.cs +++ /dev/null @@ -1,46 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using AAS = AasCore.Aas3_0; - -namespace Extensions -{ - public static class ExtendRelationshipElement - { - public static AAS.RelationshipElement Set(this AAS.RelationshipElement elem, - AAS.Reference first, AAS.Reference second) - { - elem.First = first; - elem.Second = second; - return elem; - } - - public static AAS.RelationshipElement UpdateFrom( - this AAS.RelationshipElement elem, AAS.ISubmodelElement source) - { - if (source == null) - return elem; - - ((AAS.ISubmodelElement)elem).UpdateFrom(source); - - if (source is AAS.ReferenceElement srcRef) - { - if (srcRef.Value != null) - elem.First = srcRef.Value.Copy(); - } - - if (source is AAS.AnnotatedRelationshipElement srcRelA) - { - if (srcRelA.First != null) - elem.First = srcRelA.First.Copy(); - } - - return elem; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendSpecificAssetId.cs b/src/AasxCsharpLibrary/Extensions/ExtendSpecificAssetId.cs deleted file mode 100644 index 6aa1552c6..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendSpecificAssetId.cs +++ /dev/null @@ -1,48 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using Extensions; -using System.Collections.Generic; -using System.Linq; - -namespace AdminShellNS.Extensions -{ - public static class ExtendSpecificAssetId - { - public static bool Matches(this ISpecificAssetId specificAssetId, ISpecificAssetId other) - { - if (specificAssetId == null) return false; - if (other == null) return false; - - //check mandatory parameters first - if (specificAssetId.Name != other.Name) return false; - if (specificAssetId.Value != other.Value) return false; - if (!specificAssetId.ExternalSubjectId.Matches(other.ExternalSubjectId)) return false; - - //TODO (jtikekar, 0000-00-00): Check optional parameter i.e., Semantic Id and supplementatry semantic id - - return true; - } - - #region ListOfSpecificAssetIds - - public static bool ContainsSpecificAssetId(this List specificAssetIds, ISpecificAssetId other) - { - if (specificAssetIds == null) return false; - if (other == null) return false; - - var foundIds = specificAssetIds.Where(assetId => assetId.Matches(other)); - if (foundIds.Any()) return true; - - return false; - } - - #endregion - - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendStream.cs b/src/AasxCsharpLibrary/Extensions/ExtendStream.cs deleted file mode 100644 index 09f582d5b..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendStream.cs +++ /dev/null @@ -1,25 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System.IO; - -namespace Extensions -{ - public static class ExtendStream - { - public static byte[] ToByteArray(this Stream stream) - { - using (stream) - { - using MemoryStream memStream = new(); - stream.CopyTo(memStream); - return memStream.ToArray(); - } - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendStringification.cs b/src/AasxCsharpLibrary/Extensions/ExtendStringification.cs deleted file mode 100644 index 0e153f191..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendStringification.cs +++ /dev/null @@ -1,20 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Extensions -{ - public static class ExtendStringification - { - public static IEnumerable DataTypeXsdToStringArray() => - Enum.GetValues(typeof(DataTypeDefXsd)).OfType().Select((dt) => Stringification.ToString(dt)); - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendSubmodel.cs b/src/AasxCsharpLibrary/Extensions/ExtendSubmodel.cs deleted file mode 100644 index d008af091..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendSubmodel.cs +++ /dev/null @@ -1,470 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using AdminShellNS; -using AdminShellNS.Extensions; -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Extensions -{ - public static class ExtendSubmodel - { - #region AasxPackageExplorer - - /// - /// Recurses on all Submodel elements of a Submodel or SME, which allows children. - /// The state object will be passed to the lambda function in order to provide - /// stateful approaches. Include this element, as well. - /// - /// State object to be provided to lambda. Could be null. - /// The lambda function as (state, parents, SME) - /// The lambda shall return TRUE in order to deep into recursion. - /// Include this element as well. parents will then - /// include this element as well! - public static void RecurseOnReferables(this Submodel submodel, - object state, Func, IReferable, bool> lambda, - bool includeThis = false) - { - var parents = new List(); - if (includeThis) - { - lambda(state, null, submodel); - parents.Add(submodel); - } - submodel.SubmodelElements?.RecurseOnReferables(state, parents, lambda); - } - - public static void Remove(this Submodel submodel, ISubmodelElement submodelElement) - { - if (submodel != null) - { - if (submodel.SubmodelElements != null) - { - submodel.SubmodelElements.Remove(submodelElement); - } - } - } - - public static object AddChild( - this ISubmodel submodel, ISubmodelElement childSubmodelElement, - EnumerationPlacmentBase placement = null) - { - if (childSubmodelElement == null) - return null; - submodel.SubmodelElements ??= new(); - if (childSubmodelElement != null) - childSubmodelElement.Parent = submodel; - submodel.SubmodelElements.Add(childSubmodelElement); - return childSubmodelElement; - } - - public static Tuple ToCaptionInfo(this ISubmodel submodel) - { - var caption = AdminShellUtil.EvalToNonNullString("\"{0}\" ", submodel.IdShort, ""); - if (submodel.Administration != null) - caption += "V" + submodel.Administration.Version + "." + submodel.Administration.Revision; - var info = ""; - if (submodel.Id != null) - info = $"[{submodel.Id}]"; - return Tuple.Create(caption, info); - } - - public static IEnumerable FindAllReferences(this ISubmodel submodel) - { - // not nice: use temp list - var temp = new List(); - - // recurse - submodel.RecurseOnSubmodelElements(null, (state, parents, sme) => - { - if (sme is ReferenceElement re) - if (re.Value != null) - temp.Add(re.Value); - if (sme is RelationshipElement rl) - { - if (rl.First != null) - temp.Add(rl.First); - if (rl.Second != null) - temp.Add(rl.Second); - } - // recurse - return true; - }); - - // now, give back - foreach (var r in temp) - yield return new LocatedReference(submodel, r); - } - - #endregion - public static void Validate(this Submodel submodel, AasValidationRecordList results) - { - // access - if (results == null) - return; - - // check - submodel.BaseValidation(results); - submodel.Kind?.Validate(results, submodel); - if (submodel.SemanticId != null && !submodel.SemanticId.IsEmpty()) - { - submodel.SemanticId.Keys.Validate(results, submodel); - } - } - - public static Submodel ConvertFromV10(this Submodel submodel, AasxCompatibilityModels.AdminShellV10.Submodel sourceSubmodel, bool shallowCopy = false) - { - if (sourceSubmodel == null) - { - return null; - } - - if (string.IsNullOrEmpty(sourceSubmodel.idShort)) - { - submodel.IdShort = ""; - } - else - { - submodel.IdShort = sourceSubmodel.idShort; - } - - if (sourceSubmodel.description != null) - { - submodel.Description = ExtensionsUtil.ConvertDescriptionFromV10(sourceSubmodel.description); - } - - if (sourceSubmodel.administration != null) - { - submodel.Administration = new AdministrativeInformation(version: sourceSubmodel.administration.version, revision: sourceSubmodel.administration.revision); - } - - if (sourceSubmodel.semanticId != null && !sourceSubmodel.semanticId.IsEmpty) - { - var keyList = new List(); - foreach (var refKey in sourceSubmodel.semanticId.Keys) - { - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {refKey.type} not found."); - } - } - submodel.SemanticId = new Reference(ReferenceTypes.ExternalReference, keyList); - } - - if (sourceSubmodel.kind != null) - { - if (sourceSubmodel.kind.IsInstance) - { - submodel.Kind = ModellingKind.Instance; - } - else - { - submodel.Kind = ModellingKind.Template; - } - } - - if (!sourceSubmodel.qualifiers.IsNullOrEmpty()) - { - if (submodel.Qualifiers == null && submodel.Qualifiers.Count != 0) - { - submodel.Qualifiers = new List(); - } - - foreach (var sourceQualifier in sourceSubmodel.qualifiers) - { - var newQualifier = new Qualifier("", DataTypeDefXsd.String); - newQualifier = newQualifier.ConvertFromV10(sourceQualifier); - submodel.Qualifiers.Add(newQualifier); - } - } - - if (!shallowCopy && !sourceSubmodel.submodelElements.IsNullOrEmpty()) - { - submodel.SubmodelElements ??= new List(); - - foreach (var submodelElementWrapper in sourceSubmodel.submodelElements) - { - var sourceSubmodelELement = submodelElementWrapper.submodelElement; - ISubmodelElement outputSubmodelElement = null; - if (sourceSubmodelELement != null) - { - outputSubmodelElement = outputSubmodelElement.ConvertFromV10(sourceSubmodelELement, shallowCopy); - submodel.SubmodelElements.Add(outputSubmodelElement); - } - - } - } - - return submodel; - - } - - public static Submodel ConvertFromV20(this Submodel sm, AasxCompatibilityModels.AdminShellV20.Submodel srcSM, bool shallowCopy = false) - { - if (srcSM == null) - return null; - - if (string.IsNullOrEmpty(srcSM.idShort)) - sm.IdShort = ""; - else - sm.IdShort = srcSM.idShort; - - if (srcSM.identification?.id != null) - sm.Id = srcSM.identification.id; - - if (srcSM.description != null) - sm.Description = ExtensionsUtil.ConvertDescriptionFromV20(srcSM.description); - - if (srcSM.administration != null) - sm.Administration = new AdministrativeInformation( - version: srcSM.administration.version, revision: srcSM.administration.revision); - - if (srcSM.semanticId != null && !srcSM.semanticId.IsEmpty) - { - var keyList = new List(); - foreach (var refKey in srcSM.semanticId.Keys) - { - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {refKey.type} not found."); - } - } - sm.SemanticId = new Reference(ReferenceTypes.ExternalReference, keyList); - } - - if (srcSM.kind != null) - { - if (srcSM.kind.IsInstance) - { - sm.Kind = ModellingKind.Instance; - } - else - { - sm.Kind = ModellingKind.Template; - } - } - - if (!srcSM.qualifiers.IsNullOrEmpty()) - { - sm.Qualifiers ??= new List(); - - foreach (var sourceQualifier in srcSM.qualifiers) - { - var newQualifier = new Qualifier("", DataTypeDefXsd.String); - newQualifier = newQualifier.ConvertFromV20(sourceQualifier); - sm.Qualifiers.Add(newQualifier); - } - } - - if (!shallowCopy && !srcSM.submodelElements.IsNullOrEmpty()) - { - sm.SubmodelElements ??= new List(); - - foreach (var submodelElementWrapper in srcSM.submodelElements) - { - var sourceSubmodelELement = submodelElementWrapper.submodelElement; - ISubmodelElement outputSubmodelElement = null; - if (sourceSubmodelELement != null) - { - outputSubmodelElement = outputSubmodelElement.ConvertFromV20(sourceSubmodelELement, shallowCopy); - sm.SubmodelElements.Add(outputSubmodelElement); - } - - } - } - - // move Qualifiers to Extensions - sm.MigrateV20QualifiersToExtensions(); - - return sm; - } - - public static T FindFirstIdShortAs(this ISubmodel submodel, string idShort) where T : ISubmodelElement - { - - var submodelElement = submodel.SubmodelElements.Where(sme => (sme != null) && (sme is T) && sme.IdShort.Equals(idShort, StringComparison.OrdinalIgnoreCase)).FirstOrDefault(); - - return (T)submodelElement; - } - - public static IEnumerable FindDeep(this ISubmodel submodel) - { - if (submodel.SubmodelElements == null || submodel.SubmodelElements.Count == 0) - { - yield break; - } - - foreach (var submodelElement in submodel.SubmodelElements) - { - foreach (var x in submodelElement.FindDeep()) - yield return x; - } - } - - public static Reference GetModelReference(this ISubmodel submodel) - { - var key = new Key(KeyTypes.Submodel, submodel.Id); - var outputReference = new Reference(ReferenceTypes.ModelReference, new List() { key }) - { - ReferredSemanticId = submodel.SemanticId - }; - - return outputReference; - } - - /// - /// If instance, return semanticId as one key. - /// If template, return identification as key. - /// - public static Key GetSemanticKey(this Submodel submodel) - { - if (submodel.Kind == ModellingKind.Instance) - return submodel.SemanticId.GetAsExactlyOneKey(); - else - return new Key(KeyTypes.Submodel, submodel.Id); - } - - /// - /// If instance, return semanticId as one key. - /// If template, return identification as key. - /// - public static IReference GetSemanticRef(this Submodel submodel) - { - if (submodel.Kind == ModellingKind.Instance) - return submodel.SemanticId; - else - return new Reference(ReferenceTypes.ModelReference, new[] { - new Key(KeyTypes.Submodel, submodel.Id) }.Cast().ToList()); - } - - public static List SmeForWrite(this Submodel submodel) - { - if (submodel.SubmodelElements == null) - submodel.SubmodelElements = new(); - return submodel.SubmodelElements; - } - - public static void RecurseOnSubmodelElements(this ISubmodel submodel, object state, Func, ISubmodelElement, bool> lambda) - { - submodel.SubmodelElements?.RecurseOnReferables(state, null, (o, par, rf) => - { - if (rf is ISubmodelElement sme) - return lambda(o, par, sme); - else - return true; - }); - } - - public static ISubmodelElement FindSubmodelElementByIdShort(this ISubmodel submodel, string smeIdShort) - { - if (submodel.SubmodelElements == null || submodel.SubmodelElements.Count == 0) - { - return null; - } - - var submodelElements = submodel.SubmodelElements.Where(sme => (sme != null) && sme.IdShort.Equals(smeIdShort, StringComparison.OrdinalIgnoreCase)); - if (submodelElements.Any()) - { - return submodelElements.First(); - } - else - { - return null; - } - } - - public static void SetAllParents(this ISubmodel submodel, DateTime timestamp) - { - if (submodel.SubmodelElements != null) - foreach (var sme in submodel.SubmodelElements) - SetParentsForSME(submodel, sme, timestamp); - } - - public static void SetParentsForSME(IReferable parent, ISubmodelElement submodelElement, DateTime timestamp) - { - if (submodelElement == null) - return; - - submodelElement.Parent = parent; - submodelElement.TimeStamp = timestamp; - submodelElement.TimeStampCreate = timestamp; - - foreach (var childElement in submodelElement.EnumerateChildren()) - { - SetParentsForSME(submodelElement, childElement, timestamp); - } - } - - public static void SetParentsForSME(IReferable parent, ISubmodelElement submodelElement) - { - if (submodelElement == null) - return; - - submodelElement.Parent = parent; - - foreach (var childElement in submodelElement.EnumerateChildren()) - { - SetParentsForSME(submodelElement, childElement); - } - } - - public static void SetAllParents(this ISubmodel submodel) - { - if (submodel.SubmodelElements != null) - foreach (var sme in submodel.SubmodelElements) - SetParentsForSME(submodel, sme); - } - - public static void Add(this Submodel submodel, ISubmodelElement submodelElement) - { - if (submodel.SubmodelElements == null) - { - submodel.SubmodelElements = new List(); - } - - submodelElement.Parent = submodel; - submodel.SubmodelElements.Add(submodelElement); - } - - public static void Insert(this ISubmodel submodel, int index, ISubmodelElement submodelElement) - { - if (submodel.SubmodelElements == null) - { - submodel.SubmodelElements = new List(); - } - - submodelElement.Parent = submodel; - submodel.SubmodelElements.Insert(index, submodelElement); - } - - public static T CreateSMEForCD( - this Submodel sm, - ConceptDescription conceptDescription, string category = null, string idShort = null, - string idxTemplate = null, int maxNum = 999, bool addSme = false, bool isTemplate = false) - where T : ISubmodelElement - { - if (sm.SubmodelElements == null) - sm.SubmodelElements = new List(); - return sm.SubmodelElements.CreateSMEForCD( - conceptDescription, category, idShort, idxTemplate, maxNum, addSme, isTemplate); - } - - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendSubmodelElementCollection.cs b/src/AasxCsharpLibrary/Extensions/ExtendSubmodelElementCollection.cs deleted file mode 100644 index 628561c52..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendSubmodelElementCollection.cs +++ /dev/null @@ -1,193 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using AdminShellNS; -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Extensions -{ - public static class ExtendSubmodelElementCollection - { - #region AasxPackageExplorer - - /// - /// Recurses on all Submodel elements of a Submodel or SME, which allows children. - /// The state object will be passed to the lambda function in order to provide - /// stateful approaches. Include this element, as well. - /// - /// State object to be provided to lambda. Could be null. - /// The lambda function as (state, parents, SME) - /// The lambda shall return TRUE in order to deep into recursion. - /// Include this element as well. parents will then - /// include this element as well! - public static void RecurseOnReferables(this SubmodelElementCollection submodelElementCollection, - object state, Func, IReferable, bool> lambda, - bool includeThis = false) - { - var parents = new List(); - if (includeThis) - { - lambda(state, null, submodelElementCollection); - parents.Add(submodelElementCollection); - } - submodelElementCollection.Value?.RecurseOnReferables(state, parents, lambda); - } - - public static void Remove(this SubmodelElementCollection submodelElementCollection, ISubmodelElement submodelElement) - { - if (submodelElementCollection != null) - { - if (submodelElementCollection.Value != null) - { - submodelElementCollection.Value.Remove(submodelElement); - } - } - } - - public static object AddChild(this SubmodelElementCollection submodelElementCollection, ISubmodelElement childSubmodelElement, EnumerationPlacmentBase placement = null) - { - if (childSubmodelElement == null) - return null; - if (submodelElementCollection.Value == null) - submodelElementCollection.Value = new(); - if (childSubmodelElement != null) - childSubmodelElement.Parent = submodelElementCollection; - submodelElementCollection.Value.Add(childSubmodelElement); - return childSubmodelElement; - } - - #endregion - public static T FindFirstIdShortAs(this SubmodelElementCollection submodelElementCollection, string idShort) where T : ISubmodelElement - { - - var submodelElement = submodelElementCollection.Value.Where(sme => (sme != null) && (sme is T) && sme.IdShort.Equals(idShort, StringComparison.OrdinalIgnoreCase)).FirstOrDefault(); - - return (T)submodelElement; - } - - public static SubmodelElementCollection ConvertFromV10(this SubmodelElementCollection submodelElementCollection, AasxCompatibilityModels.AdminShellV10.SubmodelElementCollection sourceSmeCollection, bool shallowCopy = false) - { - if (sourceSmeCollection == null) - return null; - - submodelElementCollection.Value ??= new List(); - - if (!shallowCopy) - { - foreach (var submodelElementWrapper in sourceSmeCollection.value) - { - var sourceSubmodelElement = submodelElementWrapper.submodelElement; - ISubmodelElement outputSubmodelElement = null; - if (sourceSubmodelElement != null) - { - outputSubmodelElement = outputSubmodelElement.ConvertFromV10(sourceSubmodelElement, shallowCopy); - } - - submodelElementCollection.Value.Add(outputSubmodelElement); - } - } - - return submodelElementCollection; - } - - public static SubmodelElementCollection ConvertFromV20(this SubmodelElementCollection submodelElementCollection, AasxCompatibilityModels.AdminShellV20.SubmodelElementCollection sourceSmeCollection, bool shallowCopy = false) - { - if (sourceSmeCollection == null) - return null; - - submodelElementCollection.Value ??= new List(); - - if (!shallowCopy) - { - foreach (var submodelElementWrapper in sourceSmeCollection.value) - { - var sourceSubmodelElement = submodelElementWrapper.submodelElement; - ISubmodelElement outputSubmodelElement = null; - if (sourceSubmodelElement != null) - { - outputSubmodelElement = outputSubmodelElement.ConvertFromV20(sourceSubmodelElement, shallowCopy); - } - - submodelElementCollection.Value.Add(outputSubmodelElement); - } - } - - return submodelElementCollection; - } - - public static void Add(this SubmodelElementCollection submodelElementCollection, ISubmodelElement submodelElement) - { - submodelElementCollection.Value ??= new List(); - - submodelElement.Parent = submodelElementCollection; - submodelElementCollection.Value.Add(submodelElement); - } - - public static void Insert(this SubmodelElementCollection submodelElementCollection, int index, ISubmodelElement submodelElement) - { - if (submodelElementCollection.Value == null) - { - submodelElementCollection.Value = new List(); - } - - submodelElement.Parent = submodelElementCollection; - submodelElementCollection.Value.Insert(index, submodelElement); - } - - public static T CreateSMEForCD( - this SubmodelElementCollection smc, - ConceptDescription conceptDescription, string category = null, string idShort = null, - string idxTemplate = null, int maxNum = 999, bool addSme = false, bool isTemplate = false) - where T : ISubmodelElement - { - if (smc.Value == null) - smc.Value = new List(); - return smc.Value.CreateSMEForCD( - conceptDescription, category, idShort, idxTemplate, maxNum, addSme, isTemplate); - } - - public static SubmodelElementCollection UpdateFrom( - this SubmodelElementCollection elem, ISubmodelElement source) - { - if (source == null) - return elem; - - ((ISubmodelElement)elem).UpdateFrom(source); - - if (source is SubmodelElementList srcList) - { - if (srcList.Value != null) - elem.Value = srcList.Value.Copy(); - } - - if (source is Operation srcOp) - { - Action, List> appov = (dst, src) => - { - if (src == null) - return; - foreach (var ov in src) - if (ov.Value != null) - dst.Append(ov.Value.Copy()); - }; - - elem.Value = new(); - appov(elem.Value, srcOp.InputVariables); - appov(elem.Value, srcOp.InoutputVariables); - appov(elem.Value, srcOp.OutputVariables); - if (elem.Value.Count < 1) - elem.Value = null; - } - - return elem; - } - - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtendSubmodelElementList.cs b/src/AasxCsharpLibrary/Extensions/ExtendSubmodelElementList.cs deleted file mode 100644 index a3a27c53d..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtendSubmodelElementList.cs +++ /dev/null @@ -1,206 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using AdminShellNS; -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Extensions -{ - public static class ExtendSubmodelElementList - { - #region AasxPackageExplorer - - /// - /// Recurses on all Submodel elements of a Submodel or SME, which allows children. - /// The state object will be passed to the lambda function in order to provide - /// stateful approaches. Include this element, as well. - /// - /// State object to be provided to lambda. Could be null. - /// The lambda function as (state, parents, SME) - /// The lambda shall return TRUE in order to deep into recursion. - /// Include this element as well. parents will then - /// include this element as well! - public static void RecurseOnReferables(this SubmodelElementList submodelElementList, - object state, Func, IReferable, bool> lambda, - bool includeThis = false) - { - var parents = new List(); - if (includeThis) - { - lambda(state, null, submodelElementList); - parents.Add(submodelElementList); - } - submodelElementList.Value?.RecurseOnReferables(state, parents, lambda); - } - - public static void Add(this SubmodelElementList submodelElementList, ISubmodelElement submodelElement) - { - if (submodelElementList != null) - { - submodelElementList.Value ??= new(); - - submodelElement.Parent = submodelElementList; - - submodelElementList.Value.Add(submodelElement); - } - } - - public static void Remove(this SubmodelElementList submodelElementList, ISubmodelElement submodelElement) - { - if (submodelElementList != null) - { - if (submodelElementList.Value != null) - { - submodelElementList.Value.Remove(submodelElement); - } - } - } - - public static object AddChild( - this SubmodelElementList submodelElementList, ISubmodelElement childSubmodelElement, - EnumerationPlacmentBase placement = null) - { - if (childSubmodelElement == null) - return null; - if (submodelElementList.Value == null) - submodelElementList.Value = new(); - if (childSubmodelElement != null) - childSubmodelElement.Parent = submodelElementList; - submodelElementList.Value.Add(childSubmodelElement); - return childSubmodelElement; - } - - #endregion - public static T FindFirstIdShortAs(this SubmodelElementList submodelElementList, string idShort) where T : ISubmodelElement - { - - var submodelElements = submodelElementList.Value.Where(sme => sme != null && sme is T && sme.IdShort.Equals(idShort, StringComparison.OrdinalIgnoreCase)); - - if (submodelElements.Any()) - { - return (T)submodelElements.First(); - } - - return default; - } - - public static SubmodelElementList UpdateFrom( - this SubmodelElementList elem, ISubmodelElement source) - { - if (source == null) - return elem; - - ((ISubmodelElement)elem).UpdateFrom(source); - - if (source is SubmodelElementCollection srcColl) - { - if (srcColl.Value != null) - elem.Value = srcColl.Value.Copy(); - } - - if (source is Operation srcOp) - { - Action, List> appov = (dst, src) => - { - if (src == null) - return; - foreach (var ov in src) - if (ov.Value != null) - dst.Append(ov.Value.Copy()); - }; - - elem.Value = new(); - appov(elem.Value, srcOp.InputVariables); - appov(elem.Value, srcOp.InoutputVariables); - appov(elem.Value, srcOp.OutputVariables); - if (elem.Value.Count < 1) - elem.Value = null; - } - - return elem; - } - - // advanced checks - - public class ConstraintStat - { - /// - /// Constraint AASd-107: If a first level child element in a SubmodelElementList has a semanticId - /// it shall be identical to SubmodelElementList/semanticIdListElement. - /// - public bool AllChildSemIdMatch = true; - - /// - /// Constraint AASd-108: All first level child elements in a SubmodelElementList shall have the - /// same submodel element type as specified in SubmodelElementList/typeValueListElement. - /// - public bool AllChildSmeTypeMatch = true; - - /// - /// Constraint AASd-109: If SubmodelElementList/typeValueListElement equal to Property or Range, - /// SubmodelElementList/valueTypeListElement shall be set and all first level child elements in - /// the SubmodelElementList shall have the the value type as specified in - /// SubmodelElementList/valueTypeListElement - /// - public bool AllChildValueTypeMatch = true; - } - - public static ConstraintStat EvalConstraintStat(this SubmodelElementList list) - { - // access - var res = new ConstraintStat(); - if (list.Value == null) - return res; - - // prepare SME type - var smeTypeToCheck = list.TypeValueListElement; - - // prepare value type - var valueTypeToCheck = list.ValueTypeListElement; - - // eval - foreach (var sme in list.Value) - { - // need self description - var smesd = sme.GetSelfDescription(); - if (smesd == null) - continue; - - // sem id? - if (res.AllChildSemIdMatch - && list.SemanticIdListElement?.IsValid() == true - && sme.SemanticId?.IsValid() == true - && !list.SemanticIdListElement.Matches(sme.SemanticId)) - res.AllChildSemIdMatch = false; - - // type of SME? - if (res.AllChildSmeTypeMatch - && smesd.SmeType != smeTypeToCheck) - res.AllChildSmeTypeMatch = false; - - // value type to check - if (valueTypeToCheck.HasValue - && res.AllChildValueTypeMatch - && sme is Property prop - && prop.ValueType != valueTypeToCheck.Value) - res.AllChildValueTypeMatch = false; - - if (valueTypeToCheck.HasValue - && res.AllChildValueTypeMatch - && sme is AasCore.Aas3_0.Range range - && range.ValueType != valueTypeToCheck.Value) - res.AllChildValueTypeMatch = false; - } - - // ok - return res; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/ExtensionsUtil.cs b/src/AasxCsharpLibrary/Extensions/ExtensionsUtil.cs deleted file mode 100644 index 32200d1a7..000000000 --- a/src/AasxCsharpLibrary/Extensions/ExtensionsUtil.cs +++ /dev/null @@ -1,120 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -using AasxCompatibilityModels; -using System; -using System.Collections.Generic; - -namespace Extensions -{ - public static class ExtensionsUtil - { - - public static Reference ConvertReferenceFromV10(AdminShellV10.Reference sourceReference, ReferenceTypes referenceTypes) - { - Reference outputReference = null; - if (sourceReference != null && !sourceReference.IsEmpty) - { - var keyList = new List(); - foreach (var refKey in sourceReference.Keys) - { - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {refKey.type} not found."); - } - } - outputReference = new Reference(referenceTypes, keyList); - } - - return outputReference; - } - - public static Reference ConvertReferenceFromV20(AdminShellV20.Reference sourceReference, ReferenceTypes referenceTypes) - { - Reference outputReference = null; - if (sourceReference != null && !sourceReference.IsEmpty) - { - var keyList = new List(); - foreach (var refKey in sourceReference.Keys) - { - // Fix, as Asset does not exist anymore - if (refKey.type?.Trim().Equals("Asset", StringComparison.InvariantCultureIgnoreCase) == true) - refKey.type = "GlobalReference"; - - var keyType = Stringification.KeyTypesFromString(refKey.type); - if (keyType != null) - { - keyList.Add(new Key((KeyTypes)keyType, refKey.value)); - } - else - { - Console.WriteLine($"KeyType value {refKey.type} not found."); - } - } - outputReference = new Reference(referenceTypes, keyList); - } - - return outputReference; - } - - internal static List ConvertDescriptionFromV10(AdminShellV10.Description sourceDescription) - { - var newLangStrList = new List(); - foreach (var ls in sourceDescription.langString) - { - newLangStrList.Add(new LangStringTextType(ls.lang, ls.str)); - } - - return new List(newLangStrList); - } - - internal static List ConvertDescriptionFromV20(AdminShellV20.Description sourceDescription) - { - var newLangStrList = new List(); - foreach (var ls in sourceDescription.langString) - { - newLangStrList.Add(new LangStringTextType(ls.lang, ls.str)); - } - - return new List(newLangStrList); - } - - internal static KeyTypes GetKeyType(IClass aasElement) - { - return aasElement switch - { - AssetAdministrationShell => KeyTypes.AssetAdministrationShell, - Submodel => KeyTypes.Submodel, - ConceptDescription => KeyTypes.ConceptDescription, - SubmodelElementCollection => KeyTypes.SubmodelElementCollection, - SubmodelElementList => KeyTypes.SubmodelElementList, - BasicEventElement => KeyTypes.BasicEventElement, - Blob => KeyTypes.Blob, - Entity => KeyTypes.Entity, - File => KeyTypes.File, - MultiLanguageProperty => KeyTypes.MultiLanguageProperty, - Property => KeyTypes.Property, - Operation => KeyTypes.Operation, - AasCore.Aas3_0.Range => KeyTypes.Range, - ReferenceElement => KeyTypes.ReferenceElement, - RelationshipElement => KeyTypes.RelationshipElement, - AnnotatedRelationshipElement => KeyTypes.AnnotatedRelationshipElement, - IIdentifiable => KeyTypes.Identifiable, - IReferable => KeyTypes.Referable, - Reference => KeyTypes.GlobalReference, - //TODO (jtikekar, 0000-00-00): what about model reference - _ => KeyTypes.SubmodelElement, // default case - }; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/LocatedReference.cs b/src/AasxCsharpLibrary/Extensions/LocatedReference.cs deleted file mode 100644 index 26916c5b7..000000000 --- a/src/AasxCsharpLibrary/Extensions/LocatedReference.cs +++ /dev/null @@ -1,23 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -namespace Extensions -{ - public class LocatedReference - { - public IIdentifiable Identifiable; - public IReference Reference; - - public LocatedReference() { } - public LocatedReference(IIdentifiable identifiable, IReference reference) - { - Identifiable = identifiable; - Reference = reference; - } - } -} diff --git a/src/AasxCsharpLibrary/Extensions/MatchMode.cs b/src/AasxCsharpLibrary/Extensions/MatchMode.cs deleted file mode 100644 index 12792aa1a..000000000 --- a/src/AasxCsharpLibrary/Extensions/MatchMode.cs +++ /dev/null @@ -1,17 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ -namespace Extensions -{ - public enum MatchMode - { - Strict, //may be not needed in future, as no local flag in V3 - Relaxed, //should be as default - Identification - } -} diff --git a/src/AasxCsharpLibrary/IAasxOnlineConnection.cs b/src/AasxCsharpLibrary/IAasxOnlineConnection.cs deleted file mode 100644 index 550bd7e21..000000000 --- a/src/AasxCsharpLibrary/IAasxOnlineConnection.cs +++ /dev/null @@ -1,26 +0,0 @@ -/* -Copyright (c) 2018-2023 Festo SE & Co. KG -Author: Michael Hoffmeister - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using System.IO; - -namespace AasxIntegrationBase -{ - /// - /// This interface describes a connection for a server resource of AASX contents, such as OPC UA or REST - /// - public interface IAasxOnlineConnection - { - bool IsValid(); - bool IsConnected(); - string GetInfo(); - Stream GetThumbnailStream(); - string UpdatePropertyValue( - AasCore.Aas3_0.Environment env, Submodel submodel, ISubmodelElement sme); - } -} diff --git a/src/AasxCsharpLibrary/LICENSE.txt b/src/AasxCsharpLibrary/LICENSE.txt deleted file mode 100644 index 01f9cb5eb..000000000 --- a/src/AasxCsharpLibrary/LICENSE.txt +++ /dev/null @@ -1,1475 +0,0 @@ -Copyright (c) 2018-2023 Festo SE & Co. KG -, -author: Michael Hoffmeister - -Copyright (c) 2019-2021 PHOENIX CONTACT GmbH & Co. KG -, -author: Andreas Orzelski - -Copyright (c) 2019-2020 Fraunhofer IOSB-INA Lemgo, - eine rechtlich nicht selbstaendige Einrichtung der Fraunhofer-Gesellschaft - zur Foerderung der angewandten Forschung e.V. - -Copyright (c) 2020 Schneider Electric Automation GmbH -, -author: Marco Mendes - -Copyright (c) 2020 SICK AG - -Copyright (c) 2021 KEB Automation KG - -Copyright (c) 2021 Lenze SE -author: Jonas Grote, Denis Göllner, Sebastian Bischof - -The AASX Package Explorer is licensed under the Apache License 2.0 -(Apache-2.0, see below). - -The AASX Package Explorer is a sample application for demonstration of the -features of the Asset Administration Shell. -The implementation uses the concepts of the document "Details of the Asset -Administration Shell" published on www.plattform-i40.de which is licensed -under Creative Commons CC BY-ND 3.0 DE. - -When using eCl@ss or IEC CDD data, please check the corresponding license -conditions. - -------------------------------------------------------------------------------- - -The components below are used in AASX Package Explorer. -The related licenses are listed for information purposes only. -Some licenses may only apply to their related plugins. - -The browser functionality is licensed under the cefSharp license (see below). - -The Newtonsoft.JSON serialization is licensed under the MIT License -(MIT, see below). - -The QR code generation is licensed under the MIT license (MIT, see below). - -The Zxing.Net Dot Matrix Code (DMC) generation is licensed under -the Apache License 2.0 (Apache-2.0, see below). - -The Grapevine REST server framework is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The AutomationML.Engine is licensed under the MIT license (MIT, see below). - -The MQTT server and client is licensed under the MIT license (MIT, see below). - -The ClosedXML Excel reader/writer is licensed under the MIT license (MIT, -see below). - -The CountryFlag WPF control is licensed under the Code Project Open License -(CPOL, see below). - -The DocumentFormat.OpenXml SDK is licensed under the MIT license (MIT, -see below). - -The ExcelNumberFormat number parser is licensed under the MIT license (MIT, -see below). - -The FastMember reflection access is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The IdentityModel OpenID client is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The jose-jwt object signing and encryption is licensed under the -MIT license (MIT, see below). - -The ExcelDataReader is licensed under the MIT license (MIT, see below). - -Portions copyright (c) by OPC Foundation, Inc. and licensed under the -Reciprocal Community License (RCL, see below) - -The OPC UA Example Code of OPC UA Standard is licensed under the MIT license -(MIT, see below). - -The MSAGL (Microsoft Automatic Graph Layout) is licensed under the MIT license -(MIT, see below) - -Glob (https://www.nuget.org/packages/Glob/) is licensed under the MIT license -(MIT, see below). - -The Magick.NET library is licensed under Apache License 2.0 -(Apache-2.0, see below). - -The SSharp.NET library (https://github.com/PetroProtsyk/SSharp) is licensed -under Apache License 2.0 (Apache-2.0, see below). - -------------------------------------------------------------------------------- - - -With respect to AASX Package Explorer -===================================== - -(http://www.apache.org/licenses/LICENSE-2.0) - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - -With respect to cefSharp -======================== - -(https://raw.githubusercontent.com/cefsharp/CefSharp/master/LICENSE) - -Copyright © The CefSharp Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - - * Neither the name of Google Inc. nor the name Chromium Embedded - Framework nor the name CefSharp nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -With respect to Newtonsoft.Json -=============================== - -(https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md) - -The MIT License (MIT) - -Copyright (c) 2007 James Newton-King - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -With respect to QRcoder -======================= - -(https://github.com/codebude/QRCoder/blob/master/LICENSE.txt) - -The MIT License (MIT) - -Copyright (c) 2013-2018 Raffael Herrmann - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -With respect to ZXing.Net -========================= -With respect to Grapevine -========================= -With respect to FastMember -========================== -With respect to IdentityModel -============================= - -(http://www.apache.org/licenses/LICENSE-2.0) - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - -With respect to AutomationML.Engine -=================================== - -(https://raw.githubusercontent.com/AutomationML/AMLEngine2.1/master/license.txt) - -The MIT License (MIT) - -Copyright 2017 AutomationML e.V. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - - -With respect to MQTTnet -======================= - -(https://github.com/chkr1011/MQTTnet/blob/master/LICENSE) - -MIT License - -MQTTnet Copyright (c) 2016-2019 Christian Kratky - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With resepct to ClosedXML -========================= - -(https://github.com/ClosedXML/ClosedXML/blob/develop/LICENSE) - -MIT License - -Copyright (c) 2016 ClosedXML - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With resepct to CountryFlag -=========================== - -(https://www.codeproject.com/Articles/190722/WPF-CountryFlag-Control) - -The Code Project Open License (CPOL) 1.02 - -Copyright © 2017 Meshack Musundi - -Preamble - -This License governs Your use of the Work. This License is intended to allow -developers to use the Source Code and Executable Files provided as part of -the Work in any application in any form. - -The main points subject to the terms of the License are: - - Source Code and Executable Files can be used in commercial applications; - Source Code and Executable Files can be redistributed; and - Source Code can be modified to create derivative works. - No claim of suitability, guarantee, or any warranty whatsoever is provided. - The software is provided "as-is". - The Article(s) accompanying the Work may not be distributed or republished - without the Author's consent - -This License is entered between You, the individual or other entity reading or -otherwise making use of the Work licensed pursuant to this License and the -individual or other entity which offers the Work under the terms of this -License ("Author"). - -License - -THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS -CODE PROJECT OPEN LICENSE ("LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT -AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED -UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. - -BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HEREIN, YOU ACCEPT AND AGREE -TO BE BOUND BY THE TERMS OF THIS LICENSE. THE AUTHOR GRANTS YOU THE RIGHTS -CONTAINED HEREIN IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND -CONDITIONS. IF YOU DO NOT AGREE TO ACCEPT AND BE BOUND BY THE TERMS OF THIS -LICENSE, YOU CANNOT MAKE ANY USE OF THE WORK. - -Definitions. - "Articles" means, collectively, all articles written by Author which -describes how the Source Code and Executable Files for the Work may -be used by a user. - "Author" means the individual or entity that offers the Work under -the terms of this License. - "Derivative Work" means a work based upon the Work or upon the Work -and other pre-existing works. - "Executable Files" refer to the executables, binary files, -configuration and any required data files included in the Work. - "Publisher" means the provider of the website, magazine, CD-ROM, -DVD or other medium from or by which the Work is obtained by You. - "Source Code" refers to the collection of source code and -configuration files used to create the Executable Files. - "Standard Version" refers to such a Work if it has not been modified, -or has been modified in accordance with the consent of the Author, -such consent being in the full discretion of the Author. - "Work" refers to the collection of files distributed by the Publisher, -including the Source Code, Executable Files, binaries, data files, -documentation, whitepapers and the Articles. - "You" is you, an individual or entity wishing to use the Work and -exercise your rights under this License. - -Fair Use/Fair Use Rights. Nothing in this License is intended to reduce, -limit, or restrict any rights arising from fair use, fair dealing, -first sale or other limitations on the exclusive rights of the -copyright owner under copyright law or other applicable laws. - -License Grant. Subject to the terms and conditions of this License, the -Author hereby grants You a worldwide, royalty-free, non-exclusive, -perpetual (for the duration of the applicable copyright) license -to exercise the rights in the Work as stated below: - You may use the standard version of the Source Code or Executable -Files in Your own applications. - You may apply bug fixes, portability fixes and other modifications -obtained from the Public Domain or from the Author. A Work modified -in such a way shall still be considered the standard version and will -be subject to this License. - You may otherwise modify Your copy of this Work (excluding the Articles) -in any way to create a Derivative Work, provided that You insert a prominent -notice in each changed file stating how, when and where You changed that file. - You may distribute the standard version of the Executable Files and Source -Code or Derivative Work in aggregate with other (possibly commercial) -programs as part of a larger (possibly commercial) software distribution. - The Articles discussing the Work published in any form by the author may -not be distributed or republished without the Author's consent. The author -retains copyright to any such Articles. You may use the Executable Files and -Source Code pursuant to this License but you may not repost or republish or -otherwise distribute or make available the Articles, without the prior written -consent of the Author. - -Any subroutines or modules supplied by You and linked into the Source Code -or Executable Files of this Work shall not be considered part of this Work -and will not be subject to the terms of this License. - -Patent License. Subject to the terms and conditions of this License, each -Author hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, -royalty-free, irrevocable (except as stated in this section) patent license -to make, have made, use, import, and otherwise transfer the Work. - -Restrictions. The license granted in Section 3 above is expressly made subject -to and limited by the following restrictions: - You agree not to remove any of the original copyright, patent, trademark, -and attribution notices and associated disclaimers that may appear in the -Source Code or Executable Files. - You agree not to advertise or in any way imply that this Work is a product -of Your own. - The name of the Author may not be used to endorse or promote products -derived from the Work without the prior written consent of the Author. - You agree not to sell, lease, or rent any part of the Work. This does -not restrict you from including the Work or any part of the Work inside -a larger software distribution that itself is being sold. The Work by itself, -though, cannot be sold, leased or rented. - You may distribute the Executable Files and Source Code only under the terms -of this License, and You must include a copy of, or the Uniform Resource -Identifier for, this License with every copy of the Executable Files or -Source Code You distribute and ensure that anyone receiving such Executable -Files and Source Code agrees that the terms of this License apply to such -Executable Files and/or Source Code. You may not offer or impose any terms -on the Work that alter or restrict the terms of this License or the -recipients' exercise of the rights granted hereunder. You may not sublicense -the Work. You must keep intact all notices that refer to this License and to -the disclaimer of warranties. You may not distribute the Executable Files or -Source Code with any technological measures that control access or use of the -Work in a manner inconsistent with the terms of this License. - You agree not to use the Work for illegal, immoral or improper -purposes, or on pages containing illegal, immoral or improper material. -The Work is subject to applicable export laws. You agree to comply with all -such laws and regulations that may apply to the Work after Your receipt of -the Work. - -Representations, Warranties and Disclaimer. THIS WORK IS PROVIDED "AS IS", -"WHERE IS" AND "AS AVAILABLE", WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES OR -CONDITIONS OR GUARANTEES. YOU, THE USER, ASSUME ALL RISK IN ITS USE, -INCLUDING COPYRIGHT INFRINGEMENT, PATENT INFRINGEMENT, SUITABILITY, ETC. -AUTHOR EXPRESSLY DISCLAIMS ALL EXPRESS, IMPLIED OR STATUTORY WARRANTIES -OR CONDITIONS, INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS -OF MERCHANTABILITY, MERCHANTABLE QUALITY OR FITNESS FOR A PARTICULAR -PURPOSE, OR ANY WARRANTY OF TITLE OR NON-INFRINGEMENT, OR THAT THE WORK -(OR ANY PORTION THEREOF) IS CORRECT, USEFUL, BUG-FREE OR FREE OF VIRUSES. -YOU MUST PASS THIS DISCLAIMER ON WHENEVER YOU DISTRIBUTE THE WORK OR DERIVATIVE -WORKS. - -Indemnity. You agree to defend, indemnify and hold harmless the Author and the -Publisher from and against any claims, suits, losses, damages, liabilities, -costs, and expenses (including reasonable legal or attorneys’ fees) -resulting from or relating to any use of the Work by You. - -Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, -IN NO EVENT WILL THE AUTHOR OR THE PUBLISHER BE LIABLE TO YOU ON ANY LEGAL -THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY -DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK OR OTHERWISE, -EVEN IF THE AUTHOR OR THE PUBLISHER HAS BEEN ADVISED OF THE POSSIBILITY -OF SUCH DAMAGES. - -Termination. - This License and the rights granted hereunder will terminate -automatically upon any breach by You of any term of this License. -Individuals or entities who have received Derivative Works from You under -this License, however, will not have their licenses terminated provided such -individuals or entities remain in full compliance with those licenses. -Sections 1, 2, 6, 7, 8, 9, 10 and 11 will survive any termination of -this License. - If You bring a copyright, trademark, patent or any other infringement -claim against any contributor over infringements You claim are made by the -Work, your License from such contributor to the Work ends automatically. - Subject to the above terms and conditions, this License is perpetual -(for the duration of the applicable copyright in the Work). -Notwithstanding the above, the Author reserves the right to release the Work -under different license terms or to stop distributing the Work at any time; -provided, however that any such election will not serve to withdraw this -License (or any other license that has been, or is required to be, -granted under the terms of this License), and this License will continue -in full force and effect unless terminated as stated above. - -Publisher. The parties hereby confirm that the Publisher shall not, under -any circumstances, be responsible for and shall not have any liability -in respect of the subject matter of this License. The Publisher makes no -warranty whatsoever in connection with the Work and shall not be liable -to You or any party on any legal theory for any damages whatsoever, including -without limitation any general, special, incidental or consequential damages -arising in connection to this license. The Publisher reserves the right to -cease making the Work available to You at any time without notice - -Miscellaneous - This License shall be governed by the laws of the location of the head -office of the Author or if the Author is an individual, the laws of -location of the principal place of residence of the Author. - If any provision of this License is invalid or unenforceable under -applicable law, it shall not affect the validity or enforceability of the -remainder of the terms of this License, and without further action by the -parties to this License, such provision shall be reformed to the minimum -extent necessary to make such provision valid and enforceable. - No term or provision of this License shall be deemed waived and no -breach consented to unless such waiver or consent shall be in writing -and signed by the party to be charged with such waiver or consent. - This License constitutes the entire agreement between the parties -with respect to the Work licensed herein. There are no understandings, -agreements or representations with respect to the Work not specified herein. -The Author shall not be bound by any additional provisions that may appear -in any communication from You. This License may not be modified without -the mutual written agreement of the Author and You. - - -With respect to DocumentFormat.OpenXml -====================================== - -(https://github.com/OfficeDev/Open-XML-SDK/blob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) Microsoft Corporation - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With respect to ExcelNumberFormat -================================= - -(https://github.com/andersnm/ExcelNumberFormat/blob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2017 andersnm - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With respect to jose-jwt -======================== - -(https://github.com/dvsekhvalnov/jose-jwt/blob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2014-2019 dvsekhvalnov - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -With resepect to ExcelDataReader -================================ - -(https://github.com/ExcelDataReader/ExcelDataReader/blob/develop/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2014 ExcelDataReader - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -With resepect to OPC UA Example Code -==================================== - - * Copyright (c) 2005-2019 The OPC Foundation, Inc. All rights reserved. - * - * OPC Foundation MIT License 1.00 - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - * The complete license agreement can be found here: - * http://opcfoundation.org/License/MIT/1.00/ - - -With respect to OPC Foundation -============================== - -RCL License -Reciprocal Community License 1.00 (RCL1.00) -Version 1.00, June 24, 2009 -Copyright (C) 2008,2009 OPC Foundation, Inc., All Rights Reserved. - -https://opcfoundation.org/license/rcl.html - -Remark: PHOENIX CONTACT GmbH & Co. KG and Festo SE & Co. KG are members -of OPC foundation. - -With respect to MSAGL (Microsoft Automatic Graph Layout) -======================================================== -(see: https://github.com/microsoft/automatic-graph-layout/blob/master/LICENSE) - -Microsoft Automatic Graph Layout, MSAGL - -Copyright (c) Microsoft Corporation - -All rights reserved. - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -""Software""), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -With respect to Glob (https://www.nuget.org/packages/Glob/) -=========================================================== -(see: https://raw.githubusercontent.com/kthompson/glob/master/LICENSE) - -The MIT License (MIT) - -Copyright (c) 2013-2019 Kevin Thompson - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -With respect to Magick.NET -========================== - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - 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. - -With respect to SSharp.NET library -================================== - - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - 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. diff --git a/src/AasxCsharpLibrary/LogInternally.cs b/src/AasxCsharpLibrary/LogInternally.cs deleted file mode 100644 index 5b8061292..000000000 --- a/src/AasxCsharpLibrary/LogInternally.cs +++ /dev/null @@ -1,83 +0,0 @@ -/* -Copyright (c) 2020 ZHAW Zürcher Hochschule für Angewandte Wissenschaften -Author: Marko Ristin - -This source code is licensed under the Apache License 2.0 (see LICENSE.txt). - -This source code may use other Open Source software components (see LICENSE.txt). -*/ - -using Exception = System.Exception; - -namespace AdminShellNS -{ - public static class Logging - { - // see: https://stackoverflow.com/questions/9314172/getting-all-messages-from-innerexceptions - private static string GetExceptionMessages(this Exception e, string msgs = "") - { - if (e == null) return string.Empty; - if (msgs == "") msgs = e.Message; - if (e.InnerException != null) - msgs += "\r\nInnerException: " + GetExceptionMessages(e.InnerException); - return msgs; - } - - public static string FormatError(Exception ex, string where) - { - var res = string.Format("Error: {0}: {1} {2} at {3}.", - where, - ex.Message, - ex.GetExceptionMessages(), - ex.StackTrace); - - var inner = ex.InnerException; - while (inner != null) - { - res += $"Inner message: {inner.Message}" + System.Environment.NewLine; - inner = inner.InnerException; - } - - return res; - } - } - - public class InternalLog - { - /// - /// Logs the exception to STDERR. - /// - public void Error(Exception ex, string where) - { - System.Console.Error.WriteLine(Logging.FormatError(ex, where)); - } - - /// - /// Logs that the exception is silently ignored to STDERR. - /// - public void SilentlyIgnoredError(Exception ex) - { - System.Console.Error.WriteLine("The exception is silently ignored: {0} {1} at {2}.", - ex.Message, - ((ex.InnerException != null) ? ex.InnerException.Message : ""), - ex.StackTrace); - } - - /// - /// Does no logging at all. Allows to have non-empty catch clauses. - /// - public void CompletelyIgnoredError(Exception ex) - { - } - } - - /// - /// Handles logging meant to be read by developers (*i.e*, not by the users of the software). - /// - /// Please see AasxIntegrationBase\LogInstance.cs for how to keep logs intended - /// for the user. - public static class LogInternally - { - public static readonly InternalLog That = new InternalLog(); - } -} \ No newline at end of file diff --git a/src/AasxCsharpLibrary/Properties/AssemblyInfo.cs b/src/AasxCsharpLibrary/Properties/AssemblyInfo.cs deleted file mode 100644 index 1c46e4aa6..000000000 --- a/src/AasxCsharpLibrary/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// Allgemeine Informationen über eine Assembly werden über die folgenden -// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, -// die einer Assembly zugeordnet sind. -[assembly: AssemblyTitle("AasxCsharpLibrary")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("AasxCsharpLibrary")] -[assembly: AssemblyCopyright("Copyright © 2019")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly -// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von -// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen. -[assembly: ComVisible(false)] - -// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird -[assembly: Guid("9863799b-4e44-4da2-9120-c85c7985bc6d")] - -// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: -// -// Hauptversion -// Nebenversion -// Buildnummer -// Revision -// -// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, -// indem Sie "*" wie unten gezeigt eingeben: -//// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/AasxCsharpLibrary/Resources/schemaV201/AAS.xsd b/src/AasxCsharpLibrary/Resources/schemaV201/AAS.xsd deleted file mode 100644 index 2e6c24f6b..000000000 --- a/src/AasxCsharpLibrary/Resources/schemaV201/AAS.xsd +++ /dev/null @@ -1,555 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/AasxCsharpLibrary/Resources/schemaV201/AAS_ABAC.xsd b/src/AasxCsharpLibrary/Resources/schemaV201/AAS_ABAC.xsd deleted file mode 100644 index 4048a5746..000000000 --- a/src/AasxCsharpLibrary/Resources/schemaV201/AAS_ABAC.xsd +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/AasxCsharpLibrary/Resources/schemaV201/IEC61360.xsd b/src/AasxCsharpLibrary/Resources/schemaV201/IEC61360.xsd deleted file mode 100644 index d52f04f1e..000000000 --- a/src/AasxCsharpLibrary/Resources/schemaV201/IEC61360.xsd +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/AasxCsharpLibrary/Resources/schemaV201/aas.json b/src/AasxCsharpLibrary/Resources/schemaV201/aas.json deleted file mode 100644 index 9583c2b1f..000000000 --- a/src/AasxCsharpLibrary/Resources/schemaV201/aas.json +++ /dev/null @@ -1,1148 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2019-09/schema", - "title": "AssetAdministrationShellEnvironment", - "$id": "http://www.admin-shell.io/schema/json/v2.0.1", - "type": "object", - "required": ["assetAdministrationShells", "submodels", "assets", "conceptDescriptions"], - "properties": { - "assetAdministrationShells": { - "type": "array", - "items": { - "$ref": "#/definitions/AssetAdministrationShell" - } - }, - "submodels": { - "type": "array", - "items": { - "$ref": "#/definitions/Submodel" - } - }, - "assets": { - "type": "array", - "items": { - "$ref": "#/definitions/Asset" - } - }, - "conceptDescriptions": { - "type": "array", - "items": { - "$ref": "#/definitions/ConceptDescription" - } - } - }, - "definitions": { - "Referable": { - "type": "object", - "properties": { - "idShort": { - "type": "string" - }, - "category": { - "type": "string" - }, - "description": { - "type": "array", - "items": { - "$ref": "#/definitions/LangString" - } - }, - "parent": { - "$ref": "#/definitions/Reference" - }, - "modelType": { - "$ref": "#/definitions/ModelType" - } - }, - "required": [ "idShort", "modelType" ] - }, - "Identifiable": { - "allOf": [ - { "$ref": "#/definitions/Referable" }, - { "properties": { - "identification": { - "$ref": "#/definitions/Identifier" - }, - "administration": { - "$ref": "#/definitions/AdministrativeInformation" - } - }, - "required": [ "identification" ] - } - ] - }, - "Qualifiable": { - "type": "object", - "properties": { - "qualifiers": { - "type": "array", - "items": { - "$ref": "#/definitions/Constraint" - } - } - } - }, - "HasSemantics": { - "type": "object", - "properties": { - "semanticId": { - "$ref": "#/definitions/Reference" - } - } - }, - "HasDataSpecification": { - "type": "object", - "properties": { - "embeddedDataSpecifications": { - "type": "array", - "items": { - "$ref": "#/definitions/EmbeddedDataSpecification" - } - } - } - }, - "AssetAdministrationShell": { - "allOf": [ - { "$ref": "#/definitions/Identifiable" }, - { "$ref": "#/definitions/HasDataSpecification" }, - { "properties": { - "derivedFrom": { - "$ref": "#/definitions/Reference" - }, - "asset": { - "$ref": "#/definitions/Reference" - }, - "submodels": { - "type": "array", - "items": { - "$ref": "#/definitions/Reference" - } - }, - "views": { - "type": "array", - "items": { - "$ref": "#/definitions/View" - } - }, - "conceptDictionaries": { - "type": "array", - "items": { - "$ref": "#/definitions/ConceptDictionary" - } - }, - "security": { - "$ref": "#/definitions/Security" - } - }, - "required": [ "asset" ] - } - ] - }, - "Identifier": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "idType": { - "$ref": "#/definitions/KeyType" - } - }, - "required": [ "id", "idType" ] - }, - "KeyType": { - "type": "string", - "enum": ["Custom", "IRDI", "IRI", "IdShort", "FragmentId"] - }, - "AdministrativeInformation": { - "type": "object", - "properties": { - "version": { - "type": "string" - }, - "revision": { - "type": "string" - } - } - }, - "LangString": { - "type": "object", - "properties": { - "language": { - "type": "string" - }, - "text": { - "type": "string" - } - }, - "required": [ "language", "text" ] - }, - "Reference": { - "type": "object", - "properties": { - "keys": { - "type": "array", - "items": { - "$ref": "#/definitions/Key" - } - } - }, - "required": [ "keys" ] - }, - "Key": { - "type": "object", - "properties": { - "type": { - "$ref": "#/definitions/KeyElements" - }, - "idType": { - "$ref": "#/definitions/KeyType" - }, - "value": { - "type": "string" - }, - "local": { - "type": "boolean" - } - }, - "required": [ "type", "idType", "value", "local" ] - }, - "KeyElements": { - "type": "string", - "enum": [ - "Asset", - "AssetAdministrationShell", - "ConceptDescription", - "Submodel", - "AccessPermissionRule", - "AnnotatedRelationshipElement", - "BasicEvent", - "Blob", - "Capability", - "ConceptDictionary", - "DataElement", - "File", - "Entity", - "Event", - "MultiLanguageProperty", - "Operation", - "Property", - "Range", - "ReferenceElement", - "RelationshipElement", - "SubmodelElement", - "SubmodelElementCollection", - "View", - "GlobalReference", - "FragmentReference" - ] - }, - "ModelTypes": { - "type": "string", - "enum": [ - "Asset", - "AssetAdministrationShell", - "ConceptDescription", - "Submodel", - "AccessPermissionRule", - "AnnotatedRelationshipElement", - "BasicEvent", - "Blob", - "Capability", - "ConceptDictionary", - "DataElement", - "File", - "Entity", - "Event", - "MultiLanguageProperty", - "Operation", - "Property", - "Range", - "ReferenceElement", - "RelationshipElement", - "SubmodelElement", - "SubmodelElementCollection", - "View", - "GlobalReference", - "FragmentReference", - "Constraint", - "Formula", - "Qualifier" - ] - }, - "ModelType": { - "type": "object", - "properties": { - "name": { - "$ref": "#/definitions/ModelTypes" - } - }, - "required": [ "name" ] - }, - "EmbeddedDataSpecification": { - "type": "object", - "properties": { - "dataSpecification": { - "$ref": "#/definitions/Reference" - }, - "dataSpecificationContent": { - "$ref": "#/definitions/DataSpecificationContent" - } - }, - "required": [ "dataSpecification", "dataSpecificationContent" ] - }, - "DataSpecificationContent": { - "oneOf": [ - { "$ref": "#/definitions/DataSpecificationIEC61360Content" }, - { "$ref": "#/definitions/DataSpecificationPhysicalUnitContent" } - ] - }, - "DataSpecificationPhysicalUnitContent": { - "type": "object", - "properties": { - "unitName": { - "type": "string" - }, - "unitSymbol": { - "type": "string" - }, - "definition": { - "type": "array", - "items": { - "$ref": "#/definitions/LangString" - } - }, - "siNotation": { - "type": "string" - }, - "siName": { - "type": "string" - }, - "dinNotation": { - "type": "string" - }, - "eceName": { - "type": "string" - }, - "eceCode": { - "type": "string" - }, - "nistName": { - "type": "string" - }, - "sourceOfDefinition": { - "type": "string" - }, - "conversionFactor": { - "type": "string" - }, - "registrationAuthorityId": { - "type": "string" - }, - "supplier": { - "type": "string" - } - }, - "required": [ "unitName", "unitSymbol", "definition" ] - }, - "DataSpecificationIEC61360Content": { - "allOf": [ - { "$ref": "#/definitions/ValueObject" }, - { - "type": "object", - "properties": { - "dataType": { - "enum": [ - "DATE", - "STRING", - "STRING_TRANSLATABLE", - "REAL_MEASURE", - "REAL_COUNT", - "REAL_CURRENCY", - "BOOLEAN", - "URL", - "RATIONAL", - "RATIONAL_MEASURE", - "TIME", - "TIMESTAMP", - "INTEGER_COUNT", - "INTEGER_MEASURE", - "INTEGER_CURRENCY" - ] - }, - "definition": { - "type": "array", - "items": { - "$ref": "#/definitions/LangString" - } - }, - "preferredName": { - "type": "array", - "items": { - "$ref": "#/definitions/LangString" - } - }, - "shortName": { - "type": "array", - "items": { - "$ref": "#/definitions/LangString" - } - }, - "sourceOfDefinition": { - "type": "string" - }, - "symbol": { - "type": "string" - }, - "unit": { - "type": "string" - }, - "unitId": { - "$ref": "#/definitions/Reference" - }, - "valueFormat": { - "type": "string" - }, - "valueList": { - "$ref": "#/definitions/ValueList" - }, - "levelType": { - "type": "array", - "items": { - "$ref": "#/definitions/LevelType" - } - } - }, - "required": [ "preferredName" ] - } - ] - }, - "LevelType": { - "type": "string", - "enum": [ "Min", "Max", "Nom", "Typ" ] - }, - "ValueList": { - "type": "object", - "properties": { - "valueReferencePairTypes": { - "type": "array", - "minItems": 1, - "items": { - "$ref": "#/definitions/ValueReferencePairType" - } - } - }, - "required": [ "valueReferencePairTypes" ] - }, - "ValueReferencePairType": { - "allOf": [ - { "$ref": "#/definitions/ValueObject" } - ] - }, - "ValueObject": { - "type": "object", - "properties": { - "value": { "type": "string" }, - "valueId": { - "$ref": "#/definitions/Reference" - }, - "valueType": { - "type": "string", - "enum": [ - "anyUri", - "base64Binary", - "boolean", - "date", - "dateTime", - "dateTimeStamp", - "decimal", - "integer", - "long", - "int", - "short", - "byte", - "nonNegativeInteger", - "positiveInteger", - "unsignedLong", - "unsignedInt", - "unsignedShort", - "unsignedByte", - "nonPositiveInteger", - "negativeInteger", - "double", - "duration", - "dayTimeDuration", - "yearMonthDuration", - "float", - "gDay", - "gMonth", - "gMonthDay", - "gYear", - "gYearMonth", - "hexBinary", - "NOTATION", - "QName", - "string", - "normalizedString", - "token", - "language", - "Name", - "NCName", - "ENTITY", - "ID", - "IDREF", - "NMTOKEN", - "time" - ]} - } - }, - "Asset": { - "allOf": [ - { "$ref": "#/definitions/Identifiable" }, - { "$ref": "#/definitions/HasDataSpecification" }, - { "properties": { - "kind": { - "$ref": "#/definitions/AssetKind" - }, - "assetIdentificationModel": { - "$ref": "#/definitions/Reference" - }, - "billOfMaterial": { - "$ref": "#/definitions/Reference" - } - }, - "required": [ "kind" ] - } - ] - }, - "AssetKind": { - "type": "string", - "enum": ["Type", "Instance"] - }, - "ModelingKind": { - "type": "string", - "enum": ["Template", "Instance"] - }, - "Submodel": { - "allOf": [ - { "$ref": "#/definitions/Identifiable" }, - { "$ref": "#/definitions/HasDataSpecification" }, - { "$ref": "#/definitions/Qualifiable" }, - { "$ref": "#/definitions/HasSemantics" }, - { "properties": { - "kind": { - "$ref": "#/definitions/ModelingKind" - }, - "submodelElements": { - "type": "array", - "items": { - "$ref": "#/definitions/SubmodelElement" - } - } - } - } - ] - }, - "Constraint": { - "type": "object", - "properties": { - "modelType": { - "$ref": "#/definitions/ModelType" - } - }, - "required": [ "modelType" ] - }, - "Operation": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" }, - { "properties": { - "inputVariable": { - "type": "array", - "items": { - "$ref": "#/definitions/OperationVariable" - } - }, - "outputVariable": { - "type": "array", - "items": { - "$ref": "#/definitions/OperationVariable" - } - }, - "inoutputVariable": { - "type": "array", - "items": { - "$ref": "#/definitions/OperationVariable" - } - } - } - } - ] - }, - "OperationVariable": { - "type": "object", - "properties": { - "value": { - "oneOf": [ - { "$ref": "#/definitions/Blob" }, - { "$ref": "#/definitions/File" }, - { "$ref": "#/definitions/Capability" }, - { "$ref": "#/definitions/Entity" }, - { "$ref": "#/definitions/Event" }, - { "$ref": "#/definitions/BasicEvent" }, - { "$ref": "#/definitions/MultiLanguageProperty" }, - { "$ref": "#/definitions/Operation" }, - { "$ref": "#/definitions/Property" }, - { "$ref": "#/definitions/Range" }, - { "$ref": "#/definitions/ReferenceElement" }, - { "$ref": "#/definitions/RelationshipElement" }, - { "$ref": "#/definitions/SubmodelElementCollection" } - ] - } - }, - "required": [ "value" ] - }, - "SubmodelElement": { - "allOf": [ - { "$ref": "#/definitions/Referable" }, - { "$ref": "#/definitions/HasDataSpecification" }, - { "$ref": "#/definitions/HasSemantics" }, - { "$ref": "#/definitions/Qualifiable" }, - { "properties": { - "kind": { - "$ref": "#/definitions/ModelingKind" - } - } - } - ] - }, - "Event": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" } - ] - }, - "BasicEvent": { - "allOf": [ - { "$ref": "#/definitions/Event" }, - { "properties": { - "observed": { - "$ref": "#/definitions/Reference" - } - }, - "required": [ "observed" ] - } - ] - }, - "EntityType": { - "type": "string", - "enum": ["CoManagedEntity", "SelfManagedEntity"] - }, - "Entity": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" }, - { "properties": { - "statements": { - "type": "array", - "items": { - "$ref": "#/definitions/SubmodelElement" - } - }, - "entityType": { - "$ref": "#/definitions/EntityType" - }, - "asset": { - "$ref": "#/definitions/Reference" - } - }, - "required": [ "entityType" ] - } - ] - }, - "View": { - "allOf": [ - { "$ref": "#/definitions/Referable" }, - { "$ref": "#/definitions/HasDataSpecification" }, - { "$ref": "#/definitions/HasSemantics" }, - { "properties": { - "containedElements": { - "type": "array", - "items": { - "$ref": "#/definitions/Reference" - } - } - } - } - ] - }, - "ConceptDictionary": { - "allOf": [ - { "$ref": "#/definitions/Referable" }, - { "$ref": "#/definitions/HasDataSpecification" }, - { "properties": { - "conceptDescriptions": { - "type": "array", - "items": { - "$ref": "#/definitions/Reference" - } - } - } - } - ] - }, - "ConceptDescription": { - "allOf": [ - { "$ref": "#/definitions/Identifiable" }, - { "$ref": "#/definitions/HasDataSpecification" }, - { "properties": { - "isCaseOf": { - "type": "array", - "items": { - "$ref": "#/definitions/Reference" - } - } - } - } - ] - }, - "Capability": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" } - ] - }, - "Property": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" }, - { "$ref": "#/definitions/ValueObject" } - ] - }, - "Range": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" }, - { "properties": { - "valueType": { - "type": "string", - "enum": [ - "anyUri", - "base64Binary", - "boolean", - "date", - "dateTime", - "dateTimeStamp", - "decimal", - "integer", - "long", - "int", - "short", - "byte", - "nonNegativeInteger", - "positiveInteger", - "unsignedLong", - "unsignedInt", - "unsignedShort", - "unsignedByte", - "nonPositiveInteger", - "negativeInteger", - "double", - "duration", - "dayTimeDuration", - "yearMonthDuration", - "float", - "gDay", - "gMonth", - "gMonthDay", - "gYear", - "gYearMonth", - "hexBinary", - "NOTATION", - "QName", - "string", - "normalizedString", - "token", - "language", - "Name", - "NCName", - "ENTITY", - "ID", - "IDREF", - "NMTOKEN", - "time" - ] - }, - "min": { "type": "string" }, - "max": { "type": "string" } - }, - "required": [ "valueType"] - } - ] - }, - "MultiLanguageProperty": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" }, - { "properties": { - "value": { - "type": "array", - "items": { - "$ref": "#/definitions/LangString" - } - }, - "valueId": { - "$ref": "#/definitions/Reference" - } - } - } - ] - }, - "File": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" }, - { "properties": { - "value": { - "type": "string" - }, - "mimeType": { - "type": "string" - } - }, - "required": [ "mimeType" ] - } - ] - }, - "Blob": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" }, - { "properties": { - "value": { - "type": "string" - }, - "mimeType": { - "type": "string" - } - }, - "required": [ "mimeType" ] - } - ] - }, - "ReferenceElement": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" }, - { "properties": { - "value": { - "$ref": "#/definitions/Reference" - } - } - } - ] - }, - "SubmodelElementCollection": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" }, - { "properties": { - "value": { - "type": "array", - "items": { - "oneOf": [ - { "$ref": "#/definitions/Blob" }, - { "$ref": "#/definitions/File" }, - { "$ref": "#/definitions/Capability" }, - { "$ref": "#/definitions/Entity" }, - { "$ref": "#/definitions/Event" }, - { "$ref": "#/definitions/BasicEvent" }, - { "$ref": "#/definitions/MultiLanguageProperty" }, - { "$ref": "#/definitions/Operation" }, - { "$ref": "#/definitions/Property" }, - { "$ref": "#/definitions/Range" }, - { "$ref": "#/definitions/ReferenceElement" }, - { "$ref": "#/definitions/RelationshipElement" }, - { "$ref": "#/definitions/SubmodelElementCollection" } - ] - } - }, - "allowDuplicates": { - "type": "boolean" - }, - "ordered": { - "type": "boolean" - } - } - } - ] - }, - "RelationshipElement": { - "allOf": [ - { "$ref": "#/definitions/SubmodelElement" }, - { "properties": { - "first": { - "$ref": "#/definitions/Reference" - }, - "second": { - "$ref": "#/definitions/Reference" - } - }, - "required": [ "first", "second" ] - } - ] - }, - "AnnotatedRelationshipElement": { - "allOf": [ - { "$ref": "#/definitions/RelationshipElement" }, - { "properties": { - "annotation": { - "type": "array", - "items": { - "oneOf": [ - { "$ref": "#/definitions/Blob" }, - { "$ref": "#/definitions/File" }, - { "$ref": "#/definitions/MultiLanguageProperty" }, - { "$ref": "#/definitions/Property" }, - { "$ref": "#/definitions/Range" }, - { "$ref": "#/definitions/ReferenceElement" } - ] - } - } - } - } - ] - }, - "Qualifier": { - "allOf": [ - { "$ref": "#/definitions/Constraint" }, - { "$ref": "#/definitions/HasSemantics" }, - { "$ref": "#/definitions/ValueObject" }, - { "properties": { - "type": { - "type": "string" - } - }, - "required": [ "type" ] - } - ] - }, - "Formula": { - "allOf": [ - { "$ref": "#/definitions/Constraint" }, - { "properties": { - "dependsOn": { - "type": "array", - "items": { - "$ref": "#/definitions/Reference" - } - } - } - } - ] - }, - "Security": { - "type": "object", - "properties": { - "accessControlPolicyPoints": { - "$ref": "#/definitions/AccessControlPolicyPoints" - }, - "certificate": { - "type": "array", - "items": { - "oneOf": [ - { "$ref": "#/definitions/BlobCertificate" } - ] - } - }, - "requiredCertificateExtension": { - "type": "array", - "items": { - "$ref": "#/definitions/Reference" - } - } - }, - "required": [ "accessControlPolicyPoints" ] - }, - "Certificate": { - "type": "object" - }, - "BlobCertificate": { - "allOf": [ - { "$ref": "#/definitions/Certificate" }, - { "properties": { - "blobCertificate": { - "$ref": "#/definitions/Blob" - }, - "containedExtension": { - "type": "array", - "items": { - "$ref": "#/definitions/Reference" - } - }, - "lastCertificate": { - "type": "boolean" - } - } - } - ] - }, - "AccessControlPolicyPoints": { - "type": "object", - "properties": { - "policyAdministrationPoint": { - "$ref": "#/definitions/PolicyAdministrationPoint" - }, - "policyDecisionPoint": { - "$ref": "#/definitions/PolicyDecisionPoint" - }, - "policyEnforcementPoint": { - "$ref": "#/definitions/PolicyEnforcementPoint" - }, - "policyInformationPoints": { - "$ref": "#/definitions/PolicyInformationPoints" - } - }, - "required": [ "policyAdministrationPoint", "policyDecisionPoint", "policyEnforcementPoint" ] - }, - "PolicyAdministrationPoint": { - "type": "object", - "properties": { - "localAccessControl": { - "$ref": "#/definitions/AccessControl" - }, - "externalAccessControl": { - "type": "boolean" - } - }, - "required": [ "externalAccessControl" ] - }, - "PolicyInformationPoints": { - "type": "object", - "properties": { - "internalInformationPoint": { - "type": "array", - "items": { - "$ref": "#/definitions/Reference" - } - }, - "externalInformationPoint": { - "type": "boolean" - } - }, - "required": [ "externalInformationPoint" ] - }, - "PolicyEnforcementPoint": { - "type": "object", - "properties": { - "externalPolicyEnforcementPoint": { - "type": "boolean" - } - }, - "required": [ "externalPolicyEnforcementPoint" ] - }, - "PolicyDecisionPoint": { - "type": "object", - "properties": { - "externalPolicyDecisionPoints": { - "type": "boolean" - } - }, - "required": [ "externalPolicyDecisionPoints" ] - }, - "AccessControl": { - "type": "object", - "properties": { - "selectableSubjectAttributes": { - "$ref": "#/definitions/Reference" - }, - "defaultSubjectAttributes": { - "$ref": "#/definitions/Reference" - }, - "selectablePermissions": { - "$ref": "#/definitions/Reference" - }, - "defaultPermissions": { - "$ref": "#/definitions/Reference" - }, - "selectableEnvironmentAttributes": { - "$ref": "#/definitions/Reference" - }, - "defaultEnvironmentAttributes": { - "$ref": "#/definitions/Reference" - }, - "accessPermissionRule": { - "type": "array", - "items": { - "$ref": "#/definitions/AccessPermissionRule" - } - } - } - }, - "AccessPermissionRule": { - "allOf": [ - { "$ref": "#/definitions/Referable" }, - { "$ref": "#/definitions/Qualifiable" }, - { "properties": { - "targetSubjectAttributes": { - "type": "array", - "items": { - "$ref": "#/definitions/SubjectAttributes" - }, - "minItems": 1 - }, - "permissionsPerObject": { - "type": "array", - "items": { - "$ref": "#/definitions/PermissionsPerObject" - } - } - }, - "required": [ "targetSubjectAttributes" ] - } - ] - }, - "SubjectAttributes": { - "type": "object", - "properties": { - "subjectAttributes": { - "type": "array", - "items": { - "$ref": "#/definitions/Reference" - }, - "minItems": 1 - } - } - }, - "PermissionsPerObject": { - "type": "object", - "properties": { - "object": { - "$ref": "#/definitions/Reference" - }, - "targetObjectAttributes": { - "$ref": "#/definitions/ObjectAttributes" - }, - "permission": { - "type": "array", - "items": { - "$ref": "#/definitions/Permission" - } - } - } - }, - "ObjectAttributes": { - "type": "object", - "properties": { - "objectAttribute": { - "type": "array", - "items": { - "$ref": "#/definitions/Property" - }, - "minItems": 1 - } - } - }, - "Permission": { - "type": "object", - "properties": { - "permission": { - "$ref": "#/definitions/Reference" - }, - "kindOfPermission": { - "type": "string", - "enum": ["Allow", "Deny", "NotApplicable", "Undefined"] - } - }, - "required": [ "permission", "kindOfPermission" ] - } - } -}