예제 #1
0
        public override List <OperationVariable_V1_0> ReadJson(JsonReader reader, Type objectType, List <OperationVariable_V1_0> existingValue, bool hasExistingValue, JsonSerializer serializer)
        {
            JArray jArray = null;

            try
            {
                jArray = JArray.Load(reader);
            }
            catch (Exception e)
            {
                logger.Error(e);
            }

            if (jArray == null || jArray.Count == 0)
            {
                return(null);
            }

            List <OperationVariable_V1_0> operationVariables = new List <OperationVariable_V1_0>();

            foreach (var element in jArray)
            {
                ModelType modelType = element.SelectToken("modelType")?.ToObject <ModelType>(serializer);
                SubmodelElementType_V1_0 submodelElementType = CreateSubmodelElement(modelType);
                if (submodelElementType != null)
                {
                    serializer.Populate(element.CreateReader(), submodelElementType);
                    operationVariables.Add(new OperationVariable_V1_0()
                    {
                        Value = new EnvironmentSubmodelElement_V1_0()
                        {
                            submodelElement = submodelElementType
                        }
                    });
                }
            }
            return(operationVariables);
        }
        public static ISubmodelElement ToSubmodelElement(this SubmodelElementType_V1_0 envSubmodelElement, List <IConceptDescription> conceptDescriptions)
        {
            if (envSubmodelElement == null)
            {
                logger.Warn("EnvironmentSubmodelElement is null");
                return(null);
            }

            ModelType modelType = envSubmodelElement.ModelType;

            if (modelType == null)
            {
                logger.Warn("ModelType of Element " + envSubmodelElement.IdShort + " is null");
                return(null);
            }
            SubmodelElement submodelElement = null;

            if (modelType == ModelType.Property && envSubmodelElement is Property_V1_0 castedProperty)
            {
                Property property;
                if (DataObjectType.TryParse(castedProperty.ValueType, out DataObjectType dataObjectType))
                {
                    property = new Property(new DataType(dataObjectType));
                }
                else
                {
                    logger.Warn("Unable to parse ValueType of Property " + castedProperty.IdShort + " - ValueType: " + castedProperty.ValueType);
                    property = new Property();
                }

                property.Value   = castedProperty.Value;
                property.ValueId = castedProperty.ValueId?.ToReference_V1_0();

                submodelElement = property;
            }
            else if (modelType == ModelType.File && envSubmodelElement is File_V1_0 castedFile)
            {
                File file = new File
                {
                    MimeType = castedFile.MimeType,
                    Value    = castedFile.Value
                };

                submodelElement = file;
            }
            else if (modelType == ModelType.Blob && envSubmodelElement is Blob_V1_0 castedBlob)
            {
                Blob blob = new Blob
                {
                    MimeType = castedBlob.MimeType,
                    Value    = Convert.FromBase64String(castedBlob.Value)
                };

                submodelElement = blob;
            }
            else if (modelType == ModelType.RelationshipElement && envSubmodelElement is RelationshipElement_V1_0 castedRelationshipElement)
            {
                RelationshipElement relationshipElement = new RelationshipElement
                {
                    First  = castedRelationshipElement.First?.ToReference_V1_0 <IReferable>(),
                    Second = castedRelationshipElement.Second?.ToReference_V1_0 <IReferable>()
                };

                submodelElement = relationshipElement;
            }
            else if (modelType == ModelType.ReferenceElement && envSubmodelElement is ReferenceElement_V1_0 castedReferenceElement)
            {
                ReferenceElement referenceElement = new ReferenceElement
                {
                    Value = castedReferenceElement.Value?.ToReference_V1_0()
                };

                submodelElement = referenceElement;
            }
            else if (modelType == ModelType.Event && envSubmodelElement is Event_V1_0 castedEvent)
            {
                Event eventable = new Event();

                submodelElement = eventable;
            }
            else if (modelType == ModelType.Operation && envSubmodelElement is Operation_V1_0 castedOperation)
            {
                Operation operation = new Operation
                {
                    InputVariables  = new OperationVariableSet(),
                    OutputVariables = new OperationVariableSet()
                };

                var operationInElements = castedOperation.In?.ConvertAll(c => c.Value?.submodelElement?.ToSubmodelElement(conceptDescriptions));
                if (operationInElements?.Count > 0)
                {
                    foreach (var element in operationInElements)
                    {
                        operation.InputVariables.Add(element);
                    }
                }

                var operationOutElements = castedOperation.Out?.ConvertAll(c => c.Value?.submodelElement?.ToSubmodelElement(conceptDescriptions));
                if (operationOutElements?.Count > 0)
                {
                    foreach (var element in operationOutElements)
                    {
                        operation.OutputVariables.Add(element);
                    }
                }

                submodelElement = operation;
            }
            else if (modelType == ModelType.SubmodelElementCollection && envSubmodelElement is SubmodelElementCollection_V1_0 castedSubmodelElementCollection)
            {
                SubmodelElementCollection submodelElementCollection = new SubmodelElementCollection();

                if (castedSubmodelElementCollection.Value?.Count > 0)
                {
                    submodelElementCollection.Value = new ElementContainer <ISubmodelElement>();
                    List <ISubmodelElement> smElements = castedSubmodelElementCollection.Value?.ConvertAll(c => c.submodelElement?.ToSubmodelElement(conceptDescriptions));
                    foreach (var smElement in smElements)
                    {
                        submodelElementCollection.Value.Add(smElement);
                    }
                }

                submodelElement = submodelElementCollection;
            }


            if (submodelElement == null)
            {
                logger.Warn("SubmodelElement " + envSubmodelElement.IdShort + " is still null");
                return(null);
            }

            submodelElement.Category    = envSubmodelElement.Category;
            submodelElement.Description = envSubmodelElement.Description;
            submodelElement.IdShort     = envSubmodelElement.IdShort;
            submodelElement.Kind        = envSubmodelElement.Kind;
            submodelElement.SemanticId  = envSubmodelElement.SemanticId?.ToReference_V1_0();
            submodelElement.Constraints = null;

            string semanticId = envSubmodelElement.SemanticId?.Keys?.FirstOrDefault()?.Value;

            if (!string.IsNullOrEmpty(semanticId))
            {
                submodelElement.ConceptDescription =
                    conceptDescriptions.Find(f => f.Identification.Id == semanticId);
                submodelElement.EmbeddedDataSpecifications = submodelElement.ConceptDescription?.EmbeddedDataSpecifications;
            }

            return(submodelElement);
        }
        public static EnvironmentSubmodelElement_V1_0 ToEnvironmentSubmodelElement_V1_0(this ISubmodelElement element)
        {
            if (element == null)
            {
                return(null);
            }
            ModelType modelType = element.ModelType;

            if (modelType == null)
            {
                return(null);
            }

            EnvironmentSubmodelElement_V1_0 environmentSubmodelElement = new EnvironmentSubmodelElement_V1_0();

            SubmodelElementType_V1_0 submodelElementType = new SubmodelElementType_V1_0()
            {
                Category    = element.Category,
                Description = element.Description,
                IdShort     = element.IdShort,
                Kind        = element.Kind,
                Parent      = element.Parent?.First?.Value,
                Qualifier   = null,
                SemanticId  = element.SemanticId?.ToEnvironmentReference_V1_0(),
            };

            if (modelType == ModelType.Property && element is IProperty castedProperty)
            {
                environmentSubmodelElement.submodelElement = new Property_V1_0(submodelElementType)
                {
                    Value     = castedProperty.Value?.ToString(),
                    ValueId   = castedProperty.ValueId?.ToEnvironmentReference_V1_0(),
                    ValueType = castedProperty.ValueType?.ToString()
                }
            }
            ;
            else if (modelType == ModelType.Operation && element is IOperation castedOperation)
            {
                environmentSubmodelElement.submodelElement = new Operation_V1_0(submodelElementType);
                List <OperationVariable_V1_0> inputs  = new List <OperationVariable_V1_0>();
                List <OperationVariable_V1_0> outputs = new List <OperationVariable_V1_0>();

                if (castedOperation.InputVariables?.Count > 0)
                {
                    foreach (var inputVar in castedOperation.InputVariables)
                    {
                        inputs.Add(new OperationVariable_V1_0()
                        {
                            Value = inputVar.Value.ToEnvironmentSubmodelElement_V1_0()
                        });
                    }
                }
                if (castedOperation.OutputVariables?.Count > 0)
                {
                    foreach (var outputVar in castedOperation.OutputVariables)
                    {
                        outputs.Add(new OperationVariable_V1_0()
                        {
                            Value = outputVar.Value.ToEnvironmentSubmodelElement_V1_0()
                        });
                    }
                }

                (environmentSubmodelElement.submodelElement as Operation_V1_0).In  = inputs;
                (environmentSubmodelElement.submodelElement as Operation_V1_0).Out = outputs;
            }
            else if (modelType == ModelType.Event && element is IEvent castedEvent)
            {
                environmentSubmodelElement.submodelElement = new Event_V1_0(submodelElementType)
                {
                }
            }
            ;
            else if (modelType == ModelType.Blob && element is IBlob castedBlob)
            {
                environmentSubmodelElement.submodelElement = new Blob_V1_0(submodelElementType)
                {
                    Value    = Convert.ToBase64String(castedBlob.Value),
                    MimeType = castedBlob.MimeType
                }
            }
            ;
            else if (modelType == ModelType.File && element is IFile castedFile)
            {
                environmentSubmodelElement.submodelElement = new File_V1_0(submodelElementType)
                {
                    MimeType = castedFile.MimeType,
                    Value    = castedFile.Value
                }
            }
            ;
            else if (modelType == ModelType.ReferenceElement && element is IReferenceElement castedReferenceElement)
            {
                environmentSubmodelElement.submodelElement = new ReferenceElement_V1_0(submodelElementType)
                {
                    Value = castedReferenceElement.Value?.ToEnvironmentReference_V1_0()
                }
            }
            ;
            else if (modelType == ModelType.RelationshipElement && element is IRelationshipElement castedRelationshipElement)
            {
                environmentSubmodelElement.submodelElement = new RelationshipElement_V1_0(submodelElementType)
                {
                    First  = castedRelationshipElement.First?.ToEnvironmentReference_V1_0(),
                    Second = castedRelationshipElement.Second?.ToEnvironmentReference_V1_0()
                }
            }
            ;
            else if (modelType == ModelType.SubmodelElementCollection && element is ISubmodelElementCollection castedSubmodelElementCollection)
            {
                environmentSubmodelElement.submodelElement = new SubmodelElementCollection_V1_0(submodelElementType);
                List <EnvironmentSubmodelElement_V1_0> environmentSubmodelElements = new List <EnvironmentSubmodelElement_V1_0>();
                if (castedSubmodelElementCollection.Value?.Count > 0)
                {
                    foreach (var smElement in castedSubmodelElementCollection.Value)
                    {
                        environmentSubmodelElements.Add(smElement.ToEnvironmentSubmodelElement_V1_0());
                    }
                }
                (environmentSubmodelElement.submodelElement as SubmodelElementCollection_V1_0).Value = environmentSubmodelElements;
            }
            else
            {
                return(null);
            }

            return(environmentSubmodelElement);
        }